2010-08-11 12 views
0

J'ai un ListBox qui utilise un WrapPanel pour son ItemsPanel, une coutume ItemTemplate, et une coutume ItemContainerStyle. Le modèle ItemContainerStyle contient une zone de sélection qui s'affiche lorsqu'un élément est sélectionné. Le concepteur graphique aimerait que cette zone de sélection chevauche les éléments frères dans ListBox, comme s'il s'agissait d'une superposition.Permettant indicateur de sélection d'un élément dans ListBox à superposer tous les éléments dans Silverlight

La première chose que j'ai essayé était de définir la propriété Canvas.ZIndex du ItemContainer dans l'état Selected. Cela n'a pas semblé avoir d'effet. Puis j'ai lu que les éléments de la liste pouvaient être enveloppés dans un ContentPresenter, donc j'ai créé une propriété attachée qui modifie l'index ZIndex du parent d'un élément, mais j'ai découvert que les storyboards Silverlight ne vous permettent pas d'animer les propriétés attachées personnalisées.

Est-ce que quelqu'un connaît une technique que nous pouvons utiliser pour obtenir l'effet que nous désirons?

Répondre

1

J'ai trouvé une solution. Fondamentalement, j'ai créé une propriété jointe qui configure un gestionnaire d'événements sur Selector (y compris ListBox) pour quand sa sélection change. Lorsqu'il change, le code itère dans tous les conteneurs d'éléments, en ajustant le Canvas.ZIndex selon que le conteneur représente l'élément sélectionné:

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); 
       } 
      } 
     }; 
    } 
}