34

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

4 に答える 4

22

問題の 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}" />
于 2009-11-25T00:26:33.593 に答える
5
<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 番目の文字列に注意してください。黒を背景のデフォルト値に設定しました。

于 2013-11-17T02:10:45.347 に答える
3

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

于 2009-11-24T23:29:38.173 に答える
2

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

<Button x:Key="DefaultButton"/>

<Style TargetType="{x:Type TestTemplate:MyButton}">
        <Setter Property="Background"
                Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>
于 2012-03-26T12:20:06.753 に答える