Подтвердить что ты не робот

Как настроить текстовое поле в 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();
        }
    }
}
4b9b3361

Ответ 1

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

Ответ 2

Plugin.Focus(); 

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

Вызов

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

От загруженного события.

Ответ 3

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

this.Focus(); тогда Dispatcher.BeginInvoke(() = > {tbNewText.Focus();});

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

-Mike

Ответ 8

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

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

Кажется, это ошибка для меня....

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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

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

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

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

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

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

Ответ 14

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

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

Ответ 15

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

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

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

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

Моей версией Silverlight является 4.