精通Silverlight——12.1.1 聲明 x:Class, 定義事件處理
使用VS2008創建Silverlight項目時,x:Class自動被指定爲:項目名稱.Page,程序集被指定爲ClientBin/項目名稱.dll,通常不需要更改默認的設置。
Loaded屬性指定了Page類的Loaded事件名稱,在後置代碼中,自動創建了一個Page_Loaded事件名稱,與Loaded的屬性設置相對應,如下所示。
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
}
Loaded屬性與x:Class不同的是,Loaded不一定非要定義在XAML中。下面的代碼爲Page類添加了一個構造函數,並將Loaded事件關聯到Page_Loaded。
public Page()
{
this.Loaded+=new EventHandler(Page_Loaded);
}
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
}
如果需要爲其他圖形對象添加事件,比如鼠標移動,鍵盤輸入時,一般建議的作法是在Page_Load中添加事件訂閱代碼。
例如在畫布中,聲明一個矩形,代碼如下所示。
<Rectangle Canvas.Left="100" Canvas.Top="100" Width="100" Height="100" x:Name="Rec1"></Rectangle>
注意:必須指定x:Name屬性,以便於在代碼文件中直接訪問,爲了給這個矩形添加事件,通常是在Page_Load區的InitializeComponent方法的下面添加事件訂閱代碼,可藉助於VS2008的智能感知功能。
有時候可能智能感知功能並不能立刻反映出在XAML文件中所做的變化,可以通過全部保存或者編譯一次來獲得智能感知。
在Page_Loaded區中,藉助於智能提示功能,添加如下的代碼框架。
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
Rec1.MouseEnter += new MouseEventHandler(Rec1_MouseEnter);
}
void Rec1_MouseEnter(object sender, MouseEventArgs e)
{
//在這裏將要添加代碼
}
可以在出現如圖12.1所示的提示時按兩下Tab鍵,由VS2008來自動生成代碼框架。
圖12.1 VS2008智能完成
當然還可以直接在XAML中添加事件,如下面的代碼所示。
<Rectangle Canvas.Left="100" Canvas.Top="100" Width="100" Height="100" x:Name="Rec1" MouseEnter="MouseEnter"></Rectangle>
這樣就不必再在Page_Loaded中訂閱事件了。
注意Page_Loaded事件中的InitializeComponent方法,與ASP.NET項目一樣,當在XAML中添加新對象後,在該方法中就會用.NET語法定義這些對象,以便於開發人員直接在後置代碼中訪問。
如果按F12鍵追蹤該方法,會看到剛剛定義的Rec1原來是定義在InitializeComponent方法中,並且使用瞭如下的代碼。
Rectangle Rec1;
private void InitializeComponent()
{
Rec1= this.FindName("Rec1") as Rectangle;
}
這段代碼的意思是在根畫布中,也就是Page類中,查找名爲Rec1的對象,並轉換爲Rectangle。這樣在代碼文件中就可以直接使用Rec1了。
必須注意的是,InitializeComponent方法被定義在名爲Page.g.cs文件中,該文件會感知在XAML中所做的變更,並自動進行更新。而且在Page.g.cs也是一個局部類,最後都將被編譯到Page類中。
有了事件和代碼框架,也具有了可以直接引用的XAML對象,下面就可以爲事件編寫代碼了。