silverlight 初始控件获得焦点

      这个问题本来是在我实际的项目中遇到过的,但这其实是当初项目要求,要求一进入就要使得在用户名那个文字框中聚焦,而不是再用鼠标去点击获得焦点,后来自己费了点时间解决了.本来我没太注意就过去了,没想到在QQ群里也有人问了一样的问题,我想还是写出来,这样大家可以注意一下,可能以后有帮助.

  我用一个简单的例子来说明一下吧.

  目标:是我要使得在silveright项目中的一个TextBox在不做任何点击操作的同时一开始获得焦点.

      xaml:

<Grid x:Name="LayoutRoot" Background="White">
<TextBox Name="myTextBox" Height="23" HorizontalAlignment="Left" Margin="145,67,0,0" VerticalAlignment="Top" Width="120" />
</Grid>

      C#:

复制代码
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
myTextBox.Focus();
}
}
复制代码

  这里我们调用了Focus()这个方法想要使得这个TextBox获得焦点.但我们运行项目看去,TextBox并没有或得到焦点.

  当时我得出的分析:1)可能是方法调用不成功,没有聚焦,2)可能是这个TextBox聚焦了,但是经过运行焦点又聚焦到其他地方了.

  于是我把后台做了一下简单的修改.

复制代码
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
DispatcherTimer timer
= new DispatcherTimer();
timer.Interval
= TimeSpan.FromMilliseconds(5000);
timer.Tick
+= new EventHandler(timer_Tick);
timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
if (myTextBox.Focus())
{
MessageBox.Show(
"文本框聚焦成功!");
}
}
}
复制代码

并没有聚焦.

  我用一个线程来一直看,结果还是弹出的提示信息都是"文本框聚焦成功!",这样看来这个Focus()方法返回为true是成功的,而且即使是Focus到其他地方,我一直后来还是要聚焦到这个TextBox,应该也是成功的,但我们仍然是看到这文本框没有聚焦,看来我当初上面两个分析是错的.

  不知道大家后来发现没有就是我们随便在其他地方点击一下,我们突然发现这个文本框聚焦了,这是怎么回事?

  当我们理所当然的一直是认为我建立的是一个silverlight项目,想什么事情都是从silverlight本身的东西去想解决办法,但其实我们去看,这个silverlight其实也是建立在一个aspx页面中的,是一种插件形式存在的,可能插入过flash人就知道,放在页面中的是以一个<object>标签放入的,那么我们就可能会想到是不是当初只是聚焦到了页面上面,而没有聚焦到插件上,于是我们添加一项HtmlPage.Plugin.Focus(); 后面也改成

复制代码
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
HtmlPage.Plugin.Focus();
myTextBox.Focus();
}
复制代码

成功聚焦.

  好了这样我们就发现成功聚焦了,结论是:要想聚焦到silverlight中的控件一定要先聚焦到silverlight这个插件上,我们可以通过鼠标点击到silverlight上使其聚焦.但当我们一开始没有点击就想使其中的控件获得焦点可能就要用到我这个方法了.希望能给大家帮助.

PS:  HtmlPage 这个类要导入System.Windows.Browser.dll,  在:C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\System.Windows.Browser.dll

posted @   wz2cool  阅读(2233)  评论(11编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示