【问题标题】:How to set focus on TextBox in Silverlight 4 out-of-browser popup如何在 Silverlight 4 浏览器外弹出窗口中将焦点设置在 TextBox 上
【发布时间】:2010-12-25 23:02:32
【问题描述】:

我在 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 浏览器外运行时会出错。

【问题讨论】:

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


    【解决方案1】:

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

    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 非常感谢。这对我有用(Silverlight 4 应用程序)。
    • 这也是我的 ChildWindow 的诀窍。所有其他的“技巧”都不起作用。谢谢。
    【解决方案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();
        }
    }
    

    这应该对你有用。

    【讨论】:

    • 我还没有再次尝试过,但问题是它不适用于浏览器外的 Loaded 事件。记住这是一个子窗口——不仅仅是一个“常规控件”
    【解决方案3】:

    感谢所有的帖子,但在做了一些研究之后,下面的东西对我有用

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我用:

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

        【讨论】:

          【解决方案6】:

          感谢所有的帖子,但我已经通过以下方式找到了工作。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多