似乎当WPF应用程序启动时,没有任何焦点 .
这真的很奇怪 . 我使用过的每个其他框架都符合您的期望:将初始重点放在Tab键顺序中的第一个控件上 . 但我已经确认它是WPF,而不仅仅是我的应用程序 - 如果我创建一个新窗口,只是在其中放置一个TextBox,并运行应用程序,TextBox没有焦点,直到我点击它或按Tab键 . 呸 .
我的实际应用程序比TextBox更复杂 . 我在UserControls中有几层UserControl . 其中一个UserControls有Focusable =“True”和KeyDown / KeyUp处理程序,我希望它在我的窗口打开后立即获得焦点 . 不过,我仍然有点像WPF新手,而且我没有太多运气搞清楚如何做到这一点 .
如果我启动我的应用程序并按Tab键,则焦点转到我的可聚焦控件,它开始以我想要的方式工作 . 但是我不希望我的用户在开始使用窗口之前必须点击Tab .
我玩过FocusManager.FocusedElement,但是我不确定将它设置为哪个控件(顶级窗口?包含可聚焦控件的父级?可聚焦控件本身?)或者设置它的内容 .
一旦窗口打开,我需要做什么才能使我的深层嵌套控件具有初始焦点?或者更好的是,将第一个可聚焦控件聚焦在Tab键顺序中?
12 回答
您可以轻松地将控件设置为XAML中的焦点元素 .
我从来没有尝试在用户控件中设置它,看看它是否有效,但它可能 .
以上解决方案对我来说没有按预期工作,我稍微改变了Mizipzor提出的行为如下:
从这一部分
对此
我没有将此行为附加到Window或UserControl,但控制我想最初聚焦,例如:
哦,抱歉不同的命名我正在使用附加属性的InitialFocus名称 .
这对我有用,也许它可以帮助别人 .
基于接受的answer实现为附加行为:
像这样用它:
我发现了另一种可能的解Mark Smith发布了一个FirstFocusedElement markup extension用于FocusManager.FocusedElement .
有同样的问题通过简单的解决方案解决了它:在主窗口中:
在用户控件中:
C#6的最小版本Mizipzor's answer .
在XAML中使用:
我有一个聪明的主意,就是通过Reflector来查看Focusable属性的使用位置,并找到了解决这个问题的方法 . 我只需要将以下代码添加到我的Window的构造函数中:
这将自动选择Tab键顺序中的第一个控件,因此它是一个通用的解决方案,应该可以放入任何窗口和Just Work .
在有了“WPF初始焦点噩梦”并基于堆叠上的一些答案之后,以下证明了我是最佳解决方案 .
首先,添加您的App.xaml OnStartup()以下内容:
然后在App.xaml中添加'WindowLoaded'事件:
由于某些框架竞争条件,WPF初始焦点大多失败,因此必须使用线程问题 .
我发现以下解决方案最佳,因为它在整个应用程序中全局使用 .
希望能帮助到你...
奥兰
如果你像我一样,并且你正在使用一些框架,以某种方式,搞乱基本的焦点行为,并使所有解决方案无关紧要,你仍然可以这样做:
1 - 注意获得焦点的元素(无论它是什么!)
2 - 在xxx.xaml.cs后面的代码中添加它
3 - 在获得第一个焦点的元素上添加它:
4 - 在后面的代码中添加Element_GotFocus方法,并指定需要第一个焦点的WPF命名元素:
5 - 管理已加载的事件
在XAML中
在xaml.cs中
希望这将有助于作为最后的解决方案
我也遇到了同样的问题 . 我在canvas容器中有三个文本框,并希望在用户控件打开时聚焦第一个文本框 . WPF代码遵循MVVM模式 . 我创建了一个单独的行为类来聚焦元素,并将其绑定到我的视图中 .
画布行为代码
视图代码
这也有效: