Question

Dans mon application Silverlight, je n'arrive pas à mettre en évidence 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();
        }
    }
}
Était-ce utile?

La solution

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

Autres conseils

Plugin.Focus(); 

n'a pas fonctionné pour moi.

Appeler

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

À partir de l'événement Load a fonctionné.

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

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

J'ai résolu de mettre le constructeur de contrôle:

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

Ê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 ().

J'essaierais 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à.

Je devais aussi appeler

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

curieusement, cet appel se passe à l'intérieur d'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.

-Mike

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 le contrôle 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">

Cela me semble être un bug ....

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

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

Cela fonctionne pour moi dans SL4, IE7 et Firefox 3.6.12

Dernière pièce manquante "" qui a fait le focus au travail (pour moi) définissait 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;
        }

Mon profil ne permet pas de commenter la réponse de @Jim BG, mais ce qui a bien fonctionné pour moi a été d'ajouter un gestionnaire pour l'événement Loaded sur la RichTextBox et à l'intérieur de ce gestionnaire, ajouter

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 this

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

Donc, il se peut 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 commencer à attendre une entrée au clavier pour s’assurer que l’application silverlight est active.

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

Si vous avez un contrôle BusyIndicator 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.

Au lieu de cela, vous devrez appeler cette ligne de code après que votre écran BusyIndicator a été défini sur false.

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

En effet, un comportement 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).

Merci de: http: // www .dotnetspark.com / kb / 1792-set-focus-to-textbox-silverlight-3.aspx

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 la 4.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top