似乎当WPF应用程序启动时,没有任何东西具有焦点。
这真的很奇怪。我使用的所有其他框架都做了您所期望的事情:将初始焦点放在Tab键顺序中的第一个控件上。但我已经确认它是WPF,而不仅仅是我的应用程序--如果我创建一个新窗口,在其中放入一个TextBox,然后运行应用程序,TextBox直到我点击它或按Tab键时才有焦点。糟透了。
我的实际应用程序比TextBox复杂得多。我在UserControls中有几层UserControls。其中一个UserControls有Focusable="True“和KeyDown/KeyUp处理程序,我希望它在我的窗口一打开就有焦点。不过,我在某种程度上仍然是WPF的新手,而且我没有太多的运气来弄清楚如何做到这一点。
如果我启动我的应用程序并按下Tab键,然后焦点转到我的可聚焦控件,它就会开始以我想要的方式工作。但我不希望我的用户在开始使用窗口之前必须按Tab键。
我尝试过使用FocusManager.FocusedElement,但我不确定要将它设置在哪个控件上(顶层窗口?包含可聚焦控件的父级?可聚焦控件本身?)或者将其设置为什么。
窗口一打开,我需要做什么才能让我的深度嵌套控件具有初始焦点?或者更好的是,在Tab键顺序中聚焦第一个可聚焦的控件?
发布于 2009-05-04 01:46:23
我有了一个聪明的想法,通过Reflector挖掘,看看在哪里使用了可聚焦属性,并找到了解决方案的方法。我只需要将以下代码添加到我的窗口的构造函数中:
Loaded += (sender, e) =>
MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
这将自动选择Tab键顺序中的第一个控件,因此这是一个通用的解决方案,应该能够放到任何窗口中并正常工作。
发布于 2009-08-27 21:58:50
这也是可行的:
<Window FocusManager.FocusedElement="{Binding ElementName=SomeElement}">
<DataGrid x:Name="SomeElement">
...
</DataGrid>
</Window>
发布于 2012-01-23 23:51:59
基于作为附加行为实现的已接受answer:
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));
}
}
}
}
像这样使用它:
<Window xmlns:Behaviors="clr-namespace:UI.Behaviors"
Behaviors:FocusBehavior.FocusFirst="true">
https://stackoverflow.com/questions/817610
复制相似问题