probar - ¿Cómo le doy un enfoque de cuadro de texto en Silverlight?
habilitar silverlight (15)
En mi aplicación Silverlight, parece que no puedo enfocar un control TextBox. Por recomendación de varias publicaciones, configuré la propiedad IsTabStop en True y estoy usando TextBox.Focus (). Aunque el evento UserControl_Loaded se activa, el control TextBox no obtiene el foco. He incluido mi código muy simple a continuación. ¿Qué me estoy perdiendo? Gracias.
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();
}
}
}
¿Estás seguro de que no estás realmente enfocado? Hay un error conocido en Beta 2 donde obtendrá foco y podrá escribir, pero no obtendrá el cursor o el borde. La solución consiste en llamar a UpdateLayout () en el cuadro de texto justo antes de llamar a Focus ().
De hecho, un comportamiento molesto. Encontré una solución sencilla y directa:
(Código VB)
Me.Focus()
Me.UpdateLayout()
Me.tbx_user_num.Focus()
Me.tbx_user_num.UpdateLayout()
Cada elemento aquí es esencial, según mi proyecto al menos (VB2010 SL4 OutOfBrowser).
Crédito a: http://www.dotnetspark.com/kb/1792-set-focus-to-textbox-silverlight-3.aspx
El código para configurar el foco es correcto, ya que si agrega un botón que llama al mismo código, funciona perfectamente:
<StackPanel Width="150" VerticalAlignment="Center">
<TextBox x:Name="RegularTextBox" IsTabStop="True" />
<Button Click="UserControl_Loaded">
<TextBlock Text="Test"/>
</Button>
</StackPanel>
Así que supongo que esto tiene algo que ver con Focus () que requiere algún tipo de interacción del usuario. No pude hacer que funcione con un evento MouseMove en UserControl, pero poner un evento KeyDown para establecer el foco funciona (aunque la plantilla no se actualiza a la plantilla enfocada).
Width="400" Height="300" Loaded="UserControl_Loaded" KeyDown="UserControl_KeyDown">
Me parece como un insecto....
Encontré esto en silverlight.net, y pude hacer que funcionara para mí agregando una llamada a System.Windows.Browser.HtmlPage.Plugin.Focus () antes de llamar a RegularTextBox.Focus ():
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
RegularTextBox.Focus();
}
Funciona para mí en SL4 e IE7 y Firefox 3.6.12
La última "pieza" faltante que hizo que el enfoque funcionara (para mí) fue establecer la propiedad .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;
}
Intentaría agregar un DispatcherTimer en el evento UserLoaded que ejecuta el método Focus unos pocos milisegundos después de que se haya cargado todo el control; tal vez el problema está ahí.
Mi perfil no es lo suficientemente bueno para comentar la answer @Jim BG pero lo que funcionó para mí fue agregar un controlador para el evento Loaded en el RichTextBox y dentro de ese controlador agregar
System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();
Sin embargo, solo funcionó en IE y FF. Para que funcione en Chrome y Safari, desplácese hasta el final de this
Ninguna de las respuestas anteriores funcionó para mí directamente, lo que hice es que agregué este evento en el constructor MainPage ():
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
Y lo manejó de la siguiente manera:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
RegularTextBox.Focus();
}
Mi versión de Silverlight es 4.
Olvidé una cosa ... No he encontrado una forma de forzar el enfoque a su aplicación Silverlight en la página de manera confiable (funcionará en algunos navegadores y no en otros).
Por lo tanto, es posible que la aplicación Silverlight en sí no tenga foco. Por lo general, engaño al usuario para que haga clic en un botón o algo similar antes de comenzar a esperar la entrada del teclado para asegurarme de que la aplicación Silverlight tiene foco.
Para aplicaciones fuera del navegador, System.Windows.Browser.HtmlPage.Plugin.Focus();
no existe
Vea mi pregunta aquí para otras ideas.
Resolví poner el constructor de control:
this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
También encontré este problema, pero surgió de un caso diferente al que ya se ha respondido aquí.
Si tiene un control BusyIndicator
se muestra y oculta durante su vista, los controles no se enfocarán si tiene líneas como
Dispatcher.BeginInvoke(() => { myControl.Focus();});
en el evento de carga.
En cambio, deberá llamar a esa línea de código después de que su pantalla BusyIndicator se haya configurado en falso.
Tengo una pregunta relacionada here , así como una solución para este escenario.
También necesitaba llamar
Deployment.Current.Dispatcher.BeginInvoke (() => myTextbox.Focus ());
Curiosamente, esta llamada está sucediendo dentro de un controlador de eventos cuando hago clic con el mouse en un TextBlock, contrae el TextBlock y hace que TextBox sea visible. Si no lo sigo por un dispatcher.BeginInvoke no se enfocará.
-Micro
gracias Santiago Palladino Dispatcher trabajó para mí perfectamente. Lo que estoy haciendo es:
esto.Enfoque (); luego Dispatcher.BeginInvoke (() => {tbNewText.Focus ();});
Plugin.Focus();
no funcionó para mí
Vocación
Dispatcher.BeginInvoke(() => { tbNewText.Focus();});
Del evento de carga trabajado.