1

我正在尝试创建一个文本块,该文本块在修剪时显示文本块文本的工具提示。我在转换器中处理了这个的实际可见性部分。我的问题是将工具提示的内容绑定到其部分文本块的文本。一段时间以来,我一直在摆弄不同的相对路径,除了空白的工具提示之外什么都得不到。如果我对工具提示内容中的某些内容进行硬编码,则文本会在我想要的时候显示得很好。

<Style x:Key="InfoToolTipBaseTextBlockStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockBase}">
    <Setter Property="ToolTip">
        <Setter.Value>
            <ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource TrimmedVisibilityConverter}}" Content="{Binding Path=Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBlock}}}"/>                
        </Setter.Value>
    </Setter>
</Style>
4

2 回答 2

3

无需创建始终存在的工具提示,设置其内容,然后切换其可见性,只需在 TextBlock 上设置一个样式触发器,在需要时将 ToolTip 属性设置为 Text。

我使用了您现有的转换器,但您可能希望将其重写为 return bool。然后你会Value="True"DataTrigger.

<Style 
    x:Key="InfoToolTipBaseTextBlockStyle" 
    TargetType="{x:Type TextBlock}" 
    BasedOn="{StaticResource TextBlockBase}"
    >
    <Style.Triggers>
        <DataTrigger 
            Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource TrimmedVisibilityConverter}}"
            Value="Visible"
            >
            <Setter Property="ToolTip" Value="{Binding Text, RelativeSource={RelativeSource Self}}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

我不知道这对您来说是否是个问题,但是如果Text在运行时发生更改,则工具提示将不会更新,因为该 Binding 不知道您关心该Text属性。解决方法是重写转换器,IMultiValueConverter以便您可以将它与具有绑定的 MultiBindingText以及Self. 它不必使用 Text,但它会在Text更改时更新目标。

一个更好的解决方案,更简单和 WPFish,将是编写一个行为来TextBlock回收转换器的内容,处理 Text 上的更改通知,并更新 TextBlock 上附加的TextBlockExt.IsTextElidedbool 属性。

于 2018-01-03T16:23:15.777 回答
2

就这样简单的解决了。

        <Style x:Key="InfoToolTipBaseTextBlockStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockBase}">
            <Setter Property="ToolTip">
                <Setter.Value>
                    <ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource TrimmedVisibilityConverter}}"
                             Content="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.Text}"/>
                </Setter.Value>
            </Setter>
        </Style>
于 2018-01-03T19:57:36.100 回答