Установка начального контрольного фокуса в Silverlight - PullRequest
8 голосов
/ 14 июля 2009

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

Я попытался вызвать .Focus в событии Loaded UserControl, но безуспешно. Кто-нибудь знает, как это сделать?

Ответы [ 5 ]

16 голосов
/ 15 июля 2009
public MainPage()
{
    InitializeComponent();

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

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    HtmlPage.Plugin.Focus();
    MyTextBox.Focus();
}
5 голосов
/ 14 июля 2009

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

Однако, посмотрите, если это решение решит эту проблему для вас. Вам придется использовать немного 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" />
3 голосов
/ 20 июля 2009

Если вы хотите сделать это способом 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 голос
/ 24 мая 2011

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

window.onload = function ()

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

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

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

0 голосов
/ 11 февраля 2011

Я только что сделал быстрый тест, и, похоже, это решит проблему и в браузере!

Как установить фокус на TextBox в всплывающем окне вне браузера Silverlight 4

...