【问题标题】:XAML Tooltip's StringFormat DateTime does not append a stringXAML 工具提示的 StringFormat DateTime 不附加字符串
【发布时间】:2014-01-10 17:16:08
【问题描述】:

我有工具提示翻转日期格式的触发器。两个触发器都起作用。但是,当我将字符串格式应用于第一个格式并向 DateTime 值添加/附加字符串“UTC”时,日期会以正确的日期时间格式正确显示,但“UTC”部分不会附加:

....
<DataTemplate.Triggers>
   <DataTrigger Binding="{Binding ShowUTC}" Value="True">           
      <Setter TargetName="brd" Property="Border.ToolTip" 
              Value="{Binding Path=SomeDate, 
               <!--Problem on the line below - the 'UTC' part isn't being added -->
               StringFormat={}{0:ddd MM/dd/yy HH:mm:ss} UTC}" />
   </DataTrigger>
   <DataTrigger Binding="{Binding ShowUTC}" Value="False">
       <Setter TargetName="brd" Property="Border.ToolTip" 
               Value="{Binding SomeDate, 
               Converter={StaticResource ToLocalTime}}"/>
   </DataTrigger>
 .....

这应该适用于每个 MSDN: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingbase.stringformat(v=vs.110).aspx 我也尝试了其他类型,并且可以正常工作,DateTime 有什么问题吗?

更新:

有趣的是在 TextBlock 上使用相同的代码:

Text="{Binding Path=EndInterval, StringFormat={}{0:ddd MM/dd/yy HH:mm:ss} UTC}"

但不在工具提示上:

<Border Tooltip="{Binding Path=EndInterval, StringFormat={}{0:ddd MM/dd/yy HH:mm:ss} UTC}"

【问题讨论】:

标签: wpf xaml string-formatting


【解决方案1】:

由于绑定到 ToolTip,它隐式设置 Content 属性。工具提示有一个 ContentFormatString 属性,当您想要格式化时使用该属性。我尚未对其进行测试,但我认为以下内容会起作用。

<DataTemplate.Triggers>
  <DataTrigger Binding="{Binding ShowUTC}" Value="True">           
    <Setter TargetName="brd" Property="Border.ToolTip" 
            Value="{Binding Path=SomeDate}" />
    <Setter TargetName="brd" Property="Border.ToolTip.ContentFormatString" 
            Value="{}{0:ddd MM/dd/yy HH:mm:ss} UTC" />
  </DataTrigger>
  <DataTrigger Binding="{Binding ShowUTC}" Value="False">
    <Setter TargetName="brd" Property="Border.ToolTip" 
            Value="{Binding SomeDate, 
            Converter={StaticResource ToLocalTime}}"/>
  </DataTrigger>
</DataTemplate.Triggers>

【讨论】:

  • 哇,不知道+1!我会检查一下。我唯一的保留是Border.ToolTip.ContentFormatString - 我的结果好坏参半,嵌套深度超过 2 层。
  • 是的.. 三重嵌套没有编译,但会很酷。
  • 要添加到@denismorozov 评论,上述解决方案既不能编译也不能工作。
【解决方案2】:

好吧,对于遇到同样问题的任何人,我都会发布我最终做了什么。

由于我无法直接在 ToolTip 上使用 StringFormat。 我最终对其进行了样式化,并将 StringFormat 直接应用于 ToolTip 内的TextBlock

<Border ..>
  <Border.ToolTip>
    <ToolTip>
       <TextBlock>
          <TextBlock.Style>
             <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Text" 
                        Value="{Binding Path=SomeDate, 
                                        Converter={StaticResource ToLocalTime}}"/>
                   <Style.Triggers>
                       <DataTrigger Binding="{Binding ShowUtc}" Value="True">
                           <Setter Property="Text" Value="{Binding Path=SomeDate, 
                                   StringFormat={}{0:ddd MM/dd/yy HH:mm:ss} UTC}"/>
                       </DataTrigger>
                   </Style.Triggers>
              </Style>
           </TextBlock.Style>
       </TextBlock>
     </ToolTip>
  </Border.ToolTip>
</Border>

【讨论】:

    【解决方案3】:

    最后,我不得不求助于转换器,因为我在 SO 上没有找到任何东西。

    using System;
    using System.Globalization;
    using System.Windows.Data;
    
    namespace Converters
    {
        [ValueConversion(typeof(DateTime), typeof(string))]
        public class DateTimeStringFormatConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is DateTime && parameter != null)
                    return ((DateTime)value).ToString(parameter.ToString());
                return value;
            }
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return null;
            }
        }
    }
    

    用法

    <Border ToolTip="{Binding DateTime, Converter={StaticResource DateTimeStringFormatConverter}, ConverterParameter=yyyy}"/>
    

    简单而有效。

    【讨论】:

      【解决方案4】:

      StringFormat 没有任何问题。使用这个简单的代码时,我可以看到UTC

      <TextBlock Text="{Binding Time, StringFormat={}{0:ddd MM/dd/yy HH:mm:ss} UTC}" />
      

      因此,我向您建议,文本的结尾可能会被截断,要么是由于覆盖控件,要么是控件显示的文本不够宽。无论哪种方式,如果您尝试这个简化的代码,您会发现它可以工作,因此问题出在其他地方。

      【讨论】:

      • 哦,没想到文字会被截断!有这个可能,我去看看,谢谢! +1!现在我想得更多,宽度由第一个触发文本设置,该文本更短,并且由于某种原因不会调整第二个文本的大小。
      • 经过一些测试,我发现它确实适用于文本块,但不适用于工具提示,很奇怪.. 我想我必须为工具提示创建一个模板并在那里填充一个文本块
      • 再次感谢您的帖子,您使用TextBlock 而不是ToolTip 的示例将我指向解决方案区域。
      猜你喜欢
      • 2015-12-29
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2020-08-19
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多