web-dev-qa-db-ja.com

WPF ControlTemplate:TemplateBindingのデフォルト値を提供する方法は?

Buttonをサブクラス化する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>

ユーザーにコントロールの背景を変更する機会を与えたいのですが、変更しない場合は、デフォルト値を提供したいと思います。どうすればいいのですか?

投稿されたコードのように行うと、ユーザーが明示的に指定しない限り、BackgroundとBorderBrushはnull(=存在しない)になります(これにより、ユーザーは常に何らかの値を提供するようになります)が、標準のウィンドウコントロール(Buttonなど)はデフォルトの外観を提供します、それでもユーザーがカスタマイズできます。私のコントロールでこれを行う方法は?

ありがとうございました!

マイケルモートンによる解決策:

次のスタイルのセッターとしてデフォルトを指定できます。

<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>
28
Tomáš Kafka

問題の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}" />
19
Michael Morton
<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>

2番目の文字列に注意してください。黒色を背景のデフォルト値に設定しました。

3

サンプルインスタンスを作成し、そのプロパティを参照することで、Button要素のデフォルトスタイルを「継承」することもできます。

<Button x:Key="DefaultButton"/>

<Style TargetType="{x:Type TestTemplate:MyButton}">
        <Setter Property="Background"
                Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>
2
Marcin Wisnicki

コントロールの依存関係プロパティを宣言するときは、デフォルトも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つの方法は、カスタムコントロールのコンストラクターでデフォルトの色を設定することです。これは、ユーザーがプロパティを設定しなかった場合、ユーザーがプロパティを設定する前にコンストラクターが常に呼び出されるためです。実際、それらは常にあなたによって設定され、ユーザー設定はあなたのものを上書きします。これは、実際には作成していないBackgroundなどのプロパティ、つまり継承元の基本クラスから取得したプロパティを設定する場合に特に効果的です。

2
Aran Mulholland