首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF样式触发TemplateBinding

WPF样式触发TemplateBinding
EN

Stack Overflow用户
提问于 2013-03-03 23:15:41
回答 3查看 3.6K关注 0票数 3

我是WPF的新手,我正在努力寻找我想要做的事情的解决方案,因为我仍然有点不确定我这样做是否正确。

我为按钮定义了以下样式

代码语言:javascript
复制
<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},但这不起作用。

提前感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-04 00:06:02

我认为问题在于LinearGradientBrush不是FrameworkElement,也不属于布局树。只有FrameworkElements具有DataContext属性,因此可以使用绑定。您要做的是在GradientStop上设置一个Binding

您的触发器应该如下所示:

代码语言:javascript
复制
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Button.Background" 
                        Value="{TemplateBinding Background, Converter={StaticResource myConverter}}">
                </Setter>
            </Trigger>

myConverter是一个自定义的转换类,它将获取背景的值,并返回从输入画笔创建的完整LinearGradientBrush实例。我假设你知道如何编写转换器。请记住,它需要添加到资源中。

或多或少是这样的:

代码语言:javascript
复制
    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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-03-03 23:25:19

不能将ColorBackground属性绑定,因为Background的返回类型是Brush而不是Color

绑定Brush的颜色属性。因为后台绑定到资源CompanyBlue,所以也要在触发器中使用该绑定-

代码语言:javascript
复制
<GradientStop Color="{Binding Color, Source={StaticResource CompanyBlue}}"
              Offset="0.5" />
票数 0
EN

Stack Overflow用户

发布于 2013-03-03 23:59:21

像这样试一下

代码语言:javascript
复制
<GradientStop Color="White" Offset="0" />
<GradientStop Color="{DynamicResource CompanyBlue}"  Offset="0.5" />
<GradientStop Color="White" Offset="1" />

我希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15187114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档