Silverlight 2 Tutorial – Dùng các mẫu để tùy biến Look and Feel của control


Đây là phần 7 trong loạt 8 bài hướng dẫn các bước để xây dựng một chương trình Digg đơn giản dùng bản Beta 1 của Silverlight 2. Các bài hướng dẫn này nên được đọc theo thứ tự, và sẽ giúp giải thích một số khái niệm cơ bản trong Silverrlight.
Bạn có thể download mã nguồn phiên bản hoàn chỉnh của chương trình mẫu Digg tại đây.


Tùy biến Look and Feel
Một trong những tính năng mạnh mẽ nhất của mô hình lập trình trong WPF và Silverlight là khả năng cho phép tùy biến hoàn toàn LnF (Look and Feel: cách thức hiển thị và xử lý hành vi của các đối tượng giao diện) cảu các control. Nó cho phép người phát triển và người thiết kế có thể có thể làm cho các đối tượng giao diện trở nên cực kỳ tinh tế, và tính mềm dẻo rất cao của nó cũng cho phép tạo ra các trải nghiệm người dùng xuất sắc.
Trong phần này chúng ta sẽ xem qua một vài cách mà bạn có thể dùng để tùy biến các control, và sẽ dùng nó để “tỉa tót” lại chương trình Digg.

Tùy biến nội dung của các control
In Part 1 of our tutorial we added a simple button control to the page and demonstrated how to set a Trong phần 1, chúng ta đã thêm một nút bấm vào một trang và giới thiệu cách đặt lại chuỗi nội dung “Push Me!” của nó. Chúng ta cũng đã tạo ra hàm để xử lý sự kiện “Click” mỗi khi người dùng nhấn chuột.

Những thay đổi này sẽ làm cho nút bấm hiển thị giống như dưới đây:

Một trong những điều có thể làm bạn ngạc nhiên, đó là thuộc tính “Content” của Button không nhất thiết phải là một chuỗi đơn giản kiểu như “Push Me!”, mà thực sự, chúng ta thậm chí có thể đặt các Control và Shape như giá trị cho thuộc tính “Content”.
Lấy ví dụ, chúng ta có thể nhúng một StackPanel với một <Image> and <TextBlock> bên trong:

Điều này sẽ làm Button của chúng ta trông giống như dưới đây. Nhớ rằng nó vẫn giữ nguyên các hành vi và tính năng như cũ (khi nhấn vào sẽ lún xuống, và phát ra sự kiện Click…)

Chúng ta cũng có thể dùng một Shape để hiển thị một ảnh vector bên trong nút, giống như hình Ellipse dưới đây:

Ở trên tôi đã tô màu Ellipse với một RadialGradientBrush để nó trông đẹp hơn:

Nếu bạn là người lập dị D, thậm chí bạn còn có thể nhúng các control tương tác như Calendar trong ví dụ dưới đây:

Ở ví dụ trên, control Calendar vẫn mang tính tương tác hoàn toàn – có nghĩa là người dùng có thể chuyển qua lại giữa các tháng và chọn một ngày trong tháng, và sau đó nhấn vào nút chứa nó để tạo ra sự kiện “Click”. (Tôi không chắc liệu điều này có là một trải nghiệm tốt cho người dùng hay không – nhưng nó cho ta thấy mức độ mềm dẻo mà bạn có thể làm).

Các cách tùy biển nội dung như trên sẽ làm việc không chỉ với Button, mà cho tất cả các control thừa kế từ lớp ContentControl.

Tùy biến các control dùng Control Template
Mô hình xây dựng nên các control trong Silverlight và WPF cho phép bạn làm được nhiều hơn là chỉ tùy biến lại nội dung bên trong control. Về cơ bản, nó cho phép bạn thay thế hoàn toàn các thành phần trực quan trên một control với bất kỳ thứ gì bạn muốn – trong khi vẫn giữ lại những hành vi như nó vốn có.
Chẳng hạn, cho là bạn không muốn các nút bấm mang hình chữ nhật như mặc nhiên, mà muốn nó có hình tròn như dưới đây:

Chúng ta có thể làm điều này bằng việc tạo ra một kiểu “RoundButton”trong file App.xaml. Trong đó chúng ta sẽ thay thế thuộc tính Template của nút bấm, và cung cấp một ControlTemplate mà nó sẽ thay thế hình chữ nhật mặc nhiên với một hình Ellipse và một TextBlock bên trong:

Chúng ta có thể tham chiếu đến Style này để dùng RoundButton như là mẫu cho nút bấm:

Kết hợp nội dung bên trong Control Template
Một điều mà có lẽ bạn đã biết trong “RoundButton” control template ở trên là kích thước của Button, và nội dung hiển thị bên trong nó đã được hard-coded (nó luôn hiển thị “Push Me!”).
Một tin tốt lành là WPF và Silverlight cho phép ta có thể tùy biến cả các cài đặt đó. Chúng ta có thể làm điều này bằng cách dùng cú pháp mở rộng {TemplateBinding ControlProperty} bên trong control template để gắn nối vào các thuộc tính của control. Điều này sẽ cho phép các control template của chúng ta có thể thích ứng được với việc thay đổi các thuộc tính của các nhà phát triển khác:

Hãy để ý ở trên thay vì chúng ta thêm một <TextBlock> để hiện thị nội dung, chúng ta đã dùng control <ContentPresenter>. Điều này sẽ cho phép chúng ta không chỉ hiển thị các chuỗi văn bản mà cả các nội dung khác (giống như chúng ta đã làm trước đây trong loạt bài này).
Chúng ta sau đó có thể dùng Style ở trên trong 3 nút bấm bên dươci (mỗi cái đều có nội dung và các cài đặt khác nhau):

Các Button trên sẽ hiển thị giống như dưới đây (và tất nhiên – control Calendar vẫn sẽ hỗ trợ chuyển trang và chọn ngày):

Nếu muốn đẹp mắt hơn, chúng ta còn có thể thêm các hoạt hình vào ControlTemplate (để bắt các trạng thái của nút bấm như: “hover”, “focus” và “pushed”). Khả năng này cho phép ta tạo ra các giao diện tương tác bóng bẩy, mà bạn thực sự không thể làm được với HTML.
Các nhà phát triển làm việc với các control trong một ứng dụng có thể quên đi tất cả các thuộc tính và kiểu dáng đã được tùy biến, họ chỉ cần quan tâm đến việc bắt các sự kiện và xử lý dữ liệu, việc tùy biến giao diện là của các nhà thiết kế.

Đánh bóng lại chương trình Digg
Giờ chúng ta đã khảo sát qua một số điều cơ bản về các mà các Control Template làm việc, chúng ta sẽ dùng chúng trong một vài chỗ để làm cho chương trình Digg bóng bẩy hơn.
Có một nơi trong chương trình của chúng ta cần phải được chỉnh sửa lại – đó là nút Close trong User Control:

Một tin tốt lành là điều này rất dễ dàng cho chúng ta (hoặc cho nhà thiết kế của chúng ta) để có thể chỉnh sửa. Chúng ta có thể thêm một ControlTemplate vào style “CloseButton” trong file App.xaml và thêm một số hình họa để làm cho nút Close trông ấn tượng hơn. (ghi chú: một người thiết kế giỏi hơn tôi có thể thêm một số hoạt hình cho các hình họa để làm cho nó đẹp hơn):

Khi chạy lại chương trình, nút Close sẽ trông như sau:

Một chỗ nữa mà tôi nghĩ cũng nên được chỉnh sửa thêm là phần viền bên ngoài của ListBox. Nếu nhìn gần, bạn sẽ thấy ListBox trong bản Beta1 có một đường viền lồng bên ngoài như sau:

Chúng ta có thể bỏ viền này để nó có một viền phẳng xung quanh ListBox bằng việc tùy biến lại COntrol Template. Dưới đây là style của ListBox với một mẫu tùy biến:

Notice how we’ve removed all border controls from the ListBox. We are now just using the Hãy để ý cách chúng ta xóa bỏ đường viêng của ListBox. Chúng ta chỉ dùng <ScrollViewer> trong Silverlight (nó cho phép cuộn nội dung bên trong) và nhúng vào trong một <ItemsPresenter/> để nó tự vẽ các mục dữ liệu bên trong (nó dùng <DataTemplate> mà chúng ta đã tạo ở bài 4 để vẽ các mục đó).
Dưới đây là giao diện phẳng hơn mà chúng ta đã làm với ListBox:

Điều thực sự hấp dẫn là chúng ta đã không phải thay đổi bất kỳ điều gì trong chương trình, và cũng chẳng phải thay đổi mã XAML của các điều khiển để làm cho giao diện của chúng thay đổi. Khả năng phân tách code/design cho phép các nhà phát triển và thiết kế có thể làm việc một cách hữu hiệu trên các ứng dụng Silverlight và WPF.
Expression Blend và bộ Expression Studio làm cho khả năng thiết kế các control mạnh mẽ hơn, và mang đến một bộ công cụ thiết kế phong phú mà nó sẽ giúp việc tùy biến dễ dàng hơn.

Bước tiếp theo
Chúng ta đã hoàn thành xong việc xây dựng chương trình Digg bằng Silverlight.
Bước cuối cùng là hiện thực hóa một phiên bản trên desktop cho nó. Một tin tốt là điều này cũng không khó khăn lắm – vì Silverlight vốn là một tập con của bộ WPF và .NET Framework đầy đủ, vậy nên các khái niệm, mã lệnh và nội dung đều có thể chuyển đổi tương đối dễ dàng.
Để làm điều này, xin mời xem tiếp phần cuối: Xây dựng phiên bản chạy trên desktop với WPF.

2 thoughts on “Silverlight 2 Tutorial – Dùng các mẫu để tùy biến Look and Feel của control

  1. Trong Silverlight việc phân trang thường là không cần thiết, vì nó hoạt động cũng giống các ứng dụng desktop (thường không cần phân trang).

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s