2017-01-10 4 views
3

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

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

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

Link to the ColorPicker I am describing

ответ

5

Вы можете основывать стиль на другой стиль и переопределить specfic сеттеры:

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

3

Получить всплывающие окна от 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; 
    } 
Смежные вопросы