La liaison de zone de texte IsFocused de Popup IsOpen plus des conditions supplémentaires

J'ai un TextBox et un Popup de contrôle. Je veux le Popup.IsOpen propriété d'être lié à la TextBox.IsFocused de la propriété. En d'autres termes, si la zone de texte a le focus, le popup est ouvert. Alternativement, si le pop-up est dans le focus, je n'en veux pas à fermer en raison de la zone de texte perd le focus. J'espérais pour gérer cela en utilisant des liaisons plutôt que d'avoir à traiter avec cela dans les gestionnaires d'événements. Aussi, dois-je faire quoi que ce soit concernant les propriétés de dépendance, car ils sont pré-existants(c'est à dire s'Inscrire, remplacer les métadonnées, etc), ou puis-je lier à ces propriétés.

Voici un exemple de code similaire à mon scénario

StackPanel sp = new StackPanel();
TextBox tb = new TextBox();
Popup popup = new Popup();

sp.Children.Add(tb);
sp.Children.Add(popup);
this.Content = sp;

Binding bd = new Binding("IsFocused");
bd.source = tb.IsFocused;
popup.SetBinding(Popup.IsOpenProperty, bd);

De ce que j'étais, en supposant que si j'ai cliqué sur le contrôle de zone de texte et lui a donné l'accent, que la popup s'ouvre, et inversement, si la zone de texte perdu le focus, que le popup de fermer. Je n'arrive pas à obtenir que cela fonctionne.

Si quelqu'un a une idée de ce que je fais mal, alors ils pourraient peut-être aussi une réponse à la deuxième moitié de ma question que si la zone de texte perd le focus, mais c'était la fenêtre qui reçoit le focus, que le popup restera ouverte ou donner le focus à la zone de texte de sorte qu'il restera ouvert colombie-britannique de la première liaison. N'importe quel autre contrôle que les gains de mise au point lorsque la zone de texte perd le focus ne s'applique pas à ce scénario.

Si je pouvais reformuler ce pour des raisons de clarté, je dirais comme ça.

1.) Lier Popup.IsOpen à TextBox.IsFocused

2.) Lier TextBox.IsFocused à Popup.IsFocused(en supposant que cela suffira de donner le focus à la zone de texte)


Voici mon premier C# tentative à cet égard. Quelque chose est pas encore tout à fait droit. Rien ne se passe donc je ne suis pas tout à fait sûr de savoir où est mon erreur est.

        StackPanel sp = new StackPanel(); 
TextBox tb = new TextBox(); 
Popup popup = new Popup();
TextBox popupTextBox = new TextBox();
popup.Child = popupTextBox;
sp.Children.Add(tb); 
sp.Children.Add(popup); 
this.Content = sp;
//***Questions concerning giving the UIElement a name and registering it
tb.Name = "siblingTextBox";
System.Windows.NameScope.GetNameScope(tb).RegisterName("siblingTextBox", tb);
//***Questions concerning giving the UIElement a name and registering it
popupTextBox.Name = "popupTextBox";
System.Windows.NameScope.GetNameScope(tb).RegisterName("popupTextBox", popupTextBox);
Binding binding = new Binding();
binding.ElementName = tb.Name;
popup.PlacementTarget = tb;
Style style = new Style();
style.TargetType = typeof(Popup);
DataTrigger dataTrigger = new DataTrigger();
Binding focusedBinding = new Binding("IsFocused");
focusedBinding.ElementName = tb.Name;
dataTrigger.Value = true;
dataTrigger.Binding = focusedBinding;
Setter setter = new Setter();
setter.Property = Popup.IsOpenProperty;
setter.Value = true;
dataTrigger.Setters.Add(setter);
style.Triggers.Add(dataTrigger);
dataTrigger = new DataTrigger();
focusedBinding = new Binding("IsFocused");
focusedBinding.ElementName = popupTextBox.Name;
dataTrigger.Value = true;
dataTrigger.Binding = focusedBinding;
setter = new Setter();
setter.Property = Popup.IsOpenProperty;
setter.Value = true;
dataTrigger.Setters.Add(setter);
style.Triggers.Add(dataTrigger);
popup.Style = style;
InformationsquelleAutor BrandonS | 2009-05-18