【问题标题】:ToolTip ignores specified DateTime format specifier工具提示忽略指定的 DateTime 格式说明符
【发布时间】:2016-12-08 09:58:42
【问题描述】:

我在 WPF 中遇到一个关于 ToolTips 的奇怪问题:

首先,代码:

<TextBlock Text="{Binding SelectedItem.Approver.Timestamp, StringFormat='{}{0:g}'}"
           ToolTip="{Binding SelectedItem.Approver.Timestamp, StringFormat='{}{0:f}'}" />

如您所见,“g format specifier”(例如2016-12-24 23:42)用于时间戳的显示,“f format specifier”(例如Saturday, 24. December 2016 23:42)用于其ToolTip

但是,我得到的是:2016-12-24 23:42。换句话说:ToolTip 显示的格式与TextBlock 完全相同。

当将TextBlock 切换为“f 格式说明符”时,它也变得更加奇怪:ToolTip 只是停留在“g 格式说明符”指定的格式中。

那么,我有两个问题:
a) 为什么会这样?
以及
b) 如何强制执行我想要的格式?

【问题讨论】:

  • 熟悉 WPF 但我有几个问题:1) 因为这些是标准格式,所以不是 StringFormat=gStringFormat=g 够吗? 2) 你不能使用自定义的日期和时间格式来代替StringFormat=yyyy-MM-dd HH:mmStringFormat=dddd, dd. MMMM yyyy HH:mm 吗? 3) 用于格式化的文化不是sq-AL,不是吗?由于gf 格式说明符生成相同的结果,因为此区域性对于LongDatePatternShortDatePattern 属性具有相同 值。
  • 关于你的问题:1):不,你可以看到here2):我不想对 .NET 中已经内置的东西进行自定义硬编码。 3):不,不是。然而,还有其他几个Cultures 被使用,例如。 G。 de-DE。但最重要的是:fg会产生不同的输出。

标签: c# wpf datetime tooltip format-specifiers


【解决方案1】:

我让它工作了。

<TextBlock Text="{Binding SelectedItem.Approver.Timestamp, StringFormat={}{0:g}}">
  <TextBlock.ToolTip>
    <ToolTip Content="{Binding SelectedItem.Approver.Timestamp}" ContentStringFormat="{}{0:f}" />
  </TextBlock.ToolTip>
</TextBlock>

由于 Tooltip 可以包含任何内容,我们应该使用它的 ContentStringFormat。

【讨论】:

  • 感谢您的第二个建议。通过ContentStringFormat 详细指定它确实会改变显示的格式。但它没有回答为什么会缩短格式的问题。
  • 由于 Tooltip 可以包含任何东西,任何对象,它内部有一个简单的转换器 ToString,它忽略了 DataBinding 中定义的 StringFormat。这就是为什么 Tooltip 有一个 ContentStringFormat
  • 感谢您的见解。这几乎就是我一直在寻找的。最后一件事:没有机会让它保持单线,例如在ToolTip 属性中使用ContentStringFormat 而不是内联定义(请纠正我,如果这不是&lt;TextBlock.ToolTip&gt; ... &lt;/TextBlock.ToolTip&gt; 的正确技术术语形式!)?
  • 嗨。没有办法像这样使用:“ 如果您只想在一行中使用,我相信您应该改变方法:在 ViewModel 中创建另一个只读属性,重新调整您想要格式化的 Timestamp 值并将这个新属性绑定到 Tooltip。
  • 遗憾的是没有可用的附加属性。无论如何,您已经全面回答了所有问题 - 因此我很乐意接受您的第二个答案!再次,非常感谢! :)
【解决方案2】:

我认为语法不正确。

见:

<TextBlock Text="{Binding SelectedItem.Approver.Timestamp, StringFormat={}{0:g}}"
           ToolTip="{Binding SelectedItem.Approver.Timestamp, StringFormat={}{0:f}}" />

【讨论】:

  • 不,这样的参数用单引号封装是无效的。但是,由于急于尝试建议,我尝试了不带单引号的方法。不幸的是,结果保持不变。 :(
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 2018-07-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2016-01-15
  • 2018-02-13
  • 2022-01-14
相关资源
最近更新 更多