Как сделать фокус текстового поля в Silverlight?

В моем приложении 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();
        }
    }
}

person Ben Griswold    schedule 24.09.2008    source источник
comment
Это зависит от браузера!   -  person JOG    schedule 08.05.2013
comment
Это может показаться очевидным, но проверьте, отключено ли ваше текстовое поле, прежде чем пытаться сфокусироваться. focus() будет работать только с включенными элементами управления.   -  person Fortune    schedule 17.07.2015


Ответы (15)


Я нашел это на silverlight.net и смог заставить его работать для меня, добавив вызов System.Windows.Browser.HtmlPage.Plugin.Focus () перед вызовом RegularTextBox.Focus ():

   private void UserControl_Loaded(object sender, RoutedEventArgs e)
   {        
      System.Windows.Browser.HtmlPage.Plugin.Focus();
      RegularTextBox.Focus();
   }
person Jim B-G    schedule 24.09.2008
comment
Это помогло. Он не дает индикатора того, что текстовое поле находится в фокусе (карат в текстовом поле или выделение границы), но я счастлив. Спасибо. - person Ben Griswold; 24.09.2008
comment
System.Windows.Browser.HtmlPage.Plugin.Focus () что он делает? - person Manish Basantani; 22.06.2009
comment
как следует из названия System.Windows.Browser.HtmlPage.Plugin.Focus () будет фокусировать плагин silverlight в окне браузера. - person bugBurger; 13.07.2009

Plugin.Focus(); 

у меня не сработало.

Звонок

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

От события Load сработало.

person rekle    schedule 14.04.2010

спасибо Сантьяго Палладино Диспетчер работал у меня отлично. Что я делаю:

this.Focus (); затем Dispatcher.BeginInvoke (() => {tbNewText.Focus ();});

person om.    schedule 27.01.2010

Я решил вставить конструктор элемента управления:

this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
person Luca    schedule 16.10.2012

Вы уверены, что действительно не сосредотачиваетесь? В бета-версии 2 есть известная ошибка, при которой вы получите фокус и сможете печатать, но не получите курсор или рамку. Обходной путь - вызвать UpdateLayout () в текстовом поле прямо перед вызовом Focus ().

person Bill Reiss    schedule 24.09.2008
comment
Хороший вопрос, но я уверен. После загрузки UserControl фокус не на TextBox. Странный. - person Ben Griswold; 24.09.2008

Я бы попытался добавить DispatcherTimer к событию UserLoaded, которое выполняет метод Focus через несколько миллисекунд после загрузки всего элемента управления; может проблема в этом.

person Santiago Palladino    schedule 24.09.2008
comment
Спасибо за предложение. Я подключил DispatcherTimer, и результат тот же. Только когда я физически совершу действие (например, щелкну страницу), будет установлен фокус. - person Ben Griswold; 24.09.2008

Мне также нужно было позвонить

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

Интересно, что этот вызов происходит внутри обработчика событий, когда я щелкаю мышью по TextBlock, сворачиваю TextBlock и делаю TextBox видимым. Если я не буду следить за ним диспетчером.BeginInvoke, он не получит фокус.

-Майк

person mike gold    schedule 08.10.2010

Код для установки фокуса правильный, поскольку если вы добавляете кнопку, которая вызывает тот же код, она работает отлично:

<StackPanel Width="150" VerticalAlignment="Center">
    <TextBox x:Name="RegularTextBox" IsTabStop="True" />
    <Button Click="UserControl_Loaded">
        <TextBlock Text="Test"/>
    </Button>
</StackPanel>

Итак, я предполагаю, что это как-то связано с Focus (), требующим какого-то взаимодействия с пользователем. Мне не удалось заставить его работать с событием MouseMove в UserControl, но установка события KeyDown для установки фокуса работает (хотя шаблон не обновляется до сфокусированного шаблона).

Width="400" Height="300" Loaded="UserControl_Loaded" KeyDown="UserControl_KeyDown">

Мне кажется, что это ошибка ....

person Bryant    schedule 24.09.2008
comment
Спасибо, Брайант. Мне нравится, как вы подтвердили, нажав кнопку. Я посмотрю, смогу ли я придумать что-то похожее на ваше предложение MouseMove. - person Ben Griswold; 24.09.2008

Для приложений вне браузера System.Windows.Browser.HtmlPage.Plugin.Focus(); не существует.

См. мой вопрос здесь для других идей.

person Simon_Weaver    schedule 12.12.2009

У меня это работает в 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;
        }
person user544583    schedule 16.12.2010
comment
Это работает в IE и FF, но не в Chrome. Я упростил его как HtmlPage.Plugin.Focus (); someTextBox.UpdateLayout (); someTextBox.Focus (); - person Keith Adler; 21.04.2011

Мой профиль недостаточно хорош, чтобы комментировать ответ @Jim BG, но у меня сработало добавление обработчика для событие Loaded в RichTextBox и внутри этого обработчика добавить

System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();

Однако это работало только в IE и FF. Чтобы он работал в Chrome и Safari, прокрутите страницу это

person harryhazza    schedule 01.05.2013

Я забыл одну вещь ... Я не нашел способа надежно принудительно переключить фокус на ваше приложение Silverlight на странице (он будет работать в некоторых браузерах, но не в других).

Так что, возможно, само приложение Silverlight не имеет фокуса. Я обычно обманываю пользователя, заставляя его нажать кнопку или что-то подобное, прежде чем я начну ожидать ввода с клавиатуры, чтобы убедиться, что приложение silverlight имеет фокус.

person Bill Reiss    schedule 24.09.2008

Я также столкнулся с этой проблемой, но она возникла в другом случае, чем тот, на который здесь уже был дан ответ.

Если у вас есть BusyIndicator элемент управления, который отображается и скрывается вообще во время вашего просмотра, элементы управления не будут получать фокус, если у вас есть такие строки, как

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

в событии загрузки.

Вместо этого вам нужно будет вызвать эту строку кода после для отображения BusyIndicator значения false.

У меня есть связанный с этим вопрос здесь, а также решение для этого сценария.

person Matthew Steven Monkan    schedule 13.01.2012

Действительно раздражающее поведение. Я нашел простое и понятное решение:

(Код VB)

    Me.Focus()
    Me.UpdateLayout()

    Me.tbx_user_num.Focus()
    Me.tbx_user_num.UpdateLayout()

Каждый элемент здесь важен, по крайней мере, в соответствии с моим проектом (VB2010 SL4 OutOfBrowser).

Кредит: http://www.dotnetspark.com/kb/1792-set-focus-to-textbox-silverlight-3.aspx

person Jonathan S.    schedule 25.08.2012

Ни один из приведенных выше ответов не помог мне напрямую, я сделал то, что добавил это событие в конструктор MainPage ():

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

И обработал это следующим образом:

   void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        System.Windows.Browser.HtmlPage.Plugin.Focus();
        RegularTextBox.Focus();
    }

Моя версия Silverlight - 4.

person Talha Imam    schedule 06.03.2017