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

时间:2010-08-28 14:37:46

标签: silverlight windows-phone-7

我想重现Windows Phone 7日历中使用的ListBox。当列表没有焦点时,仅显示所选项目。当列表聚焦时,它会(垂直地)平滑地增长以显示所有项目。

我有限的Silverlight和Blend才能让我失望。我以为我可以通过ItemContainerStyle实现所有这些,但FocusStates组是针对每个项目而不是列表,对吧?

我应该采取什么方法?

3 个答案:

答案 0 :(得分:1)

你是正确的,ListBox本身没有特定的焦点状态(除了对你没用的无效状态)。您只能使用模板更改单个项目的焦点状态。

选项1

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

选项2

您可以继承现有控件(此实例中为ListBox),但由于您需要提供默认模板,因此更多工作。您可以添加焦点/未聚焦状态。

选择取决于您的长期目标,但我会选择一个简单的自定义用户控件。可能需要不到一个小时的时间。

希望这有帮助。

答案 1 :(得分:0)

我使用Alex Yakhnin's implemenation,它只是将ListBox的大小调整为单个项目的高度,显示所选项目,其他项目仅在上方和下方,但不在视口中。

答案 2 :(得分:0)

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

除了将可见性绑定到ViewModel中的IsFiltered属性之外,我们使用这种技术快速“过滤”列表甚至TreeViews。

最好的部分,因为你没有绑定到你经常添加和删除东西的ObservableCollection,任何只有视图的属性(例如IsExpanded)就像你在显示项目时离开它们一样再次,所有这些都无需在ViewModel中跟踪它们!它纯粹是UI。全部'查看'。

我提到它的纯XAML ???哦......我做到了。只是确保你知道它是PURE XAML !!!

再次......当你隐藏ListBoxItem(使用触发器或绑定为你做)时,让确定将'IsEnabled'设置为false,否则你的键盘导航将无效! / p>