WPF 功能区选项卡 - 无法绑定到功能区选项卡标题样式

本文关键字:选项 功能区 标题 样式 绑定 WPF | 更新日期: 2023-09-27 18:32:40

我尝试用不同的颜色自定义RibbonTabHeader。但是,我无法将动态值绑定到对象 RibbonTabHeader。可以通过将样式分配给 HeaderStyle 来自定义其样式。但是绑定方法BackgroundColor的get永远不会被调用。

Xaml:

<Style TargetType="{x:Type ribbon:RibbonTab}">
            <Setter Property="Header" Value="{Binding Header}" />
            <Setter Property="ItemsSource" Value="{Binding GroupDataCollection}" />
            <Setter Property="Visibility" Value="{Binding IsVisible}" />
            <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
            <Setter Property="HeaderStyle">
                <Setter.Value>
                    <Style TargetType="{x:Type ribbon:RibbonTabHeader}">
                        <Setter Property="Background" Value="{Binding BackgroundColor}"/>     
                    </Style>
                </Setter.Value>
             </Setter>
            <Setter Property="Foreground" Value="#333333" />
        </Style>

代码隐藏:

    public string BackgroundColor
    {
        get { return "Black";  }
    }

当我在代码隐藏中动态创建样式并将其分配给 HeaderStyle 时,它实际上是在工作。但这在我看来不是一种选择,因为我的风格会变得更加复杂(我必须删除渐变,绘制水平矩形,调整边框,..(。因此,在代码隐藏中动态创建所有内容会变得复杂。在 RibbonTab 中直接调用的其他绑定(即 IsEnabled(实际上正在工作。

有效的是以下代码:

在 Xaml 中:

  <Setter Property="HeaderStyle" Value="{Binding Style}"/>

在后面的代码中:

  public Style Style
  {
        get
        {
             Style style = new Style(typeof (RibbonTabHeader));
             style.Setters.Add(new Setter(RibbonTabHeader.BackgroundProperty, Brushes.Green));
             return style;
         }
   }

任何想法如何将动态值绑定到对象功能区选项卡标题?

我正在考虑在 xaml 中定义一种样式,然后通过代码隐藏中的 LoadResource 加载它。但我不确定以后是否可以克隆它以将所有不同的颜色分配给不同的选项卡。

WPF 功能区选项卡 - 无法绑定到功能区选项卡标题样式

经过几天的研究,我仍然没有找到我的问题的答案。

尽管如此,我还是找到了使其工作的解决方法。我最终做的是给我们一个自定义转换器来利用动态绑定的选项卡名称。

根据每个选项卡名称返回不同颜色的转换器如下所示:

public class TabNameToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.ToString() = "tabName")
            return "Red";
        return "Black";
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Xaml 如下所示(内容是选项卡的名称,它正在替换背景颜色(

<UserControl.Resources>
    <ResourceDictionary>
        <Converters:TabNameToColorConverter x:Key="TabNameToColorConverter" />
    </ResourceDictionary>
</UserControl.Resources>
<Style TargetType="{x:Type ribbon:RibbonTabHeader}">
            <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content,Converter={StaticResource TabNameToColorConverter}}"/>
</Style>