2016-04-23 71 views
0

正如標題中所述,我希望彈出窗口顯示,當文本框獲得鍵盤焦點時,但當用戶在彈出窗口外單擊時關閉(這是通過staysopen = false完成的)。當文本框具有鍵盤焦點並通過「staysopen = false」屬性關閉時打開彈出框

正如您在下面的代碼中看到的,我已將IsOpen屬性綁定到ExampeTextBox的IsKeyboardFocused屬性。這適用於打開彈出窗口,但阻止我與彈出窗口進行交互,因爲我在用戶單擊窗口中的任何位置時被調用的單擊事件中調用Keyboard.ClearFocus();。這意味着單擊文本框外的任何位置都會導致Keyboard.ClearFocus()觸發,導致文本框失去鍵盤焦點。

如果我設置StaysOpen = false,然後設置IsOpen編程通過Popup.IsOpen = true;它會導致性能IsOpenStaysOpen衝突和彈出窗口不會出現在所有。

  <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.

任何幫助深表感謝感謝。

+0

爲什麼不使用自動完成文本框而不是普通文本框。它看起來好像你想在彈出的窗口中顯示搜索建議 – Jerin

+0

通過完全使用彈出窗口,你在做什麼? –

回答

1

您可以將IsOpen綁定到boolean屬性,該屬性使popup可見或不可見。

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

當你的textbox得到focus設置propertytrue,當你需要關閉彈出窗口設置property價值false。確保你實現了INotifyPropertyChangedinterface並設置DataContext

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; 
    }