wpf 单击按钮时重置焦点

zbq4xfa0  于 2023-08-07  发布在  其他
关注(0)|答案(4)|浏览(194)

我有一个TextBox和一个ToolBar和一个Button。如果我输入TextBox并单击Button,我希望TextBox丢失Focus,以便更新绑定。我不想将UpdateSourceTrigger=PropertyChanged添加到我的TextBox。但是,当我点击Button时,我将Focus重置到主窗口,这样我所使用的东西就会丢失Focus并更新绑定。
我试着用下面的代码给按钮添加一个OnClick,但似乎不起作用:

private void Button_Click(object sender, RoutedEventArgs e) {
        FocusManager.SetFocusedElement(this, null);
    }

字符串
任何提示将不胜感激。
谢谢,劳尔

ego6inou

ego6inou1#

我遇到了类似的问题。我需要在按回车键时取消文本框的焦点。最后得到这样的代码:

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

字符串
我认为它比创建虚拟控件更干净,并且可以重复使用。但我对这个解决方案没有信心。但似乎效果不错。

ndasle7k

ndasle7k2#

问题是工具栏将您的按钮放置在不同的FocusManager.FocusScope中。这意味着ButtonTextBox可以同时接收逻辑焦点,每个都在自己的范围内。这通常是一件好事,因为您通常不希望在选择菜单项和工具栏按钮时失去主窗口区域的焦点,但在您的情况下,它会阻止您正在执行的操作。
虽然你可以覆盖工具栏上的FocusManager.IsFocusScope属性并获得你想要的效果,但这可能不是最好的计划,因为它会使所有其他工具栏按钮也从主窗口区域窃取焦点。
相反,您可以使用以下几种简单的解决方案之一:

  • 把你的按钮放在工具栏外面
  • 添加一个Focusable=“true”控件到你的主窗口区域,并在按钮被点击时聚焦它
  • 通过调用textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()手动强制更新
  • 在主窗口的一个控件上临时设置Focusable=“true”,将焦点设置到它,然后立即再次设置Focusable=“false”
z9smfwbn

z9smfwbn3#

我在离开日历时遇到了一个问题,需要点击两次按钮(WPF,.Net 5.0),我尝试了上面建议的一些解决方案,但没有运气,但是这起作用了-引用了微软网站上的某人的话:
“我解决这个问题的方法是插入到主窗体中,但这可能有点矫枉过正。”

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

字符串

oaxa6hgo

oaxa6hgo4#

我的按钮保持焦点,即使我有样式触发器作为应用程序资源,用于鼠标悬停true/false和isfocused true/false。尝试了以上所有方法,感谢维斯Studio中的新功能,它可以访问Github示例,发现这个片段e.Handled = true;工作得很好。

相关问题