【问题标题】:WPF - Disable tooltip when value is null or emptyWPF - 当值为空或为空时禁用工具提示
【发布时间】:2015-11-23 04:24:34
【问题描述】:

我有这个问题,我在 WPF 上使用 Telerik,在我的网格上使用源并进行正确的绑定。当绑定的值为空或为空时,我希望能够禁用工具提示。如何做呢? 这是一个例子:

<telerik:GridViewDataColumn x:Name="GRIDVIEWCOLUMN_ENDDATE" Header="Data de Conclusão" DataMemberBinding="{Binding ClosedDate, StringFormat=dd-MM-yyyy}" IsVisible="False" Width="auto" IsFilterable="False">
    <telerik:GridViewDataColumn.ToolTipTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ClosedDate, StringFormat=dd-MM-yyyy}" FontFamily="Segoe UI Light" FontSize="13.667" />
        </DataTemplate>
    </telerik:GridViewDataColumn.ToolTipTemplate>
</telerik:GridViewDataColumn>

【问题讨论】:

  • is ToolTip 有这样的 IsVisible/IsEnable 属性,或者您可以使用任何参数隐藏它。如果是这样,您可以为此属性编写转换器

标签: c# wpf xaml telerik


【解决方案1】:

只需将工具提示的可见性(在本例中,您提供了一个 TextBlock)绑定到相同的属性 - ClosedDate,然后使用转换器根据您的逻辑获取值。

public class TooltipVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (value is string)
        {
            return String.IsNullOrEmpty(value as string) ? Visibility.Collapsed :Visibility.Visible;
        }

        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException(); 
    }
}

在您的 XAML 中,您将拥有类似的内容。您在视图中的某处将转换器声明为静态资源,然后在绑定中引用它。

<converters:TooltipVisibilityConverter x:Key="TooltipVisibilityConverter"/>

<telerik:GridViewDataColumn x:Name="GRIDVIEWCOLUMN_ENDDATE" Header="Data de Conclusão" DataMemberBinding="{Binding ClosedDate, StringFormat=dd-MM-yyyy}" IsVisible="False" Width="auto" IsFilterable="False">
<telerik:GridViewDataColumn.ToolTipTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding ClosedDate, StringFormat=dd-MM-yyyy}" FontFamily="Segoe UI Light" FontSize="13.667" Visibility="{Binding ClosedDate, Converter={StaticResource x:Key="TooltipVisibilityConverter"}" />
    </DataTemplate>
</telerik:GridViewDataColumn.ToolTipTemplate>

【讨论】:

  • 不客气。如果有,请将帖子标记为答案。
  • 好吧,刚刚发生了另一个问题。似乎实际上文本块已折叠,但工具提示仍会弹出,但我可以注意到它更小,因此文本块不可见。
  • 需要深入研究 Telerik 文档才能找到答案。当我在家时,我会尽力提供帮助。
  • 有什么消息吗?我一直在研究其他解决方案,但无法做到。
  • @EchO,对于您提到的文本块为空的情况,请查看我上面的答案。希望对您有所帮助。
【解决方案2】:

我知道这是一个很老的问题,但我试图隐藏空的工具提示,并在这里找到了一种更简单的方法:http://wpfthoughts.blogspot.com/2014/02/hiding-empty-tooltips.html

基本上,如果您将资源字典放在 App.xaml 中,您可以自动隐藏应用程序中的所有空/空工具提示。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Style TargetType="{x:Type ToolTip}">
        <Style.Triggers>
            <Trigger Property="Content" Value="{x:Static sys:String.Empty}">
                <Setter Property="Visibility" Value="Collapsed"/>
            </Trigger> 
            <Trigger Property="Content" Value="{x:Null}"> 
                <Setter Property="Visibility" Value="Collapsed"/> 
            </Trigger> 
        </Style.Triggers> 
    </Style> 
</ResourceDictionary>

如果您只需要在一个地方使用它,那就太过分了,但这是一个超级简单的修复方法,可以让您不必在每个有工具提示的页面上添加代码。希望这可以帮助某人。

【讨论】:

    【解决方案3】:

    您可以考虑使用 IValueConverter 来显示/隐藏工具提示边框

          <telerik:GridViewDataColumn x:Name="GRIDVIEWCOLUMN_ENDDATE" Header="Data de Conclusão" DataMemberBinding="{Binding ClosedDate, StringFormat=dd-MM-yyyy}" IsVisible="False" Width="auto" IsFilterable="False">
                <telerik:GridViewDataColumn.ToolTipTemplate>
                    <DataTemplate>
                     <Border Background="Black" Visibility="{Binding ClosedDate, Converter={StaticResource BorderVisible}}" >
                        <TextBlock Text="{Binding ClosedDate, StringFormat=dd-MM-yyyy}" FontFamily="Segoe UI Light" FontSize="13.667" />
                     </Border>
                    </DataTemplate>
                </telerik:GridViewDataColumn.ToolTipTemplate>
            </telerik:GridViewDataColumn>
    
        class BorderVisibilitySetter : IValueConverter
        {
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
               //check if the control's content property is null or empty        
                if(value == null || value.ToString() == string.Empty)
                    return Visibility.Collapsed;
                else
                    return Visibility.Visible;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    

    【讨论】:

    • 好吧,刚刚发生了另一个问题。似乎实际上文本块已折叠,但工具提示仍会弹出,但我可以注意到它更小,因此文本块不可见。
    • @EchO,对于您提到的文本块为空的情况,请查看我上面的答案。希望对您有所帮助。
    【解决方案4】:

    将工具提示父控件 IsEnabled 设置为 false 将有效防止工具提示弹出,除非 ToolTipService.ShowOnDisabled 设置为 true。

    检查 george.zakaryan 的答案,但不是使用转换器将工具提示文本块的可见性绑定到其内容,而是使用类似的转换器将工具提示父级的 IsEnabled 属性绑定到其文本块的文本。

    public class StringToBoolConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is string)
            {
                return String.IsNullOrEmpty(value as string) ? false : true;
            }
    
            return false;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    在您的 xaml 中

    <UserControl.Resources>
        <utils:StringToBoolConverter x:Key="StringToBoolConverter"/>
    </UserControl.Resources>
    

    <TextBlock Text="{Binding SrcDrive, Mode=OneWay}" IsEnabled="{Binding SrcDrive, Converter={StaticResource StringToBoolConverter}, Mode=OneWay}" Width="400"  >
        <TextBlock.ToolTip>
            <TextBlock Text="{Binding SrcDrive, Mode=OneWay}"  />
        </TextBlock.ToolTip>
    </TextBlock>
    

    【讨论】:

      【解决方案5】:

      GridView 的 Native Telerik 工具提示有一个缺陷,即使您设置了Visibility=Collapsed,它仍然会显示一个空框(见下图):

      代码:

      <telerik:RadGridView.Columns>
          <telerik:GridViewDataColumn DataMemberBinding="{Binding Name}">
              <telerik:GridViewColumn.ToolTipTemplate>
                  <DataTemplate>
                      <TextBlock Text="{Binding Name}" Visibility="Collapsed" />
                  </DataTemplate>
              </telerik:GridViewColumn.ToolTipTemplate>
          </telerik:GridViewDataColumn>   
      </telerik:RadGridView.Columns>
      

      结果:


      解决方案:

      我没有使用null 检查转换器,而是跳过显示TextBlock.ToolTipOpeningEvent 触发时的工具提示。

      要在您的xaml.cs 中这样做,请执行以下操作:

      public partial class MainWindow: Window
      {
          public MainWindow()
          {
              InitializeComponent();
      
              EventManager.RegisterClassHandler(typeof(GridViewCell),
                 TextBlock.ToolTipOpeningEvent,
                 new RoutedEventHandler(OnToolTipOpening));
          }
      
          private void OnToolTipOpening(object sender, RoutedEventArgs e)
          {
              if (sender is GridViewCell cell)  // show tooltip only when text is trimmed
                  e.Handled = !IsTextTrimmed(cell);
          }
      
          static bool IsTextTrimmed(GridViewCell cell) => cell?.Value.ToString().Length > 50;
      }
      

      就是这样,无需编写任何额外的逻辑来显示/隐藏工具提示。

      【讨论】:

        猜你喜欢
        • 2013-03-07
        • 2012-08-07
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多