如何在Silverlight中提供文本框焦点?

时间:2008-09-24 00:05:13

标签: silverlight textbox focus

在我的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();
        }
    }
}

15 个答案:

答案 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)

谢谢Santiago Palladino Dispatcher完美地为我工作。我在做的是:

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();}); 

在加载事件中。

相反,在将BusyIndi​​cator显示设置为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。