如何在Silverlight 4浏览器外弹出窗口中将焦点设置在TextBox上

时间:2009-12-12 09:38:04

标签: silverlight silverlight-4.0 out-of-browser

我在Silverlight 4(测试版)中有一个简单的ChildWindow弹出窗口。

重要提示:这是浏览器外应用程序。

我希望在窗口打开时自动将焦点放在TextBox控件上。

我尝试了几件事:

以下代码似乎没有做任何事情。在“加载”之后我不认为控件已经准备好了。

    private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
    {
          textBox1.Focus();
    }

这很有效,但它很笨拙。

    private void ChildWindow_GotFocus(object sender, RoutedEventArgs e)
    {
          if (_firstTime == true) {
              textBox1.Focus();
             _firstTime = false;
          }
    }

有没有更好的方法?我总是不得不在WinForms中做这样可怕的事情,但希望不再需要这样做。

注意:此similar question仅适用于浏览器。它建议调用System.Windows.Browser.HtmlPage.Plugin.Focus();哪个不起作用,实际上在浏览器上运行Silverlight 4 beta时会出错。

6 个答案:

答案 0 :(得分:3)

我在SilverLight 4(OOB)中遇到了同样的问题,我注意到标签序列会将焦点设置为我看不到的控件。似乎正在发生的事情是焦点被设置为您的控件(选项卡序列中的第一个)然后由于某种原因焦点移动到ContentControl(name =“content”),其中(我认为)是父的孩子的窗户。

默认情况下,ContentControl的IsTabStop = true。 看到.... Why would I want IsTabStop set to true on a ContentControl? 要为应用中的所有ContentControl设置ContentControl.IsTabStop = false,请将其添加到styles.xaml。

   <Style  TargetType="ContentControl" >
         <Setter Property="IsTabStop" Value="false"/>
    </Style>

MainPage上的选项卡序列也会出现同样的问题。这种风格也可以解决这个问题。

答案 1 :(得分:2)

你走在正确的轨道上。您需要处理两个测试用例:
1.在浏览器中设置焦点。 2.将焦点设置在浏览器之外。

您在Loaded事件中显示的代码将在浏览器中完美运行。所有必要的是重构它来处理这两种情况:

private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
{
    if (App.current.IsRunningOutOfBrowser)
    {
        textBox1.Focus();
    }
    else
    {
        System.Windows.Browser.HtmlPage.Plugin.Focus();
        textBox1.Focus();
    }
}

这应该适合你。

答案 2 :(得分:2)

感谢所有帖子,但经过一些研究后,下面的内容对我有用

在Xamal:

<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" FontFamily="Arial" FontSize="12" Height="25" Width="200" Margin="38,50,0,0" Name="txtUserName" Text="{Binding LoginInfo.UserName,Mode=TwoWay, NotifyOnValidationError=True}"  IsTabStop="True" TabIndex="1" ></TextBox>

// Initialiazing Main Part View Model
/// </summary>
/// <param name="mainPartViewModel"></param>
public ChildWindowLoginControl(MainPartViewModel mainPartViewModel)
{
     InitializeComponent();
     this.DataContext = mainPartViewModel;
     System.Windows.Browser.HtmlPage.Plugin.Focus();
     this.GotFocus += (s, e) => { txtUserName.Focus(); };
}

答案 3 :(得分:1)

当我想在GotFocus中设置焦点时,我必须使用您的ChildWindow方式编写在IronPython中编写的Silverlight 3应用程序。

答案 4 :(得分:1)

我用:

protected override void OnOpened()
{
    base.OnOpened();
    textBox1.Focus();
}

答案 5 :(得分:0)

感谢所有帖子,但我发现通过以下方式完成了工作。

private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        if (App.Current.IsRunningOutOfBrowser)
        {
            txtSalesOrderNo.Focus(); 
        }
        else
        {
            System.Windows.Browser.HtmlPage.Plugin.Focus();
            txtSalesOrderNo.Focus(); 
        }

    }