Vấn đề
Trong hầu hết tất cả các ứng dụng trên web đều không đơn thuần xử lý chỉ trên 1 trang chủ duy nhất, đa số 1 trang web phải có nhiều trang thể hiện do đó trong game cũng phải có được nhiều trang thể hiện như vậy, tuy nhiên mặc định ứng dụng silverlight tạo ra chỉ hỗ trợ xủ lý trên một trang duy nhất bằng cách thiết lập thuộc tính RootVisual của lớp App bằng thể hiện của trang cần hiển thị. Sau khi ta đã thiết lập giá trị của thuộc tính RootVisual thì sẽ không thể thay đổi được nữa[1]. Trong game được xây dựng phải có nhiều trang với mỗi trang thực hiện chức năng nào đó trong game như đăng kí game, đăng nhập game, màn hinh chính giao diện của
game…. Vì vậy nhu cầu đầu tiên khi xây dựng ứng dụng dựa trên silverlight đó là tạo ra giao diện hỗ trợ nhiều trang chuyển đổi qua lại giữa với nhau.
Ngoài ra trong ứng dụng nhiều trang ta cần phải quan tâm thêm vấn đề lưu giữ trạng thái của các trang đã tạo ra, đồng thời cũng phải giải quyết việc truyền dữ liệu giữa các trang khi có sự thay đổi trang.
Giải pháp
Như vậy để thực hiện được điều này chúng ta phải sử dụng 1 cơ chế làm việc như trong J2ME là dựng 1 khung treo (có thể là canvas hay grid ) khi trang nào được gọi thì sẽ gán nội dung trang đó vào khung treo này. Và mỗi lần gán vào khung treo thì nội dung của trang vừa được xử lý đều được cache lại trên server. Trước hết ta cần tạo ra một enum liệt kê danh sách các trang có thể chuyển đến.
Tạo ra một trang tên là MasterPage, đây sẽ là trang chứa tất cả các trang sẽ tạo ra. Gồm có các thành phần chính như sau:
public enum Pages
{ SignIn, Register, City, World, … BarrackPage }
public class MasterPage: UserControl
{
Grid _current;
Dictionary<Pages, UserControl> _pagesCache; public void NavigateTo(Pages nextPage);
public void NavigateTo(Pages nextPage, object state); public void ResetToPage(Pages nextPage);
public void ResetToPage(Pages nextPage, object state); }
Biến _current lưu giữ trang hiện tại đang được hiển thị trong thuộc tính Children của mình. Biến _pagesCache lưu lại các trang đã được tạo ra. Hàm NavigateTo
chịu trách nhiệm tạo ra trang cần chuyển đến (nếu cần), sau đó gán vào thuộc tính Children của _current. Hàm ResetToPage sẽ loại bỏ hết các trang đã tạo và chuyển đến trang mới.
Để phục vụ nhu cầu truyền dữ liệu giữa các trang, hai hàm NavigateTo và
ResetToPage có hai hàm nạp chồng nhận đối số kiểu object là dữ liệu truyền cho trang mới.
Bất kì trang nào có xử lí đối với dữ liệu truyền qua khi chuyển trang đều phải hiện thực hóa giao diện IStateConsumable.
Để cho việc chuyển trang được đơn giản hóa ta sẽ tạo ra một lớp Switcher có hàm tĩnh là To và ResetTo với đối số là trang cần đến, đồng thời thay đổi nội dung hàm Application_Startup trong lớp App như sau:
public interface IStateConsumable
{
void UtilizeState(object state); }
private void Application_Startup(object sender, StartupEventArgs e) {
MasterPage master = new MasterPage(); this.RootVisual = master;
Switcher.MasterPage = master;
Switcher.To(Pages.SignIn); }
public class Switcher
{
public static MasterPage MasterPage; // Gán bên ngoài public static void To(Pages nextPage);
public static void To(Pages nextPage, object state); public static void ResetTo(Pages newNextPage);
public static void ResetTo(Pages newNextPage, object state); }