Как установить фокус на TextBox во всплывающем окне вне браузера Silverlight 4

У меня есть простое всплывающее окно ChildWindow в Silverlight 4 ( бета).

Важно: это приложение вне браузера.

Я хочу автоматически устанавливать фокус на 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();, что не работает и фактически выдает ошибку при работе в бета-версии Silverlight 4 вне браузера.


person Simon_Weaver    schedule 12.12.2009    source источник


Ответы (6)


У меня была такая же проблема в SilverLight 4 (OOB), и я заметил, что последовательность вкладок фокусировалась на элементе управления, который я не мог видеть. Кажется, что происходит то, что фокус устанавливается на ваш элемент управления (первый в последовательности вкладок), а затем по какой-то причине фокус перемещается на ContentControl (name = "content"), который (я думаю) является родительским элементом дочернее окно.

ContentControl по умолчанию имеет IsTabStop = true. см. .... Зачем мне нужен IsTabStop установить значение true для ContentControl? Чтобы установить ContentControl.IsTabStop = false для всех ContentControl в вашем приложении, добавьте это в свой styles.xaml.

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

Та же проблема возникает с последовательностью вкладок на главной странице. Этот стиль также исправит это.

person tkerwood    schedule 11.02.2011
comment
+1 Большое вам спасибо. Это помогло мне (приложение Silverlight 4). - person fre0n; 13.04.2011
comment
То же самое и с моим ChildWindow. Все остальные «уловки» не сработали. Спасибо. - person Tim Cochran; 29.10.2011

Ты на правильном пути. Вам нужно обработать два тестовых примера:
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();
    }
}

Это должно помочь вам.

person mattduffield    schedule 29.01.2010
comment
Я еще не пробовал это снова, но проблема заключалась в том, что он не работал для события Loaded вне браузера. помните, что это дочернее окно, а не просто «обычный элемент управления» - person Simon_Weaver; 29.01.2010

Спасибо за все сообщения, но после небольшого исследования для меня работает следующая вещь.

в Хамале:

<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(); };
}
person Kokonad Mukherjee    schedule 02.12.2011

Мне пришлось использовать ваш GotFocus способ для приложения Silverlight 3, написанного на IronPython, когда я хотел установить фокус в ChildWindow.

person Lukas Cenovsky    schedule 30.04.2010

Я использую:

protected override void OnOpened()
{
    base.OnOpened();
    textBox1.Focus();
}
person allen    schedule 12.12.2011

Спасибо за весь пост, но я нашел проделанную работу, выполнив следующие действия.

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

    }
person Khalid Rafique    schedule 19.01.2012