Вы можете стиль ListBoxItem
, чтобы вызвать на IsSelected
собственности. Вот пример:
, а затем использовать его как это:
<ListBox ItemContainerStyle="{StaticResource yourListBoxItemStyle}">
или непосредственно в ListBox
сам:
<ListBox.ItemContainerStyle>
<Style TargetType=”ListBoxItem”>
...
</Style>
</ListBox.ItemContainerStyle>
Edit:
Вот полный пример как с ItemTemplate
, так и с номером ItemContainerStyle
, который помещает полупрозрачный слой поверх выбранного элемента.
<Grid>
<Grid.Resources>
<x:Array Type="sys:String" x:Key="sampleData">
<sys:String>Red</sys:String>
<sys:String>Green</sys:String>
<sys:String>Blue</sys:String>
</x:Array>
<DataTemplate x:Key="listBoxItem">
<Rectangle Fill="{Binding}" Width="100" Height="100"/>
</DataTemplate>
<Style TargetType="ListBoxItem" x:Key="listBoxItemStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid>
<ContentPresenter />
<Rectangle x:Name="Rectangle" Fill="Black" Opacity="0"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Rectangle" Property="Opacity"
Value="0.5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<ListBox
ItemsSource="{StaticResource sampleData}"
ItemTemplate="{StaticResource listBoxItem}"
ItemContainerStyle="{StaticResource listBoxItemStyle}"
/>
</Grid>
Редактировать
После комментария, вот версия с помощью "единого" шаблона:
<Style TargetType="ListBoxItem" x:Key="listBoxItemStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid>
<Rectangle Name="Rectangle" Fill="{Binding}" Width="100" Height="100" Opacity="1"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Rectangle" Property="Opacity"
Value="0.5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
так вы говорите НЕ использовать ItemTemplate вообще? – Mark
Нет, продолжайте использовать свой «ItemTemplate». «ContentPresenter» в «ControlTemplate» в примере приведет к «расширению» вашего «ItemTemplate». –
ОК спасибо за код, но я не вижу, как это будет работать, если я хочу изменить свойство элемента управления (в вашем случае класса Rectangle) в DataTemplate, поскольку вы не можете получить доступ к элементу управления из шаблона itemcontainer – Mark