2017-04-24 102 views
1

我希望有人有一個提示/解決方案,以更好,更高性能的方式解決這個問題。冒泡/重定向事件到父ScrollViewer

我正在寫一個Windows UWP應用程序,其中包含一個帶網格的ScrollViewer。在這個網格中,我有兩個嵌入在ScrollViewer中的StackPanels。

每個StackPanel都有一個垂直方向的圖像列表。 StackPanel與所有圖像在一起的高度一樣,因此沒有垂直滾動條,因爲它應該是。 另一方面,圖像更寬,然後顯示StackPanel和水平滾動條。我可以用鼠標在水平方向上滾動StackPanels。這工作完美。

但是,如果我用鼠標在一個StackPanel上,我不能使用鼠標滾輪在垂直方向上滾動周圍的ScrollViewer。 StackPanels周圍的ScrollViewer將使用MouseWheel事件,並且不會冒泡到父ScrollViewer。

有人知道我可以如何冒泡/將MouseWheel事件重定向到父ScrollViewer嗎?

我發現了一個不太好的解決方法。我已經添加了自己的UIElement.PointerWheelChangedEvent處理器和移動外的ScrollViewer我自己,像這樣:

LeftScrollViewer.AddHandler(UIElement.PointerWheelChangedEvent, new PointerEventHandler(OnVerticalScrollEventHandled), true); 

private void OnVerticalScrollEventHandled(object sender, PointerRoutedEventArgs e) 
{ 
    ScrollViewPages.ChangeView(ScrollViewPages.HorizontalOffset, ScrollViewPages.VerticalOffset + (-1 * e.GetCurrentPoint(null).Properties.MouseWheelDelta), 1); 
} 

這工作,但不是在一個快速流暢的方式。有人有更好的解決方案嗎?

+0

你是說當你將鼠標懸停在ScrollViewer的空白區域,它不滾動?懸停在圖像上時它會滾動嗎? – Laith

+0

沒有其他的方式。如果我在ScrollViewer中的空白區域滾動。如果我在圖片上,它不會滾動。 – StefanH

+0

嘗試設置e.Handled = false;如果你想讓父母滾動。 – Hannes

回答

0

對於將事件從子級冒泡到父級,請爲事件添加自己的處理程序,並將處理的屬性設置爲false。

LeftScrollViewer.AddHandler(UIElement.PointerWheelChangedEvent, new PointerEventHandler(OnVerticalScrollEventHandled), true); 

private void OnVerticalScrollEventHandled(object sender, PointerRoutedEventArgs e) 
{ 
    e.Handled = false; 
}