2010-05-23 4 views
16

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

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

У меня есть IValueConverter, чтобы инвертировать boolean IsEnabled свойство binding. Но в этой ситуации это, похоже, не работает. 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> 

Благодарности люди.

+0

Вы уверены, что ToolTipService.ShowOnDisabled = "True" не выполняется "после" вашего обращения? Кажется, что необходимо только активированное связывание. – JustABill

+0

@JustABill: Это может быть так, но это не работает без ToolTipService.ShowOnDisabled = "True". Возможно, мне нужно обработать его в коде. Я предпочел бы, если возможно, хранить файлы графического интерфейса в XAML. – dant

+0

В этом случае я предлагаю вам привязать к Tooltip, например ToolTip = "{Binding ElementName = tabItem2, Path = IsEnabled, Converter = {StaticResource newconverter}, ConverterParameter = Фактический текст подсказки здесь}", где newconverter - новый тип, который возвращает значение в параметре, если значение истинно. Я думаю, что ложь в вашем случае. (Также я набрал это из памяти, так что простите меня, если синтаксис выключен) – JustABill

ответ

20

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

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

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

+1 для ToolTipService.ShowOnDisabled = "True" – Tim

5

Немного устаревают, но я получил эту работу, установив режим RelativeSource СЕБЕ вместо установки 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> 
+0

очень хороший ответ – stambikk

Смежные вопросы