仅在禁用的项目上显示WPF工具提示

时间:2010-05-23 06:43:37

标签: c# wpf binding tooltip ivalueconverter

只是想知道是否可以在禁用的项目 ONLY 上显示WPF(而不是在项目启用时)。

我想向用户提供一个工具提示,解释当前禁用某个项目的原因。

我有一个IValueConverter来反转布尔IsEnabled属性绑定。但它似乎不适用于这种情况。当项目启用和禁用时,ToolTip都会显示。

可以将ToolTip.IsEnabled属性专门绑定到项目自己的属性!IsEnabled

我想这是一个非常直截了当的问题,但无论如何都是代码示例:

public class BoolToOppositeBoolConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(bool))
            throw new InvalidOperationException("The target must be a boolean");

        return !(bool)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(bool))
            throw new InvalidOperationException("The target must be a boolean");

        return !(bool)value;
    }

    #endregion
}

和绑定:

<TabItem Header="Tab 2" Name="tabItem2" ToolTip="Not enabled in this situation." ToolTipService.ShowOnDisabled="True" ToolTipService.IsEnabled="{Binding Path=IsEnabled, ElementName=tabItem2, Converter={StaticResource oppositeConverter}}">
    <Label Content="Item content goes here" />
</TabItem>

谢谢大家。

2 个答案:

答案 0 :(得分:21)

JustABill的建议奏效了。我还需要将字符串定义为资源以避免引号问题。而你仍然需要设置ToolTipService.ShowOnDisabled =“True”。

因此,以下是工作代码,其中显示了在禁用某个项目时如何在WPF 中显示工具提示。

在顶部容器中,包含系统命名空间(请参阅下面的 sys )。我还有一个Resources名称空间,我称之为“Res”。

    <Window x:Class="MyProjectName.Window1"
    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"
    xmlns:Res="clr-namespace:MyProjectName.Resources"
    >

然后你需要

<Window.Resources>
    <Res:FalseToStringConverter x:Key="falseToStringConv" />
    <sys:String x:Key="stringToShowInTooltip">This item is disabled because...</sys:String>
</Window.Resources>

在我的情况下,它是我感兴趣的标签项。它可以是任何UI元素但是......

<TabItem Name="tabItem2" ToolTipService.ShowOnDisabled="True" ToolTip="{Binding Path=IsEnabled, ElementName=tabItem2, Converter={StaticResource falseToStringConv}, ConverterParameter={StaticResource stringToShowInTooltip}}">
            <Label Content="A label in the tab" />
</TabItem>

转换器在代码后面(或者你想把它放在哪里)。注意,我进入了名为 Resources 的名称空间,该名称空间已在前面声明过。

public class FalseToStringConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool && parameter is string)
        {
            if ((bool)value == false)
                return parameter.ToString();
            else return null;
        }
        else
            throw new InvalidOperationException("The value must be a boolean and parameter must be a string");
    }

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

答案 1 :(得分:8)

有点过时,但我通过将RelativeSource模式设置为Self而不是在Binding中设置ElementName来实现此功能。

<TabItem Header="Tab 2" Name="tabItem2" ToolTip="Not enabled in this situation." ToolTipService.ShowOnDisabled="True" ToolTipService.IsEnabled="{Binding Path=IsEnabled, RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource oppositeConverter}}">
    <Label Content="Item content goes here" />
</TabItem>