2009-07-14 2 views
8

Я ищу способ автоматического задания начального фокуса на Silverlight UserControl для определенного элемента управления. У меня есть страница входа с текстовым полем с именем пользователя, и я хотел бы иметь ее так, чтобы как только пользователь перешел на страницу, их курсор уже позиционирован и ждет в текстовом поле имени пользователя вместо того, чтобы заставить их щелкнуть по нему.Настройка начального фокуса управления в Silverlight

Я попытался позвонить. Фокус в загруженном событии UserControl, но без успеха. Кто-нибудь знает, как это сделать?

ответ

5

Я быстро взломал быстрое приложение SL3, и он сложно получить начальный фокус перейти к UserControl, не говоря уже о контроле в элементе управления Silverlight.

Однако, посмотрите, this solution решает эту проблему для вас. Вам придется использовать небольшой JavaScript.

Вот код для справки:

<%@ 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> 

После того, как элемент управления SL имеет фокус, вы можете дополнительно установить фокус на определенный контроль, используя что-то вроде:

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

где uxLogin определяется XAML как:

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

Это решение, кажется, работает в IE, но я не могу получить Silverlight управления, чтобы получить внимание в Firefox или Chrome. –

+0

По-прежнему не удается заставить это работать в других браузерах, но я собираюсь с этим решением, так как большинство пользователей будут в IE в любом случае, а остальные просто должны будут щелкнуть элемент управления Silverlight. Благодаря! –

+0

ваш приветствовать. У меня было много проблем с Silverlight и FF - изменение размера и просто получение контроля для отображения. В одном случае я, наконец, сдался и получил одно решение для IE, а другое для FF. Не лучший способ, но хорошо. –

16
public MainPage() 
{ 
    InitializeComponent(); 

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

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

+1. Это работает для меня в Silverlight 4 – Jehof

+1

+1 Также работал для меня в Silverlight 5 – BaBu

3

Если вы хотите сделать это в режиме PRISM или MVVM (избавиться от кода кода), вы можете реализовать поведение. В моем случае я фокусирую представление в поле имени пользователя, если оно пустое и в пароле, если оно установлено (следовательно, 2 параметра).

Моя реализация:

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

Если вы хотите этот код:

window.onload = функция()

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

работу во всех браузерах, необходимо установить TabIndex для элемента с ID = "Xaml1".

Извините за мой английский :)

Смежные вопросы