В моем приложении 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();
}
}
}
Это может показаться очевидным, но проверьте, отключено ли ваше текстовое поле, прежде чем пытаться сфокусироваться. focus() будет работать только с включенными элементами управления.





Код для установки фокуса правильный, поскольку если вы добавляете кнопку, которая вызывает тот же код, она работает отлично:
<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.
Вы уверены, что действительно не сосредотачиваетесь? В бета-версии 2 есть известная ошибка, когда вы получите фокус и сможете печатать, но не получите курсор или рамку. Обходной путь - вызвать UpdateLayout () в текстовом поле прямо перед вызовом Focus ().
Хороший вопрос, но я уверен. После загрузки UserControl фокус не на TextBox. Странный.
Я забыл одну вещь ... Я не нашел способа надежно принудительно переключить фокус на ваше приложение Silverlight на странице (он будет работать в некоторых браузерах, но не в других).
Так что, возможно, само приложение Silverlight не имеет фокуса. Я обычно обманываю пользователя, заставляя его нажать кнопку или что-то подобное, прежде чем я начну ожидать ввода с клавиатуры, чтобы убедиться, что приложение silverlight имеет фокус.
Я бы попытался добавить DispatcherTimer к событию UserLoaded, которое выполняет метод Focus через несколько миллисекунд после загрузки всего элемента управления; может проблема в этом.
Спасибо за предложение. Я подключил DispatcherTimer, и результат тот же. Только когда я физически совершу действие (например, щелкну страницу), будет установлен фокус.
Я нашел это на 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();
}
Это помогло. Он не указывает на то, что текстовое поле находится в фокусе (карат в текстовом поле или выделение границ), но я счастлив. Спасибо.
"System.Windows.Browser.HtmlPage.Plugin.Focus ()" что он делает?
как следует из названия System.Windows.Browser.HtmlPage.Plugin.Focus () будет фокусировать плагин silverlight в окне браузера.
Для приложений вне браузера 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 ();
Я также столкнулся с этой проблемой, но она возникла в другом случае, чем тот, на который уже был дан ответ.
Если у вас есть элемент управления 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.
Это зависит от браузера!