wpf styles default controltemplate templatebinding

Plantilla de control de WPF: ¿Cómo proporcionar un valor predeterminado para TemplateBinding?



styles default (4)

Cuando declara una propiedad de dependencia para sus controles, también declara el valor predeterminado como UIPropertyMetadata

esta propiedad por defecto es Brushes.Red, como se puede ver en la última línea.

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

la otra forma en que podría hacerlo es estableciendo el color predeterminado en el constructor de su control personalizado, ya que el constructor siempre recibe una llamada antes de que el usuario establezca las propiedades si el usuario no las configura por defecto. De hecho, siempre se establecerán por usted y luego cualquier configuración de usuario anulará la suya. Esto es especialmente efectivo si desea establecer las propiedades tales como el Fondo que no está creando en realidad, las que provienen de las clases base de las que está heredando.

Estoy escribiendo un control WPF que subclasifica un botón. Luego proporciono un estilo predeterminado en Themes / generic.xaml, que tiene este aspecto (simplificado):

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

Me gustaría que el usuario tenga la oportunidad de cambiar el fondo del control, pero si no lo hace, me gustaría proporcionar un valor predeterminado. ¿Cómo lo hago?

Cuando lo hago como en el código publicado, el Fondo y el BorderBrush son nulos (= inexistentes) a menos que el usuario los especifique explícitamente (lo que efectivamente obliga al usuario a proporcionar siempre algún valor), pero los controles estándar de Windows (como el Botón) proporcionan una apariencia predeterminada , que todavía puede ser personalizado por el usuario. ¿Cómo hacer esto en mi control?

¡Gracias!

Solución de Michael Morton:

Puede proporcionar valores predeterminados como configuradores en estilo:

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

Uso:

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


Puede definir definidores en su estilo para las dos propiedades en cuestión.

Por ejemplo, algunas definiciones generales:

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

Luego, en su definición de estilo:

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


También es posible "heredar" el estilo predeterminado del elemento Button creando una instancia de ejemplo y haciendo referencia a sus propiedades:

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


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

Preste atención a la cadena de segundos, establezco el color Negro en el valor predeterminado de Fondo.