2010-05-23 72 views
16

想知道是否可以在禁用物品上顯示WPF 僅限於(而不是在啓用物品時)。僅在禁用物品上顯示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> 

感謝鄉親。

+0

您確定ToolTipService.ShowOnDisabled =「True」在您的反轉之後未執行「after」嗎?似乎只有啓用的綁定應該是必要的。 – JustABill 2010-05-23 16:03:38

+0

@JustABill: 這可能是這種情況,但如果沒有ToolTipService.ShowOnDisabled =「True」,它將無法正常工作。 也許我需要在代碼隱藏中處理它。如果可能,我寧願在XAML中保留GUI。 – dant 2010-05-23 23:06:20

+0

在這種情況下,我建議你綁定到Tooltip,如ToolTip =「{Binding ElementName = tabItem2,Path = IsEnabled,Converter = {StaticResource newconverter},ConverterParameter =實際工具提示文本在這裏}」,其中newconverter是一個新類型,如果值爲true,則爲參數中的值。或者我的猜想是假的。 (也是我從內存中輸入的,如果語法關閉,請原諒我) – JustABill 2010-05-24 02:35:27

回答

20

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> 

在我而言,這是我非常感興趣的一個標籤項,它可以是任何雖然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 
} 
+12

+1 for ToolTipService.ShowOnDisabled =「True」 – Tim 2012-02-16 15:45:05

5

過時了一點點,但是我用的RelativeSource模式設置爲自我而不是內的綁定設置的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> 
+0

非常好的答案 – stambikk 2016-11-21 21:15:14