c# - WPF: Est-il possible de remplacer une partie d'un ControlTemplate sans redéfinir le style entier?




styles color-picker (2)

Obtenez un popup de ColorPicker via VisualTreeHelper et modifiez les propriétés de la bordure (enfant de popup) comme ceci:

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

J'essaye de dénommer un WPF xctk: ColorPicker. Je souhaite modifier la couleur d'arrière-plan de la vue déroulante et du texte sans redéfinir le style.

Je sais que le ColorPicker contient par exemple une partie nommée "PART_ColorPickerPalettePopup". Est-il possible de référencer directement cette partie dans mon style, en fournissant par exemple une nouvelle couleur d'arrière-plan uniquement ?

Je veux éviter d'avoir à redéfinir toutes les autres propriétés de "PART_ColorPickerPalettePopup".

Lien vers le ColorPicker que je décris


Vous pouvez baser un style sur un autre style et remplacer les paramètres spécifiques:

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

Mais vous ne pouvez pas "remplacer" uniquement une partie d'un ControlTemplate. Malheureusement, vous devez ensuite (re) définir le modèle entier dans son ensemble.







wpf-extended-toolkit