首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WPF和初始焦点

WPF和初始焦点
EN

Stack Overflow用户
提问于 2009-05-03 17:59:09
回答 12查看 96.2K关注 0票数 205

似乎当WPF应用程序启动时,没有任何东西具有焦点。

这真的很奇怪。我使用的所有其他框架都做了您所期望的事情:将初始焦点放在Tab键顺序中的第一个控件上。但我已经确认它是WPF,而不仅仅是我的应用程序--如果我创建一个新窗口,在其中放入一个TextBox,然后运行应用程序,TextBox直到我点击它或按Tab键时才有焦点。糟透了。

我的实际应用程序比TextBox复杂得多。我在UserControls中有几层UserControls。其中一个UserControls有Focusable="True“和KeyDown/KeyUp处理程序,我希望它在我的窗口一打开就有焦点。不过,我在某种程度上仍然是WPF的新手,而且我没有太多的运气来弄清楚如何做到这一点。

如果我启动我的应用程序并按下Tab键,然后焦点转到我的可聚焦控件,它就会开始以我想要的方式工作。但我不希望我的用户在开始使用窗口之前必须按Tab键。

我尝试过使用FocusManager.FocusedElement,但我不确定要将它设置在哪个控件上(顶层窗口?包含可聚焦控件的父级?可聚焦控件本身?)或者将其设置为什么。

窗口一打开,我需要做什么才能让我的深度嵌套控件具有初始焦点?或者更好的是,在Tab键顺序中聚焦第一个可聚焦的控件?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-05-04 01:46:23

我有了一个聪明的想法,通过Reflector挖掘,看看在哪里使用了可聚焦属性,并找到了解决方案的方法。我只需要将以下代码添加到我的窗口的构造函数中:

代码语言:javascript
复制
Loaded += (sender, e) =>
    MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

这将自动选择Tab键顺序中的第一个控件,因此这是一个通用的解决方案,应该能够放到任何窗口中并正常工作。

票数 167
EN

Stack Overflow用户

发布于 2009-08-27 21:58:50

这也是可行的:

代码语言:javascript
复制
<Window FocusManager.FocusedElement="{Binding ElementName=SomeElement}">

   <DataGrid x:Name="SomeElement">
     ...
   </DataGrid>
</Window>
票数 183
EN

Stack Overflow用户

发布于 2012-01-23 23:51:59

基于作为附加行为实现的已接受answer

代码语言:javascript
复制
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace UI.Behaviors
{
    public static class FocusBehavior
    {
        public static readonly DependencyProperty FocusFirstProperty =
            DependencyProperty.RegisterAttached(
                "FocusFirst",
                typeof(bool),
                typeof(FocusBehavior),
                new PropertyMetadata(false, OnFocusFirstPropertyChanged));

        public static bool GetFocusFirst(Control control)
        {
            return (bool)control.GetValue(FocusFirstProperty);
        }

        public static void SetFocusFirst (Control control, bool value)
        {
            control.SetValue(FocusFirstProperty, value);
        }

        static void OnFocusFirstPropertyChanged(
            DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            Control control = obj as Control;
            if (control == null || !(args.NewValue is bool))
            {
                return;
            }

            if ((bool)args.NewValue)
            {
                control.Loaded += (sender, e) =>
                    control.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }
    }
}

像这样使用它:

代码语言:javascript
复制
<Window xmlns:Behaviors="clr-namespace:UI.Behaviors"
        Behaviors:FocusBehavior.FocusFirst="true">
票数 64
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/817610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档