具有maxlength属性

时间:2015-12-15 10:32:27

标签: c# wpf xaml tooltip

我想在XAML中为我的TextBox做一个工具提示,我想用Xaml中的样式做这个。

工具提示应显示类似于输入x个字符的内容,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>

2 个答案:

答案 0 :(得分:0)

您可以尝试第一个代码示例。 更新添加了完整的样式代码以便澄清。

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

答案 1 :(得分:0)

MultiDataTrigger,顾名思义,适用于许多条件。你实际上从未使用过多个。您可以利用几个选项:

  1. 为textBox创建样式,并在set默认工具提示内设置为“Enter up to ..”并在样式触发器中检查MaxLength是否等于null或0,如果是这样,则将ToolTip设置为空。
  2. 将ToolTip属性绑定到MaxLength,并根据MaxLength是否设置在转换器中指定值
  3. 修改

     <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。总而言之,你最终被迫创建转换器。