WPF:有没有办法在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?

Posted

技术标签:

【中文标题】WPF:有没有办法在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?【英文标题】:WPF: Is there a way to override part of a ControlTemplate without redefining the whole style? 【发布时间】:2017-05-25 00:24:57 【问题描述】:

我正在尝试设置 WPF xctk:ColorPicker 的样式。我想更改下拉视图和文本的背景颜色而不重新定义整个样式。

我知道 ColorPicker 包含例如一个名为“PART_ColorPickerPalettePopup”的部分。有没有一种方法可以让我以我的风格直接引用这部分,例如提供一种新的背景颜色

我想避免重新定义“PART_ColorPickerPalettePopup”的所有其他属性。

Link to the ColorPicker I am describing

【问题讨论】:

【参考方案1】:

您可以基于另一种样式的样式并覆盖特定的设置器:

<Style x:Key="myStyle" TargetType="xctk:ColorPicker" BasedOn="StaticResource x:Type xctk:ColorPicker">
    <!-- This will override the Background setter of the base style -->
    <Setter Property="Background" Value="Red" />
</Style>

但您不能仅“覆盖”ControlTemplate 的一部分。不幸的是,您必须(重新)将整个模板定义为一个整体。

【讨论】:

【参考方案2】:

通过 VisualTreeHelper 从 ColorPicker 获取弹出窗口并更改边框属性(弹出窗口的子项),如下所示:

   private void colorPicker_Loaded(object sender,RoutedEventArgs e)
    
        Popup popup = FindVisualChildByName<Popup> ((sender as DependencyObject),"PART_ColorPickerPalettePopup");
        Border border = FindVisualChildByName<Border> (popup.Child,"DropDownBorder");
        border.Background = Brushes.Yellow;
    

    private T FindVisualChildByName<T>(DependencyObject parent,string name) where T:DependencyObject
    
        for (int i = 0;i < VisualTreeHelper.GetChildrenCount (parent);i++)
        
            var child = VisualTreeHelper.GetChild (parent,i);
            string controlName = child.GetValue (Control.NameProperty) as string;
            if (controlName == name)
            
                return child as T;
            
            else
            
                T result = FindVisualChildByName<T> (child,name);
                if (result != null)
                    return result;
            
        
        return null;
    

【讨论】:

你应该得到一枚奖牌。很好的解决方案!

以上是关于WPF:有没有办法在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

WPF:在不知道项目的情况下更改组合框的字体大小

有没有办法在不重新启动调试器的情况下评估nodejs中的promise?

有没有办法在不通知 ItemsSource 集合的情况下使用 ObservableCollection 和 MVVM 刷新 WPF DataGrid?

如何在InDesign文档中找到所有对象样式覆盖

有没有办法在不覆盖现有类名的情况下将类名添加到 blazor 组件?

有没有办法在不读取整个文件的情况下推断文件是啥图像格式?