从其他样式绑定到样式资源库

本文关键字:样式 资源库 绑定 其他 | 更新日期: 2023-09-27 18:31:17

如何将一个样式设置器的前景色绑定到另一个样式设置器的填充颜色,它应该是相同的对象类型。这是我在下面得到的代码!

收到以下错误:

System.Windows.Data 错误:4:找不到要绑定的源 引用"元素名称=菜单项路径"。绑定表达式:路径=填充; 数据项=空;目标元素是"文本块"(名称=");目标 属性为"前景"(类型"画笔")

<Style x:Key="MenuItemName" TargetType="TextBlock">
        <Setter Property="Foreground" Value="{Binding ElementName=MenuItemPath, Path=Fill}" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="HorizontalAlignment" Value="Left" />
    </Style>
    <ControlTemplate x:Key="MenuItem" TargetType="RadioButton">
        <ControlTemplate.Resources>
            <Style TargetType="Path" x:Name="MenuItemPath">
                <Setter Property="Fill" Value="#FF22252C" />
                <Setter Property="Height" Value="25" />
                <Setter Property="Width" Value="25" />
                <Setter Property="Stretch" Value="Uniform" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type RadioButton}}, Path=IsChecked}" Value="True">
                        <Setter Property="Fill" Value="White" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ControlTemplate.Resources>

从其他样式绑定到样式资源库

就个人而言,我会创建一个单独的资源来存储画笔颜色,并从两个位置引用它。

<SolidColorBrush Color="#FF22252C" x:Key="MenuFillColor" /> 
<Style x:Key="MenuItemName" TargetType="TextBlock">
    <Setter Property="Foreground" Value="{StaticResource MenuFillColor}" />
    ...
</Style>
<ControlTemplate x:Key="MenuItem" TargetType="RadioButton">
    <ControlTemplate.Resources>
        <Style TargetType="Path" x:Name="MenuItemPath">
            <Setter Property="Fill" Value="{StaticResource MenuFillColor}" />
            ...
        </Style>
    </ControlTemplate.Resources>
</ControlTemplate>

也就是说,我从未真正尝试绑定到另一个 Style 的 Setter.Value 属性......假设所有内容都是相同的范围,这可能是可能的。您看起来可能有不同的作用域,因为您使用<ControlTemplate.Resources>将 MenuItemPath 样式的范围限制为该控件模板。但就我个人而言,我不会尝试它,并且会假设任何需要这样的东西的要求也可以用更好的方式完成:)

在 wpf 中无法访问其他样式的外部属性,这就是出现绑定错误的原因。相反,您可以在资源中声明一种颜色,并从中可以访问它。

我使它比需要的更复杂,我只是添加了一个数据触发器来解决问题:

<Style x:Key="MenuItemName" TargetType="TextBlock">
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsChecked, ElementName=MenuItemRadio}" Value="True">
                <Setter Property="Foreground" Value="White" />
            </DataTrigger>
        </Style.Triggers>
    </Style>