web-dev-qa-db-fra.com

Comment donner un focus à Textbox dans Silverlight?

Dans mon application Silverlight, je n'arrive pas à attirer l'attention sur un contrôle TextBox. Sur la recommandation de divers articles, j'ai défini la propriété IsTabStop sur True et j'utilise TextBox.Focus (). Bien que l'événement UserControl_Loaded se déclenche, le contrôle TextBox n'est pas activé. J'ai inclus mon code très simple ci-dessous. Qu'est-ce que je rate? Merci.

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();
        }
    }
}
32
Ben Griswold

J'ai trouvé ceci sur silverlight.net et j'ai pu le faire fonctionner en ajoutant un appel à System.Windows.Browser.HtmlPage.Plugin.Focus () avant d'appeler RegularTextBox.Focus ():

   private void UserControl_Loaded(object sender, RoutedEventArgs e)
   {        
      System.Windows.Browser.HtmlPage.Plugin.Focus();
      RegularTextBox.Focus();
   }
41
Jim B-G
Plugin.Focus(); 

n'a pas fonctionné pour moi.

Appel

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

Depuis l'événement Load a fonctionné.

23
rekle

merci Santiago Palladino Dispatcher a parfaitement travaillé pour moi. Ce que je fais c'est:

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

10
om.

J'ai résolu en mettant dans le constructeur de contrôle:

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

Êtes-vous sûr de ne pas vraiment vous concentrer? Il y a un bug connu dans la bêta 2 où vous aurez le focus et pourrez taper mais vous n'obtiendrez pas le curseur ou la bordure. La solution consiste à appeler UpdateLayout () dans la zone de texte juste avant d'appeler Focus ().

2
Bill Reiss

J'essayerais d'ajouter un DispatcherTimer à l'événement UserLoaded qui exécute la méthode Focus quelques millisecondes après le chargement du contrôle entier; le problème est peut-être là.

2
Santiago Palladino

J'avais aussi besoin d'appeler 

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

fait intéressant, cet appel se passe dans un gestionnaire d'événements lorsque je clique sur un TextBlock, que je réduis le TextBlock et que le TextBox est visible. Si je ne le suis pas par un répartiteur.BeginInvoke ne sera pas activé.

-Mike

2
mike gold

Pour les applications hors navigateur, le System.Windows.Browser.HtmlPage.Plugin.Focus(); n'existe pas.

Voir ma question ici pour d’autres idées.

1
Simon_Weaver

Votre code pour définir le focus est correct car si vous ajoutez un bouton qui appelle le même code cela fonctionne parfaitement:

<StackPanel Width="150" VerticalAlignment="Center">
    <TextBox x:Name="RegularTextBox" IsTabStop="True" />
    <Button Click="UserControl_Loaded">
        <TextBlock Text="Test"/>
    </Button>
</StackPanel>

Je suppose donc que cela a quelque chose à voir avec Focus () qui nécessite une sorte d'interaction de l'utilisateur. Je ne pouvais pas le faire fonctionner avec un événement MouseMove sur UserControl, mais mettre un événement KeyDown pour définir le focus fonctionne (bien que le modèle ne soit pas mis à jour vers le modèle ciblé). 

Width="400" Height="300" Loaded="UserControl_Loaded" KeyDown="UserControl_KeyDown">

Ça ressemble à un bug pour moi....

1
Bryant

Mon profil n'est pas assez bon pour commenter @Jim B-G's répondre mais ce qui a bien fonctionné pour moi a été d'ajouter un gestionnaire pour l'événement Loaded sur la RichTextBox et d'ajouter à l'intérieur de ce gestionnaire 

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

Cependant, cela ne fonctionnait que sur IE et FF. Pour que cela fonctionne avec Chrome et Safari, faites défiler vers le bas de this

1
harryhazza

Cela fonctionne pour moi dans SL4 et IE7 et Firefox 3.6.12 

La dernière "pièce" manquante qui a permis à Focus de fonctionner (pour moi) était la définition de la propriété .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;
        }
1
user544583

J'ai oublié une chose ... Je n'ai pas trouvé de moyen de forcer le focus sur votre application Silverlight sur la page de manière fiable (cela fonctionnera sur certains navigateurs et pas sur d'autres). 

Il se peut donc que l'application Silverlight elle-même n'ait pas le focus. En général, je trompe l'utilisateur en cliquant sur un bouton ou quelque chose de similaire avant de m'attendre à une entrée au clavier pour s'assurer que l'application silverlight est active. 

0
Bill Reiss

En effet un beheviour ennuyeux. J'ai trouvé une solution simple et directe:

(Code VB)

    Me.Focus()
    Me.UpdateLayout()

    Me.tbx_user_num.Focus()
    Me.tbx_user_num.UpdateLayout()

Chaque élément ici est essentiel, au moins selon mon projet (VB2010 SL4 OutOfBrowser).

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

0
Jonathan S.

J'ai également rencontré ce problème, mais il est né d'un cas différent de celui auquel on a déjà répondu ici.

Si un contrôle BusyIndicator est affiché et masqué pendant votre affichage, les contrôles ne seront pas activés si vous avez des lignes telles que

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

dans l'événement de chargement.

À la place, vous devrez appeler cette ligne de code après que votre affichage BusyIndicator a été défini sur false.

J'ai une question connexe ici , ainsi qu'une solution à ce scénario.

0

Aucune des réponses ci-dessus n'a fonctionné pour moi directement, ce que j'ai fait est que j'ai ajouté cet événement dans le constructeur de MainPage ():

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

Et traité comme suit:

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

Ma version Silverlight est 4.

0
Talha Imam