gpt4 book ai didi

WPF 样式触发器 TemplateBinding

转载 作者:行者123 更新时间:2023-12-04 14:06:24 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com