2017-04-24 83 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; 
}