Pregunta

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 recibe el foco.He incluido mi código muy simple a continuación.¿Qué me estoy perdiendo?Gracias.

Página.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>

Página.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();
        }
    }
}
¿Fue útil?

Solución

Encontré esto en silverlight.net y pude hacerlo funcionar 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();
   }

Otros consejos

Plugin.Focus(); 

no funcionó para mí.

Vocación

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

Desde el evento Load funcionó.

gracias Santiago Palladino Dispatcher me funcionó perfecto.Lo que estoy haciendo es:

this.Focus();luego despachador.begininvoke (() => {tbnewText.focus ();});

Resolví poniendo el constructor de control:

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

¿Estás seguro de que realmente no te estás concentrando?Hay un error conocido en Beta 2 en el que podrás enfocarte y poder escribir, pero no verás el símbolo de intercalación ni el borde.La solución es llamar a UpdateLayout() en el cuadro de texto justo antes de llamar a Focus().

Intentaría agregar un DispatcherTimer en el evento UserLoaded que ejecuta el método Focus unos milisegundos después de que se haya cargado todo el control;tal vez el problema esté ahí.

yo también necesitaba llamar

Deployment.Current.Dispatcher.BeginInvoke(() => myTextbox.Focus());

Curiosamente, esta llamada ocurre dentro de un controlador de eventos cuando hago clic con el mouse en un TextBlock, contraigo el TextBlock y hago visible el TextBox.Si no lo sigo mediante un despachador.BeginInvoke, no se enfocará.

-Miguel

Su código para establecer 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 funcionara con un evento MouseMove en UserControl, pero poner un evento KeyDown para establecer el enfoque 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....

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

Ver mi pregunta aquí para otras ideas.

Me funciona en SL4 e IE7 y Firefox 3.6.12

La última "pieza" que faltaba y 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;
        }

Mi perfil no es lo suficientemente bueno para comentar en @Jim B-G. respuesta pero lo que funcionó para mí fue agregar un controlador para el evento Loaded en RichTextBox y dentro de ese controlador agregar

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

Sin embargo, sólo funcionó en IE y FF.Para que funcione en Chrome y Safari, desplácese hasta el final de este

Olvidé una cosa... No he encontrado una manera de forzar el enfoque de 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 esté enfocada.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 esté enfocada.

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

Si tienes un BusyIndicator control se muestra y se oculta durante la vista, los controles no se enfocarán si tiene líneas como

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

en el evento de carga.

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

tengo una pregunta relacionada aquí, así como una solución para este escenario.

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, al menos según mi proyecto (VB2010 SL4 OutOfBrowser).

Crédito a : http://www.dotnetspark.com/kb/1792-set-focus-to-textbox-silverlight-3.aspx

Ninguna de las respuestas anteriores funcionó para mí directamente, lo que hice fue agregar 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 la 4.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top