2009-07-14 13 views
8

Sto cercando un modo per impostare automaticamente l'attivazione iniziale su Silverlight UserControl su un controllo specifico. Ho una pagina di login con una casella di testo per il nome utente e mi piacerebbe averla in modo che non appena l'utente accede alla pagina il loro cursore sia già posizionato e in attesa nella casella di testo del nome utente invece di dover fare clic sulla casella.Impostazione del focus di controllo iniziale in Silverlight

Ho provato a chiamare. Focus nell'evento Loaded UserControl ma senza successo. Qualcuno sa come fare questo?

risposta

5

ho montata su uno SL3 applicazione rapida ed è difficile avere il focus iniziale andare al UserControl figuriamoci a un controllo all'interno del controllo Silverlight.

Tuttavia, vedere se this solution risolve questo problema. Dovrai usare un piccolo JavaScript.

Ecco il codice di riferimento:

<%@ Page Language="C#" AutoEventWireup="true" %> 

<%@ Register Assembly="System.Web.Silverlight" Namespace="System.Web.UI.SilverlightControls" 
    TagPrefix="asp" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" style="height:100%;"> 
<head runat="server"> 
    <title>Test Page For TextFocusTest</title> 
    <script type="text/javascript"> 
    window.onload = function() 
     { 
      document.getElementById('Xaml1').focus(); 
     } 
    </script> 
</head> 
<body style="height:100%;margin:0;"> 
    <form id="form1" runat="server" style="height:100%;"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
     <div style="height:100%;"> 
      <asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/TextFocusTest.xap" Version="2.0" Width="100%" Height="100%" /> 
     </div> 
    </form> 
</body> 
</html> 

Una volta che il controllo di SL è attiva, è possibile impostare ulteriormente il focus a un controllo specifico usando qualcosa come:

namespace SilverlightApplication2 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 

      this.GotFocus += new RoutedEventHandler (MainPage_GotFocus); 
     } 

     void MainPage_GotFocus (object sender, RoutedEventArgs e) 
     { 
      uxLogin.Focus(); 
     } 
    } 
} 

dove uxLogin è definito in XAML come:

<TextBox x:Name="uxLogin" Height="25" Width="100" /> 
+1

Questa soluzione sembra funzionare in IE, ma non riesco a ottenere il controllo Silverlight per guadagnare attenzione in Firefox o Chrome. –

+0

Ancora non riesco a farlo funzionare in altri browser, ma ho intenzione di questa soluzione poiché la maggior parte degli utenti sarà in IE comunque e gli altri dovranno semplicemente fare clic sul controllo Silverlight. Grazie! –

+0

il benvenuto. Ho avuto un sacco di problemi con Silverlight e FF - ridimensionamento e solo il controllo da visualizzare. In un caso, alla fine ho rinunciato e ho una soluzione per IE e un'altra per FF. Non è il modo migliore, ma vabbè. –

16
public MainPage() 
{ 
    InitializeComponent(); 

    this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
} 

void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    HtmlPage.Plugin.Focus(); 
    MyTextBox.Focus(); 
} 
+2

+1. Questo funziona per me in Silverlight 4 – Jehof

+1

+1 Funzionava anche per me in Silverlight 5 – BaBu

3

Se si vuole farlo in modo PRISM o MVVM (eliminare il codice code-behind), è possibile implementare un comportamento. Nel mio caso focalizzo la vista nel campo username se è vuota e nella password se è impostata (da qui i 2 parametri).

mia realizzazione:

public static class ControlTextFocusBehavior 
{ 
    public static readonly DependencyProperty FocusParameterProperty = DependencyProperty.RegisterAttached(
     "FocusParameter", 
     typeof(string), 
     typeof(ControlTextFocusBehavior), 
     new PropertyMetadata(OnSetFocusParameterCallBack)); 

    public static readonly DependencyProperty IsEmptyFocusedProperty = DependencyProperty.RegisterAttached(
     "IsEmptyFocused", 
     typeof(bool), 
     typeof(ControlTextFocusBehavior), 
     new PropertyMetadata(true)); 


    private static void OnSetFocusParameterCallBack(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
    { 
     Control control = dependencyObject as Control; 
     if (control != null) 
     { 
      control.Loaded += new RoutedEventHandler(control_Loaded); 
     } 
    } 

    private static void control_Loaded(object sender, RoutedEventArgs e) 
    { 
     Control control = sender as Control; 
     control.Loaded -= new RoutedEventHandler(control_Loaded); 

     DependencyObject dependencyObject = sender as DependencyObject; 
     if (dependencyObject != null) 
     { 
      bool isEmptyFocused = GetIsEmptyFocused(dependencyObject); 
      bool isNullOrEmpty = string.IsNullOrEmpty(GetFocusParameter(dependencyObject)); 
      if ((isEmptyFocused && isNullOrEmpty) || 
       (!isEmptyFocused && !isNullOrEmpty)) 
      { 
       HtmlPage.Plugin.Focus(); 
       control.Focus(); 
      } 
     } 
    } 

    public static void SetFocusParameter(DependencyObject dependencyObject, string parameter) 
    { 
     dependencyObject.SetValue(FocusParameterProperty, parameter); 
    } 

    public static string GetFocusParameter(DependencyObject dependencyObject) 
    { 
     return dependencyObject.GetValue(FocusParameterProperty) as string; 
    } 


    public static void SetIsEmptyFocused(DependencyObject dependencyObject, bool parameter) 
    { 
     dependencyObject.SetValue(IsEmptyFocusedProperty, parameter); 
    } 

    public static bool GetIsEmptyFocused(DependencyObject dependencyObject) 
    { 
     return (bool)dependencyObject.GetValue(IsEmptyFocusedProperty); 
    } 
} 
1

Se si desidera che questo codice:

window.onload = function()

{ 
     document.getElementById('Xaml1').focus(); 
    } 

lavoro in tutti i browser, è necessario impostare il tabIndex per elemento con id = "Xaml1".

Ci dispiace per il mio inglese :)

Problemi correlati