2016-04-23 6 views
0

Wie im Titel erwähnt, möchte ich das Popup anzeigen, wenn das Textfeld Tastaturfokus erhält, aber dann schließen, wenn der Benutzer außerhalb des Popup klickt (was über staysopen = false geschieht).Popup öffnen, wenn Textbox Tastaturfokus hat und schließen über "staysopen = false" -Eigenschaft

Wie Sie mit dem Code unten sehen können, habe ich die Eigenschaft IsOpen an die ExampeTextBox IsKeyboardFocused Eigenschaft gebunden. Das funktioniert, um das Popup zu öffnen, aber verhindert, dass ich mit dem Popup interagiere, wie ich Keyboard.ClearFocus(); in einem Klick-Ereignis rufe, das aufgerufen wird, wenn der Benutzer irgendwo auf das Fenster klickt. Das bedeutet, dass das Klicken auf eine beliebige Stelle außerhalb des Textfelds zum Auslösen von Keyboard.ClearFocus() führt, wodurch das Textfeld den Tastaturfokus verliert.

Wenn ich StaysOpen = false gesetzt und stellen Sie dann IsOpen programmatisch über Popup.IsOpen = true; es bewirkt, dass die Eigenschaften IsOpen und StaysOpen zu Konflikt und das Popup erscheint überhaupt nicht auf.

  <Popup 
      x:Name="ExamplePopup" 
      Placement="Bottom" 
      PlacementTarget="{Binding ElementName=ExampleTextBox}" 
      IsOpen="{Binding ElementName=ExampleTextBox, Path=IsKeyboardFocused, Mode=OneWay}">...</Popup> 

Here is a screen recording of my problem.

Jede Hilfe ist sehr Dank geschätzt.

+0

Warum nicht eine Autocomplete-Textbox anstelle der normalen Textbox verwenden. Es scheint, als ob Sie Suchvorschläge in Ihrem Popup anzeigen möchten. – Jerin

+0

Was tun Sie, indem Sie ein Popup genau verwenden? –

Antwort

1

Sie können IsOpen an eine boolean Eigenschaft binden, die Ihre popup sichtbar macht oder nicht.

<Popup 
      x:Name="ExamplePopup" StaysOpen="True" 
      Placement="Bottom" 
      PlacementTarget="{Binding ElementName=ExampleTextBox}" 
      IsOpen="{Binding IsNeedToOpen}"> 
    </Popup> 

Wenn Ihr textbox bekommt focus setzen Sie den Wert propertytrue und wenn Sie den property Wert false Pop-up schließen einstellen müssen. Stellen Sie sicher, dass Sie INotifyPropertyChangedinterface implementieren und DataContext setzen.

private bool _IsNeedToOpen = false; 
    public bool IsNeedToOpen 
    { 
     get { return _IsNeedToOpen; } 
     set 
     { 
      if (_IsNeedToOpen == value) { return; } 
      _IsNeedToOpen = value; 
      OnPropertyChanged("IsNeedToOpen"); 
     } 
    } 
    private void TextBox_GotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e) 
    { 
     IsNeedToOpen = true; 
    }