WPF重置焦点按钮单击

Hax*_*lit 35 c# data-binding wpf focus button

我有一个TextBoxToolBar一个Button.如果我正在键入,TextBox我点击Button我想要TextBox丢失,Focus所以绑定得到更新.我不想加UpdateSourceTrigger=PropertyChanged我的TextBox.但是当我点击Button我重置Focus到主窗口时,我所做的就是丢失Focus并更新绑定.

我尝试OnClick使用以下内容添加到按钮,但它似乎不起作用:

    private void Button_Click(object sender, RoutedEventArgs e) {
        FocusManager.SetFocusedElement(this, null);
    }
Run Code Online (Sandbox Code Playgroud)

任何提示将不胜感激.

谢谢,劳尔

Dud*_*udu 33

我遇到了类似的问题.当按下enter时,我需要取消对焦文本框.我最终得到这个代码:

var scope = FocusManager.GetFocusScope(elem); // elem is the UIElement to unfocus
FocusManager.SetFocusedElement(scope, null); // remove logical focus
Keyboard.ClearFocus(); // remove keyboard focus
Run Code Online (Sandbox Code Playgroud)

我认为它比创建虚拟控件更清晰,它是可重用的.我对这个解决方案没有信心.但似乎运作良好.

  • +1在控件GotFocus()事件中像魅力一样工作. (3认同)
  • 当我没有其他任何东西强制DatePicker在单击工具栏中的保存按钮时解析输入的文本时,这对我有用.下面的代码使用视图(MVVM)作为this.owner,从ViewModel调用.var t =(DependencyObject)FocusManager.GetFocusedElement(this.Owner); var scope = FocusManager.GetFocusScope(t); FocusManager.SetFocusedElement(scope,null); (3认同)

Ray*_*rns 25

问题是工具栏将您的按钮放在不同的位置FocusManager.FocusScope.这意味着,两个ButtonTextBox可以在同一时间接收逻辑焦点,各自在其自身的范围.这通常是一件好事,因为当您选择菜单项和工具栏按钮时,您通常不希望在主窗口区域失去焦点,但在您的情况下,它会阻止您正在进行的工作.

虽然你可以覆盖FocusManager.IsFocusScope工具栏上的属性并获得你想要的效果,但这可能不是最好的计划,因为它会使所有其他工具栏按钮也从主窗口区域偷走焦点.

相反,您可以使用以下几种简单解决方案之一

  • 将您的按钮放在工具栏之外
  • 将Focusable ="true"控件添加到主窗口区域,并在单击按钮时将其对焦
  • 通过调用手动强制更新 textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
  • 暂时在主窗口的控件上设置Focusable ="true",将焦点设置为它,然后立即再次设置Focusable ="false"

  • 谢谢你提到`FocusManager.IsFocusScope`.在我的特定场景中,我*希望*从我的主窗口区域偷取焦点,所以我只在我的工具栏上设置`FocusManager.IsFocusScope ="False". (2认同)