我有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);
}
任何提示都将不胜感激。
谢谢, 劳尔
答案 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
中。这意味着Button
和TextBox
都可以同时获得逻辑焦点,每个焦点都在自己的范围内。这通常是一件好事,因为当您选择菜单项和工具栏按钮时,您通常不希望在主窗口区域失去焦点,但在您的情况下,它会妨碍您在工作时所做的事情。
虽然你可以覆盖工具栏上的FocusManager.IsFocusScope
属性并获得你想要的效果,但这可能不是最好的计划,因为它会使所有其他工具栏按钮也从你的主窗口区域偷走焦点。 / p>
相反,您可以使用以下几种简单解决方案之一:
textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
答案 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);
}
}