Frage

Ich habe eine TextBox und eine Popup Kontrolle.Ich will das 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 pop-up im Fokus, ich will nicht, dass es in der Nähe aufgrund der textbox Fokus verlieren.Ich war in der Hoffnung, dies zu behandeln mit Bindungen, anstatt Sie zu deal mit diesem event-Handler.Außerdem habe ich zu tun alles, was in Bezug auf die Abhängigkeit der Eigenschaften, da Sie bereits(D. H.Register überschreiben, Metadaten, etc.), oder kann ich nur binden, auf diese Eigenschaften.

Hier finden Sie einige Beispiel-code ähnlich wie mein 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 den Fokus, dass der popup ö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 Sie könnten vielleicht 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 zurück auf das Textfeld, so dass es offen bleiben v. Chr. von den ersten verbindlich.Alle anderen Steuerelement, das den Fokus erhält, wenn das Textfeld den Fokus verliert gelten nicht für dieses Szenario.

Wenn ich könnte, formulieren Sie dies für die übersichtlichkeit würde ich sagen, dass es wie dies.

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 das Textfeld)


Hier ist mein erstes C# - Versuch an.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;
War es hilfreich?

Lösung

Der folgende code veranschaulicht, dass zwei Textfelder in einem StackPanel-Element, die Einstellung, der Fokus auf das Textfeld oben öffnet sich das Popup.An dem Punkt, wenn Sie dann verschieben Sie den Fokus auf das Textfeld im Popup wird es bleiben offen.Wenn Sie verschieben Sie den Fokus auf ein anderes element, in diesem Beispiel das zweite Textfeld, in das StackPanel, das Popup-Fenster wird geschlossen.Als Sie nicht in der Lage zu konzentrieren, das Popup selbst bin ich eigentlich die Bindung an die IsFocused-Eigenschaft des text Feld im Popup-Fenster.

<StackPanel>
    <TextBox x:Name="text" Text="This is a text box" />
    <TextBox Text="Another Text Box" />
    <Popup PlacementTarget="{Binding ElementName=text}">
        <Popup.Style>
            <Style TargetType="{x:Type Popup}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=text, Path=IsFocused}" Value="True">
                        <Setter Property="IsOpen" Value="True" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=popupText, Path=IsFocused}" Value="True">
                        <Setter Property="IsOpen" Value="True" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Popup.Style>
        <TextBox x:Name="popupText" Text="HELLO WORLD" />
    </Popup>
</StackPanel>

Zu erreichen die gleiche Sache in C#, die Sie nicht haben zu verwenden die ElementName-Bindungen, wie Sie bereits die Elemente direkt an die hand.Ich verwende fast immer XAML zu definieren Elemente von mir so bin ich sicher, dass Sie könnte sauber das ein bisschen.

var text1 = new TextBox { Name = "text", Text = "This is a text box" };
var text2 = new TextBox { Text = "Another Text Box" };
var popupText = new TextBox { Name = "popupText", Text = "HELLO WORLD" };
var popup = new Popup { Child = popupText, PlacementTarget = text1 };
var stackPanel = new StackPanel();

stackPanel.Children.Add(text1);
stackPanel.Children.Add(text2);
stackPanel.Children.Add(popup);

var popupStyle = new Style(typeof (Popup));
var textIsFocusedTrigger = new DataTrigger
    {
        Binding = new Binding {Source = text1, Path = new PropertyPath("IsFocused")},
        Value = true
    };

textIsFocusedTrigger.Setters.Add(new Setter(Popup.IsOpenProperty, true));

var popupTextIsFocusedTrigger = new DataTrigger
    {
        Binding = new Binding {Source = popupText, Path = new PropertyPath("IsFocused")},
        Value = true
    };

popupTextIsFocusedTrigger.Setters.Add(new Setter(Popup.IsOpenProperty, true));

popupStyle.Triggers.Add(textIsFocusedTrigger);
popupStyle.Triggers.Add(popupTextIsFocusedTrigger);

popup.Style = popupStyle;

Ich hoffe, das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top