2011-10-28 19 views
3

如果我們有畫布的ScrollViewer(預覽)MOUSEBUTTONDOWN事件順序

<ScrollViewer Name="scroll_viewer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <Canvas Name="canvas" Height="200" Width="200"> 
     <Rectangle Fill="AliceBlue" Width="100" Height="100"/> 
    </Canvas> 
</ScrollViewer> 

與處理程序:

scroll_viewer.PreviewMouseLeftButtonDown 
scroll_viewer.MouseLeftButtonDown 
canvas.PreviewMouseLeftButtonDown 

那麼,如果我們在我們得到scroll_viewer_PreviewMouseLeftButtonDown矩形單擊稱爲第一則canvas_PreviewMouseLeftButtonDownscroll_viewer_MouseLeftButtonDown是不叫。
我想在畫布中首先處理點擊事件 - 如果單擊對象,我想處理事件(用於對象拖動)。如果沒有畫布對象被點擊,我想在scroll_viewer中處理事件(用鼠標管理scrollview平移)。
如何管理這個給定的呼叫順序是我想要的反例,並且不會調用非perview版本scroll_viewer.MouseLeftButtonDown

UPDATE:
從這個帖子:Silverlight forums

((FrameworkElement)scroll_viewer.GetValue(ScrollViewer.ContentProperty)).MouseLeftButtonDown += scroll_viewer_MouseLeftButtonDown; 

不工作IE瀏覽器預覽事件之後被調用 - 可一些解釋爲什麼需要這個不到明顯的語法?

回答

5

的問題是,ScrollViewer已經處理MouseLeftButtonDown事件內部,就像這樣:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { 
    if (base.Focus()) 
     e.Handled = true; 
    base.OnMouseLeftButtonDown(e); 
} 

可以 「修復」 這個使用自定義類,像這樣:

public class MyScrollViewer : ScrollViewer { 

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { 
     base.OnMouseLeftButtonDown(e); 
     e.Handled = false; 
    } 
} 

SIDE注意:您應該在XAML中使用x:Name,而不是Name。否則,您可能會遇到使用上述類的編譯錯誤。

或者,您可以附加您的處理程序的所有MouseLeftButtonDown事件,包括處理的事件。因此,而不是:

this.scroll_viewer.MouseLeftButtonDown += new MouseButtonEventHandler(scroll_viewer_MouseLeftButtonDown); 

你會使用:

this.scroll_viewer.AddHandler(ScrollViewer.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.scroll_viewer_MouseLeftButtonDown), true); 
2

Preview事件均遵循相似Tunneling策略的路由策略,這意味着該事件在元素樹的頂部開始,沿着它走。所以它會首先擊中你的ScrollViewer,然後是你的畫布。

非預覽活動遵循類似Bubbling策略的路由策略,即事件發生,他們的對象開始,行程長達元素樹。在這種情況下,Canvas首先會被擊中,然後是ScrollViewer。

你可以閱讀更多有關策略路由here

作爲一個側面說明,對畫布對象是對的HitTest事件可見,他們需要有一個不透明的背景。所以如果你有一個沒有指定背景顏色的畫布,它將默認爲透明並且對於HitTests不可見。

+0

+1對於透明/ hittest的事情 - 我已經注意到,使用默認畫布,如果沒有對象點擊,則沒有事件調用。 – Ricibob