2010-05-02 3 views
3

Quel est le nombre minimal d'étapes requises pour afficher une info-bulle lorsque le contrôle suivant est activé?Quelle est la manière la moins intrusive d'afficher l'info-bulle WPF sur le focus?

<TextBox ToolTip="Hello there!" ... /> 

J'ai essayé ce qui suit dans GotFocus

private void ..._GotFocus(object sender, RoutedEventArgs e) { 
     var element = (FrameworkElement)sender; 
     var tooltip = element.ToolTip; 
     if (!(tooltip is ToolTip)) { 
      tooltip = new ToolTip { Content = tooltip }; 
      element.ToolTip = tooltip; 
     } 

     ((ToolTip)tooltip).IsOpen = true; 
    } 

Cependant, il semble ignorer la ToolTipService.Placement pour ce contrôle et SystemParameters.ToolTipPopupAnimationKey mis en place plus haut niveau.

Comment puis-je faire fonctionner et respecter tous les paramètres qui fonctionnent généralement pour les info-bulles (à l'exception de la synchronisation, évidemment)?

Répondre

0

Ne pas avoir une machine Windows pour tester, mais j'aurais pensé:

<TextBox x:Name="textBox"> 
    <TextBox.ToolTip> 
     <ToolTip IsOpen="{Binding IsKeyboardFocusWithin, ElementName=textBox}"> 
      Whatever 
     </ToolTip> 
    </TextBox.ToolTip> 
</TextBox> 
+0

'ToolTipService .IsOpen' n'a malheureusement pas de setter disponible (par rapport à 'ToolTip.IsOpen'). –

+0

Désolé, je ne devrais pas répondre aux questions quand je suis incertain et ne peux pas tester :) Que diriez-vous de ma révision - est-ce que cela aide? –

+0

Cela fonctionnerait, oui, et c'est ma solution actuelle, mais je ne veux vraiment pas réécrire le TetBox lui-même. Je veux le faire dans une propriété attachée qui n'exigera pas l'utilisateur d'écrire l'info-bulle comme 'ToolTip'. Après tout, 'ToolTipService' ne fait pas. –

0

Je construis un IsKeyboardFocused obligatoire dans la propriété attachée, comme celui-ci:

public class ShowOnFocusTooltip : DependencyObject 
{ 
    public object GetToolTip(... 
    public void SetToolTip(... 
    public static readonly DependencyProperty ToolTipProperty = DependencyProperty.RegisterAttached(..., new PropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => 
    { 
     ToolTipService.SetToolTip(obj, 
     e.NewValue==null ? null : 
     BuildToolTip(obj, e.NewValue)); 
    } 
    }); 

    private object BuildToolTip(DependencyObject control, object content) 
    { 
    var tooltip = content is ToolTip ? (ToolTip)content : new ToolTip { Content = content }; 
    tooltip.SetBinding(ToolTip.IsOpenProperty, 
     new Binding("IsKeyboardFocusWithin") { Source = control }); 
    return tooltip; 
    } 
+0

C'est très similaire à ma solution originale. Je ne l'ai pas encore essayé, mais 'new tooltip' semble impliquer le même problème: ignoré' ToolTipService.Placement' et 'SystemParameters.ToolTipPopupAnimationKey'. Je peux copier le premier, mais je veux vraiment obtenir l'info-bulle que ce service utilise, car il sera à l'épreuve du temps en termes de propriétés et de styles. –

+0

Le code "nouvelle info-bulle" est pratique lorsque vous ne souhaitez pas définir ces propriétés. Si vous le faites, votre XAML peut donner un ToolTipPlacement explicite, etc: '0: ' –

+0

Le problème est , pour l'utilisateur de la propriété jointe, il n'est pas évident que 'ToolTipService.Placement' ne fonctionne plus et qu'il devrait utiliser explicitement' ToolTip' avec 'Placement' à la place. Bien sûr, je peux lancer une exception, mais cela viole la règle de la moindre surprise. Et toute la question est de préserver la manière originale de configurer les info-bulles. –