"标签"...... WPF中的特殊功能?

WPF*_*-it 8 wpf xaml

MSDN说"获取或设置一个可用于存储有关此元素的自定义信息的任意对象值." 这意味着我可以在这个属性中存储我想要的任何东西.

但是如果你绑定到这个属性(类型为String的属性,其值为"XYZ")并在触发条件下使用它,它就不起作用!

  <Trigger Property="Tag" Value="XYZ">
      <Setter Property="Background" Value="Red" />
  </Trigger>
Run Code Online (Sandbox Code Playgroud)

它不会将背景设置为红色.您可以尝试将myElement假设为TextBlock!为什么会这样?

小智 9

Tag是一个从Winforms时代开始的构造(也可能是之前的那个!).它被用作将对象与UI元素相关联的便利位置,例如带有Button的FileInfo,因此在Button的事件处理程序中,您可以简单地将事件发送者,将其强制转换为Button,然后将Tag值转换为a FileInfo,您可以获得有关要打开的文件的所有信息.

然而,有一种情况,我发现Tag它在WPF中很有用.我已经将它用作可以由ContextMenu MenuItem访问的保留点,它不能使用您用来遍历可视树的常规RelativeSource绑定.

<ListBox.ItemContainerStyle>
        <Style
            TargetType="ListBoxItem">
            <Setter
                Property="Tag"
                Value="{Binding ElementName=TheUserControlRootElement}" />
            <Setter
                Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem
                            Header="_Remove"
                            ToolTip="Remove this from this list"
                            CommandParameter="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                            Command="{Binding PlacementTarget.Tag.Remove, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)

从中ContextMenu,我无法访问在定义此代码段的类中定义的Remove命令UserControl.但我可以绑定根到TagListBoxItem,这是我可以访问通过ContextMenu.PlacementTarget性能.在a中绑定时可以使用相同的技巧ToolTip,因为相同的限制适用.


Ern*_*rno 8

Tag在WPF中没有特殊功能.

这对我有用:

<TextBlock Tag="{Binding Data}"
           x:Name="tb">
    <TextBlock.Style>
        <Style>
            <Style.Triggers>
                <Trigger Property="TextBlock.Tag"
                         Value="XYZ">
                     <Setter Property="TextBlock.Background"
                             Value="Lime" />
                </Trigger>
            </Style.Triggers>        
        </Style>
    </TextBlock.Style>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

并在事件中将Data对象属性设置为"XYZ".

  • @AngelWPF,可以犯错误,事实上,这是我们学习的唯一方法,因此可以做更多的事情。你怎么了 (2认同)