2010-05-23 23 views
16

Yalnızca bir devre dışı bırakılmış öğeye WPF gösterilip gösterilmeyeceğini merak etme SADECE (ve öğe etkinleştirildiğinde değil).Yalnızca devre dışı bırakılmış öğede WPF araç ipucunu göster

Kullanıcıya, bir öğenin neden devre dışı bırakıldığını açıklayan bir araç ipucu vermek istiyorum.

Boole IsEnabled özellik bağlayıcısını tersine çevirmek için IValueConverter sahibim. Ancak bu durumda işe yaramıyor. ToolTip, öğenin etkinleştirildiği ve devre dışı bırakıldığını gösterir.

ToolTip.IsEnabled özelliğini yalnızca bir öğeye ait olmak üzere bağlamak mümkündür! IsEnabled?

Oldukça basit sanırım soru, ama yine de buraya kod örneği:

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 
} 

Ve bağlayıcı:

<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> 

teşekkürler millet.

+0

ToolTipService.ShowOnDisabled = "Doğru", inversiyonunuzu "sonra" yürütmediğinden emin misiniz? Sadece etkin bağlamanın gerekli olması gerektiği gibi görünüyor. – JustABill

+0

@JustABill: Bu durum böyle olabilir ancak ToolTipService.ShowOnDisabled = "True" olmadan çalışmaz. Belki de kod arkasında işlem yapmalıyım. Mümkünse GUI maddelerini XAML'de tutmayı tercih ederim. – dant

+0

Bu durumda, ToolTip gibi Tooltip'e bağlamanızı öneririm = "{Binding ElementName = tabItem2, Path = IsEnabled, Dönüştürücü = {StaticResource newconverter}, ConverterParameter = Güncel araç metni buradadır}", yeni dönüştürücünün döndüğü yeni bir tür Değer true ise parametre değeri. Ya da sanırım davasında sanırım. (Ayrıca, bu sözdizimi kapalıysa, bu yüzden beni yazdığınız için beni affet) – JustABill

cevap

20

JustABill'in önerisi işe yaradı. Ayrıca, tırnak işaretleriyle ilgili sorunları önlemek için dizeyi bir kaynak olarak tanımladım. Ve hala ToolTipService.ShowOnDisabled = "True" değerini ayarlamanız gerekiyor.

Yani, burada bir öğe devre dışı sadece zaman WPF bir araç ipucu nasıl görüntüleneceğini gösterir çalışma kodudur. En kapta

, sistem ad (sys aşağıdaki bakınız) içerir. Ayrıca "Res" adını verdiğim bir Kaynak adları alanım var.

<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" 
    > 

Sonra Benim durumumda

<Window.Resources> 
    <Res:FalseToStringConverter x:Key="falseToStringConv" /> 
    <sys:String x:Key="stringToShowInTooltip">This item is disabled because...</sys:String> 
</Window.Resources> 

gerekiyor, bu benim ilgi bir sekme madde oldu. O ... gerçi herhangi UI öğesi olabilir

<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> 

Ve dönüştürücü arkasındaki kodda (ya da nereye koymak istediğinizi). Not, benim daha önce bildirilen Kaynaklar adında bir isim alanına gitti.

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

5
Biraz güncel

ama Kendine RelativeSource modunu ayarlayarak yerine Cilt içinde elementName ayarlayarak bu çalışma var.

<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

çok güzel yanıt – stambikk

İlgili konular