我知道这个问题听起来有点奇怪,但我想更改ItemsControl中未选中的所有项目的不透明度。换句话说,我想让所选项目更“明显”,显示其他项目更“混淆”。
我有一个从ItemsControl派生的自定义控件“MyCustomControl”,其中每个项目都是“MyObject”类的实例。
我为自定义控件创建了一个样式,我将ItemTemplate设置为一个Image属性,该属性绑定到“MyObject”属性“LargeImage”。 这就是问题所在。当我选择一个项目时,我想设置其他元素的不透明度,但我还没找到方法!
这是我的(简化的)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>
答案 0 :(得分:1)
我认为一个非常简单的解决方案是使用Trigger或DataTrigger为使用“IsSelected”属性的数据模板添加一个触发器,如下所示:
<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>
答案 1 :(得分:0)
<ListBox>
<ListBox.ItemContainerStyle>
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
<Setter Property="Opacity" Value="{Binding IsSelected, Converter={StaticResource YourOpacityConverter}}"/>
</ListBox.ItemContainerStyle>
</ListBox>
以上显示了如何使用ListBox执行此操作,以避免与您自己的类型混淆。它假设您的数据项(MyObject
)具有IsSelected
属性,并且您已将转换器资源放在可视树中的某处。
您可以放弃转换器,而是在IsSelected
更改时触发状态更改,但您明白了。