WPF - 当值为null或为空时禁用工具提示

时间:2015-08-28 13:27:40

标签: c# wpf xaml telerik

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

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

enter image description here

5 个答案:

答案 0 :(得分:5)

只需将工具提示的可见性(在本例中,您提供了一个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>

答案 1 :(得分:2)

您可以考虑使用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();
        }
    }

答案 2 :(得分:1)

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

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

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>

答案 3 :(得分:0)

我知道这是一个很老的问题,但是我试图隐藏空的工具提示,并在这里找到了一种更简单的方法: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>

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

答案 4 :(得分:0)

GridView的原生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>

结果:

enter image description here


解决方案:

代替使用null检查Converter,对我有用的方法是在触发TextBlock.ToolTipOpeningEvent 跳过显示 工具提示。< / p>

要在您的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;
}

就是这样,不需要编写任何其他逻辑来显示/隐藏工具提示。