Tags标签 网战地图
当前位置: 主页 > 网站建设 > silverlight教程 >

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三

2012-03-23 17:12 [silverlight教程] 来源于:
导读:C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十九)向Silverlight移植① 一、主要改进: 1)Silverlight3.0上的右键实现: //注册右键事件 Htm

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。没错,关联属性就是这么强大。

(编辑:)

本文标签:
网友评论

栏目列表

推荐文章