Какое событие срабатывает, когда пользователь поднимает палец от ScrollViewer на сенсорных экранах

Я нахожу, что когда я нажимаю ScrollViewer, события PointerPressed и PointerExited срабатывают, как ожидалось. Но, если я прокручиваю в любом направлении после касания экрана и поднимаю палец, никакое событие не срабатывает, кроме PointerCaptureLost, которое преждевременно срабатывает, как только я прокручиваю.

Когда я фиксирую идентификатор указателя и проверяю статус PointerPoint таймером, флаг IsInContact остается верным даже после того, как я подниму палец после прокрутки. Он работает так, как ожидалось, когда я просто нажимаю экран.

ManipulationCompleted имеет тот же эффект, что и выше, и я не могу использовать событие ViewChanged, так как это срабатывает, прежде чем я подниму палец.

Является ли это ошибкой или я что-то пропустил? Есть ли другой способ, который я могу обнаружить, когда пользователь поднял палец с экрана? Это заставляет меня бананы.

Пример кода ниже. Вам нужно будет использовать симулятор в сенсорном режиме или иметь сенсорный экран для проверки:

Код

using System;
using Windows.UI.Input;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;

namespace App1
{
    public sealed partial class MainPage : Page
    {

        private readonly DispatcherTimer pointerTimer = new DispatcherTimer();
        private uint? CurrentPointerID; //container for the current pointer id when user makes contact with the screeen

        public MainPage()
        {
            this.InitializeComponent();

            scrollviewer.PointerPressed += scrollviewer_PointerPressed;
            scrollviewer.PointerMoved += scrollviewer_PointerMoved;
            scrollviewer.PointerExited += scrollviewer_PointerExited;
            scrollviewer.PointerReleased += scrollviewer_PointerReleased;
            scrollviewer.PointerCaptureLost += scrollviewer_PointerCaptureLost;
            scrollviewer.PointerCanceled += scrollviewer_PointerCanceled;


            pointerTimer.Tick += pointerTimer_Tick;
            pointerTimer.Interval = TimeSpan.FromMilliseconds(300);
            pointerTimer.Start();


        }

        #region ScrollViewer Events

        void scrollviewer_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            EventCalledTextBlock.Text = "Pointer Moved";
        }

        void scrollviewer_PointerExited(object sender, PointerRoutedEventArgs e)
        {
            EventCalledTextBlock.Text = "Pointer Exited";
        }

        void scrollviewer_PointerPressed(object sender, PointerRoutedEventArgs e)
        {
            CurrentPointerID = e.Pointer.PointerId;
            EventCalledTextBlock.Text = "Pointer Pressed";
        }

        void scrollviewer_PointerCanceled(object sender, PointerRoutedEventArgs e)
        {
            EventCalledTextBlock.Text = "Pointer Canceled";
        }

        void scrollviewer_PointerCaptureLost(object sender, PointerRoutedEventArgs e)
        {
            EventCalledTextBlock.Text = "Capture Lost";
        }

        void scrollviewer_PointerReleased(object sender, PointerRoutedEventArgs e)
        {
            EventCalledTextBlock.Text = "Pointer Released";
        }
        #endregion



        void pointerTimer_Tick(object sender, object e)
        {
            if (!CurrentPointerID.HasValue)
            {
                PollingTextBlock.Text = string.Empty;
                return;
            }

            try
            {
                var pointerPoint = PointerPoint.GetCurrentPoint(CurrentPointerID.Value);

                PollingTextBlock.Text = pointerPoint.IsInContact ? "Is In Contact" : "Not in Contact";
            }
            catch (Exception ex)
            {
                //This exception is raised when the user lifts finger without dragging.
                //assume finger is not in contact with screen
                PollingTextBlock.Text = "Not in Contact";
            }
        }

    }
}

XAML

 <Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Name="grid">
        <Grid.RowDefinitions>
            <RowDefinition Height="113*"/>
            <RowDefinition Height="655*"/>
        </Grid.RowDefinitions>
        <ScrollViewer x:Name="scrollviewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Visible" Grid.Row="1" >
            <Rectangle Fill="#FF3783CF" Height="100" Stroke="#FF33D851" Width="{Binding ElementName=grid, Path=ActualWidth}" Margin="100" StrokeThickness="4" />
        </ScrollViewer>
        <StackPanel Orientation="Vertical" Margin="45,25,0,0">
            <StackPanel Orientation="Horizontal">
            <TextBlock  HorizontalAlignment="Left" TextWrapping="Wrap" Text="Event Called:" VerticalAlignment="Top" FontSize="24" Margin="0,0,20,0"/>
            <TextBlock x:Name="EventCalledTextBlock" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="24"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock  HorizontalAlignment="Left" TextWrapping="Wrap" Text="Polling Value:" VerticalAlignment="Top" FontSize="24" Margin="0,0,20,0"/>
            <TextBlock x:Name="PollingTextBlock" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="24"/>
        </StackPanel>
    </StackPanel>

    </Grid>
</Page>

Ответ 1

Я наткнулся на этот вопрос, так как я боролся с аналогичной проблемой. У меня есть ScrollViewer, в котором есть несколько изображений, и я хотел знать, какие изображения будут показаны в тот момент, когда ScrollViewer перестанет двигаться...

В конце я использовал событие ScrollViewer.ViewChanged. Это событие продолжает срабатывать до тех пор, пока оно не закончится с прокруткой.

На самом деле меня интересует только последнее из этих событий, но поскольку нет события, которое срабатывает только в этот конкретный момент, мне нужно ответить на этот вопрос и проверить себя, если это подходящий момент для принятия мер.

Надеюсь, это поможет.

Событие ScrollViewer.ViewChanged: https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.scrollviewer.viewchanged?f=255&MSPPError=-2147217396