Как сделать фокус текстового поля в 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();
        }
    }
}

Это зависит от браузера!

JOG 08.05.2013 19:56

Это может показаться очевидным, но проверьте, отключено ли ваше текстовое поле, прежде чем пытаться сфокусироваться. focus() будет работать только с включенными элементами управления.

Fortune 17.07.2015 11:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
32
2
42 753
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

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

<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">

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

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

Ben Griswold 24.09.2008 06:53

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

Хороший вопрос, но я уверен. После загрузки UserControl фокус не на TextBox. Странный.

Ben Griswold 24.09.2008 06:50

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

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

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

Спасибо за предложение. Я подключил DispatcherTimer, и результат тот же. Только когда я физически совершу действие (например, щелкну страницу), будет установлен фокус.

Ben Griswold 24.09.2008 21:36
Ответ принят как подходящий

Я нашел это на 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();
   }

Это помогло. Он не указывает на то, что текстовое поле находится в фокусе (карат в текстовом поле или выделение границ), но я счастлив. Спасибо.

Ben Griswold 24.09.2008 23:10

"System.Windows.Browser.HtmlPage.Plugin.Focus ()" что он делает?

Manish Basantani 22.06.2009 07:09

как следует из названия System.Windows.Browser.HtmlPage.Plugin.Focus () будет фокусировать плагин silverlight в окне браузера.

bugBurger 13.07.2009 21:53

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

Другие идеи см. В мой вопрос здесь.

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

this.Focus (); потом Dispatcher.BeginInvoke (() => {tbNewText.Focus ();});

Plugin.Focus(); 

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

Звонок

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

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

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

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

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

-Майк

У меня это работает в 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;
        }

Это работает в IE и FF, но не в Chrome. Я упростил его как HtmlPage.Plugin.Focus (); someTextBox.UpdateLayout (); someTextBox.Focus ();

Keith Adler 21.04.2011 20:20

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

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

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

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

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

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

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

(Код 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

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

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

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

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

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

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

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

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

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

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

Другие вопросы по теме