我有一个
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);
}
任何提示,我们将不胜感激。
谢谢, 劳尔
我遇到了类似的问题。我需要在按下回车键时取消文本框的焦点。我最终得到了这段代码:
var scope = FocusManager.GetFocusScope(elem); // elem is the UIElement to unfocus
FocusManager.SetFocusedElement(scope, null); // remove logical focus
Keyboard.ClearFocus(); // remove keyboard focus
我认为它比创建虚拟控件更干净,并且可以重用。但我对这个解决方案并没有信心。但看起来效果不错。
问题是工具栏将您的按钮放置在不同的
FocusManager.FocusScope
中。这意味着 Button
和 TextBox
可以同时接收逻辑焦点,每个都在自己的范围内。这通常是一件好事,因为当您选择菜单项和工具栏按钮时,您通常不希望失去主窗口区域的焦点,但在您的情况下,它会阻止您正在做的事情工作。
虽然您可以覆盖工具栏上的
FocusManager.IsFocusScope
属性并获得您想要的效果,但这可能不是最好的计划,因为它会使所有其他工具栏按钮也从主窗口区域窃取焦点。
您可以使用几种简单的解决方案之一:
textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
我在离开日历时遇到问题,需要单击按钮两次(WPF、.Net 5.0),我尝试了上面的一些建议解决方案,但没有成功,但是这有效 - 引用 Microsoft 网站上的某人的话:
“我对这个问题的解决方案是插入到主窗体中,但这可能有点过分了。”
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);
}
}
即使我有样式触发器作为鼠标悬停在真/假上并且聚焦真/假的应用程序资源,我的按钮仍然保持焦点。尝试了以上所有方法,并且感谢 Vis Studio 中的新功能(它提供了对 Github 示例的访问),找到了这个片段
e.Handled = true;
非常有用。