我是 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>
在 XAML 中,我放置了占位符 {ORIGINAL-COLOR}
,我基本上希望这是之前使用 {TemplateBinding Background}
设置的值> 为样式的控件模板。
我看到建议我应该使用 {Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}
但这不起作用。
在此先感谢您的帮助。
最佳答案
我认为问题在于 LinearGradientBrush
不是 FrameworkElement
并且不属于布局树。只有 FrameworkElements
具有 DataContext
属性,因此可以使用绑定(bind)。您要做的是在 GradientStop
上设置一个 Binding
。
您的触发器应如下所示:
<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();
}
}
关于WPF 样式触发器 TemplateBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15187114/