【问题标题】:Change DockPanel's already set property using style trigger使用样式触发器更改 DockPanel 的已设置属性
【发布时间】:2014-05-23 21:58:42
【问题描述】:

我想使用样式触发器根据某些属性(例如标签)更改停靠面板的外观。这是我的代码:

<DockPanel Grid.Row="0" LastChildFill="True" 
                   Name="MyDockPanel"
                   Tag="{Binding TagForColor}"
                   Background="Blue"
                   Width="300">
            <DockPanel.Resources>
                <Style TargetType="{x:Type DockPanel}">
                    <Style.Triggers>
            <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="Alert">
                <Setter Property="DockPanel.Background" Value="Red"/>
                <Setter Property="DockPanel.Width" Value="100"/>
                <Setter Property="TextBlock.FontSize" Value="30"/>
            </DataTrigger>

                    </Style.Triggers>
                </Style>
            </DockPanel.Resources>
            <TextBlock Text="My Text" 
                       DockPanel.Dock="Top"
                       Name="MyText"
                       Foreground="White">
            </TextBlock>

背景和宽度等属性一旦设置就不会被触发器更新。我验证了触发器已被触发,因为我的文本块的大小确实增加了。

谁能告诉我这种行为背后的原因?

谢谢, RDV

【问题讨论】:

    标签: wpf triggers dockpanel


    【解决方案1】:

    您需要将Background 的默认值作为Setter 移动到Style 中,否则Trigger 将无法覆盖手动设置的值(它具有更高的优先级)。 Width 也有同样的问题。另外,与您的问题无关,但您可以使用Trigger 而不是Trigger

    <DockPanel Grid.Row="0" LastChildFill="True" Name="MyDockPanel" Tag="{Binding TagForColor}">
        <DockPanel.Resources>
            <Style TargetType="{x:Type DockPanel}">
                <Setter Property="Background" Value="Blue"/>
                <Setter Property="Width" Value="300"/>
                <Style.Triggers>
                    <Trigger Property="Tag" Value="Alert">
                        <Setter Property="Background" Value="Red"/>
                        <Setter Property="Width" Value="100"/>
                        <Setter Property="TextBlock.FontSize" Value="30"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DockPanel.Resources>
        <TextBlock Text="My Text" DockPanel.Dock="Top" Name="MyText" Foreground="White"/>
    </DockPanel>
    

    阅读更多关于Dependency Property Value Precedence

    【讨论】:

      【解决方案2】:

      你需要在 Style 中移动 Background 和 Width。如果你想为 Background 和 Width 属性分配一些默认值,你应该在 style 的 setter 中设置它们。这样无论何时 您的触发器触发,控件将从触发器获取值。这是wpf的属性值继承。这里是链接:http://wpftutorial.net/DependencyProperties.html#valueres.

      这段代码应该适合你:

       <DockPanel Grid.Row="0" LastChildFill="True" 
                     Name="MyDockPanel"
                     Tag="{Binding TagForColor}"
      
                     >
          <DockPanel.Resources>
              <Style TargetType="{x:Type DockPanel}">
                  <Setter Property="Background" Value="Blue"></Setter>
                  <Setter Property="Width" Value="300"></Setter>
                  <Style.Triggers>
                      <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="Alert">
                          <Setter Property="DockPanel.Background" Value="Red"/>
                          <Setter Property="DockPanel.Width" Value="100"/>
                          <Setter Property="TextBlock.FontSize" Value="30"/>
                      </DataTrigger>
      
                  </Style.Triggers>
              </Style>
          </DockPanel.Resources>
          <TextBlock Text="My Text" 
                         DockPanel.Dock="Top"
                         Name="MyText"
                         Foreground="White">
          </TextBlock>
      </DockPanel>
      

      如果这对您有用,请告诉我。 谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        相关资源
        最近更新 更多