none
事件捕捉问题 RRS feed

  • 问题

  • 想完成一个下拉刷新的需求

    在做WP7的时候 用MouseMove和MouseLeftButtonUp事件就能捕捉到ScrollViewer的拖拽以及释放

    在Win8里没有了这些事件 然后尝试了Pointer和Manipulation相关事件

    貌似都没法捕捉到拖拽事件 而且用Pointer捕捉PointerCaptureLost事件也不是很准确 手指还没抬起来就已经调用该事件了

    请问有啥好的办法么?应该用什么事件去处理这个需求呢?谢谢。

    2013年1月16日 3:40

答案

全部回复

  • Hi,

    拖拽动作的话,商店应用使用ManipulationDelta来捕捉,通过传递过来的e.Delta可以得到拖动数据。

    使用这个的时候需要设置ManipulationMode=ALL(只要不是默认的System或者None都可以)

    参考:

    http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.manipulationdelta.aspx


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月17日 8:04
    版主
  • 多谢回复,试验了下您的方法,事件是抓到了,但是ScrollView失效了

    做了自定义ListView的Style和Template,然后处理了下事件,具体样式如下:

            <Style x:Key="ListViewStyle1" TargetType="ListView">
                <Setter Property="IsTabStop" Value="False"/>
                <Setter Property="TabNavigation" Value="Once"/>
                <Setter Property="IsSwipeEnabled" Value="True"/>
                <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
                <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
                <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled"/>
                <Setter Property="ScrollViewer.IsHorizontalRailEnabled" Value="False"/>
                <Setter Property="ScrollViewer.VerticalScrollMode" Value="Enabled"/>
                <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>
                            <VirtualizingStackPanel 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" 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}"
                                              ManipulationStarting="ScrollViewer_ManipulationStarting_1" ManipulationStarted="ScrollViewer_ManipulationStarted_1" ManipulationInertiaStarting="ScrollViewer_ManipulationInertiaStarting_1" ManipulationDelta="ScrollViewer_ManipulationDelta_1" ManipulationCompleted="ScrollViewer_ManipulationCompleted_1" ManipulationMode="All"
                                              PointerMoved="ScrollViewer_PointerMoved_1">
                                    <ItemsPresenter HeaderTemplate="{TemplateBinding HeaderTemplate}" Header="{TemplateBinding Header}" HeaderTransitions="{TemplateBinding HeaderTransitions}" Padding="{TemplateBinding Padding}"
                                                    ManipulationStarting="ItemsPresenter_ManipulationStarting_1" ManipulationStarted="ItemsPresenter_ManipulationStarted_1" ManipulationInertiaStarting="ItemsPresenter_ManipulationInertiaStarting_1" ManipulationDelta="ItemsPresenter_ManipulationDelta_1" ManipulationCompleted="ItemsPresenter_ManipulationCompleted_1" ManipulationMode="TranslateY"
                                                    PointerMoved="ItemsPresenter_PointerMoved_1"/>
                                </ScrollViewer>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

    之后在后台CS事件代码中调用Debug语句输出,查看该事件是否被调用。

    如果ItemsPresenter设置了ManiputationMode(如上)则ScrollViewer里是可以处理到ManipulationDelta事件的,但是ScrollViewer就不能被拖拽了

    如果不设置的话,ScrollView是运行正常的,可以完成拖拽等状态,但是事件就无法抓到了

    个人感觉是不是和路由事件有关系,但是又不知道该具体如何处理,请问您是否有些建议呢?

    2013年1月17日 10:46
  • Hi,

    这个不是路由的问题,而是ScrollViewer内部实现的问题。ScrollViewer滑动和Manipulation这两个事件会有冲突。我的建议是不要将两个放在一起用。如果要使用滑动来显示比较大的内容的话,可以用ManipulationDelta自己写一个好了。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月24日 4:33
    版主
  • 主要目的还是说要实现下拉刷新这个功能

    在网上查了 有外国人说系统自带的无法实现 因为ScrollViewer处理了所有的Manipulation 除非自己从写个ScrollViewer

    2013年1月25日 8:10
  • Hi,

    他说的是对的,的确是这样。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Seraph89 2013年1月25日 9:02
    2013年1月25日 8:47
    版主
  • 单纯的ScrollViewer还是可以做到下拉刷新的,listView里的ScrollViewer好像有些奇怪。。。

    好吧 好像是不行的。。。。。 吭爹啊,但是好像自己改动以后需要好好调整缓动 否则效果不如一开始流畅啊

    涩涩的。。。。。

    2013年10月14日 7:04