ScrollViewer GridView XAML

时间:2012-08-17 12:40:05

标签: gridview windows-8 windows-runtime winrt-xaml scrollviewer

我目前正在构建Windows 8 XAML C#应用程序。在页面中,我有一个水平滑动和滚动的滚动查看器。我有几个控件,它们与scorllviewer配合得很好。但是当您滚动并且光标位于ListView / GridView的顶部时,该控件将处理scrollnig而不是scrollviewer。 通过滑动,这不会发生,但使用鼠标滚轮停止滚动查看滚动。 有人知道如何禁用此行为或有解决方法吗?

6 个答案:

答案 0 :(得分:1)

在解决这个问题很长一段时间后,我决定改变策略。至少在我的解决方案中,我将内部 GridView 更改为 ItemsControl 。这样我可以处理所有点击/点击但仍然按预期滚动工作。

当然,这个解决方案并不适合所有人,因为有时你也需要所有的选择。但对我来说,它起作用,因为我只需要点击/点击项目。

希望有所帮助

答案 1 :(得分:1)

我在这里找到了一个解决方法:msdn workaround

基本上你必须做以下事情:

基础XAML:

   <Grid Name="BaseElement">
        <ScrollViewer Name="MainScrollViewer" Style="{StaticResource HorizontalScrollViewerStyle}" VerticalScrollMode="Auto">
            <GridView />
            <GridView />
        </ScrollViewer>
    </Grid>
  1. 将新处理程序添加到根元素:

    BaseElement.AddHandler(PointerWheelChangedEvent, new PointerEventHandler(Bubble_PointerWheelChanged), true);
    
  2. 实现Handler以滚动滚动:

    private void Bubble_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
    {
        // Could walk up the tree to find the next SV or just have a reference like here:
        MainScrollViewer.ScrollToHorizontalOffset(MainScrollViewer.HorizontalOffset - e.GetCurrentPoint(null).Properties.MouseWheelDelta);
    }
    

答案 2 :(得分:1)

1.在View.cs中添加此代码:

  private void ThumbnailViewer_OnMouseWheel(object sender, MouseWheelEventArgs e)
    {
        ThumbnailViewerScroller.ScrollToHorizontalOffset(ThumbnailViewerScroller.HorizontalOffset - e.Delta);
    }

2.在Xaml中添加代码:

  <ScrollViewer
            x:Name="ViewerScroller"               
            MouseWheel="ThumbnailViewer_OnMouseWheel">
<StackPanel>
...
</StackPanel>
</ScrollViewer>

答案 3 :(得分:0)

这也是我看到的问题。触摸不存在 - 只有在使用鼠标滚轮时才会出现。我还不知道一个解决方法。我不认为有一个。

答案 4 :(得分:0)

我也有同样的问题。然后我尝试从网格模板中删除滚动条,如下面的线程所示..它对我来说很好..

https://stackoverflow.com/a/10305608/2444509

答案 5 :(得分:0)

最佳解决方案。

public class CustomGridView : GridView
{
    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var sv = this.GetTemplateChild("ScrollViewer") as UIElement;
        if (sv != null)
            sv.AddHandler(UIElement.PointerWheelChangedEvent, new PointerEventHandler(OnPointerWheelChanged), true);
    }

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

更多信息:GridView in a ScrollViewer