Показывать подсказку 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>