2009-07-14 30 views
8

Tôi đang tìm cách tự động đặt trọng tâm ban đầu trên một Silverlight UserControl thành một điều khiển cụ thể. Tôi có một trang đăng nhập với một hộp văn bản tên người dùng và tôi muốn có nó để ngay sau khi người dùng đi đến trang con trỏ của họ đã được định vị và chờ trong hộp văn bản tên người dùng thay vì phải làm cho họ bấm vào hộp.Đặt tiêu điểm điều khiển ban đầu trong Silverlight

Tôi đã thử gọi .Focus trong sự kiện đã tải của UserControl nhưng không thành công. Bất cứ ai biết làm thế nào để làm điều này?

Trả lời

5

Tôi đã bỏ qua một ứng dụng SL3 nhanh và nó khó có được trọng tâm ban đầu đi đến UserControl cho phép một mình kiểm soát trong điều khiển Silverlight.

Tuy nhiên, xem nếu this solution giải quyết vấn đề này cho bạn. Bạn sẽ phải sử dụng một chút JavaScript.

Dưới đây là đoạn code để tham khảo:

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

Khi kiểm soát SL của bạn đã tập trung, bạn có thể tiếp tục thiết lập focus cho một điều khiển cụ thể sử dụng một cái gì đó như:

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

nơi uxLogin được định nghĩa trong XAML là:

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

Giải pháp này dường như hoạt động trong IE nhưng tôi không thể điều khiển Silverlight để lấy tiêu điểm trong Firefox hoặc Chrome. –

+0

Vẫn không thể làm việc này trong các trình duyệt khác nhưng tôi sẽ thực hiện giải pháp này vì hầu hết người dùng sẽ ở trong IE và những người khác sẽ chỉ cần nhấp vào điều khiển Silverlight. Cảm ơn! –

+0

chào mừng bạn. Tôi đã có rất nhiều vấn đề với Silverlight và FF - thay đổi kích thước và chỉ nhận được sự kiểm soát để hiển thị. Trong một trường hợp, cuối cùng tôi đã từ bỏ và có một giải pháp cho IE và một giải pháp khác cho FF. Không phải là cách tốt nhất, nhưng tốt thôi. –

16
public MainPage() 
{ 
    InitializeComponent(); 

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

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

+1. Điều này làm việc cho tôi trong Silverlight 4 – Jehof

+1

+1 Cũng làm việc cho tôi trong Silverlight 5 – BaBu

3

Nếu bạn muốn thực hiện nó theo cách PRISM hoặc MVVM (loại bỏ mã code phía sau), bạn có thể thực hiện một hành vi. Trong trường hợp của tôi, tôi tập trung xem trong trường tên người dùng nếu nó trống và trong mật khẩu nếu nó được thiết lập (do đó có 2 tham số).

thực hiện của tôi:

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

Nếu bạn muốn mã này:

window.onload = function()

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

làm việc trong tất cả các trình duyệt, bạn phải thiết lập các tabIndex cho các phần tử với id = "Xaml1".

Xin lỗi vì tiếng Anh của tôi :)

Các vấn đề liên quan