Come faccio a dare un focus sulla casella di testo in Silverlight?

Nella mia applicazione Silverlight, non riesco a portare l’attenzione su un controllo TextBox. Sulla raccomandazione di vari post, ho impostato la proprietà IsTabStop su True e sto utilizzando TextBox.Focus (). Sebbene l’evento UserControl_Loaded sia triggersto, il controllo TextBox non ottiene il focus. Ho incluso il mio codice molto semplice qui sotto. Cosa mi manca? Grazie.

Page.xaml

       

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

Ho trovato questo su silverlight.net, ed è stato in grado di farlo funzionare per me 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(); } 
 Plugin.Focus(); 

non ha funzionato per me

chiamata

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

Dall’evento Load ha funzionato.

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

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

Ho risolto mettendo il costruttore di controllo:

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

Sei sicuro di non focalizzarti davvero? C’è un bug noto nella Beta 2 in cui ti focalizzi e puoi digitare ma non otterrai il segno o il bordo. La soluzione alternativa è chiamare UpdateLayout () sulla casella di testo appena prima di chiamare Focus ().

Vorrei provare ad aggiungere un DispatcherTimer all’evento UserLoaded che esegue il metodo Focus alcuni millisecondi dopo il caricamento dell’intero controllo; forse il problema è lì.

Dovevo anche chiamare

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

È interessante notare che questa chiamata sta accadendo all’interno di un gestore di eventi quando faccio clic su un TextBlock, comprimo il TextBlock e rendiamo visibile il TextBox. Se non lo seguo da un dispatcher.BeginInvoke, non si focalizzerà.

-Mike

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

     

Quindi presumo che questo sia qualcosa a che fare con Focus () che richiede un qualche tipo di interazione con l’utente. Non riuscivo a farlo funzionare con un evento MouseMove su UserControl, ma inserendo un evento KeyDown per impostare il focus funziona (anche se il modello non si aggiorna al modello focalizzato).

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

Sembra un insetto per me ….

Per app fuori dal browser, 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

Il “pezzo” mancante finale che ha messo a fuoco 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; } 

Il mio profilo non è abbastanza buono per commentare la risposta di @Jim BG, ma ciò che ha funzionato per me è stato aggiungere un gestore per l’evento Loaded sul RichTextBox e all’interno di quel gestore aggiungere

 System.Windows.Browser.HtmlPage.Plugin.Focus(); .UpdateLayout() .Focus(); 

Tuttavia, ha funzionato solo su IE e FF. Per farlo funzionare su Chrome e Safari, scorri fino alla fine di questo

Ho dimenticato una cosa … Non ho trovato un modo per forzare il focus 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 il focus. Di solito induco l’utente a fare clic su un pulsante o qualcosa di simile prima di iniziare a prevedere l’input da tastiera per assicurarsi che l’app Silverlight abbia il focus.

Ho anche incontrato questo problema, ma è nato da un caso diverso da quello che è stato già risposto qui.

Se si dispone di un controllo BusyIndicator viene visualizzato e nascosto durante la visualizzazione, i controlli non verranno messi a fuoco se si dispone di righe come

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

nell’evento di caricamento.

Invece, dovrai chiamare quella riga di codice dopo che il tuo display BusyIndicator è stato impostato su false.

Ho una domanda correlata qui , oltre a una soluzione per questo scenario.

Anzi un fastidioso beheviour. Ho trovato una soluzione semplice e semplice:

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

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

Nessuna delle risposte precedenti ha funzionato per me direttamente, quello che ho fatto è che ho aggiunto questo evento nel costruttore di 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 Silverlight è 4.