Разрешение индикатора выбора элемента в ListBox наложить все элементы в Silverlight - PullRequest
0 голосов
/ 12 августа 2010

У меня есть ListBox, который использует WrapPanel для своих ItemsPanel, пользовательский ItemTemplate и пользовательский ItemContainerStyle. Шаблон ItemContainerStyle содержит поле выбора, которое отображается при выборе элемента. Графический дизайнер хотел бы, чтобы это поле выбора перекрывало элементы одного уровня в ListBox, как будто это наложение.

Первым делом я попытался установить свойство Canvas.ZIndex ItemContainer в состоянии Selected. Это, казалось, не имело эффекта. Затем я прочитал, что элементы списка могут быть обернуты внутри ContentPresenter, поэтому я создал прикрепленное свойство, которое изменяет ZIndex родительского элемента, но затем я обнаружил, что раскадровки Silverlight не позволяют анимировать пользовательские присоединенные свойства. *

Кто-нибудь знает технику, которую мы можем использовать для достижения желаемого эффекта?

1 Ответ

1 голос
/ 12 августа 2010

Я нашел решение. По сути, я создал прикрепленное свойство, которое устанавливает обработчик событий для любого 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);
                }
            }
        };
    }
}
...