WPF 重置按钮单击焦点

问题描述 投票:0回答:4

我有一个

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

任何提示,我们将不胜感激。

谢谢, 劳尔

c# wpf data-binding button focus
4个回答
40
投票

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

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

我认为它比创建虚拟控件更干净,并且可以重用。但我对这个解决方案并没有信心。但看起来效果不错。


27
投票

问题是工具栏将您的按钮放置在不同的

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

虽然您可以覆盖工具栏上的

FocusManager.IsFocusScope
属性并获得您想要的效果,但这可能不是最好的计划,因为它会使所有其他工具栏按钮也从主窗口区域窃取焦点。

您可以使用几种简单的解决方案之一:

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

1
投票

我在离开日历时遇到问题,需要单击按钮两次(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);
  }
}

0
投票

即使我有样式触发器作为鼠标悬停在真/假上并且聚焦真/假的应用程序资源,我的按钮仍然保持焦点。尝试了以上所有方法,并且感谢 Vis Studio 中的新功能(它提供了对 Github 示例的访问),找到了这个片段

e.Handled = true;
非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.