2017-01-10 1 views
3

Ich versuche, ein WPF xctk: ColorPicker zu stylen. Ich möchte die Hintergrundfarbe der Dropdown-Ansicht ändern und Text ohne den gesamten Stil neu definieren.WPF: Gibt es eine Möglichkeit, einen Teil einer ControlTemplate zu überschreiben, ohne den gesamten Stil neu zu definieren?

Ich weiß, dass der ColorPicker z. ein Teil namens "PART_ColorPickerPalettePopup". Gibt es eine Möglichkeit, dass ich diesen Teil in meinem Stil direkt referenzieren kann, indem z. eine neue Hintergrundfarbe nur?

Ich möchte vermeiden, alle anderen Eigenschaften von "PART_ColorPickerPalettePopup" neu zu definieren.

Link to the ColorPicker I am describing

Antwort

5

Sie können einen Stil auf einem anderen Style stützen und specfic Setter außer Kraft setzen:

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

Aber man kann nicht "überschreiben" nur ein Teil eines Control. Leider müssen Sie dann das gesamte Template als Ganzes neu definieren.

3

Get Popup von Colorpicker über VisualTreeHelper und Grenz Eigenschaften (Kind von Pop-up) ändern wie folgt aus:

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