2008-09-24 13 views
32

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.¿Cómo le doy un foco de texto en Silverlight?

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(); 
     } 
    } 
} 
+0

depende del navegador! – JOG

+0

Puede sonar obvio, pero verifique si su cuadro de texto está deshabilitado antes de intentar enfocar. 'focus()' solo funcionará en controles habilitados. – Fortune

Respuesta

41

Encontré esto en silverlight.net, y pude hacer que funcione 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(); 
    } 
+0

Eso hizo el truco. No proporciona un indicador de que el cuadro de texto tenga el foco (quilates dentro del cuadro de texto o el resaltado de bordes), pero estoy contento. Gracias. –

+0

"System.Windows.Browser.HtmlPage.Plugin.Focus()" ¿qué hace? –

+0

como el nombre sugiere System.Windows.Browser.HtmlPage.Plugin.Focus() enfocará el complemento silverlight en la ventana del navegador. – bugBurger

1

código para ajustar el enfoque es correcto, ya que si se agrega un botón que llama el 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"> 

que parece ser un error para mí ....

+0

Gracias Bryant. Me gusta cómo has validado usando el botón clic. Veré si no puedo encontrar algo similar a tu sugerencia de MouseMove. –

2

¿Seguro que no está realmente conseguir el enfoque? 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().

+0

Buena pregunta, pero estoy seguro. El foco no está en el TextBox después de que se carga UserControl. Extraño. –

0

Olvidé una cosa ... No he encontrado una manera 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.

2

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í.

+0

Gracias por la sugerencia. Conecté el DispatcherTimer y el resultado es el mismo. No es hasta que realizo una acción física (haga clic en la página, por ejemplo) se establece el enfoque. –

1

Para aplicaciones fuera del navegador, el System.Windows.Browser.HtmlPage.Plugin.Focus(); no existe.

Ver my question here para otras ideas.

10

gracias Santiago Palladino Dispatcher funcionó perfectamente para mí. Lo que estoy haciendo es:

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

+0

Esto funcionó para mí también. – kpozin

23
Plugin.Focus(); 

no funcionó para mí.

Calling

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

Desde el evento de carga trabajaban.

+2

No funciona para mí – Mario

2

También necesitaba para 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 el TextBox sea visible. Si no lo sigo por un dispatcher.BeginInvoke no se enfocará.

-Mike

1

Funciona para mí en SL4 e IE7 y Firefox 3.6.12

final faltante "pieza" que hizo foco a trabajar (para mí) se ponía .TabIndex propiedad

 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; 
     } 
+0

Esto funciona en IE y FF, pero no en Chrome. Lo simplifiqué como HtmlPage.Plugin.Focus(); someTextBox.UpdateLayout(); someTextBox.Focus(); –

0

También encontré este problema, pero surgió de un caso diferente al que ya se ha respondido aquí.

Si usted tiene un control BusyIndicator que se muestra y oculta en absoluto durante su opinión, los controles no conseguirá centrarse si tiene líneas como

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

en el evento de carga.

En su lugar, tendrá que llamar a esa línea de código después de su pantalla BusyIndicator se ha configurado en falso.

Tengo una pregunta relacionada here, así como una solución para este escenario.

3

solucioné poniendo en el constructor de control:

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

Mi perfil no es lo suficientemente bueno para comentar sobre @Jim BG answer pero lo que funcionó para mí era añadir un controlador para el evento cargado en el RichTextBox y dentro de ese manejador añadir

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

Sin embargo, sólo funcionaba en IE y FF.Para conseguir que funcione en Chrome y Safari, desplazarse hasta la parte inferior de this

0

Ninguna de las respuestas anteriores trabajaron para mí directamente, lo que hice es que he añadido a este evento en el MainPage() constructor:

this.Loaded += new RoutedEventHandler(MainPage_Loaded); 

y manipulados como sigue:

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

Mi versión de Silverlight es 4.

Cuestiones relacionadas