37 Stimmen

WPF ControlTemplate: Wie man einen Standardwert für TemplateBinding bereitstellen?

Ich schreibe ein WPF-Steuerelement, das eine Schaltfläche unterklassifiziert. Ich stelle dann einen Standardstil in Themes \generic.xaml die wie folgt aussieht (vereinfacht):

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

Ich möchte, dass der Benutzer die Möglichkeit hat, den Hintergrund des Steuerelements zu ändern, aber wenn er das nicht tut, möchte ich einen Standardwert vorgeben. Wie kann ich das tun?

Wenn ich es wie in den geposteten Code zu tun, ist der Hintergrund und BorderBrush null (= nicht vorhanden), es sei denn, Benutzer explizit angibt, Sie (die effektiv zwingt Benutzer immer einen Wert bereitstellen), aber die Standard-Windows-Steuerelemente (wie Button) bieten ein Standard-Look, die noch vom Benutzer angepasst werden können. Wie kann ich dies in meinem Steuerelement tun?

Ich danke Ihnen!

Lösung von Michael Morton:

Sie können Standardwerte als Setzer im Stil angeben:

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

Verwendung:

<StackPanel>
    <TestTemplate:MyButton Background="Blue">Explicitly blue</TestTemplate:MyButton>
    <TestTemplate:MyButton>Naturally red</TestTemplate:MyButton>
</StackPanel>

23voto

Mara Morton Punkte 4379

Sie können für die beiden fraglichen Eigenschaften einfach Setter für Ihren Stil definieren.

Zum Beispiel einige allgemeine Definitionen:

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

Dann, in Ihrer Stildefinition:

<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}" />
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}" />

7voto

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

Achten Sie auf den zweiten String, ich habe die schwarze Farbe auf den Standardwert Background gesetzt.

3voto

Aran Mulholland Punkte 22956

Wenn Sie eine Abhängigkeitseigenschaft für Ihre Steuerelemente deklarieren, deklarieren Sie auch den Standard als UIPropertyMetadata

Diese Eigenschaft ist standardmäßig auf Brushes.Red eingestellt, wie Sie in der letzten Zeile sehen können.

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

die andere Möglichkeit, die Sie tun könnten, ist durch die Einstellung der Standardfarbe im Konstruktor des benutzerdefinierten Steuerelements, wie der Konstruktor immer aufgerufen wird, bevor alle Eigenschaften durch den Benutzer festgelegt werden, wenn der Benutzer nicht, um sie zu setzen sie standardmäßig auf Ihre würde. In der Tat würden sie immer von Ihnen festgelegt werden und dann jede Benutzereinstellung wird Ihre überschreiben. Dies ist besonders effektiv, wenn Sie Eigenschaften wie Hintergrund festlegen möchten, die Sie nicht selbst erstellen, sondern die aus den Basisklassen stammen, von denen Sie erben.

2voto

Marcin Wisnicki Punkte 4097

Es ist auch möglich, den Standardstil der Button Element, indem Sie eine Beispielinstanz erstellen und auf seine Eigenschaften verweisen:

<Button x:Key="DefaultButton"/>

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X