Подтвердить что ты не робот

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

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

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

У меня есть IValueConverter, чтобы инвертировать связывание свойств boolean IsEnabled. Но в этой ситуации это, похоже, не работает. ToolTip отображается, когда элемент включен и отключен.

Таким образом, возможно привязать свойство ToolTip.IsEnabled исключительно к элементу own! 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>

Спасибо, ребята.

4b9b3361

Ответ 1

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

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

В верхнем контейнере укажите пространство имен системы (см. ниже раздел sys). У меня также есть пространство имен ресурсов, которое я назвал "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>

В моем случае это был элемент табуляции, который меня интересовал. Это может быть любой элемент пользовательского интерфейса, хотя...

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

Ответ 2

Немного устарел, но я получил эту работу, установив режим RelativeSource в Self вместо установки ElementName в Binding.

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