Xaml 如何在几个TextBlock控件上使用相同的样式,但使每个控件使用不同的绑定和触发器?

Xaml 如何在几个TextBlock控件上使用相同的样式,但使每个控件使用不同的绑定和触发器?,xaml,triggers,styles,Xaml,Triggers,Styles,我希望有几个文本块看起来大致相同,但每个文本块都需要在另一个触发器上以另一种方式做出反应。我尝试过使用一种通用样式MyTextBlockStyle,并在以后添加触发器。但我总是会遇到一些错误,比如属性“style”被声明了两次或两次 为了解释我的意思,我用3个文本块做了一个例子。其中2个绑定到每个不同的复选框,每个复选框触发不同的属性显示文本与前景色。第三个文本块应根据文本框的内容改变其背景色。我怎样才能做到这一点 <UserControl.Resources> &l

我希望有几个文本块看起来大致相同,但每个文本块都需要在另一个触发器上以另一种方式做出反应。我尝试过使用一种通用样式MyTextBlockStyle,并在以后添加触发器。但我总是会遇到一些错误,比如属性“style”被声明了两次或两次

为了解释我的意思,我用3个文本块做了一个例子。其中2个绑定到每个不同的复选框,每个复选框触发不同的属性显示文本与前景色。第三个文本块应根据文本框的内容改变其背景色。我怎样才能做到这一点

<UserControl.Resources>
        <Style x:Key="MyTextBlockStyle" TargetType="TextBlock">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="Margin" Value="10"/>
            <Setter Property="Padding" Value="5"/>
        </Style>
</UserControl.Resources>

<Grid >
        <StackPanel Margin="10">
            <CheckBox x:Name="CheckBox01" Content="Change Background of TextBlock 1" IsChecked="False" Foreground="White" Margin="5" />
            <CheckBox x:Name="CheckBox02" Content="Change Background of TextBlock 2" IsChecked="False" Foreground="White" Margin="5" />
            <TextBox x:Name="TextBox03" Padding="10" Background="White" Text="Enter Text here ..." Tooltip="Change Background of TextBlock 3"/>
            <TextBlock Style="{StaticResource MyTextBlockStyle}" >
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Text" Value="No" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=CheckBox01, Path=IsChecked}" Value="True">
                                <Setter Property="Text" Value="Yes!" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
            <TextBlock Style="{Static Resource MyTextBlockStyle}" Text="Something different">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Foreground" Value="Red" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=CheckBox02, Path=IsChecked}" Value="True">
                                <Setter Property="Foreground" Value="Green" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
            <TextBlock Style="{Static Resource MyTextBlockStyle}" Text="Anything else">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Background" Value="Yellow" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=TextBox03, Path=Text}" Value="">
                                <Setter Property="Background" Value="Blue" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </StackPanel>
</Grid >

请尝试一下这个代码。它很有效。我想这是你想要的

  <Window.Resources>       
    <Style TargetType="TextBlock">              
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding ElementName=CheckBox01,Path=IsChecked}" Value="True"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" Value="tb1"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="TextBlock.Background" Value="Orange"/>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding ElementName=CheckBox02,Path=IsChecked}" Value="True"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" Value="tb2"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="TextBlock.Background" Value="Pink"/>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding ElementName=TextBox03,Path=Text}" Value=""/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" Value="tb3"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="TextBlock.Background" Value="Green"/>
            </MultiDataTrigger>

        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid>
    <StackPanel Margin="10">           
        <CheckBox x:Name="CheckBox01" Content="Change Background of TextBlock 1" IsChecked="False"  Margin="5"/>          
        <CheckBox x:Name="CheckBox02" Content="Change Background of TextBlock 2" IsChecked="False" Margin="5"/>           
        <TextBox x:Name="TextBox03" Padding="10" Background="White" Text="Enter Text here ..."/>           
        <TextBlock Tag="tb1"/>
        <TextBlock Tag="tb2" Text="Something different"/>
        <TextBlock Tag="tb3" x:Name="tb3" Text="Anything else"/>               
    </StackPanel>
</Grid >

您正在寻找BasedOn酒店。它总是让我着迷

<TextBlock>
            <TextBlock.Style>
                <Style TargetType="TextBlock" BasedOn="MyTextBlockStyle">
                    <Setter Property="Text" Value="No" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=CheckBox01, Path=IsChecked}" Value="True">
                            <Setter Property="Text" Value="Yes!" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

那么,只有使用样式的方法了吗?由于每个触发器都非常独特,我希望以后可以直接在控件中“修改”样式,就像不使用“style=”属性一样。无论如何,谢谢你的解决方案。