Bindung Textbox IsFocused auf Popup-IsOpen-plus zusätzliche Bedingungen
Ich habe eine TextBox
und ein Popup
Kontrolle. Ich will die Popup.IsOpen
Eigenschaft gebunden werden, um die TextBox.IsFocused
Eigenschaft. In anderen Worten, wenn die textbox den Fokus hat, wird das popup geöffnet ist. Alternativ, wenn das popup den Fokus hat, ich nicht wollen, es zu schließen, durch die textbox Fokus verlieren. Ich hatte gehofft, um dies zu umgehen, mithilfe Bindungen, anstatt auf den Umgang mit diesem Ereignis-Handler. Außerdem habe ich zu tun alles, was in Bezug auf die Abhängigkeit von Eigenschaften, da diese bereits vorhandenen(d.h. Register, überschreiben, Metadaten, etc), oder kann ich einfach eine Bindung an diese Eigenschaften.
Ist hier einige Beispiel-code ähnlich zu meinem Szenario
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);
Von diesem ich war der Annahme, dass, wenn ich klickte auf das textbox-Steuerelement und gab es gefasst, dass das popup sich öffnen würde, und Umgekehrt, wenn die textbox den Fokus verloren, dass das popup schließen würde. Ich kann nicht scheinen, um diese zu arbeiten.
Wenn jemand eine Idee hat was ich falsch mache, dann vielleicht konnten Sie auch die Antwort auf die zweite Hälfte meiner Frage ist, dass, wenn das Textfeld den Fokus verliert, aber es war das popup, das den Fokus erhält, dass das popup-Fenster geöffnet bleibt, oder geben Sie den Fokus wieder auf die textbox, so dass es offen bleibt, bc der ersten Bindung. Jedes andere Steuerelement, das den Fokus erhält, wenn das Textfeld den Fokus verliert nicht für dieses Szenario gelten.
Wenn ich könnte, formulieren Sie dies für die übersichtlichkeit würde ich sagen, dass es wie dieses.
1.) Binden Popup.IsOpen
zu TextBox.IsFocused
2.) Binden TextBox.IsFocused
zu Popup.IsFocused
(vorausgesetzt, dies wird nur geben Sie den Fokus zurück auf die textbox)
Hier ist mein erstes C# - Versuch. Noch etwas ist nicht ganz richtig. Nichts passiert, also bin ich mir nicht ganz sicher, wo mein Fehler ist.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende code veranschaulicht, dass zwei Textfelder in einem StackPanel-Element, die Einstellung, die den Fokus auf das Textfeld oben öffnet sich das Popup. An welcher Stelle, wenn Sie dann verschieben Sie den Fokus auf das Textfeld im Popup-es wird offen bleiben. Wenn Sie verschieben Sie den Fokus zu einem anderen element, in diesem Beispiel das zweite Textfeld, in das StackPanel-Steuerelement, das Popup-Fenster wird geschlossen. Da Sie nicht in der Lage zu konzentrieren, das Popup selbst bin ich eigentlich die Bindung an die IsFocused-Eigenschaft des Textfeld im Popup.
Zu erreichen, die gleiche Sache in C# müssen Sie nicht verwenden die ElementName-Bindungen, wie Sie bereits die Elemente direkt an die hand. Ich verwende fast immer XAML zu definieren, meine Elemente so ich bin sicher, Sie könnten aufzuräumen ein bisschen.
Ich hoffe, das hilft!
Ich habe gerade bearbeitet meine Antwort, um eine C# - version von dem, was ich in XAML, hoffentlich ist das, was Sie brauchen. Aus Interesse, warum bist du mit C#, XAML, erstellen Ihre Elemente?
InformationsquelleAutor David Padbury