在我的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();
}
}
}
答案 0 :(得分:41)
我在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();
}
答案 1 :(得分:23)
Plugin.Focus();
对我不起作用。
调用
Dispatcher.BeginInvoke(() => { tbNewText.Focus();});
从Load事件起作用。
答案 2 :(得分:10)
this.Focus(); 然后 Dispatcher.BeginInvoke(()=&gt; {tbNewText.Focus();});
答案 3 :(得分:3)
我解决了放入控件构造函数的问题:
this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
答案 4 :(得分:2)
你确定你没有真正关注焦点吗? Beta 2中存在一个已知错误,您可以获得焦点并能够键入,但不会得到插入符号或边框。解决方法是在调用Focus()之前调用文本框上的UpdateLayout()。
答案 5 :(得分:2)
我会尝试在UserLoaded事件上添加一个DispatcherTimer,它在整个控件加载后的几毫秒内执行Focus方法;也许问题出在那里。
答案 6 :(得分:2)
我还需要打电话
Deployment.Current.Dispatcher.BeginInvoke(()=&gt; myTextbox.Focus());
有趣的是,当我在TextBlock上单击鼠标时,会在事件处理程序中发生此调用,折叠TextBlock并使TextBox可见。如果我没有通过调度员跟踪它.BeginInvoke它将无法获得焦点。-Mike
答案 7 :(得分:1)
您设置焦点的代码是正确的,因为如果您添加一个调用相同代码的按钮,则它可以完美地运行:
<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">
对我来说似乎是个错误......
答案 8 :(得分:1)
对于浏览器外应用,System.Windows.Browser.HtmlPage.Plugin.Focus();
不存在。
有关其他想法,请参阅my question here。
答案 9 :(得分:1)
它适用于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;
}
答案 10 :(得分:1)
我的个人资料不足以评论@Jim B-G的answer,但对我有用的是在RichTextBox上添加一个Loaded事件的处理程序并在该处理程序中添加
System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();
但是,它只适用于IE和FF。要使其在Chrome和Safari上运行,请滚动到this
的底部答案 11 :(得分:0)
我忘记了一件事......我还没有找到一种方法可以在页面上强制关注你的Silverlight应用程序(它可以在某些浏览器上运行而不在其他浏览器上运行)。
因此可能是Silverlight应用程序本身没有焦点。在我开始期待键盘输入以确保silverlight应用程序具有焦点之前,我通常欺骗用户点击按钮或类似的东西。
答案 12 :(得分:0)
我也遇到了这个问题,但它出现的情况与此处已经回答的情况不同。
如果您在视图中显示并隐藏了BusyIndicator
控件,那么如果您有像
Dispatcher.BeginInvoke(() => { myControl.Focus();});
在加载事件中。
相反,在将BusyIndicator显示设置为false后,您需要调用该行代码。
我有一个相关问题here,以及此方案的解决方案。
答案 13 :(得分:0)
确实是一个令人讨厌的beheviour。我找到了一个简单直接的解决方案:
(VB代码)
Me.Focus()
Me.UpdateLayout()
Me.tbx_user_num.Focus()
Me.tbx_user_num.UpdateLayout()
至少根据我的项目,这里的每个元素都是必不可少的(VB2010 SL4 OutOfBrowser)。
感谢:http://www.dotnetspark.com/kb/1792-set-focus-to-textbox-silverlight-3.aspx
答案 14 :(得分:0)
上述答案都没有直接对我有用,我所做的是我在MainPage()构造函数中添加了这个事件:
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
按如下方式处理:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
RegularTextBox.Focus();
}
我的Silverlight版本是4。