我是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},但这不起作用。
提前感谢您的帮助。
发布于 2013-03-04 00:06:02
我认为问题在于LinearGradientBrush不是FrameworkElement,也不属于布局树。只有FrameworkElements具有DataContext属性,因此可以使用绑定。您要做的是在GradientStop上设置一个Binding。
您的触发器应该如下所示:
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Button.Background"
Value="{TemplateBinding Background, Converter={StaticResource myConverter}}">
</Setter>
</Trigger>myConverter是一个自定义的转换类,它将获取背景的值,并返回从输入画笔创建的完整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();
}
}发布于 2013-03-03 23:25:19
不能将Color与Background属性绑定,因为Background的返回类型是Brush而不是Color。
绑定Brush的颜色属性。因为后台绑定到资源CompanyBlue,所以也要在触发器中使用该绑定-
<GradientStop Color="{Binding Color, Source={StaticResource CompanyBlue}}"
Offset="0.5" />发布于 2013-03-03 23:59:21
像这样试一下
<GradientStop Color="White" Offset="0" />
<GradientStop Color="{DynamicResource CompanyBlue}" Offset="0.5" />
<GradientStop Color="White" Offset="1" />我希望这能有所帮助。
https://stackoverflow.com/questions/15187114
复制相似问题