黃偉榮的學習筆記

軟體的世界變化萬千,小小的我只能在這洪流奮發向上以求立足。
随笔 - 100, 文章 - 0, 评论 - 212, 阅读 - 17万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Silverlight的事件氣泡(EventBubbling)

Posted on   黃偉榮  阅读(655)  评论(0编辑  收藏  举报

元件重疊在一起,當發生滑鼠點擊事件,你發現他會從最上面的元件開始,每個元件都會發生事件,這現像不光只是有在Silverlight中有,Web或Window Form也有這現象。

如這個範例,當在Grid3上點擊,卻連Grid2與Grid3都發生事件。

(Silverlight實際範例,請各位在各Grid上點擊看看)

image

 

要防止這個現像也很簡單,只要讓MouseButtonEventArgs.Handled值為true就可以了。

private void Grid3_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
e.Handled = true; //將Handled設定為true,其他元件就不會發生事件。
MessageBox.Show("Grid3 Clicked");
}

在Silverlight中會發生事件氣泡的有如下:
  • 滑鼠點擊
    • MouseLeftButtonDown
    • MouseLeftButtonUp
    • MouseRightButtonDown
    • MouseRightButtonUp
  • 滑鼠滾輪

    • MouseWheel
  • 拖曳
    • DragEnter
    • DragLeave
    • DragOver
    • Drop
  • 鍵盤輸入
    • KeyDown
    • KeyUp
    • TextInput
    • TextInputStart
    • TextInputUpdate

 

哇~這麼多,你會不會想說為什麼系統不直接就設成True就好了,還要自己寫時自己注意多麻煩丫。

不過他真的這樣做,才真的麻煩。

<Button>
<Border>
<StackPanel Orientation="Horizontal">
<Image/>
<TextBlock/>
</StackPanel>
</Border>
</Button>

你想想,如果上面個範例,事件沒有氣泡,你在Button上點擊,Button還會發生Click事件嗎?

答案是不會,因為事件可能在Image或TextBlock上就結束了。

可Image只是佈局用的元件不應該Handled事件,但系統怎麼會知道Image是佈局用。

所以必需要自己設,那我們來比較一下是事件氣泡在Button中Handled,還是事件不氣泡而在Button下的所有子元件設定事件要向上傳遞。

是不是事件氣泡比較簡單。

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示