代码之家  ›  专栏  ›  技术社区  ›  Martin Plante

如何创建仅在未聚焦时显示所选项目的列表框

  •  1
  • Martin Plante  · 技术社区  · 14 年前

    我想复制WindowsPhone7日历中使用的列表框。当列表没有焦点时,仅显示所选项目。当列表聚焦时,它会平滑地增长(垂直地)以显示所有项目。

    我有限的Silverlight和混合功能让我失望。我以为我可以通过itemcontainerStyle实现所有这些,但是focusStates组是针对每个项目的,而不是列表,对吗?

    我应该采取什么方法?

    3 回复  |  直到 14 年前
        1
  •  1
  •   iCollect.it Ltd    14 年前

    正确的做法是,列表框本身没有特定的焦点状态(无效状态除外,该状态对您没有用处)。只能使用模板更改单个项目的焦点状态。

    选项1

    如果要根据控件中尚未存在的状态进行更改,最好是创建自定义用户控件。在这种情况下,您将使用2个ControlStoryboardAction行为捕获焦点状态,这些行为使用2个Storyboards将控件转换为焦点/从焦点转换为焦点。我可能会对未聚焦状态使用第二个(非列表)控件,并将其绑定到列表框的选定项。

    选项2

    您可以对现有控件(本例中的列表框)进行子类化,但由于需要提供默认模板,所以这项工作要做得更多。您可以添加焦点/未焦点状态。

    选择取决于您的长期目标,但我将使用一个简单的自定义用户控件。可能不到一个小时就能完成。

    希望这有帮助。

        2
  •  0
  •   Martin Plante    14 年前

    我已经用过 Alex Yakhnin's implemenation ,它只将列表框的大小调整为单个项目的高度,所选项目显示,其他项目仅在上方和下方,但不在视区中。

        3
  •  0
  •   Mark A. Donohoe    14 年前

    不,不,没有人!!不需要调整大小,不需要自定义控件,更糟的是,需要子类化!只需为ListBoxItem创建一个样式,当ListBoxItem的IsSelected为false且ListBox本身没有焦点时,该样式将其Visibility属性设置为“Collapsed”,并将其“IsEnabled”属性设置为“false”。(最好的方法是使用多个程序。)最后,将列表框设置为其内容的自动调整大小。完成又完成!它也是纯XAML!

    除了将可见性绑定到ViewModel中的IsFiltered属性之外,我们使用此技术快速“筛选”列表甚至树视图。

    最重要的是,由于您没有绑定到您不断添加和删除内容的可观察集合,因此任何仅为视图的属性(例如,isexpanded)都与再次显示项目时所保留的属性完全相同,而不必在ViewModel中跟踪它们!这纯粹是用户界面。所有“查看”。

    我有没有提到它是纯XAML????哦。。。我做到了。只是确保你知道它是纯XAML!!!!

    再一次…制作 当然 当您隐藏ListBoxItem(使用触发器或绑定为您执行此操作)或键盘导航不起作用时,将“IsEnabled”设置为false!