4

ChildWindow在 Silverlight 4 (beta) 中有一个简单的弹出窗口。

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

我想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 中做这样可怕的事情,但希望不再需要这样做。

注意:这个类似的问题仅适用于浏览器。它建议调用System.Windows.Browser.HtmlPage.Plugin.Focus();which 不起作用,实际上在 Silverlight 4 beta out-of-browser 上运行时会出错。

4

6 回答 6

3

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

ContentControl 默认具有 IsTabStop=true。看.... 为什么我希望在 ContentControl 上将 IsTabStop 设置为 true? 要为应用中的所有 ContentControl 设置 ContentControl.IsTabStop = false,请将其添加到您的 styles.xaml。

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

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

于 2011-02-11T06:23:50.500 回答
2

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

在萨马尔:

<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(); };
}
于 2011-12-02T09:27:45.623 回答
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();
    }
}

那应该对你有用。

于 2010-01-29T19:24:09.693 回答
1

当我想将GotFocus焦点设置在ChildWindow.

于 2010-04-30T16:48:55.037 回答
1

I use:

protected override void OnOpened()
{
    base.OnOpened();
    textBox1.Focus();
}
于 2011-12-12T19:50:33.793 回答
0

感谢所有的帖子,但我找到了通过以下完成的工作。

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

    }
于 2012-01-19T10:56:05.633 回答