Показывать подсказку WPF только для отключенного элемента - PullRequest
18 голосов
/ 23 мая 2010

Просто интересно, можно ли показать 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 ]

22 голосов
/ 25 мая 2010

Предложение 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>

И конвертер в коде позади (или там, где вы хотите его поставить). Обратите внимание, что мое имя вошло в пространство имен с именем 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
}
10 голосов
/ 14 июля 2014

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