Domanda

Nella mia applicazione Silverlight, non riesco a focalizzare l'attenzione su un controllo TextBox. Su consiglio di vari post, ho impostato la proprietà IsTabStop su True e sto usando TextBox.Focus (). Sebbene l'evento UserControl_Loaded si attivi, il controllo TextBox non viene attivato. Ho incluso il mio codice molto semplice di seguito. Cosa mi sto perdendo? Grazie.

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();
        }
    }
}
È stato utile?

Soluzione

L'ho trovato su silverlight.net e sono riuscito a farlo funzionare aggiungendo una chiamata a System.Windows.Browser.HtmlPage.Plugin.Focus () prima di chiamare RegularTextBox.Focus ():

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

Altri suggerimenti

Plugin.Focus(); 

non ha funzionato per me.

Calling

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

Dall'evento Load ha funzionato.

grazie Santiago Palladino Dispatcher ha funzionato perfettamente per me. Quello che sto facendo è:

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

Ho risolto inserendo il costruttore del controllo:

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

Sei sicuro di non concentrarti davvero? C'è un bug noto in Beta 2 in cui otterrai lo stato attivo e sarai in grado di digitare ma non otterrai il cursore o il bordo. Per risolvere il problema, chiamare UpdateLayout () nella casella di testo prima di chiamare Focus ().

Proverei ad aggiungere un DispatcherTimer sull'evento UserLoaded che esegue il metodo Focus alcuni millisecondi dopo che l'intero controllo è stato caricato; forse il problema è lì.

Avevo anche bisogno di chiamare

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

è interessante notare che questa chiamata sta avvenendo all'interno di un gestore di eventi quando faccio clic con il mouse su un blocco di testo, comprimo il blocco di testo e rendo visibile la casella di testo. Se non lo seguo da un dispatcher.BeginInvoke non si focalizzerà.

-Mike

Il codice per impostare lo stato attivo è corretto poiché se aggiungi un pulsante che chiama lo stesso codice funziona perfettamente:

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

Quindi suppongo che questo abbia a che fare con Focus () che richiede un qualche tipo di interazione dell'utente. Non riuscivo a farlo funzionare con un evento MouseMove su UserControl, ma inserendo un evento KeyDown per impostare lo stato attivo funziona (anche se il modello non si aggiorna al modello attivo).

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

Mi sembra un bug ....

Per le app fuori dal browser il System.Windows.Browser.HtmlPage.Plugin.Focus (); non esiste.

Vedi la mia domanda qui per altre idee.

Funziona per me in SL4 e IE7 e Firefox 3.6.12

Finale mancante "pezzo" che ha focalizzato il lavoro (per me) stava impostando la proprietà .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;
        }

Ho dimenticato una cosa ... Non ho trovato un modo per forzare l'attenzione sulla tua applicazione Silverlight sulla pagina in modo affidabile (funzionerà su alcuni browser e non su altri).

Quindi potrebbe essere che l'app Silverlight stessa non abbia lo stato attivo. Di solito induco l'utente a fare clic su un pulsante o qualcosa di simile prima di iniziare ad aspettarmi l'input da tastiera per assicurarmi che l'app silverlight abbia lo stato attivo.

Ho anche riscontrato questo problema, ma era nato da un caso diverso rispetto a quello a cui è già stata data una risposta qui.

Se hai un controllo BusyIndicator visualizzato e nascosto durante la visualizzazione, i controlli non si focalizzeranno se hai linee come

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

nell'evento load.

Invece, dovrai chiamare quella riga di codice dopo il display del tuo Indicatore di occupato è stato impostato su falso.

Ho una domanda correlata anche qui come soluzione per questo scenario.

In effetti un comportamento fastidioso. Ho trovato una soluzione semplice e diretta:

(codice VB)

    Me.Focus()
    Me.UpdateLayout()

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

Ogni elemento qui è essenziale, almeno secondo il mio progetto (VB2010 SL4 OutOfBrowser).

Accredito a: http: // www .dotnetspark.com / kb / 1792-set-focus-to-box-silverlight-3.aspx

Nessuna delle risposte sopra ha funzionato direttamente per me, quello che ho fatto è che ho aggiunto questo evento nel costruttore MainPage ():

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

E gestito come segue:

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

La mia versione di Silverlight è 4.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top