WPF: есть ли способ переопределить часть ControlTemplate без переопределения всего стиля?
Я пытаюсь стилизовать WPF xctk:ColorPicker. Я хочу изменить цвет фона раскрывающегося списка и текста без переопределения всего стиля.
Я знаю, что ColorPicker содержит, например, часть с именем "PART_ColorPickerPalettePopup". Есть ли способ, которым я могу напрямую ссылаться на эту часть в своем стиле, предоставляя, например, только новый цвет фона?
Я хочу избежать переопределения всех других свойств "PART_ColorPickerPalettePopup".
2 ответа
Вы можете основывать Стиль на другом Стиле и переопределять специфические сеттеры:
<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. К сожалению, вы должны (пере) определить весь шаблон в целом.
Получите всплывающее окно из ColorPicker через VisualTreeHelper и измените свойства границы (дочерний элемент всплывающего окна) следующим образом:
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;
}