带工具提示的Wpf TextBox样式

时间:2013-04-17 12:40:26

标签: wpf tooltip

我希望我的文本框根据验证状态显示特定文本作为工具提示。为此,我目前使用以下代码,它可以工作:

<TextBox Name="textBox1">
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="False">
                    <Setter Property="ToolTip" Value="{Binding XPath=HelpText/Description, Mode=OneTime}" />
                </Trigger>
                <Trigger Property="Validation.HasError" Value="True">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

如果没有错误,则显示从xml文件读取的描述文本,当出现错误时,将显示验证错误字符串。

问题是现在我必须复制这个样式并将其应用到每个文本框(并更改XPath,它对于每个文本框都是唯一的),我想要做的是将样式放在Window.Resources中我可以像这样在每个文本框中引用它:

<TextBox Name="textBox2" Style="{StaticResource TextBoxStyle}" />

但每个文本框的XPath都不同,所以我不能把我的风格放在Window.Resources中。如何在样式中创建特定于实例的XPath?有没有办法在不创建新文本框并从TextBox派生的情况下执行此操作?我想知道在这种情况下是否可以使用附属物,但我不知道它们是如何工作的。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我还没有对此进行过全面测试,但您可以使用附加属性 类似的东西:

class ToolTipHelper {
    public static readonly DependencyProperty ToolTipProperty =
            DependencyProperty.RegisterAttached("ToolTip", typeof(string) ...

然后你修改你的触发器:

<Trigger Property="Validation.HasError" Value="False">
  <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ToolTipHelper.ToolTip}, Mode=OneTime}" />
</Trigger>

你就像

一样使用它
<TextBox ToolTipHelper.ToolTip="{Binding XPath=HelpText/Description, Mode=OneTime}" />

答案 1 :(得分:0)

您可以使用Tag Property并将您的风格更改为

<Style TargetType="{x:Type TextBox}">
    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag}" />
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
        </Trigger>
    </Style.Triggers>
</Style>

然后将所需的XPath绑定到每个特定Tag的{​​{1}}属性

TextBox