WPF:为什么DataTrigger会删除我的默认样式?

时间:2017-01-28 06:27:25

标签: xaml styles override datatrigger

只是学习WPF并且无法弄清楚这种行为。例如:

enter image description here

Label从Window上的StaticResource获取其初始样式。然后,我有两种方法来改变标签的样式:

  1. 使用按钮(通过CodeBehind)
  2. 使用复选框(通过DataTrigger绑定)。
  3. 单击Button后,我无法再通过CheckBox更改样式。 对不起,我不明白为什么会这样。在此先感谢能帮助我的人:-)以下是代码:

    XAML:

    <Window x:Class="WtfDataTrigger.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WtfDataTrigger"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="Label" x:Key="LabelStyle">
                <Setter Property="Foreground" Value="Red" />
            </Style>
        </Window.Resources>
        <StackPanel>
            <Label Name="Label1" Content="Label1" FontSize="24">
                <Label.Style>
                    <Style TargetType="Label" BasedOn="{StaticResource LabelStyle}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=Checkbox, Path=IsChecked}" Value="True">
                                <Setter Property="Foreground" Value="Aqua" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Label.Style>
            </Label >
            <Button Content="Click Me to Change Label Style Using Routed Events" FontSize="18" Click="Button_Click" />
            <CheckBox Name="Checkbox" Content="Check Me to Change Label Style Using Data Trigger" FontSize="18">
    
            </CheckBox>
    
        </StackPanel>
    </Window>
    

    代码隐藏:

    private void Button_Click(object sender, RoutedEventArgs e)
        {
            Label1.Foreground = new SolidColorBrush(Colors.DarkOrange);
        }
    

1 个答案:

答案 0 :(得分:0)

这是因为按钮点击时绑定会丢失。直接更改在XAML中绑定的值后,新值将一起删除绑定。你可能需要另外一个触发器并迫使它发生。您可以编写代码来继续绑定或重新实例化原始绑定,但这有点过分。我个人建议,如果你打算使用XAML,请远离Code;我自己强迫自己永远不要在代码背后写代码,但这是一个设计选择,所以你选择这样做。

如果你必须使用代码,并且你希望主要坚持XAML,那么你将需要构建使用DependencyProperties等的自定义控件,并像其他控件一样保持它们的完全通用性。

这是主题,但底线是您已通过单击按钮并直接设置Foreground属性来删除绑定。如果你必须使用背后的代码并希望保留绑定,我不介意发布代码来实现这一点,你可以选择同意与否,但设计这种方式有点令人头疼。