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

时间:2010-07-27 09:20:22

标签: wpf

我知道这个问题听起来有点奇怪,但我想更改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>

2 个答案:

答案 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更改时触发状态更改,但您明白了。