我是WPF的新手,我正在努力找到我正在尝试做的解决方案,因为我仍然不确定我是否正确地这样做。
我为按钮定义了以下样式
<Style x:Key="ToolBarButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Margin" Value="5" />
<Setter Property="BorderBrush" Value="White" />
<Setter Property="Background" Value="{DynamicResource CompanyBlue}" />
<Setter Property="Foreground" Value="White" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="FontSize" Value="20" />
<Setter Property="Width" Value="100" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="ButtonBorder" BorderThickness="5" CornerRadius="5"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}"
Width="{TemplateBinding Width}">
<ContentPresenter Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Button.Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,-0.2" EndPoint="0,1.2">
<LinearGradientBrush.GradientStops>
<GradientStop Color="White" Offset="0" />
<GradientStop Color="{ORIGINAL-COLOR}" Offset="0.5" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
在我放置占位符{ORIGINAL-COLOR}
的XAML中,我基本上希望这是以前使用{TemplateBinding Background}
设置的值,用于样式的控件模板。
我见过我应该使用{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}
的建议,但这不起作用。
提前感谢您的帮助。
答案 0 :(得分:2)
我认为问题是LinearGradientBrush
不是FrameworkElement
且不属于布局树。只有FrameworkElements
具有DataContext
属性,因此可以使用绑定。您要做的是在Binding
上设置GradientStop
。
您的触发器应如下所示:
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Button.Background"
Value="{TemplateBinding Background, Converter={StaticResource myConverter}}">
</Setter>
</Trigger>
myConverter
是一个自定义转换器类,它将获取Background的值并返回从输入画笔创建的完整LinearGradientBrush
实例。我假设您知道如何编写转换器。请记住,它需要添加到资源中。
或多或少这样的事情:
class BrushToGradient : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var brush = (Brush)value;
var gradient = new LinearGradientBrush();
//Make it manually
gradient.GradientStops.Add(...);
//...
return gradient;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
答案 1 :(得分:0)
您无法将Color
与Background
属性绑定,因为Background
的返回类型为Brush
而非Color
。
使用Brush
的Color属性绑定。由于背景绑定到资源CompanyBlue
,因此也要在触发器中使用该绑定 -
<GradientStop Color="{Binding Color, Source={StaticResource CompanyBlue}}"
Offset="0.5" />
答案 2 :(得分:0)
尝试这样
<GradientStop Color="White" Offset="0" />
<GradientStop Color="{DynamicResource CompanyBlue}" Offset="0.5" />
<GradientStop Color="White" Offset="1" />
我希望这会有所帮助。