Wpf 在ItemsControl中,如何更改所有未选中项目的不透明度?

Wpf 在ItemsControl中,如何更改所有未选中项目的不透明度?,wpf,Wpf,我知道这个问题听起来有点奇怪,但我想更改ItemsControl中未选中的所有项目的不透明度。换句话说,我希望使所选项目更“可见”,使其他项目更“模糊” 我有一个自定义控件“MyCustomControl”,它派生自ItemsControl,其中每个项都是类“MyObject”的实例 我为我的自定义控件创建了一个样式,其中我将ItemTemplate设置为一个源属性绑定到“MyObject”的属性“LargeImage”的图像。 问题来了。当我选择一个项目,我想设置其他元素的不透明度,但我还没有

我知道这个问题听起来有点奇怪,但我想更改ItemsControl中未选中的所有项目的不透明度。换句话说,我希望使所选项目更“可见”,使其他项目更“模糊”

我有一个自定义控件“MyCustomControl”,它派生自ItemsControl,其中每个项都是类“MyObject”的实例

我为我的自定义控件创建了一个样式,其中我将ItemTemplate设置为一个源属性绑定到“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>


上面展示了如何使用列表框来实现这一点,以避免与您自己的类型混淆。它假定您的数据项(
MyObject
)具有
IsSelected
属性,并且您已将转换器资源放在可视化树中的某个位置


您可以放弃转换器,而在
IsSelected
更改时触发状态更改,但您知道了。

我认为一个非常简单的解决方案是在使用“IsSelected”属性的数据模板中添加触发器,使用触发器或DataTrigger,类似于:

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

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