2010-07-07 57 views
5

問題我有bubbeling事件的問題。我設法在邊界,網格,堆棧面板中將事件冒泡,但不是在ScrollViewer中。如果您查看下面的示例,您會注意到,當您單擊TextBlock時,事件將被標記爲網格。但是,當我包含ScrollViewer時,事件在此停止,並且不會發送到網格。與事件bubbeling(ScrollViewer中)

有誰現在whay這happends,如果它可以解決嗎?當我一直使用ScrollViewer時,我確實需要能夠通過ScrollViewer將事件進行冒泡。

<Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown"> 
     <!--<ScrollViewer MouseLeftButtonDown="ScrollViewer_MouseLeftButtonDown">--> 
      <StackPanel Orientation="Vertical" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown"> 
       <TextBlock Text="Click me to bubble an event" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/> 
      </StackPanel> 
     <!--</ScrollViewer>--> 
</Grid> 


public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

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


    private void ScrollViewer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     MessageBox.Show("ScrollViewer clicked"); 
     e.Handled = false; 
    } 

    private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     MessageBox.Show("StackPanel clicked"); 
     e.Handled = false; 
    } 

    private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     MessageBox.Show("Textblock clicked"); 
     e.Handled = false; 
    } 
} 
+0

的ScrollViewer是一個密封類,不能從使用的AddHandler的。 – Adam 2013-07-29 20:44:52

回答

1

use AddHandler(yourDelegate,True);用於添加事件處理程序的語法,它將忽略可視樹中其他控件設置的Handled標誌。

0

我有這個問題,並張貼user572559修復固定我的問題。對於那些需要它,下面是我做(修改發佈):

_scrollViewer = new ScrollViewer(); 
_scrollViewer.AddHandler(
    ScrollViewer.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(OnMouseLeftButtonDown), 
    true); 
_scrollViewer.AddHandler(
    ScrollViewer.MouseLeftButtonUpEvent, 
    new MouseButtonEventHandler(OnMouseLeftButtonUp), 
    true); 

...

void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     ... 
    } 

    void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     ... 
    } 

還要注意的是,如果你野兔處理這些你可能會被處理的MouseMove爲好。 MouseMove爲我工作,而不需要這樣做,而且它似乎也不以這種方式得到支持(不是冒泡事件)。

0

您可以防止e.HandledMouseButtonEventArgs通過重寫ScrollViewer這樣

public sealed class ClickScrollViewer : ScrollViewer 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     this.Focus(); 
    } 
}