Покажите подсказку WPF на отключенном объекте только

Просто удивление, если возможно показать WPF на отключенном объекте ТОЛЬКО (и не, когда объект включен).

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

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

Так, возможно связать a 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>

Спасибо люди.

19
задан Anatoliy Nikolaev 19 July 2013 в 06:00
поделиться

1 ответ

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

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

<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
}
22
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: