启动我的silverlight应用程序时,会出现一个子窗口,提示用户登录。在窗口中我有一个我想要聚焦的用户名文本框,这样用户就可以开始输入而无需先用鼠标聚焦。
这似乎应该有效:
public partial class LoginForm : ChildWindow
{
public LoginForm()
{
InitializeComponent();
}
private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
{
txtUsername.Focus();
}
}
我注意到Load
事件发生在窗口呈现之前可能是问题,但我没有看到Rendered
或类似的事件处理程序。
编辑:忘记提及此应用程序正在浏览器中运行。
答案 0 :(得分:3)
您需要在txtUsername上设置TabIndex,其值低于该子窗口上的其他控件。
答案 1 :(得分:1)
试试这个:
public partial class LoginForm : ChildWindow
{
public LoginForm()
{
InitializeComponent();
Loaded+=LoginFormLoaded;
}
private void LoginFormLoaded(object sender, RoutedEventArgs e)
{
txtUsername.Focus();
Loaded-=LoginFormLoaded;
}
}
更新: 您还可以在TextBox上添加事件。文本框也有一个Loaded事件。如果您使用此事件,则可以确保已加载TextBox。
答案 2 :(得分:0)
这是我使用的东西:
public partial class LoginForm : ChildWindow
{
public LoginForm()
{
InitializeComponent();
Loaded += (s, e) =>
{
txtUsername.Focus();
};
}
}
在XAML中,将TabIndex
设置为1
答案 3 :(得分:0)
如果您在浏览器中运行应用程序,请确保在调用控件的焦点方法之前silverlight插件具有焦点。
private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
{
HtmlPage.Plugin.Focus();
txtUsername.Focus();
}
这适用于大多数浏览器,但我无法在Safari上使用它。
答案 4 :(得分:0)
由于某些原因我没有时间弄清楚,Silverlight SDK中的子窗口打开,动画,焦点移动到某个未知的地方。在这个线程上建议的大多数解决方案对我来说都不起作用,因为控件会短暂地获得焦点(你可以看到焦点点击文本框),然后焦点移动到其他地方(我猜测ChildWindow模板上的故事板有与此有关)。所以,我想出了这个工作,这个实际代码已经实现并且已被证明有效:
public NewChildWindow()
{
InitializeComponent();
this.GotFocus += NewChildWindow_GotFocus;
}
private void NewChildWindow_GotFocus(object sender, RoutedEventArgs e)
{
this.GotFocus -= NewChildWindow_GotFocus;
txtBoxToFocusOn.Focus();
}
答案 5 :(得分:0)
制作文本框TabIndex =" 0"并在其Loaded事件中执行" YourtxtBox.Focus()"