【问题标题】:How can I use the same style on several TextBlock controls, but have each control using different bindings and triggers?如何在多个 TextBlock 控件上使用相同的样式,但让每个控件使用不同的绑定和触发器?
【发布时间】:2014-12-23 17:59:28
【问题描述】:

我希望有几个 TextBlock 通常看起来相同,但每个都需要以另一种方式对另一个触发器做出反应。我尝试使用通用样式(MyTextBlockStyle)并稍后添加触发器。但是我总是收到错误消息,例如“属性'样式'已被声明两次”或类似的。

为了解释我的意思,我用 3 个文本块做了一个例子。其中 2 个绑定到每个不同的 CheckBox,并且每个都触发不同的属性(显示的文本与前景色)。第三个 TextBlock 应根据 TextbBox 的内容更改其背景颜色。我怎样才能实现这样的目标?

<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 >

【问题讨论】:

    标签: xaml triggers styles


    【解决方案1】:

    请尝试此代码。它可以工作。我想如你所愿

      <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 >
    

    【讨论】:

    • 那么只有使用样式的方法吗?由于这些触发器每个都相当独特,我希望以后可以直接在控件中“修改”样式,就像我不使用“style =”属性一样。无论如何,感谢您的解决方案。
    【解决方案2】:

    您正在寻找 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多