Pregunta

Estoy escribiendo un control WPF que crea subclases de un botón.Luego proporciono un estilo predeterminado en Themes\generic.xaml, que se ve así (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 tuviera 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 aún puede ser personalizado por el usuario.¿Cómo hacer esto bajo mi control?

¡Gracias!

Solución de Michael Morton:

Puede proporcionar valores predeterminados como definidores de 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>
¿Fue útil?

Solución

Sólo puede definir definidores de 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"/>

A continuación, en su definición de estilo:

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

Otros consejos

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

Tener en cuenta en la cadena de seccond, que establece el color Negro con el valor por defecto de fondo.

Cuando declaras una propiedad de dependencia para tus controles, también declaras el valor predeterminado como UIPropertyMetadata.

esta propiedad tiene por defecto Brushes.Red, como 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 de hacerlo es estableciendo el color predeterminado en el constructor de su control personalizado, ya que siempre se llama al constructor antes de que el usuario establezca cualquier propiedad, si el usuario no las configura, usará de forma predeterminada la suya.De hecho, usted siempre los configurará y luego cualquier configuración de usuario anulará la suya.Esto es especialmente efectivo si desea establecer propiedades como Fondo que en realidad no está creando, las que provienen de las clases base de las que está heredando.

También es posible el estilo por defecto "hereda" del elemento Button mediante la creación de instancias 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top