Как мне сфокусировать текстовое поле в Silverlight?

StackOverflow https://stackoverflow.com/questions/124649

  •  02-07-2019
  •  | 
  •  

Вопрос

В моем приложении Silverlight я, похоже, не могу сфокусироваться на элементе управления TextBox.По рекомендации различных сообщений я установил для свойства IsTabStop значение True и использую TextBox.Focus().Хотя событие UserControl_Loaded срабатывает, элемент управления TextBox не получает фокуса.Я включил свой очень простой код ниже.Что я упускаю из виду?Спасибо.

Страница.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>

Страница.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();
        }
    }
}
Это было полезно?

Решение

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

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

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

Plugin.Focus(); 

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

Зовущий

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

С момента загрузки событие сработало.

спасибо, диспетчер Сантьяго Палладино сработал для меня безукоризненно.То, что я делаю, это:

это.Фокус ();затем Диспетчер.BeginInvoke(() => { tbNewText.Фокус();});

Я решил ввести управляющий конструктор:

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

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

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

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

Развертывание.Текущее.Диспетчер.BeginInvoke(() => MyTextBox.Фокус());

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

-Майк

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

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

По-моему, это какая-то ошибка....

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

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

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

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

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

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

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

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

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

Если у вас есть 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

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

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top