2010-05-23 13 views
16

Vous vous demandez simplement s'il est possible d'afficher un WPF sur un élément désactivé SEULEMENT (et non lorsque l'élément est activé).Afficher l'info-bulle WPF sur l'élément désactivé uniquement

Je voudrais donner à l'utilisateur une info-bulle expliquant pourquoi un élément est actuellement désactivé.

J'ai un IValueConverter pour inverser la liaison de propriété booléenne IsEnabled. Mais cela ne semble pas fonctionner dans cette situation. Le ToolTip est affiché lorsque l'élément est activé et désactivé.

Il est donc possible de lier une propriété ToolTip.IsEnabled exclusivement à un objet! IsEnabled?

question assez simple, je suppose, mais exemple de code ici de toute façon:

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 
} 

Et la liaison:

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

Merci les gens.

+0

Êtes-vous sûr que ToolTipService.ShowOnDisabled = "True" n'exécute pas "après" votre inversion? Il semble que seule la liaison activée devrait être nécessaire. – JustABill

+0

@ JustBill: Cela pourrait être le cas mais cela ne fonctionne pas sans ToolTipService.ShowOnDisabled = "True". Peut-être que je dois gérer le code-behind. Je préférerais garder les éléments GUI en XAML si possible. – dant

+0

Dans ce cas, je vous suggère de lier à Tooltip comme ToolTip = "{Liaison ElementName = tabItem2, Path = IsEnabled, Convertisseur = {StaticResource newconverter}, ConverterParameter = Texte de l'info-bulle actuelle va ici}", où newconverter est un nouveau type qui retourne la valeur dans le paramètre si la valeur est true. Ou faux dans votre cas, je suppose. (Aussi je l'ai tapé de la mémoire alors pardonnez-moi si la syntaxe est désactivée) – JustABill

Répondre

20

La suggestion de JustABill a fonctionné. J'ai également besoin de définir la chaîne comme une ressource pour éviter les problèmes avec les guillemets. Et vous devez toujours définir ToolTipService.ShowOnDisabled = "True".

Donc, voici le code de travail qui montre comment afficher une info-bulle dans WPF ne lorsqu'un élément est désactivé.

Dans le conteneur supérieur, incluez l'espace de noms système (voir sys ci-dessous). J'ai aussi un espace de noms Ressources, que j'ai appelé "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" 
    > 

Ensuite, vous avez besoin

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

Dans mon cas, il était un élément onglet que je suis intéressé. Ce pourrait être un élément d'interface utilisateur si ...

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

Et le convertisseur dans le code derrière (ou partout où vous voulez le mettre). Remarque, le mien est entré dans un espace de noms appelé Ressources, qui a été déclaré plus tôt.

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 pour ToolTipService.ShowOnDisabled = "Vrai" – Tim

5

Un peu à ce jour, mais je suis arrivé ce travail en réglant le mode RelativeSource à l'auto au lieu de fixer le ElementName au sein de la liaison.

<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

très belle réponse – stambikk