8

WPF xctk:ColorPicker のスタイルを設定しようとしています。スタイル全体を再定義せずに、ドロップダウン ビューとテキストの背景色を変更したい。

ColorPicker には、たとえば「PART_ColorPickerPalettePopup」という名前のパーツが含まれていることを知っています。たとえば、新しい背景色のみを提供して、スタイルでこの部分を直接参照できる方法はありますか?

「PART_ColorPickerPalettePopup」の他のすべてのプロパティを再定義する必要はありません。

私が説明している ColorPicker へのリンク

4

2 に答える 2

9

別のスタイルに基づいてスタイルを作成し、特定のセッターをオーバーライドできます。

<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 の一部だけを「オーバーライド」することはできません。残念ながら、テンプレート全体をまとめて (再) 定義する必要があります。

于 2017-01-10T13:38:51.343 に答える
5

VisualTreeHelper を介して ColorPicker からポップアップを取得し、境界線のプロパティ (ポップアップの子) を次のように変更します。

   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;
    }
于 2017-01-10T16:01:12.973 に答える