有关silverlight程序中事件的问题,

设计中加了有一个Canvas,欲实现的功能为:在浏览器中点击一个点,则以该点为中心画一个圆,同时如果鼠标点住一个圆不动的话,可以将其进行拖动,释放后圆的颜色改变,同时当鼠... 设计中加了有一个Canvas,欲实现的功能为:在浏览器中点击一个点,则以该点为中心画一个圆,同时如果鼠标点住一个圆不动的话,可以将其进行拖动,释放后圆的颜色改变,同时当鼠标点住圆的时候,圆的颜色也改变,三者的颜色都不一样。代码中定义了如下事件处理函数:

private void canvas_Click(object sender, MouseButtonEventArgs e)
{
……
ellipse.MouseLeftButtonDown += ellipse_MouseDown;

}
private void ellipse_MouseDown(object sender, MouseButtonEventArgs e)
{
ellipse.MouseMove += ellipse_MouseMove;
ellipse.MouseLeftButtonUp += ellipse_MouseUp;

}
private void ellipse_MouseMove(object sender, MouseEventArgs e)
{
……
}
}
private void ellipse_MouseUp(object sender, MouseButtonEventArgs e)
{
……
ellipse.MouseMove -= ellipse_MouseMove;
ellipse.MouseLeftButtonUp -= ellipse_MouseUp;

}
其中,大部分代码都用省略号省略了,标出来的部分就是我不懂的地方,为什么对应的这几个鼠标事件要安排在这几个中,比如说我曾试图把ellipse.MouseMove += ellipse_MouseMove;这一句代码移到canvas_Click中,但是这样就出现了点击画圆功能正常,也可以点击已画的圆进行拖动,其中也变颜色,但是只能拖动一次,就是说当你再次拖动的时候,拖不动。所以对于这其中几个事件为什么要如此安排在事件中,麻烦分别讲解一下缘由。还有就是canvas_click与buttondown_click是不是重复啊,两者如何区分。代码上有何区别,问题说得比较长,所以希望就需要有耐心的好心人来回答了,相信每一个刚开始学这个的也有这样的疑惑,最后谢谢了
展开
 我来答
画角连城
2012-07-17 · TA获得超过774个赞
知道小有建树答主
回答量:224
采纳率:0%
帮助的人:311万
展开全部
因为一个拖动动作,是首先在目标上按下左键,在不松开的条件下在目标上移动时,目标跟着鼠标移动,松开时目标就不移动。所以:当你在圆上按下左键(MouseLeftButtonDown)时,订阅鼠标的Move事件,这样,圆会跟着鼠标动;而松开左键(MouseLeftButtonUp)时,取消订阅鼠标的Move事件,这样,圆就不跟着动了。
至于你把事件换了地方出现的现象,应该是在Click事件中创建的圆,这样第一次点,没创建圆,可以触发Canvas的Click,而创建后,点在圆上了,就不能触发Click事件了。注:Click事件是不能路由的。
追问
什么叫做路由啊,麻烦说得通俗点,麻烦了啊
追答
就是在子元素上发生的事件,会沿嵌套层次向父元素传递。
例如:ellipse上触发了MouseLeftButtonDown(我记得是可路由的),那么随后包含这个ellipse的canvas也会触发MouseLeftButtonDown事件。这就叫事件路由。
只有几个事件支持路由。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式