在列表框允许项目选择的指标,覆盖在Silverlight中的所有项目(Allowing item s

2019-10-29 17:44发布

我有一个ListBox使用一个WrapPanelItemsPanel ,定制ItemTemplate ,和一个自定义ItemContainerStyle 。 该ItemContainerStyle的模板包含一个选择框,当一个项目被选中,显示了。 图形设计者希望这个选择框重叠ListBox中的兄弟姐妹的项目,如它的覆盖。

我想的第一件事是设置Canvas.ZIndex处于选择状态的ItemContainer的财产。 这似乎并没有产生效果。 后来我读了列表项可能在里面包裹ContentPresenter ,所以我创建了一个附加属性,改变项目的父级的zIndex的,但后来我发现Silverlight的故事板,不要让你自定义动画的附加属性。

有谁知道,我们可以用它来达到我们想要的效果的技术吗?

Answer 1:

我找到了解决办法。 基本上,我创建了一个附加属性,设置了一个事件处理程序上的任何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