C#開發WPF/Silverlight動畫及游戲系列教程(Game Tutorial):(三十九)向Silverlight移植①
一、主要改進:
1)Silverlight3.0上的右鍵實現:
//注冊右鍵事件
HtmlPage.Document.AttachEvent("oncontextmenu", Game_MouseRightButtonDown);
//鼠標右鍵事件
private void Game_MouseRightButtonDown(object sender, HtmlEventArgs e) {
e.PreventDefault(); //取消右鍵彈出菜單
……邏輯部分
}
通過上述方法還必須配合<param name="Windowless" value="true" />或System.Windows.Interop.Settings.Windowless = true才能實現右鍵功能。另外需要特別說明的是,此方法並非官方所提供的解決方案,而是第三方間接的實現方式。因此,在使用前,您必須解為Silverlight解禁右鍵將付出的代價:①Windowless = true將降低程序整體性能;②無法使用輸入法;③無法被所有的浏覽器所兼容,例如在Google Chrome中,雖然可以激發出右鍵功能,但是取消不了彈出右鍵菜單。綜上,在Silverlight3.0中,您還是得謹慎再謹慎的考慮是否使用右鍵。
2)撤消精靈及其他所有控件中的x,y,z坐標定位用關聯屬性,取而代之的是一個名為Coordinate的關聯屬性,其完整定義如下:
/// <summary>
/// 獲取或設置控件坐標(關聯屬性)
/// </summary>
public Point Coordinate {
get { return (Point)GetValue(CoordinateProperty); }
set { SetValue(CoordinateProperty, value); }
}
public static readonly DependencyProperty CoordinateProperty = DependencyProperty.Register(
"Coordinate",
typeof(Point),
typeof(QXSprite),
new PropertyMetadata(ChangeCoordinateProperty)
);
private static void ChangeCoordinateProperty(DependencyObject d, DependencyPropertyChangedEventArgs e) {
QXSprite obj = (QXSprite)d;
if (obj.Visibility == Visibility.Visible) {
Point p = (Point)e.NewValue;
obj.SetValue(Canvas.LeFTProperty, p.X - obj.CenterX);
obj.SetValue(Canvas.TopProperty, p.Y - obj.CenterY);
obj.SetValue(Canvas.ZIndexProperty, Convert.ToInt32(p.Y));
}
}
Coordinate的類型為Point,因此,我將原先精靈移動用的DoubleAnimation動畫類型替換成了PointAnimation;這樣,不論是在代碼結構還是性能上均得到很大的優化。更改控件坐標時,只需修改它的Coordinate = new Point(x,y)即可,系統會判斷該關聯屬性的值是否發生改變而激發ChangeCoordinateProperty方法,從而更新該控件最終在畫面中的LeFTProperty、TopProperty和ZIndexProperty。沒錯,關聯屬性就是這麼強大。