如何在Silverlight中赋予文本框焦点?
在我的Silverlight应用程序中,我似乎无法将焦点集中在TextBox控件上。根据各种建议,我将IsTabStop属性设置为True,并且正在使用TextBox.Focus()。尽管UserControl_Loaded事件正在触发,但TextBox控件并未获得焦点。我在下面包括了我非常简单的代码。我想念什么?谢谢。
Page.xaml
<UserControl x:Class="TextboxFocusTest.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="UserControl_Loaded" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <StackPanel Width="150" VerticalAlignment="Center"> <TextBox x:Name="RegularTextBox" IsTabStop="True" /> </StackPanel> </Grid> </UserControl>
Page.xaml.cs
using System.Windows; using System.Windows.Controls; namespace PasswordTextboxTest { public partial class Page : UserControl { public Page() { InitializeComponent(); } private void UserControl_Loaded(object sender, RoutedEventArgs e) { RegularTextBox.Focus(); } } }
解决方案
我们设置焦点的代码是正确的,因为如果我们添加一个调用相同代码的按钮,它将可以完美地工作:
<StackPanel Width="150" VerticalAlignment="Center"> <TextBox x:Name="RegularTextBox" IsTabStop="True" /> <Button Click="UserControl_Loaded"> <TextBlock Text="Test"/> </Button> </StackPanel>
因此,我假设这与需要某种用户交互的Focus()有关。我无法使其与UserControl上的MouseMove事件一起使用,但是将KeyDown事件设置为焦点工作方式(尽管模板不会更新为焦点模板)。
Width="400" Height="300" Loaded="UserControl_Loaded" KeyDown="UserControl_KeyDown">
对我来说似乎是个虫子。
我们确定我们没有真正集中注意力吗? Beta 2中有一个已知的错误,我们可以集中注意力并能够打字,但不会出现尖号或者边框。解决方法是在调用Focus()之前立即在文本框中调用UpdateLayout()。
我忘记了一件事...我还没有找到一种方法来强制将焦点可靠地聚焦在页面上的Silverlight应用程序上(它可以在某些浏览器上工作,而不能在其他浏览器上工作)。
因此,可能是Silverlight应用本身没有重点。我通常会诱骗用户单击按钮或者类似按钮,然后再开始期望键盘输入以确保silverlight应用程序具有焦点。
我会尝试在UserLoaded事件上添加DispatcherTimer,该事件在整个控件加载后几毫秒内执行Focus方法。也许问题就在那里。
我在silverlight.net上找到了它,并能够通过在调用RegularTextBox.Focus()之前添加对System.Windows.Browser.HtmlPage.Plugin.Focus()的调用来使其工作:
private void UserControl_Loaded(object sender, RoutedEventArgs e) { System.Windows.Browser.HtmlPage.Plugin.Focus(); RegularTextBox.Focus(); }
对于浏览器外的应用程序,不存在System.Windows.Browser.HtmlPage.Plugin.Focus();。
在这里查看我的问题以获取其他想法。
感谢Santiago Palladino Dispatcher非常适合我。我正在做的是:
this.Focus();
然后
Dispatcher.BeginInvoke(()=> {tbNewText.Focus();});
Plugin.Focus();
没有为我工作。
呼唤
Dispatcher.BeginInvoke(() => { tbNewText.Focus();});
从Load事件开始。
我还需要打电话
Deployment.Current.Dispatcher.BeginInvoke(()=> myTextbox.Focus());
有趣的是,当我在TextBlock上单击鼠标,折叠TextBlock并使TextBox可见时,此调用发生在事件处理程序中。如果我不由调度员跟踪它,那么BeginInvoke不会引起关注。
-麦克风
它在SL4,IE7和Firefox 3.6.12中对我有效
最终缺少的"片段"(使我专注于工作)正在设置.TabIndex属性
System.Windows.Browser.HtmlPage.Plugin.Focus(); txtUserName.IsTabStop = true; txtPassword.IsTabStop = true; if (txtUserName.Text.Trim().Length != 0) { txtPassword.UpdateLayout(); txtPassword.Focus(); txtPassword.TabIndex = 0; } else { txtUserName.UpdateLayout(); txtUserName.Focus(); txtUserName.TabIndex = 0; }