Как дать фокус текстового поля в Silverlight? - PullRequest
32 голосов
/ 24 сентября 2008

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

Ответы [ 15 ]

41 голосов
/ 24 сентября 2008

Я нашел это на 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();
   }
23 голосов
/ 14 апреля 2010
Plugin.Focus(); 

не работает для меня.

Calling

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

Сработало событие Load.

10 голосов
/ 27 января 2010

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

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

3 голосов
/ 16 октября 2012

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

this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
2 голосов
/ 09 октября 2010

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

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

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

-Mike

2 голосов
/ 24 сентября 2008

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

2 голосов
/ 24 сентября 2008

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

1 голос
/ 01 мая 2013

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

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

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

1 голос
/ 16 декабря 2010

Это работает для меня в 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;
        }
1 голос
/ 12 декабря 2009

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

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

...