WPF ControlTemplate:テンプレートバインディングにデフォルト値を提供する方法は?
-
22-09-2019 - |
質問
ボタンをサブクラス化するWPFコントロールを作成しています。次に、Themes generic.xamlのデフォルトスタイルを提供します。
<Style TargetType="{x:Type WPFControls:MyButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type WPFControls:MyButton}">
<Button
x:Name="PART_Button"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ユーザーにコントロールのバックグラウンドを変更する機会を持ってもらいたいのですが、そうでない場合は、デフォルトの値を提供したいと思います。どうすればいいのですか?
投稿されたコードのようにそれを行うと、ユーザーがそれらを明示的に指定しない限り(ユーザーに常に何らかの価値を提供するように強制します)、標準のWindowsコントロール(ボタンなど)がデフォルトの外観を提供しない限り、背景と境界線はnull(= nonexistent)です。 、それはまだユーザーによってカスタマイズできます。私のコントロールでこれを行う方法は?
ありがとうございました!
マイケル・モートンによる解決策:
スタイルのセッターとしてデフォルトを提供できます。
<Style TargetType="{x:Type TestTemplate:MyButton}">
<Setter Property="Background" Value="Red" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TestTemplate:MyButton}">
<Button
x:Name="PART_Button"
IsEnabled="{TemplateBinding IsEnabled}"
Content="{TemplateBinding Content}"
Background="{TemplateBinding Background}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用法:
<StackPanel>
<TestTemplate:MyButton Background="Blue">Explicitly blue</TestTemplate:MyButton>
<TestTemplate:MyButton>Naturally red</TestTemplate:MyButton>
</StackPanel>
解決
問題の2つのプロパティのスタイルのセッターを定義するだけです。
たとえば、いくつかの一般的な定義:
<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#F3F3F3" Offset="0"/>
<GradientStop Color="#EBEBEB" Offset="0.5"/>
<GradientStop Color="#DDDDDD" Offset="0.5"/>
<GradientStop Color="#CDCDCD" Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
次に、あなたのスタイルの定義で:
<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}" />
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}" />
他のヒント
<Style TargetType="{x:Type WPFControls:MyButton}">
<Setter Property="Background" Value="Black">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type WPFControls:MyButton}">
<Button
x:Name="PART_Button"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
SecCond文字列に注意してください。背景のデフォルト値に黒色を設定します。
コントロールの依存関係プロパティを宣言する場合、デフォルトをuipropertymetadataとして宣言します
このプロパティは、最後の行で見ることができるように、デフォルトでbrushes.redです。
public Brush MyBrush {
get { return (Brush)GetValue(MyBrushProperty); }
set { SetValue(MyBrushProperty, value); }
}
public static readonly DependencyProperty MyBrushProperty =
DependencyProperty.Register("MyBrush", typeof(Brush), typeof(MyQsFeature), new UIPropertyMetadata(Brushes.Red));
もう1つの方法は、カスタムコントロールのコンストラクターにデフォルトの色を設定することです。ユーザーがデフォルトに設定できない場合、ユーザーがプロパティを設定する前にコンストラクターが常に呼び出されるためです。実際、彼らは常にあなたによって設定され、その後、ユーザー設定はあなたのものをオーバーライドします。これは、実際に作成していない背景などのプロパティ、あなたが継承している基本クラスから来ているプロパティなどのプロパティを設定する場合に特に効果的です。
デフォルトスタイルを「継承」することも可能です Button
サンプルインスタンスを作成し、そのプロパティを参照することにより、要素:
<Button x:Key="DefaultButton"/>
<Style TargetType="{x:Type TestTemplate:MyButton}">
<Setter Property="Background"
Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>