C# 在不同类型上使用触发器属性,而在WPF样式上使用setter属性

C# 在不同类型上使用触发器属性,而在WPF样式上使用setter属性,c#,wpf,C#,Wpf,当窗口本身的依赖属性为false时,我希望将主窗口上一组图像的不透明度设置为0.25,当依赖属性为true时恢复它们。我曾尝试为此使用样式触发器,但在dependency属性与opacity属性的类型不同时遇到了困难 <Window.Resources> <Style x:Key="IconEnabledStyle" TargetType="Image"> <Style.Triggers>

当窗口本身的依赖属性为false时,我希望将主窗口上一组图像的不透明度设置为0.25,当依赖属性为true时恢复它们。我曾尝试为此使用样式触发器,但在dependency属性与opacity属性的类型不同时遇到了困难

    <Window.Resources>
        <Style x:Key="IconEnabledStyle" TargetType="Image">
            <Style.Triggers>
                <!-- MenuOptionsEnabled is on main window. Opacity is on Image -->
                <Trigger Property="MenuOptionsEnabled" Value="False">
                    <Setter Property="Opacity" Value="0.25"></Setter>
                </Trigger>
                <Trigger Property="MenuOptionsEnabled" Value="True">
                    <Setter Property="Opacity" Value="1.0"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>


正如您所看到的,触发器属性与Setter属性位于不同的类型上。是否有一种方法可以定义触发器和Setter属性的类型。

要解决此问题,您可以使用
DataTrigger
RelativeSource
来查找祖先
窗口,如下所示:

<Style x:Key="IconEnabledStyle" TargetType="Image">
    <Style.Triggers>    
       <DataTrigger Binding="{Binding MenuOptionsEnabled, 
                    RelativeSource={RelativeSource AncestorType=Window}}" 
                    Value="False">
          <Setter Property="Opacity" Value="0.25"></Setter>
       </DataTrigger>
    </Style.Triggers>
</Style>

请注意,默认的
不透明度
已经是
1
。因此,无需任何触发器即可将其重置为
1
。当条件满足时,将其设置为
0.25
,否则将自动重置为之前的值