首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TemplateBinding与IValueConverter

TemplateBinding与IValueConverter
EN

Stack Overflow用户
提问于 2022-05-07 12:03:39
回答 1查看 56关注 0票数 0

我想在WPF项目中生成一个自定义按钮。我希望按钮以这样的方式改变它的背景色,这样就降低了不透明度。

因此,我有一个具有默认按钮样式的资源字典:

代码语言:javascript
复制
<Style x:Key="DefaultStyle" TargetType="{x:Type Button}">
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="{Binding Path=Background, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource OpacityConverter}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="GreenButton" TargetType="{x:Type Button}" BasedOn="{StaticResource DefaultStyle}">
        <Setter Property="Background" Value="{StaticResource Green}"/>
        <Setter Property="Foreground" Value="Black"/>
</Style>

用我的自定义转换器:

代码语言:javascript
复制
<conv:OpacityConverter x:Key="OpacityConverter"/>

用xmlns:conv="clr-namespace:ProjectNamespace.Converter":实现

代码语言:javascript
复制
public class OpacityConverter : IValueConverter
{

    public OpacityConverter()
    {

    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush brush = ((SolidColorBrush)value).Clone();
        brush.Opacity = 0.5;
        return brush;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush brush = ((SolidColorBrush)value).Clone();
        brush.Opacity = 1;
        return brush;
    }
}

在我的窗口里,我用这样的按钮:

代码语言:javascript
复制
<Button Grid.Row="1" Grid.Column="2" 
        Style="{StaticResource GreenButton}">
   <TextBlock Text="neues Projekt anlegen" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>

按钮看起来如下:

我想看看这个样子(如果是IsMouseOver == True):

但是,在IsMouseOver == True启动时,背景完全变白,按钮看起来如下:

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-07 12:55:30

因为您没有在触发器中为Setter指定TargetName,所以它隐式地引用Button并导致循环引用。若要修复它,请命名边框并在Setter中指定该名称。

代码语言:javascript
复制
<ControlTemplate TargetType="Button">
    <Border x:Name="border"
            Background="{TemplateBinding Background}">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="border"
                    Property="Background"
                    Value="{Binding Background, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource OpacityConverter}}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72152292

复制
相关文章

相似问题

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