WPF重置焦点按钮单击

时间:2010-01-12 21:07:34

标签: c# wpf data-binding button focus

我有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);
    }

任何提示都将不胜感激。

谢谢, 劳尔

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:25)

问题是工具栏会将您的按钮放在不同的FocusManager.FocusScope中。这意味着ButtonTextBox都可以同时获得逻辑焦点,每个焦点都在自己的范围内。这通常是一件好事,因为当您选择菜单项和工具栏按钮时,您通常不希望在主窗口区域失去焦点,但在您的情况下,它会妨碍您在工作时所做的事情。

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

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

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

答案 2 :(得分:1)

我在离开日历时遇到问题,需要单击按钮两次(WPF,.Net 5.0),我尝试了上面建议的一些解决方案,但没有成功,但是这奏效了 - 引用自 Microsoft 网站上的某人:< /p>

“我对这个问题的解决方案是插入到主表单中,但这可能有点矫枉过正。”

protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
{
  base.OnPreviewMouseUp(e);
  if (Mouse.Captured is Calendar || Mouse.Captured is System.Windows.Controls.Primitives.CalendarItem)
  {
    Mouse.Capture(null);
  }
}