首页 > 解决方案 > 在运行时根据枚举值更改边框背景

问题描述

我正在设计一个自定义控件,我希望用户能够使用自定义属性更改背景颜色。背景颜色应由名为 Severity 的枚举指定:

代码

public enum Severity
{
    Warning,
    Information,
    Success,
    Error
}

Xaml

<Border Background="{DynamicResource InfoBarInformationalSeverityBackgroundBrush}" 
        CornerRadius="4">
    <Grid Margin="10">
        <TextBlock Text="{Binding Title, 
            RelativeSource={RelativeSource AncestorType=ib:InfoBar}}"/>
    </Grid>
</Border>

<InfoBar Severity="Error"/>

我尝试了触发器,但它似乎不起作用

更新:

Xaml

<Border>
    <Border.Style>
        <Style TargetType="Border">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Severity, 
                             RelativeSource={RelativeSource AncestorType=ib:InfoBar}}" 
                             Value="Error">
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Severity, 
                             RelativeSource={RelativeSource AncestorType=ib:InfoBar}}" 
                             Value="Success">
                    <Setter Property="Background" Value="Green"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

代码

public Severity Severity
{
    get { return (Severity) GetValue(SeverityProperty); }
    set { SetValue(SeverityProperty, value); }
}
    
public static readonly DependencyProperty SeverityProperty =
    DependencyProperty.Register("Severity", typeof(Brushes), typeof(InfoBar));

标签: c#wpftriggers

解决方案


依赖属性应注册为 aSeverity而不是Brushes

public static readonly DependencyProperty SeverityProperty =
    DependencyProperty.Register(nameof(Severity), typeof(Severity), typeof(InfoBar));

然后假设是控件Border的可视子项,您的示例应该可以工作:InfoBar

<b:InfoBar Severity="Warning">
        <Border>
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Severity, RelativeSource={RelativeSource AncestorType=b:InfoBar}}" Value="Warning">
                            <Setter Property="Background" Value="Red"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Severity, RelativeSource={RelativeSource AncestorType=b:InfoBar}}" Value="Success">
                            <Setter Property="Background" Value="Green"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
            <TextBlock Text="{Binding Severity, RelativeSource={RelativeSource AncestorType=b:InfoBar}}" />
        </Border>
    </StackPanel>
</b:InfoBar>

推荐阅读