Nano Hash - криптовалюты, майнинг, программирование

Какое событие срабатывает, когда пользователь поднимает палец из 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>

  • Вы пробовали события манипуляции, а не события указателя? 13.12.2013
  • да. Это приводит к тому же поведению, что и выше, когда ManipulationCompleted никогда не вызывается после прокрутки. 13.12.2013
  • Интересно, поглощает ли Rectangle внутри вашего ScrollViewer ваше событие Pointer Released. 15.12.2013
  • Хорошая теория, однако, когда я добавляю события указателя в прямоугольник через ((UIElement) scrollviewer.Content), они вообще не срабатывают. Также установка ManipulationMode в Rectangle позволяет вызвать событие PointerExit в Scrollviewer, однако это отключает прокрутку вместе. 15.12.2013
  • Хм, я помню, как читал в документах MSDN, что событие PointerReleased не всегда должно срабатывать. Он привел несколько причин, почему это так. Нашел. Проверьте это Не полагайтесь на события PointerPressed и PointerReleased, которые всегда происходят парами. Для правильной работы ваше приложение должно прослушивать и обрабатывать все события, которые представляют собой вероятные выводы для действия «Пресса». Вот ссылка: msdn.microsoft.com/library/windows/apps/br208972 16.12.2013

Ответы:


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

03.09.2015

2

Я думаю, вам нужно использовать событие PointerReleased. Перейдите по следующей ссылке: https://msdn.microsoft.com/library/windows/apps/br208279

01.09.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..