J'ai un TextBox
et un contrôle Popup
. Je souhaite que la propriété Popup.IsOpen
soit liée à la propriété TextBox.IsFocused
. En d'autres termes, si la zone de texte a le focus, la fenêtre contextuelle est ouverte. Sinon, si la fenêtre contextuelle est active, je ne veux pas qu'elle se ferme en raison de la perte de focus du champ de texte. J'espérais gérer cela en utilisant des liaisons plutôt que d'avoir à faire face à cela dans les gestionnaires d'événements. Aussi, dois-je faire quelque chose concernant les propriétés de dépendance, puisqu'elles sont préexistantes (c'est-à-dire, enregistrer, remplacer les métadonnées, etc.), ou puis-je simplement lier à ces propriétés.La zone de texte de liaison est mise au point sur Popup IsOpen plus les conditions supplémentaires
Voici quelques exemples 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);
A partir de ce que je suppose que si je clique sur le contrôle de la zone de texte et lui a donné l'accent, que la fenêtre contextuelle ouvrirait, et inversement, si la zone de texte perdu focus, que le popup se ferme. Je n'arrive pas à faire marcher ça. Si quelqu'un a une idée de ce que je fais de mal, alors peut-être pourrait-il aussi répondre à la seconde moitié de ma question que si la zone de texte perd son focus mais que c'est le popup qui reçoit le focus, ou redonner la priorité à la zone de texte pour qu'elle reste ouverte bc de la première liaison. Tout autre contrôle qui obtient un focus lorsque la zone de texte perd le focus ne s'applique pas à ce scénario.
Si je pouvais le reformuler pour plus de clarté, je le dirais comme ceci.
1.) Bind Popup.IsOpen
à TextBox.IsFocused
2.) Bind TextBox.IsFocused
à Popup.IsFocused
(en supposant que cela va juste donner focus sur la zone de texte)
Voici mon premier C# tenter cela. Quelque chose ne va toujours pas bien. Rien ne se passe donc je ne sais pas trop où est mon erreur.
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;
Cela semble être très proche de ce que je veux faire. J'ai couru votre code dans une application de test et le comportement est très similaire. J'ai écrit le C# pour faire ce que fait votre xaml, mais quelque chose est toujours éteint. Comme je n'utilise pas XAML, je pense que j'ai des problèmes avec la liaison à ElementName. Dois-je simplement définir la propriété Name ou enregistrer le nom. Ci-dessous vous verrez ce que j'ai jusqu'ici, laissez-moi savoir si vous pouvez voir ce qui pourrait être faux. Merci beaucoup. – BrandonS
Je viens d'éditer ma réponse pour fournir une version C# de ce que je faisais en XAML, j'espère que c'est ce dont vous avez besoin. Par intérêt, pourquoi utilisez-vous C# sur XAML pour créer vos éléments? –