Windows 8 启用鼠标滚动,同时保持触摸选定项目的能力

Windows 8 启用鼠标滚动,同时保持触摸选定项目的能力,windows-8,windows-runtime,winrt-xaml,Windows 8,Windows Runtime,Winrt Xaml,我正在使用GridView显示项目列表。我需要能够使用鼠标滚轮在包含GridView的页面中滚动。这可以通过覆盖GridView的模板轻松实现 <GridView.Template> <ControlTemplate> <ItemsPresenter /> </ControlTemplate> </GridView.Template> 但是,我还需要从触摸设备中选择这些项目。

我正在使用GridView显示项目列表。我需要能够使用鼠标滚轮在包含GridView的页面中滚动。这可以通过覆盖GridView的模板轻松实现

<GridView.Template>
        <ControlTemplate>
            <ItemsPresenter />
        </ControlTemplate>
</GridView.Template>

但是,我还需要从触摸设备中选择这些项目。这通常是通过向下轻弹一个项目来完成的,之后它将被选中。应用上述模板覆盖后,触摸选择机制中断

我进入Blend并开始查看GridView的默认模板,如下所示

<ControlTemplate
    TargetType="GridView">
    <Border
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness}"
        Background="{TemplateBinding Background}">
        <ScrollViewer
            x:Name="ScrollViewer"
            BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
            HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
            HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
            IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
            IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
            IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
            IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
            IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
            TabNavigation="{TemplateBinding TabNavigation}"
            VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
            VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
            ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
            <ItemsPresenter
                HeaderTemplate="{TemplateBinding HeaderTemplate}"
                Header="{TemplateBinding Header}"
                HeaderTransitions="{TemplateBinding HeaderTransitions}"
                Padding="{TemplateBinding Padding}" />
        </ScrollViewer>
    </Border>
</ControlTemplate>

如果我以任何方式移除ScrollViewer或禁用水平滚动部分,则触摸选择将停止工作

如何同时启用鼠标滚动和触摸选择


我只是想澄清一下,我不需要同时采取行动。两者只需要在同一个页面上为同一个GridView分别工作。

我认为您的方案不可能实现。有网格的SV是问题所在。MSDN文档说GridView阻止PointerHeelChanged事件冒泡:

注意:PointerHeelChanged事件不会从GridView冒泡出现。这意味着,如果指针位于GridView上,则其内部具有GridView的控件不会接收鼠标滚轮更改消息。例如,如果将GridView放在ScrollViewer中,当指针位于GridView上时,无法使用鼠标滚轮滚动ScrollViewer


在更改控件模板时,您可能使用了错误的方法。下面的链接是否解决了您要做的事情?不,到目前为止,水平滚动和触摸拖动选择似乎是相互排斥的。对不起,我还没有鼠标来测试这一点(一直在路上)。现在我知道了。我可以用滚轮滚动,并使用上面链接中的设置在网格中拖动选择。您是否有可能使用VS模拟器进行测试?如果是这样的话,你必须先在模拟器内用鼠标左键点击你的应用程序,然后它才会注册滚轮。在模拟器之外,您不必这样做。如果它是页面中唯一的元素,它就会工作。我有很多其他的内容,所以我需要一个滚动查看器来浏览所有的内容。一旦GridView被另一个SV'er包围,它将停止响应鼠标滚轮。这不起作用:对此发表评论。它似乎不再是8.1中的问题。还没有检查它是否在8.0中也已修复。