WPF 样式触发器 TemplateBinding

标签 wpf controltemplates

我是 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/

相关文章:

c# - 如何正确对齐 WPF GeometryGroup 中的路径?

c# - WPF 组合框绑定(bind)空值

c# - WPF资源字典的使用方法

c# - 绑定(bind)到控件模板

SharePoint 找不到我的自定义 RenderingTemplate

c# - WPF:如何找到可用于 Canvas 的空间?

c# - 为什么单击树抛出 'System.Windows.Documents.Run' 不是 Visual 或 Visual3D 的 InvalidOperationException?

c# - WPF - 基于 listviewitem 选择的更改控件。控件不更新

wpf - 设置 WPF 布局网格背景(每个单元格、行、列)的样式