2010-07-27 4 views
2

Je sais que la question semble un peu étrange, mais je voudrais changer l'opacité de tous les éléments non sélectionnés dans un ItemsControl. En d'autres termes, je voudrais rendre plus "visible" l'élément sélectionné, en montrant les autres éléments plus "obfusqués".Dans ItemsControl, comment puis-je modifier l'opacité de tous les éléments non sélectionnés?

J'ai un contrôle personnalisé "MyCustomControl" dérivé de ItemsControl, où chaque élément est une instance d'une classe "MyObject".

J'ai créé un style pour mon contrôle personnalisé où j'ai défini ItemTemplate comme une propriété Image with Source liée à la propriété "LargeImage" de "MyObject". Voici le problème. Quand je sélectionne un objet, je voudrais définir l'opacité de l'autre élément, mais je n'ai pas trouvé de solution!

Voici mon (simplifié) code XAML:

<Style TargetType="{x:Type MyCustomControl}" x:Key="MyStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ui:MyCustomControl}"> 
       <Border Height="{TemplateBinding Height}" Width="Auto" Background="{TemplateBinding Background}"> 
        <ItemsPresenter VerticalAlignment="Center" IsHitTestVisible="True"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"></StackPanel> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <Grid> 
        <Button> 
         <Image Source="{Binding Path=LargeImage}" Stretch="Uniform"/> 
        </Button> 
       </Grid> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Répondre

0
<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
     <Setter Property="Opacity" Value="{Binding IsSelected, Converter={StaticResource YourOpacityConverter}}"/> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

qui précède montre comment vous pouvez le faire avec un ListBox, juste pour éviter toute confusion avec vos propres types. Il suppose que vos éléments de données (MyObject) ont une propriété IsSelected et que vous avez placé une ressource de convertisseur dans votre arborescence visuelle quelque part.

Vous pouvez renoncer au convertisseur et déclencher à la place un changement d'état lorsque IsSelected change, mais vous voyez l'idée.

1

Je pense qu'une solution très simple serait d'ajouter un déclencheur au modèle de données qui utilise la propriété « IsSelected », en utilisant un déclencheur ou un DataTrigger, quelque chose comme ça:

   <DataTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="False"> 
         <Setter Property="Opacity" Value="Yourvalue"/> 
        </Trigger> 
        <DataTrigger Binding="{Binding IsSelected}" Value="False"> 
         <Setter Property="Opacity" Value="Yourvalue"/> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
Questions connexes