如何在Silverlight中提供文本框焦点?
在我的Silverlight应用程序中,我似乎无法将焦点转移到文本框控件。根据各种帖子的推荐,我将IsTabStop属性设置为True,并使用TextBox.Focus()。虽然UserControl_加载的事件正在触发,但TextBox控件没有获得焦点。我在下面包含了我非常简单的代码。我错过了什么?谢谢 Page.xaml如何在Silverlight中提供文本框焦点?,silverlight,textbox,focus,Silverlight,Textbox,Focus,在我的Silverlight应用程序中,我似乎无法将焦点转移到文本框控件。根据各种帖子的推荐,我将IsTabStop属性设置为True,并使用TextBox.Focus()。虽然UserControl_加载的事件正在触发,但TextBox控件没有获得焦点。我在下面包含了我非常简单的代码。我错过了什么?谢谢 Page.xaml <UserControl x:Class="TextboxFocusTest.Page" xmlns="http://schemas.microsoft.co
<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>
设置焦点的代码是正确的,因为如果添加一个调用相同代码的按钮,它将完美工作:
<StackPanel Width="150" VerticalAlignment="Center">
<TextBox x:Name="RegularTextBox" IsTabStop="True" />
<Button Click="UserControl_Loaded">
<TextBlock Text="Test"/>
</Button>
</StackPanel>
对我来说似乎是一个错误……你确定你没有真正得到关注吗?在Beta 2中有一个已知的bug,你可以获得焦点并能够键入,但是你不能获得插入符号或边框。解决方法是在调用Focus()之前在文本框上调用UpdateLayout()。我忘记了一件事……我还没有找到一种方法来可靠地将焦点强制到页面上的Silverlight应用程序上(它可以在某些浏览器上工作,而不能在其他浏览器上工作)
因此,Silverlight应用程序本身可能没有焦点。在我开始期待键盘输入以确保silverlight应用程序具有焦点之前,我通常会诱使用户单击按钮或类似的东西 我会尝试在UserLoaded事件上添加一个Dispatcher,该事件在整个控件加载几毫秒后执行Focus方法;可能问题就在那里。我在silverlight.net上找到了这个,在调用RegularTextBox.Focus()之前,通过添加对System.Windows.Browser.HtmlPage.Plugin.Focus()的调用,我能够让它为我工作:
对于浏览器外应用程序,
System.Windows.browser.HtmlPage.Plugin.Focus()代码>不存在
其他想法请参见。谢谢圣地亚哥·帕拉迪诺调度员为我做了完美的工作。我正在做的是:
这是Focus();
然后
Dispatcher.BeginInvoke(()=>{tbNewText.Focus();})
不适合我
召唤
Dispatcher.BeginInvoke(() => { tbNewText.Focus();});
从Load事件开始工作。我还需要调用
Deployment.Current.Dispatcher.BeginInvoke(()=>myTextbox.Focus())
有趣的是,当我在TextBlock上单击鼠标,折叠TextBlock并使TextBox可见时,这个调用发生在事件处理程序中。如果我没有调度程序跟踪它。BeginInvoke它将无法获得焦点
-Mike我在SL4、IE7和Firefox 3.6.12中都能使用它
最后一个使焦点工作(对我来说)的缺失“片段”是setting.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;
}
我也遇到了这个问题,但它是由一个不同的案例引起的,而不是这里已经回答过的问题
如果在查看过程中显示和隐藏了BusyIndicator
控件,则如果有如下行,控件将无法获得焦点:
Dispatcher.BeginInvoke(() => { myControl.Focus();});
在加载事件中
相反,您需要在BusyIndicator显示设置为false后调用该行代码
我有一个相关的问题,以及这个场景的解决方案。确实是一个令人讨厌的怪人。我找到了一个简单明了的解决方案:
(VB代码)
这里的每个元素都是必不可少的,至少根据我的项目(VB2010 SL4浏览器)
归功于:我解决了加入控制构造函数的问题:
this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
我的个人资料不够好,无法评论@Jim B-G,但对我来说,有效的方法是在RichTextBox上为加载的事件添加一个处理程序,并在该处理程序中添加
System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();
System.Windows.Browser.HtmlPage.Plugin.Focus();
.UpdateLayout()
.Focus();
然而,它只适用于IE和FF。要让它在Chrome和Safari上运行,请滚动到的底部。上面的答案都没有直接对我起作用,我所做的是在MainPage()构造函数中添加了此事件:
this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
并按以下方式处理:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
RegularTextBox.Focus();
}
我的Silverlight版本是4。问得好,但我肯定。用户控件加载后,焦点不在文本框上。奇怪,谢谢布莱恩特。我喜欢您使用按钮单击进行验证的方式。我看看能不能想出类似于你的MouseMove建议的东西。谢谢你的建议。我连接了调度员,结果是一样的。直到我实际采取行动(例如,点击页面)时,焦点才被设定。这就成功了。它不提供文本框有焦点的指示器(文本框内的克拉或边框突出显示),但我很高兴。谢谢。“System.Windows.Browser.HtmlPage.Plugin.Focus()”它做什么?顾名思义System.Windows.Browser.HtmlPage.Plugin.Focus()将在浏览器窗口中聚焦silverlight插件。这在IE和FF中有效,但在Chrome中无效。我将其简化为HtmlPage.Plugin.Focus();someTextBox.UpdateLayout();someTextBox.Focus();这取决于浏览器!这听起来很明显,但在尝试聚焦之前,请检查您的文本框是否已禁用<代码>焦点()
仅在启用的控件上工作。
System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
RegularTextBox.Focus();
}