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

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

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

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

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

0 голосов
/ 06 марта 2017

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

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

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

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

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

0 голосов
/ 25 августа 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

0 голосов
/ 14 января 2012

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

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

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

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

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

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

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

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

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

...