Как мне сфокусировать текстовое поле в Silverlight?
-
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.