J'ai une info-bulle pour une étiquette et je veux qu'elle reste ouverte jusqu'à ce que l'utilisateur déplace la souris vers un contrôle différent.
J'ai essayé les propriétés suivantes dans l'info-bulle:
StaysOpen="True"
et
ToolTipService.ShowDuration = "60000"
Mais dans les deux cas, l'info-bulle ne s'affiche que pendant exactement 5 secondes.
Pourquoi ces valeurs sont-elles ignorées?
ShowDuration
propriété, pensez que c'est quelque chose comme30,000
. Tout ce qui est supérieur à cela et il reviendra par défaut5000
.ToolTipService.ShowDuration="60000"
travaillé. Il ne revenait pas par défaut à5000
.ToolTipService.ShowDuration
propriété sur n'importe quelle valeur> = 0 (sur Int32.MaxValue), mais l'info-bulle ne restera pas ouverte pendant cette longueur.Réponses:
Mettez simplement ce code dans la section d'initialisation.
la source
new FrameworkPropertyMetadata("Top")
ne fonctionne pas.TooltipService.ShowDuration
fonctionne, mais vous devez le définir sur l'objet ayant l'info-bulle, comme ceci:Je dirais que cette conception a été choisie car elle permet la même info-bulle avec différents délais d'expiration sur différents contrôles.
la source
ToolTip
directement, sans explicite<ToolTip>
, ce qui peut simplifier la liaison.Cela me rendait aussi fou ce soir. J'ai créé une
ToolTip
sous - classe pour gérer le problème. Pour moi, sur .NET 4.0, laToolTip.StaysOpen
propriété n'est pas "vraiment" reste ouverte.Dans la classe ci-dessous, utilisez la nouvelle propriété
ToolTipEx.IsReallyOpen
au lieu de propertyToolTip.IsOpen
. Vous obtiendrez le contrôle que vous souhaitez. Via l'Debug.Print()
appel, vous pouvez regarder dans la fenêtre de sortie du débogueur combien de foisthis.IsOpen = false
est appelé! Tant pisStaysOpen
, ou devrais-je dire"StaysOpen"
? Prendre plaisir.Petite diatribe: Pourquoi Microsoft n'a-t-il pas rendu les
DependencyProperty
propriétés (getters / setters) virtuelles afin que nous puissions accepter / rejeter / ajuster les changements dans les sous-classes? Ou en faire unvirtual OnXYZPropertyChanged
pour chacunDependencyProperty
? Pouah.---Éditer---
Ma solution ci-dessus semble étrange dans l'éditeur XAML - l'info-bulle est toujours affichée, bloquant du texte dans Visual Studio!
Voici une meilleure façon de résoudre ce problème:
Certains XAML:
Un peu de code:
Conclusion: Il y a quelque chose de différent dans les classes
ToolTip
etContextMenu
. Les deux ont des classes "service", commeToolTipService
etContextMenuService
, qui gèrent certaines propriétés, et les deux utilisentPopup
comme contrôle parent "secret" pendant l'affichage. Enfin, j'ai remarqué que TOUS les exemples XAML ToolTip sur le Web n'utilisent pasToolTip
directement la classe . Au lieu de cela, ils intègrent unStackPanel
avec l'TextBlock
art. Des choses qui vous font dire: "hmmm ..."la source
Vous souhaiterez probablement utiliser Popup au lieu de Tooltip, car Tooltip suppose que vous l'utilisez selon les normes d'interface utilisateur prédéfinies.
Je ne sais pas pourquoi StaysOpen ne fonctionne pas, mais ShowDuration fonctionne comme documenté dans MSDN - c'est la durée pendant laquelle l'info-bulle est affichée LORSQUE elle est affichée. Réglez-le sur une petite quantité (par exemple 500 ms) pour voir la différence.
L'astuce dans votre cas est de conserver l'état "dernier contrôle survolé", mais une fois que vous l'avez fait, il devrait être assez simple de changer la cible de placement et le contenu de manière dynamique (soit manuellement, soit via une liaison) si vous utilisez un Popup, ou masquer le dernier Popup visible si vous en utilisez plusieurs.
Il y a quelques pièges avec les fenêtres contextuelles en ce qui concerne le redimensionnement et le déplacement de la fenêtre (les fenêtres contextuelles ne bougent pas avec les conteneurs), vous voudrez peut-être également garder cela à l'esprit lorsque vous peaufinez le comportement. Voir ce lien pour plus de détails.
HTH.
la source
Si vous souhaitez spécifier que seuls certains éléments de votre
Window
ont effectivement uneToolTip
durée indéfinie, vous pouvez définir unStyle
dans votreWindow.Resources
pour ces éléments. Voici unStyle
pourButton
qui a un telToolTip
:On peut également ajouter
Style.Resources
auStyle
pour changer l'apparence de celui-ToolTip
ci, par exemple:Remarque: lorsque j'ai fait cela, j'ai également utilisé
BasedOn
dans leStyle
afin que tout le reste défini pour la version de mon contrôle personnalisé avec une normaleToolTip
soit appliqué.la source
Je ne luttais avec l'info-bulle WPF que l'autre jour. Il ne semble pas possible de l'empêcher d'apparaître et de disparaître par lui-même, alors j'ai finalement eu recours à la gestion de l'
Opened
événement. Par exemple, je voulais l'empêcher de s'ouvrir à moins qu'il ne contienne du contenu, j'ai donc géré l'Opened
événement, puis j'ai fait ceci:C'est un hack, mais ça a marché.
Vous pouvez probablement gérer l'
Closed
événement de la même manière et lui dire de s'ouvrir à nouveau, le gardant ainsi visible.la source
Juste pour être complet: dans le code, cela ressemble à ceci:
la source
De plus, si vous souhaitez mettre un autre contrôle dans votre info-bulle, il ne sera pas focalisable car une info-bulle elle-même peut obtenir le focus. Donc, comme l'a dit micahtan, votre meilleur coup est un Popup.
la source
J'ai résolu mon problème avec le même code.
ToolTipService.ShowDurationProperty.OverrideMetadata (typeof (DependencyObject), nouveau FrameworkPropertyMetadata (Int32.MaxValue));
la source
Ça marche pour moi. Copiez cette ligne dans votre constructeur de classe.
la source