当文本框具有键盘焦点并通过“staysopen = false”属性关闭时打开弹出窗口

时间:2016-04-23 03:14:29

标签: c# wpf mvvm data-binding popup

正如标题中所提到的,当文本框获得键盘焦点时,我希望弹出窗口显示,但是当用户在弹出窗口外单击时关闭(通过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.

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以将IsOpen绑定到boolean属性,使popup可见或不可见。

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

当您的textbox获得focus设置propertytrue时,当您需要关闭弹出窗口时,请设置propertyfalse。确保您实施 INotifyPropertyChanged interface并设置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;
    }