接下来,让我们来关注如何在Silverlight 3中创建自定义的鼠标双击事件支持方案。
下面是创建定时器控件DispatcherTimer实例并设置相应时间间隔和订阅其Tick事件的概要代码。
private void InitializeAndStartTheGame(){
//省略其他……
doubleclickTimer = new DispatcherTimer();
doubleclickTimer.Interval = new TimeSpan(0, 0, 0, 0, INTERVAL);
doubleclickTimer.Tick += new EventHandler(doubleclickTimer_Tick);
//省略其他……
}
下面是定时器控件Tick事件触发后执行的代码内容。
void doubleclickTimer_Tick(object sender, EventArgs e){
doubleclickTimer.Stop();
}
//省略其他……
doubleclickTimer = new DispatcherTimer();
doubleclickTimer.Interval = new TimeSpan(0, 0, 0, 0, INTERVAL);
doubleclickTimer.Tick += new EventHandler(doubleclickTimer_Tick);
//省略其他……
}
下面是定时器控件Tick事件触发后执行的代码内容。
void doubleclickTimer_Tick(object sender, EventArgs e){
doubleclickTimer.Stop();
}
下面是用户按下鼠标左键后判断其是否为双击操作以及根据是单击还是双击执行各自相应代码的概要描述。
void cardContainer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){
//如果第二次的单击前计时器结束,说明这是一个双击动作
if (doubleclickTimer.IsEnabled) {
doubleclickTimer.Stop();
//扑克双击处理代码……(略)
}
else {
//如果不是双击,启动计时器
doubleclickTimer.Start();
//扑克单击处理代码……(略)
}
}
//如果第二次的单击前计时器结束,说明这是一个双击动作
if (doubleclickTimer.IsEnabled) {
doubleclickTimer.Stop();
//扑克双击处理代码……(略)
}
else {
//如果不是双击,启动计时器
doubleclickTimer.Start();
//扑克单击处理代码……(略)
}
}
在上面代码中,首先创建一个名为doubleclickTimer的DispatcherTimer控件并对其Tick事件进行侦听。在这里,请注意,通过调用启动计时器doubleclickTimer的Start方法,其属性IsEnabled属性值自动变为true。显然,在游戏的一开始,属性IsEnabled属性值被设置为false。
如果在双击的200毫秒时间间隔内另一个鼠标单击事件被截获,那么说明发生了鼠标双击事件。200毫秒后定时器控件的Tick事件将被触发,计时器会停止并禁用,直到收到另一次鼠标单击事件。这样一来,在上面代码的两个注释处,我们便可以分别插入我们的自定义鼠标双击和单击编程逻辑。
五、捕获鼠标操作及订阅相关事件
说实话,如何捕获鼠标事件是我初步想开发纸牌游戏时要面对的第一个难题。是针对每一张扑克都设置鼠标捕获,只针对当前扑克进行鼠标捕获,或是针对父控件Canvas进行鼠标捕获?最后,我决定订阅父控件(名为cardContainer的Canvas)的鼠标事件,而仅针对当前扑克设置鼠标捕获。这样一来,我们可以很容易地获取所有移动当前扑克所需的有关信息,并相应地获得其他可能一起移动的扑克的相关信息,最终实现共同移动所有这些扑克。由于这部分编程比较复杂,我们在后面文章中继续探讨这些问题。