【问题标题】:How to bind ToolTip content in a custom textblock styles property setter如何在自定义文本块样式属性设置器中绑定工具提示内容
【发布时间】:2018-06-13 08:03:08
【问题描述】:

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

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

【问题讨论】:

    标签: c# xaml xaml-binding


    【解决方案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 RelativeSource={RelativeSource Self}, Path=PlacementTarget.Text}"/>
                    </Setter.Value>
                </Setter>
            </Style>
    

    【讨论】:

      【解决方案2】:

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

      我使用了您现有的转换器,但您可能需要重写它以返回 bool。然后你会在DataTrigger 中有Value="True"

      <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,这样您就可以将它与绑定到TextSelf 的MultiBinding 一起使用。它不必使用 Text,但它会在Text 更改时更新目标。

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

      【讨论】:

      • 我想通了。我更新了转换器以返回布尔值,但不返回数据触发值绑定中的值。现在工作正常谢谢!我很惊讶没有一种更简单的本地方法可以做到这一点,因为我认为这是一个常见问题。
      • 谢谢@Ed。这让我很烦。
      • 不客气。我很遗憾 TextBlock 没有指示 Text 当前是否被省略的属性。这将本着 WPF 的精神。事实上,为 TextBlock 编写一个行为应该一点也不难,它可以回收转换器的内容,处理 Text 上的更改通知,并更新 TextBlock 上附加的 TextBlockExt.IsTextElided bool 属性。
      • ha 也许我说得太早了.. 我可以在我去吃午饭之前发誓这是工作,但现在转换器,在检查实际宽度时,总是有一个零值,所以它总是返回真。非常失望:(
      • 我的第一个疯狂猜测是它只被调用一次——在创建时,在 TextBlock 获取其文本之前。我会查看 MultiConverter/MultiBinding 的东西,并绑定(但不使用)文本,以便每次文本更改时都会更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2018-12-07
      相关资源
      最近更新 更多