Những kiểu riêng của thuộc tính (lớp FrameworkElement)

Một phần của tài liệu Nghiên cứu silversight và xây dựng ứng dụng web hỗ trợ phát triển bài giảng dạng multimedia (Trang 82 - 89)

SVTH: Thân Hoàng Lộc Trang 83 Nguyễn Anh Việt

Lưu Xuân Việt

Để gọi lại hành động khi thuộc tính đã thay đổi. Ví dụ, vẽ lại TextBox khi thuộc tính Text thay đổi và thông báo TextChanged event tới ứng dụng. Nếu bạn không sử dụng chức năng gọi lại sự thay đổi thì sự thay đổi sẽ không xảy ra.

Bạn có thể thêm chi tiết vào chỗ trống trong ví dụ và đăng ký một thuộc tính phụ thuộc mới để sẵn dùng khi bạn cần sử dụng.

Chú ý:

Trong Silverlight có 3 sự đơn giản hóa hơn so với sự phong phú của WPF:

- Không sử dụng đối tượng Metadata để đòi hỏi thông tin thêm vào.

- Không hỗ trợ việc phân biệt có hiệu lực hay không (Không tự động loại bỏ những giá trị sai).

- Không hỗ trợ việc ép kiểu (Tự động thừa nhận và thay đổi giá trị sai vào). b. Trình bao bọc những thuộc tính

Bước cuối cùng là gói những thuộc tính Silverlight của bạn vảo trong những thuộc tính truyền thống của .NET. Ngoài ra, xem xét những thủ tục truy xuất những đặc trưng của thuộc tính hoặc set giá trị riêng cho những field, thuộc tính thủ tục cho thuộc tính Silverlight sử dụng là phương thức GetValue() và SetValue() được định nghĩa trong lớp cơ bản DependencyObject.

Ví dụ:

public Thickness Margin {

get { return (Thickness)GetValue(MarginProperty); } set { SetValue(MarginProperty, value); }

}

Khi bạn tạo một gói bao những thuộc tính, bạn nên tính đến những cái không thể hơn là gọi SetValue() và gọi GetValue() như trong ví dụ trên. Bạn không nên thêm bất kỳ đoạn code nào để xác nhận giá trị, xây dựng event…v..v…Bởi vì đây là nét đặc trưng

SVTH: Thân Hoàng Lộc Trang 84 Nguyễn Anh Việt

Lưu Xuân Việt

trên Silverlight để có thể bỏ qua việc gói thuộc tính lại và gọi trực tiếp SetValue() và GetValue()

Cú pháp tổng quát:

myElement.Margin = new Thickness(5);

c. Mức độ giá trị chức năng (Dynamic Value Resolution )

Chúng ta đã biết, thuộc tính phụ thuộc phụ thuộc vào nhiều dịch vụ khác nhau, để xác định rõ giá trị của thuộc tính hiện hành, Silverlight quyết định đưa ra quyền ưu tiên. Xử lý này được gọi là mức độ giá trị chức năng (Dynamic Value Resolution )

Khi đánh giá một thuộc tính, Silverlight đánh giá theo những cấp bậc ưu tiên sau: 1. Amination: Nếu một amination hiện hành đang chạy, và amination đó thay đổi

giá trị thuộc tính, Silverlight sẽ sử dụng amination đó.

2. Giá trị cục bộ (Local value): Nếu bạn set một giá trị rõ ràng trong XAML hoặc trong code, Silverlight sẽ sử dụng giá trị cục bộ đó. Nên nhớ, bạn có thể dùng phương thức Setvalue() để set lại giá trị hoặc gói những thuộc tính đó lại. Nếu bạn set một thuộc tính sử dụng liên kết dữ liệu hoặc tài nguyên, nó có thể sẽ làm thay đổi những giá trị cục bộ và bạn cần phải set lại.

3. Gốc những thành phần mẫu (the template parent): nếu một phần tử là mọt phần của data template hoặc một control template. Nó d9uo75ng5 nhiên được thừa hưởng chi tiết từ những phần tử cha. Nếu thục sự như vậy, chúng sẽ có hiệu lực ngay tức thì.

4. Kiểu (Styles): Những kiểu (Styles) của Silverlight cho phép bạn cấu hình nhiều control trong một quy tắc nhất định. Nếu bạn set một kiểu áp dụng cho những control này. Nó sẽ được vận hành ngay.

SVTH: Thân Hoàng Lộc Trang 85 Nguyễn Anh Việt

Lưu Xuân Việt

Một thuộc tính kèm theo là thuộc tính phụ thuộc đầy đủ trọn vẹn và cũng như tất cả các thuộc tính phụ thuộc khác nó chịu sự quản lý của hệ thống thuộc tính Silverlight. Sự khác biệt là nó kèm theo sự thay thuộc tính tới một lớp khác mà nó định nghĩa ở trong. Những ví dụ phổ biến của thuộc tính kèm theo tìm thấy ở những bao chứa thể hiện (layout container). Ví dụ lớp Grid khai báo một thuộc tính kèm theo: Row và Column, nơi mà bạn có thể set vị trí của phần tử đã chứa bên trong. Tương tự, Canvas khai báo một thuộc tính phụ thuộc Left và Top để bạn xác định vị trí cần đặt sử dụng hệ trục tọa độ. Khi tạo một thuộc tính phụ thuộc kèm theo, bạn không nên khai báo bao chứa thuộc tính .NET. Bởi vì thuộc tính phụ thuộc kèm theo có thể set trên bất kỳ đối tượng độc lập nào. Ví dụ thuộc tính phụ thuộc Grid.Row có thể set trên một đối tượng Grid (Nếu bạn có một Grid lồng bên trong một Grid khác) hoặc trên một vài phần tử khác. Thực ra, thuộc tính Grid.Row có thể set trên những thuộc tính ngang hàng nếu thuộc tính đó không nằm trong cùng 1 Grid và không phải là một đối tượng Grid đơn trong cây phần tử.

Để thay thế một bao chứa thuộc tính .NET, thuộc tính kèm theo yêu cầu môt cặp phương thức tĩnh mà có thể được gọi là: set và get giá trị thuộc tính. Những phương thức này sử dụng giống như phương thức SetValue() và GetValue() (Thừa kế từ lớp DependencyObject). Nên đặt tên cho phương thức tĩnh này là SetPropertyName() và GetPropertyName(). (adsbygoogle = window.adsbygoogle || []).push({});

Đây là phương thức tĩnh mà thực thi thuộc tính kèm theo Grid.Row: public static int GetRow(UIElement element)

{

return (int)element.GetValue(Grid.RowProperty); }

public static void SetRow(UIElement element, int value) {

element.SetValue(Grid.RowProperty, value); }

SVTH: Thân Hoàng Lộc Trang 86 Nguyễn Anh Việt

Lưu Xuân Việt

Và thêm một ví dụ đặt vị trí của một phần từ vào hàng đầu tiên của Grid sử dụng code: Grid.SetRow(txtElement, 0);

Đặt thuộc tính Grid.Row này có giá trị là 0 trên đối tượng txtElement cho mỗi một TextBox. Bởi vì Grid.Row này một thuộc tính phụ thuộc, Silverlight cho phép bạn áp dụng chúng cho bất kỳ phần tử nào.

2. Luồng sự kiện (Routed Events)

Tất cả những người phát triển .NET hiểu rõ ý nghĩa của event (Sự kiện) – Thông điệp mà được gởi bởi một đối tượng (Như là một phần tử Silverlight) tới code (đoạn mã) của bạn khi mà xuất hiện một điều gì đó quan trọng. WPF đề cao kiểu event .NET với môt khái niệm mới là luồng sự kiện (Events Routed), cái mà cho phép một event khởi tạo trên một đối tượng nhưng được dựng ở một nơi khác. Ví dụ như luồng sự kiện cho phép một click bắt đầu trên một Button và Button nổi lên trên bao chứa nó và lúc đó là trang chứa nó trước khi xảy ra những xử lý trong code.

Silverlight mượn một vài kiểu luồng sự kiện của WPF nhưng chỉ trong những kịch bản đơn giản. Trong khi WPF hỗ trợ vài kiểu luồng sự kiện thì Silverlight chỉ hỗ trợ có một luồng sự kiện: bubbled events mà sự chứa đựng được bắt nguồn từ sự thừa kế từ những phần tử trong lớp sâu của bao chứa này. Hơn nữa, bubbled events của Silverlight là sự liên kết của một vài sự kiện nhập vào của bàn phím (Keyboard) và chuột (mouse) (như MouseMove và KeyDown). Cũng như bạn thấy, Silverlight không sử dụng luồng sự kiện cho những sự kiện điều khiển (events control) cấp cao (như click) và bạn không thể sử dụng luồng sự kiện trong những event control được tùy biến riêng.

a. Bên trong những phần tử sự kiện (The Core Element Events)

Những phần tử này thừa hưởng những cái cơ bản của sự kiện bên trong 2 lớp UIElement và FrameworkElement.

SVTH: Thân Hoàng Lộc Trang 87 Nguyễn Anh Việt

Lưu Xuân Việt

Lớp UIElement khai báo một sự kiện quan trọng cho xử lý nhập vào của user và chỉ event này có luồng sự kiện. Danh sách event của UIElement bao gồm:

Tên sự kiện Mô tả

GotFocus Xảy ra khi UIElement nhận một điểm

KeyDown Xảy ra khi một phím trên bàn phím nhấn xuống trong khi UIElement đã chọn một điểm

KeyUp Xảy ra khi một phím trên bàn phím được nhả ra trong khiUIElement đã chọn một điểm

MouseLeave Xảy ra khi chuột ( bút vẽ) rời khỏi viền một UIElement

MouseLeftButtonDown Xảy ra khi nhấn trái chuột (Hoặc khi đầu một bút vẽ tác động vào thẻ PC) trong khi con trỏ chuột nằm trên một UIElement.

MouseLeftButtonUp Xảy ra khi nhấn trái chuột (Hoặc khi đầu một bút vẽ tác động vào thẻ PC) trong khi con trỏ chuột nằm trên một UIElement.

MouseEnter Xảy ra khi chuột ( bút vẽ) nhấp vào viền một UIElement

MouseLeave Xảy ra khi chuột ( bút vẽ) rời khỏi viền một UIElement

SVTH: Thân Hoàng Lộc Trang 88 Nguyễn Anh Việt

Lưu Xuân Việt

MouseMove Xảy ra khi di chuyển chuột ngang qua phần tử (adsbygoogle = window.adsbygoogle || []).push({});

Trong một vài trường hợp, những event cao cấp hơn có hiệu lực thay thế một vài event UIElement. Ví dụ như, lớp Button cung cấp một sự kiện click mà bắt đầu một hành động khi user nhấn và thả button chuột. Bạn nên luôn có đáp ứng tới event click chứ không hẳn là MouseLeftButtonDown hay MouseLeftButtonUp. Tương tự, TextBox cung cấp một event TextChanged xảy ra khi có sự thay đổi text bởi bất kỳ cơ cấu thêm vào cơ bản event KeyDown và KeyUp.

Lớp FrameworkElement chỉ thêm vào một vài kiểu event. Những event này không sử dụng sự kiện nổi bọt (event bubbling). Chi tiết mô tả trong bảng sau:

Tên sự kiện Mô tả

Loaded Xảy ra khi một FrameworkElement hoàn tất việc thể hiện trên giao diện, đã biên dịch và sẵn sàng tương tác

SizeChanged Xảy ra khi một trong hai thuộc tính ActualHeight hoặc ActualWidth thay đổi giá trị FrameworkElement

LayoutUpdated Xảy ra khi sự kết hợp những đối tượng con trong trường hợp đồng thời gắn kết Silverlight vào làm thay đổi giao diện thể hiện

SVTH: Thân Hoàng Lộc Trang 89 Nguyễn Anh Việt

Lưu Xuân Việt

Một phần của tài liệu Nghiên cứu silversight và xây dựng ứng dụng web hỗ trợ phát triển bài giảng dạng multimedia (Trang 82 - 89)