style link attribute wpf attached-properties templatebinding

wpf - link - title attribute wordpress



Enlace de plantillas con propiedades adjuntas (2)

Creo que TemplateBinding se evalúa en tiempo de compilación, por lo que no puede establecer dinámicamente TemplateBinding en su Setter, intente usar Binding en su lugar (ver más abajo).

<Setter TargetName="border" Property="BorderBrush" Value="{Binding Path=(local:ThemeProperties.ButtonBorderColour), RelativeSource={RelativeSource TemplatedParent}}"/>

Espero que esto ayude.

Tengo un estilo estándar para mis botones pero quiero que ciertas partes del estilo sean configurables. Por ejemplo, aparece un borde cuando se activa MouseOver para el botón y quiero que el color del borde sea configurable.

Siguiendo este artículo: http://www.thomaslevesque.com/2011/10/01/wpf-creating-parameterized-styles-with-attached-properties/ Pensé que podría usar propiedades adjuntas y TemplateBinding para lograr esto.

He creado la siguiente propiedad adjunta:

public static class ThemeProperties { public static Brush GetButtonBorderColour(DependencyObject obj) { return (Brush)obj.GetValue(ButtonBorderColourProperty); } public static void SetButtonBorderColour(DependencyObject obj, Brush value) { obj.SetValue(ButtonBorderColourProperty, value); } public static readonly DependencyProperty ButtonBorderColourProperty = DependencyProperty.RegisterAttached( "ButtonBorderColour", typeof(Brush), typeof(ThemeProperties), new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.Inherits)); }

Establecí la propiedad como tal:

<Button Style="{StaticResource RedButton}" local:ThemeProperties.ButtonBorderColour="#B20000"/>

Y mi estilo se ve así:

<Window.Resources> <Style x:Key="RedButton" TargetType="Button"> <Setter Property="OverridesDefaultStyle" Value="True"/> <Setter Property="Margin" Value="2"/> <Setter Property="FontFamily" Value="Tahoma"/> <Setter Property="FontSize" Value="11px"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="Foreground" Value="White"/> <Setter Property="MinHeight" Value="25" /> <Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisual}" /> <Setter Property="Background" > <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" > <GradientStop Color="#FECCBF" Offset="0.2"/> <GradientStop Color="Red" Offset="0.85"/> <GradientStop Color="#FECCBF" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border Name="border" BorderThickness="1" Padding="4,2" BorderBrush="Transparent" CornerRadius="3" Background="{TemplateBinding Background}"> <Grid > <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Name="content"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="border" Property="BorderBrush" Value="{TemplateBinding local:ThemeProperties.ButtonBorderColour}" /> <Setter Property="Foreground" Value="#B20000" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" > <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" > <GradientStop Color="#FECCBF" Offset="0.35"/> <GradientStop Color="Red" Offset="0.95"/> <GradientStop Color="#FECCBF" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter TargetName="content" Property="RenderTransform" > <Setter.Value> <TranslateTransform Y="1.0" /> </Setter.Value> </Setter> </Trigger> <Trigger Property="IsDefaulted" Value="True"> <Setter TargetName="border" Property="BorderBrush" Value="#B20000" /> </Trigger> <Trigger Property="IsFocused" Value="True"> <Setter TargetName="border" Property="BorderBrush" Value="#B20000" /> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter TargetName="border" Property="Opacity" Value="0.7" /> <Setter Property="Foreground" Value="Gray" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources>

Donde esta la linea clave

<Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="border" Property="BorderBrush" Value="{TemplateBinding local:ThemeProperties.ButtonBorderColour}" /> <Setter Property="Foreground" Value="#B20000" /> </Trigger>

Por lo que puedo ver, esto debería funcionar pero aparece el siguiente error durante el tiempo de ejecución en la línea anterior:

No se puede convertir el valor en el atributo ''Valor'' al objeto de tipo ''''. Error en el objeto ''System.Windows.Setter'' en el archivo de marcado

¿He hecho algo incorrecto aquí? Soy nuevo en WPF y no entiendo qué está mal, ya que el Tipo de la propiedad adjunta es un Pincel, que es lo que esperaría de la propiedad BorderBrush de un Borde.


Prueba esto:

<Setter TargetName="border" Property="BorderBrush" Value="{TemplateBinding Path=(local:ThemeProperties.ButtonBorderColour)}" />

La diferencia es que los paréntesis alrededor de la propiedad indican que es una propiedad adjunta.