32

在我的 Silverlight 应用程序中,我似乎无法将焦点放在 TextBox 控件上。根据各种帖子的建议,我将 IsTabStop 属性设置为 True,并且我正在使用 TextBox.Focus()。虽然 UserControl_Loaded 事件正在触发,但 TextBox 控件没有获得焦点。我在下面包含了我非常简单的代码。我错过了什么?谢谢。

页面.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>

页面.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();
        }
    }
}
4

15 回答 15

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();
   }
于 2008-09-24T19:03:58.307 回答
23
Plugin.Focus(); 

对我不起作用。

打电话

 Dispatcher.BeginInvoke(() => { tbNewText.Focus();});

从 Load 事件开始。

于 2010-04-14T15:09:03.387 回答
10

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

this.Focus(); 然后 Dispatcher.BeginInvoke(() => { tbNewText.Focus();});

于 2010-01-27T18:16:15.977 回答
3

我解决了放入控制构造函数:

this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
于 2012-10-16T10:27:31.727 回答
2

你确定你没有真正集中注意力吗?Beta 2 中有一个已知错误,您可以集中注意力并可以打字,但您不会得到插入符号或边框。解决方法是在调用 Focus() 之前在文本框上调用 UpdateLayout()。

于 2008-09-24T02:05:12.170 回答
2

我会尝试在整个控件加载后几毫秒执行 Focus 方法的 UserLoaded 事件上添加 DispatcherTimer;也许问题就在那里。

于 2008-09-24T14:01:16.600 回答
2

我还需要打电话

Deployment.Current.Dispatcher.BeginInvoke(() => myTextbox.Focus());

有趣的是,当我在 TextBlock 上单击鼠标、折叠 TextBlock 并使 TextBox 可见时,此调用发生在事件处理程序内部。如果我没有通过 dispatcher.BeginInvoke 跟踪它,它将不会获得焦点。

-麦克风

于 2010-10-08T20:53:51.627 回答
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">

对我来说似乎是一个错误......

于 2008-09-24T00:47:33.637 回答
1

对于浏览器外的应用程序System.Windows.Browser.HtmlPage.Plugin.Focus();不存在。

有关其他想法,请参阅我的问题

于 2009-12-12T09:38:46.047 回答
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;
        }
于 2010-12-16T10:05:28.443 回答
1

我的个人资料不足以评论@Jim BG 的答案,但对我有用的是在 RichTextBox 上添加 Loaded 事件的处理程序,并在该处理程序内添加

System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();

但是,它只适用于 IE 和 FF。要让它在 Chrome 和 Safari 上运行,请滚动到底

于 2013-05-01T09:41:30.560 回答
0

我忘了一件事...我还没有找到一种方法可以可靠地强制将焦点集中在页面上的 Silverlight 应用程序上(它可以在某些浏览器上运行,而不能在其他浏览器上运行)。

因此,Silverlight 应用程序本身可能没有焦点。在我开始期待键盘输入以确保 silverlight 应用程序具有焦点之前,我通常会诱骗用户单击按钮或类似的东西。

于 2008-09-24T03:03:13.950 回答
0

我也遇到了这个问题,但它与这里已经回答的情况不同。

如果您BusyIndicator在视图期间完全显示和隐藏了一个控件,则如果您有类似的线条,控件将不会获得焦点

Dispatcher.BeginInvoke(() => { myControl.Focus();}); 

在加载事件中。

相反,您需要在BusyIndi​​cator 显示设置为 false后调用该行代码。

我在这里有一个相关的问题,以及这种情况的解决方案。

于 2012-01-13T21:31:52.033 回答
0

确实是令人讨厌的行为。我找到了一个简单直接的解决方案:

(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

于 2012-08-25T12:18:49.340 回答
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。

于 2017-03-06T09:40:46.940 回答