我有一个ListBox
使用一个WrapPanel
其ItemsPanel
,定制ItemTemplate
,和一个自定义ItemContainerStyle
。 该ItemContainerStyle的模板包含一个选择框,当一个项目被选中,显示了。 图形设计者希望这个选择框重叠ListBox中的兄弟姐妹的项目,如它的覆盖。
我想的第一件事是设置Canvas.ZIndex
处于选择状态的ItemContainer的财产。 这似乎并没有产生效果。 后来我读了列表项可能在里面包裹ContentPresenter
,所以我创建了一个附加属性,改变项目的父级的zIndex的,但后来我发现Silverlight的故事板,不要让你自定义动画的附加属性。
有谁知道,我们可以用它来达到我们想要的效果的技术吗?
我找到了解决办法。 基本上,我创建了一个附加属性,设置了一个事件处理程序上的任何Selector
(包括ListBox
,用于当其选择的变化)。 当它改变时,代码遍历所有项的容器,调整Canvas.ZIndex
基于容器是否表示所选择的项目:
public static readonly DependencyProperty SetZIndexOnSelectionProperty = DependencyProperty.RegisterAttached(
"SetZIndexOnSelection", typeof(bool), typeof(FrameworkUtils),
new PropertyMetadata(zIndexSettingChanged));
public static bool GetSetZIndexOnSelection(DependencyObject obj)
{
return (bool)obj.GetValue(SetZIndexOnSelectionProperty);
}
public static void SetSetZIndexOnSelection(
DependencyObject obj, bool value)
{
obj.SetValue(SetZIndexOnSelectionProperty, value);
}
private static void zIndexSettingChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (obj is Selector)
{
var selector = obj as Selector;
selector.SelectionChanged += (s, e) =>
{
if (selector.SelectedItem != null)
{
foreach (var pair in selector.GetItemsAndContainers())
{
pair.Value.SetValue(
Canvas.ZIndexProperty,
(pair.Key == selector.SelectedItem) ? 1 : 0);
}
}
};
}
}
文章来源: Allowing item selection indicator in ListBox to overlay all items in Silverlight