WPF:有没有一种方法来覆盖ControlTemplate的一部分,而不重新定义整个样式?

我想风格WPF xctk:ColorPicker。 我想更改下拉视图和文本的背景颜色,而不用重新定义整个样式。

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

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

链接到我所描述的ColorPicker

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

<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的一部分。 不幸的是,你必须重新定义整个模板。

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

  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; }