PDA

View Full Version : [WPF] Cambiare l'opacita' degli elementi NON selezionati in un ItemsControl


mcaisco
27-07-2010, 10:26
So che sembra strano ma ho bisogno di evidenziare l'elemento selezionato di un ItemsControl, agendo sull'opacita' degli altri elementi non selezionati, rendendo questi piu' "offuscati".

Ho un custom control "MyCustomControl" che deriva da ItemsControl i cui item sono delle istanze di una classe "MyObject".
Ho fatto uno stile "MyStyle" per "MyCustomControl" che ridefinisce l'ItemTemplate in modo che diventi una Image la cui proprieta' Source e' in binding con la proprieta' LargeImage del mio oggetto "MyObject".
Quando seleziono un elemento vorrei che gli altri diventassero piu' offuscati, agendo sulla loro "opacity".
Ma non so come fare.

Ecco il mio codice XAML semplificato:

<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>

Pixel452
28-07-2010, 09:34
Puoi fare come fanno sia il ListBox che il ListView, al posto di inserire il contenuto direttamente nel pannello dell'ItemsControl lo inserisci dentro un tuo controllo che per esempio puoi chiamare MyCustomControlItem, questo oggetto esporrà una proprietà IsSelected che poi potrai usare per gestire l'opacity. Sostanzialmente wrappi il contenuto dentro un altro oggetto che ti aiuta a gestire le funzionalità del tuo controllo visuale, non ha senso mettere questa logica nella visualizzazione dei dati. A questo punto però, perchè non usare un ListBox?