Показывать подсказку WPF только для отключенного элемента

просто интересно, можно ли показать WPF на отключенном элементе только (и не тогда, когда элемент включен).

Я хотел бы дать пользователю подсказку, объясняющую, почему элемент в настоящее время отключен.

у меня есть IValueConverter инвертировать логический IsEnabled привязка собственность. Но в данной ситуации это не работает. The 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 ответов


предложение Джастабилла сработало. Мне также нужно было определить строку как ресурс, чтобы избежать проблем с кавычками. И вам все равно нужно установить ToolTipService.ShowOnDisabled= "True".

Итак, вот рабочий код, который показывает, как отобразить всплывающую подсказку в WPF только когда элемент отключен.

в верхнем контейнере включите пространство имен system (см. sys ниже). У меня также есть пространство имен Resources, которое я назвал "РЭС."

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

и конвертер в коде позади (или там, где вы хотите его поместить). Обратите внимание, что мой вошел в пространство имен ресурсы, который был объявлен ранее.

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
}

немного устарел, но я получил эту работу, установив режим RelativeSource в Self вместо установки 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>