WPF: есть ли способ переопределить часть ControlTemplate без переопределения всего стиля?

Я пытаюсь создать WPF xctk: ColorPicker. Я хочу изменить цвет фона раскрывающегося списка и текста без переопределения всего стиля.

Я знаю, что ColorPicker содержит, например. часть с именем «PART_ColorPickerPalettePopup». Есть ли способ, которым я могу напрямую ссылаться на эту часть в своем стиле, предоставляя, например. новый цвет фона только?

Я хочу избежать переопределения всех остальных свойств PART_ColorPickerPalettePopup.

Ссылка на ColorPicker, который я описываю


person Ben Hayward    schedule 10.01.2017    source источник


Ответы (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. К сожалению, вы должны затем (пере)определить весь шаблон целиком.

person mm8    schedule 10.01.2017

Получите всплывающее окно из 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;
    }
person mohsen mousavi    schedule 10.01.2017
comment
Ты заслужил медаль. Отличное решение! - person Avrohom; 04.02.2020