ViewModel 的焦点控制

发布于 2024-09-30 02:47:46 字数 206 浏览 3 评论 0原文

当我没有将鼠标悬停在按钮或其他任何东西上时,为什么第一个按钮是“活动的”。这似乎是在我更改选项卡后发生的。

alt text

我怀疑当我更改选项卡时,它会集中第一个控件。是这样吗?我正在开发 MVVM 应用程序,因此从我的视图模型来看,我如何将焦点集中在文本框上?

Why is the 1st button "active" when I am not hovering over the button or anything. This seems to happen after I change tabs.

alt text

I suspect that when I change tabs, it focuses the 1st control. Is that the case? I am developing a MVVM app, so from my view model, how might I focus the text box instead?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

2024-10-07 02:47:46

由于 WPF 的焦点概念有点复杂,因此我有一个名为 FocusEnforcer 的类。

无论如何,它确实可以确保所需的控制获得焦点。

public static class FocusEnforcer
{
    public static void EnforceFocus(UIElement element)
    {
        if (!element.Focus())
        {

            element.Dispatcher.BeginInvoke(DispatcherPriority.Input, 
                                            new ThreadStart(delegate()
                                                            {
                                                                element.Focus();
                                                            }));

        }

    }
}

Since WPFs concept of focus is kinda complicated, I have a class called FocusEnforcer.

It really really makes sure the desired control gets the focus, no matter what.

public static class FocusEnforcer
{
    public static void EnforceFocus(UIElement element)
    {
        if (!element.Focus())
        {

            element.Dispatcher.BeginInvoke(DispatcherPriority.Input, 
                                            new ThreadStart(delegate()
                                                            {
                                                                element.Focus();
                                                            }));

        }

    }
}
明媚殇 2024-10-07 02:47:46

这种行为只需要:一种行为。或者,至少是一个新的附属财产。

  1. 为选项卡控件创建附加属性。
  2. 创建一个处理程序来更改此附加属性。
  3. 在此处理程序中,订阅 TabControl 的 SelectionChanged 事件。
  4. 在 SelectionChanged 事件处理程序中,使用 TabControl.FindName 方法获取文本框。
  5. 使用 TabControl 作为焦点范围执行 FocusManager.SetFocusedElement 方法。

This kind of behavior requires just that: a behavior. Or, at least, a new attached property.

  1. Create an attached property for tab controls.
  2. Create a handler for changes to this attached property.
  3. In this handler, subscribe to the TabControl's SelectionChanged event.
  4. In the SelectionChanged event handler, use the TabControl.FindName method to get the text box.
  5. Execute the FocusManager.SetFocusedElement method using the TabControl as the focus scope.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文