如何在Silverlight中赋予文本框焦点?

时间:2020-03-06 14:38:07  来源:igfitidea点击:

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

解决方案

我们设置焦点的代码是正确的,因为如果我们添加一个调用相同代码的按钮,它将可以完美地工作:

<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">

对我来说似乎是个虫子。

我们确定我们没有真正集中注意力吗? Beta 2中有一个已知的错误,我们可以集中注意力并能够打字,但不会出现尖号或者边框。解决方法是在调用Focus()之前立即在文本框中调用UpdateLayout()。

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

因此,可能是Silverlight应用本身没有重点。我通常会诱骗用户单击按钮或者类似按钮,然后再开始期望键盘输入以确保silverlight应用程序具有焦点。

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

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

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

在这里查看我的问题以获取其他想法。

感谢Santiago Palladino Dispatcher非常适合我。我正在做的是:

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

Plugin.Focus();

没有为我工作。

呼唤

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

从Load事件开始。

我还需要打电话

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

有趣的是,当我在TextBlock上单击鼠标,折叠TextBlock并使TextBox可见时,此调用发生在事件处理程序中。如果我不由调度员跟踪它,那么BeginInvoke不会引起关注。

-麦克风

它在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;
        }