2012-01-16 79 views
2

我有我的XAML代碼:的Silverlight:如何防止路由從兒童帆布mouseMove事件其父帆布

<Canvas x:Name="mainCanvas" Width="200" Height="150" Background="LightGray" 
     MouseLeftButtonUp="mainCanvas_MouseLeftButtonUp" 
     MouseMove="mainCanvas_MouseMove"> 
    <Canvas x:Name="topCanvas" Width="200" Height="100" Background="LightBlue" 
      MouseLeftButtonUp="topCanvas_MouseLeftButtonUp" 
      MouseMove="topCanvas_MouseMove"> 
    </Canvas> 
</Canvas> 

及其後面的代碼:

private void topCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    MessageBox.Show("topCanvas_MouseLeftButtonUp"); 

    e.Handled = true; // This can prevent routing to the mainCanvas 
} 

private void mainCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    MessageBox.Show("mainCanvas_MouseLeftButtonUp"); 
} 

private void topCanvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    Debug.WriteLine("topCanvas_MouseMove"); 

    // How to prevent routing to the mainCanvas? 
    // e.Handled = true does NOT exist in MouseEventArgs 
} 

private void mainCanvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    Debug.WriteLine("mainCanvas_MouseMove"); 
} 

我的問題已經在評論。

如何防止將MouseMove事件從topCanvas(子畫布)路由到mainCanvas(父畫布)?

謝謝。

Peter

+0

我不明白你的問題。如果您不想將該事件從您的xaml – MyKuLLSKI 2012-01-16 06:16:42

+0

中移除,請將其移除。有時我需要它,有時我不需要它。上面的代碼只是一個例子。 – 2012-01-16 06:37:49

+0

你知道什麼時候需要它,什麼時候不需要? – MyKuLLSKI 2012-01-16 14:05:47

回答

-2

該功能稱爲「事件冒泡」。您可以使用以下代碼停止它:

jQuery: event.stopPropagation(); Ref:http://api.jquery.com/event.stopPropagation/

你也可以嘗試下面的代碼: e.stopPropagation(); //防止事件冒泡 e.preventDefault(); //則取消該事件(如果是取消)

Ref: http://stackoverflow.com/questions/1967537/how-to-stop-event-bubbling-with-jquery-live 

感謝, 拉維維爾馬

+0

嗨Ravi,謝謝你的回覆。但我很困惑。我在Silverlight中談論這個,你的代碼似乎是JavaScript。你的意思是使用網頁中的JavaScript來防止在Silverlight中冒泡? – 2012-01-16 06:02:21

+1

Javascript和jQuery特別與Silverlight無關,使得這個答案令人難以置信的錯誤。 – slugster 2012-01-16 06:45:00

0

您可以嘗試在mainCanvas的MouseMove事件比較e.OriginalSource並退出Sub如果它不是從起源mainCanvas。

private void mainCanvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (sender != e.OriginalSource) 
     return;   
} 

在回答在一個小更詳細的評論。根據UIElement.MouseMove事件MSDN鏈接。

控制繼承的MouseMove可以提供處理爲充當處理程序的所有實例,通過重寫的OnMouseMove 方法事件 。與直接處理事件一樣,沒有可用的處理 屬性,因此OnMouseMove不能以這種方式實現,因爲它禁止通過處理的技術進一步處理事件。

link狀態:

此事件 此類

這給我們帶來這個鏈接AttachedEvents各國創造了Mouse.MouseMove附加事件的別名。

可擴展應用程序標記語言(XAML)限定語言 組件和事件的類型稱爲附加事件。附加事件 的概念使您能夠將特定事件 的處理程序添加到任意元素,而不是實際上 定義或繼承事件的元素。在這種情況下,潛在引發事件的對象 和目的地處理實例 都不定義或以其他方式「擁有」該事件。

所以當我看到它時,唯一的選擇就是圍繞它進行編碼。

+0

感謝您的回覆。這不會阻止路由(從頂層畫布到主畫布)。我需要的就像'MouseButtonEventArgs'中的'e.Handled = true'一樣簡單。 – 2012-01-18 19:18:21

+0

@PeterLee它不會阻止路由,因爲您沒有處理此事件的選項。它所做的是阻止你的處理程序運行它的代碼,除非事件源自MainCanvas,它有效地執行相同的事情。 – 2012-01-18 21:11:39

0

嘗試設置Canvas的IsHitTestVisible屬性。有了這個屬性設置鼠標事件將「通過」您的控制或將被抓住。

希望這是你所需要的。

+0

感謝您的回覆。這不會阻止路由(從頂層畫布到主畫布)。我需要的就像'MouseButtonEventArgs'中的'e.Handled = true'一樣簡單。 – 2012-01-18 19:18:49