以上代码实现了QXSpirit控件的X,Y关联属性。大家不要被看似复杂的代码所吓着,其实很简单的,让我一一道来。首先将以上代码分成两部分:X坐标为第一部分,Y坐标为第二部分。它们的结构是一模一样的,我们可以忽略Y坐标,只要理解了X关联属性的实现,将X换成Y即可。
关于关联属性(上一节中的AttachProperty(附加属性)其实也是通过关联属性来实现的)的相关知识,网上不要太多,它不是本教程的重点所以就不多做解释了。理解它的朋友都明白,上面代码是它的标准创建形式,public double X是它的属性访问器,public static readonly DependencyProperty XProperty 则是定义它。就如上面代码注释中写到的,分别定义它的属性名、类型、所处类名等等。这样,一个完整的X关联属性就完成了。有的朋友又困惑了,为什么要那么麻烦去创建关联属性?我直接这样写不就得了:
double _X;
public double X {
get { return _X; }
set { _X = value; }
}
即传统又简单。但是,我想告诉大家的是,在WPF/Silverlight中,只有关联属性才能被更好的使用及识别,例如在属性的绑定,Storyboard目标属性的设定等等中,都必须使用到关联属性来实现,后面的章节中会讲到它的必要性。而像如上的属性访问器只能用于创建纯描述性属性,例如精灵图片地址目录等,就可以使用属性访问器:
//精灵图片源目录地址
string _ImageAddress;
public string ImageAddress {
get { return _ImageAddress; }
set { _ImageAddress = value; }
}
至此,我们完成了一个初具雏形的精灵控件,接下来就是如何将之加入到游戏中了。首先要做的当然是添加精灵控件的引用:
using WPFGameCourse.Controls;
接下来就是创建精灵控件实例并将之添加进窗口的Carrier控件中:
QXSpirit Spirit = new QXSpirit();
private void InitSpirit() {
Spirit.X = 300; //为精灵关联属性X赋值
Spirit.Y = 400; //为精灵关联属性Y赋值
Spirit.Timer.Interval = TimeSpan.FromMilliseconds(150); //精灵图片切换频率
Spirit.ImageAddress = @"..\Player\"; //精灵图片源地址
Carrier.Children.Add(Spirit);
}