最大长度文本框的工具提示 属性

Tooltip for Textbox with maxlength property

我想在 XAML 中为我的文本框制作工具提示,并且我想在 Xaml 中使用样式来完成此操作。

工具提示应显示类似 Enter up to x characters 的内容,其中 x 等于文本框的 MaxLength 属性。如果设置了 MaxLength,我只想显示工具提示。

我现在拥有的是:

    <Style x:Key="ToolTipTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource StandardTextBox}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding MaxLength, RelativeSource={RelativeSource Self}, Converter={StaticResource valueLargerThanZero}}"  Value="True"></Condition>
                </MultiDataTrigger.Conditions>
                <Setter Property="ToolTip">
                    <Setter.Value>
                        <TextBlock Margin="0" Text="{Binding MaxLength, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}, StringFormat='Enter up to {0} characters'}"/>
                    </Setter.Value>
                </Setter>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>

条件有效,因此如果设置了 MaxLength,则会显示工具提示。只有工具提示中的绑定不起作用。

我尝试过的其他东西是:

    <Style x:Key="ToolTipTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource StandardTextBox}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding MaxLength, RelativeSource={RelativeSource Self}, Converter={StaticResource valueLargerThanZero}}"  Value="True"></Condition>
                </MultiDataTrigger.Conditions>
                <Setter Property="ToolTip">
                    <Setter.Value>
                        <ToolTip Content="{Binding MaxLength, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}}" ContentStringFormat="{}Enter up to {0} characters"/>
                    </Setter.Value>
                </Setter>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>

这会产生与上面显示的选项相同的问题,但我无法正确设置工具提示的样式。

我试过的另一件事是:

    <Style x:Key="ToolTipTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource StandardTextBox}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding MaxLength, RelativeSource={RelativeSource Self}, Converter={StaticResource valueLargerThanZero}}"  Value="True"></Condition>
                </MultiDataTrigger.Conditions>
                <Setter Property="ToolTip" Value="{Binding MaxLength, RelativeSource={RelativeSource Self}, StringFormat='Enter up to {0} characters'}"/>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>

但这样字符串格式设置将不起作用。

我之前尝试过并且有效的方法是:

    <Style x:Key="ToolTipTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource StandardTextBox}">
        <Setter Property="DataContext"  Value="{Binding RelativeSource={RelativeSource Self}}"/>
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding MaxLength, Converter={StaticResource valueLargerThanZero}}"  Value="True"></Condition>
                </MultiDataTrigger.Conditions>
                <Setter Property="ToolTip">
                    <Setter.Value>
                        <TextBlock Margin="0" Text="{Binding MaxLength ,StringFormat='Enter up to {0} characters'}"/>
                    </Setter.Value>
                </Setter>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>

但是这样 TextBox 的 DataContext 和我的其他绑定就不再起作用了。

有没有人有解决方案(有利地)只包括 XAML?

编辑

在使用 MaxLength 转换器将文本输入最多 MaxLength 个字符时,它起作用了。

我用过:

    <Style x:Key="ToolTipTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource StandardTextBox}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding MaxLength, RelativeSource={RelativeSource Self}, Converter={StaticResource valueLargerThanZero}}"  Value="True">
                <Setter Property="ToolTip" Value="{Binding MaxLength, RelativeSource={RelativeSource Self}, Converter={StaticResource textBoxToolTipConverter}}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

您可以尝试使用第一个代码示例。 更新 添加了完整的样式代码以进行说明。

<Style x:Key="ToolTipTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource StandardTextBox}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding MaxLength, RelativeSource={RelativeSource Self}, Converter={StaticResource valueLargerThanZero}}" Value="True"></Condition>
            </MultiDataTrigger.Conditions>
            <Setter Property="ToolTip">
                <Setter.Value>
                    <TextBlock Margin="0" Text="{Binding DataContext.MaxLength, RelativeSource={RelativeSource Mode=Self}, StringFormat=Enter up to {0} characters}"/>
                </Setter.Value>
            </Setter>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

Mu​​ltiDataTrigger,顾名思义,可以在多种情况下使用。你实际上从来没有使用过一个以上。您可以利用几个选项:

  1. 为文本框创建样式,并在其中将默认工具提示设置为 "Enter up to..",并在样式触发器中检查 MaxLength 是否等于 null 或 0,如果是,则将工具提示设置为空。
  2. 绑定 ToolTip 属性 到 MaxLength 并在转换器中根据是否设置 MaxLength 赋值

编辑

 <TextBox Text="Text" MaxLength="55">
        <TextBox.Style>
            <Style TargetType="TextBox">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=MaxLength,StringFormat='Enter up to {0} characters'}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=MaxLength}" Value="0">
                        <Setter Property="ToolTip" Value="{x:Null}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

这将显示 maxLength,因为 ToolTip 需要以不同的方式设置 StringFormat。我建议你参考这个 post。总而言之,您最终被迫创建转换器。