WPF:有没有一种方法可以在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?
WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?
我正在尝试设置 WPF 样式 xctk:ColorPicker。我想更改下拉视图和文本的背景颜色 而无需 重新定义整个样式。
我知道 ColorPicker 包含例如一个名为 "PART_ColorPickerPalettePopup" 的部分。有没有一种方法可以在我的风格中直接引用这部分,例如提供新的背景颜色 only?
我想避免重新定义 "PART_ColorPickerPalettePopup" 的所有其他属性。
您可以将一种样式建立在另一种样式的基础上并覆盖特定的设置器:
<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>
但是您不能 "override" 只使用 ControlTemplate 的一部分。不幸的是,您随后必须(重新)定义整个模板作为一个整体。
通过 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 样式 xctk:ColorPicker。我想更改下拉视图和文本的背景颜色 而无需 重新定义整个样式。
我知道 ColorPicker 包含例如一个名为 "PART_ColorPickerPalettePopup" 的部分。有没有一种方法可以在我的风格中直接引用这部分,例如提供新的背景颜色 only?
我想避免重新定义 "PART_ColorPickerPalettePopup" 的所有其他属性。
您可以将一种样式建立在另一种样式的基础上并覆盖特定的设置器:
<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>
但是您不能 "override" 只使用 ControlTemplate 的一部分。不幸的是,您随后必须(重新)定义整个模板作为一个整体。
通过 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;
}