关于C#:阻止Listview在XAML中捕获ScrollViewer内部的鼠标滚动

stop Listview from capturing mouse scroll inside ScrollViewer in XAML

您好,我正在制作UWP应用,在其中一个页面上我想要一个类似体验的网站,这意味着在页面上滚动很长。

我在页面上的枢轴内有一个Listview。

看起来像这样。

1
2
3
4
5
6
7
8
9
10
11
12
<ScrollViewer
        x:Name="scrollViewer"
        ManipulationMode="All"
        ScrollViewer.IsVerticalScrollChainingEnabled="True"
        VerticalScrollBarVisibility="Auto">
        <RelativePanel>
            <Image />
    <Pivot>
        <Listview />
    </Pivot>
    <Other stuff />
    </RelativePanel>

现在我的问题是,当我将鼠标悬停在除列表视图之外的任何对象上时,鼠标滚动工作正常,一旦鼠标悬停在列表视图上,滚动就无法工作。

我尝试创建像这样的自定义ListView样式,但是不起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<Style
            x:Key="NoScrollListViewStyle"
            TargetType="ListView">
            <Setter
                Property="IsTabStop"
                Value="False" />
            <Setter
                Property="TabNavigation"
                Value="Once" />
            <Setter
                Property="IsSwipeEnabled"
                Value="False" />
            <Setter
                Property="ScrollViewer.HorizontalScrollBarVisibility"
                Value="Disabled" />
            <Setter
                Property="ScrollViewer.VerticalScrollBarVisibility"
                Value="Disabled" />
            <Setter
                Property="ScrollViewer.HorizontalScrollMode"
                Value="Disabled" />
            <Setter
                Property="ScrollViewer.IsHorizontalRailEnabled"
                Value="False" />
            <Setter
                Property="ScrollViewer.VerticalScrollMode"
                Value="Disabled" />
            <Setter
                Property="ScrollViewer.IsVerticalRailEnabled"
                Value="False" />
            <Setter
                Property="ScrollViewer.ZoomMode"
                Value="Disabled" />
            <Setter
                Property="ScrollViewer.IsDeferredScrollingEnabled"
                Value="False" />
            <Setter
                Property="ScrollViewer.BringIntoViewOnFocusChange"
                Value="True" />
            <Setter
                Property="ItemContainerTransitions">
                <Setter.Value>
                    <TransitionCollection>
                        <AddDeleteThemeTransition />
                        <ContentThemeTransition />
                        <ReorderThemeTransition />
                        <EntranceThemeTransition
                            IsStaggeringEnabled="False" />
                    </TransitionCollection>
                </Setter.Value>
            </Setter>
            <Setter
                Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <ItemsStackPanel
                            Orientation="Vertical" />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter
                Property="Template">
                <Setter.Value>
                    <ControlTemplate
                        TargetType="ListView">
                        <Border
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}">
                            <ScrollViewer
                                x:Name="ScrollViewer"
                                AutomationProperties.AccessibilityView="Raw"
                                BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
                                HorizontalScrollMode="Disabled"
                                HorizontalScrollBarVisibility="Hidden"
                                IsHorizontalRailEnabled="False"
                                IsHorizontalScrollChainingEnabled="False"
                                IsVerticalScrollChainingEnabled="False"
                                IsVerticalRailEnabled="False"
                                IsDeferredScrollingEnabled="False"
                                TabNavigation="{TemplateBinding TabNavigation}"
                                VerticalScrollBarVisibility="Disabled"
                                VerticalScrollMode="Disabled"
                                ZoomMode="Disabled">
                                <ItemsPresenter
                                    FooterTransitions="{TemplateBinding FooterTransitions}"
                                    FooterTemplate="{TemplateBinding FooterTemplate}"
                                    Footer="{TemplateBinding Footer}"
                                    HeaderTemplate="{TemplateBinding HeaderTemplate}"
                                    Header="{TemplateBinding Header}"
                                    HeaderTransitions="{TemplateBinding HeaderTransitions}"
                                    Padding="{TemplateBinding Padding}" />
                            </ScrollViewer>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

有什么想法吗?


我想到的解决方案是捕获PointerWheelChanged事件并移动ScrollView

1
2
3
4
   private void ListView_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
    {
     ScrollView.ScrollToVerticalOffset(ScrollView.VerticalOffset - e.GetCurrentPoint(ScrollView).Properties.MouseWheelDelta);
    }