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

WPF, ScrollViewer потребляет касание перед длительным нажатием

Я новичок в этом мире WPF. И я немного смущен тем, почему мой прокрутка потребляет мое сенсорное событие.

Моя текущая ситуация такова:

У меня есть этот ScrollViewer с ItemsControl. В этом ItemsControl я использую Wrappanel, чтобы показать несколько прямоугольников. Мой ScrollViewer должен позволять прокручивать по вертикали, чтобы показывать прямоугольники, завернутые вниз. Для каждого из этих прямоугольников я сделал CustomBehaviour со всевозможными обработчиками. Один из этих обработчиков представляет собой «творчески» созданный способ обработки LongPressGesture.

Проблема заключается в следующем: прежде чем мое долгое нажатие будет обнаружено поведением, мой ScrollViewer захватывает мой TouchDevice в своем обработчике PreviewTouchMove.

Как я могу предотвратить слишком ранний захват моим ScrollViewer моего TouchDevice? Как я могу убедиться, что могу прокручивать свой ScrollViewer и выполнять свои LongPress, DoubleClick (который все еще работает), SingleClick (который также работает) и другие жесты, которые я могу добавить к этому пользовательскому поведению?

Я нашел похожие вопросы в stackoverflow и google, которые я просто не понимаю для своего конкретного случая.

Что-то с CustomThumb ‹-- Эта ссылка решает проблему, создав CustomThumb. Могу ли я как-то повторно использовать это для своего поведения? Захватив TouchDevice в моих обработчиках поведения на раннем этапе?

Если все не получится. Есть ли альтернатива этой комбинации ScrollViewer и CustomBehaviour?


РЕДАКТИРОВАТЬ:

В это время. Я повторил метод CustomThumb. Я получил длинное нажатие, чтобы работать теперь из моего CustomBehaviour, в то время как UIElements (с таким поведением) расположены в ScrollViewer. Однако функция прокрутки ScrollViewer по-прежнему не работает. Награда, которую я добавил, также будет присуждена человеку, который поможет мне снова заставить это работать правильно (поскольку ответ должен лежать в том же направлении, что и это решение CustomThumb).


  • Хм, из-за всплывающих и туннелирующих событий? 08.11.2013
  • Да, это, вероятно, причина, по которой это происходит, но в некоторых случаях я испытал событие, которое всплывало, чтобы быть переданным, а не потребляемым. Но в этом случае ScrollViewer решает удерживать событие и «забывает» передать его представлению, которое, как я ожидал, произойдет. Как я могу убедиться, что мое долгое нажатие все еще происходит. Итак, я могу прокручивать прокрутку, не нажимая долго на прямоугольники, на которых я сделал свое поведение? 08.11.2013

Ответы:


1

У меня была аналогичная проблема раньше. Я не мог одновременно использовать прокрутку, касание и стиль. В конце концов я разработал собственный ScrollViewer. Это проще, чем вы думаете, так как вам нужно только посмотреть/изменить некоторые основные методы.

В вашем случае вы можете проверить, нажимал ли пользователь на пустую поверхность или элемент списка. Если это элемент списка, нужно проверить, было ли это короткое нажатие (значит, касание тоже произошло после тачдауна) или долгое.

Прокрутку можно настроить с помощью PanningMode. Это позволяет вам прокручивать пальцем по всему пользовательскому элементу управления.

Вот моя версия scrollviewer. Он отключает режим прокрутки, когда пользователь нажимает кнопку, а затем включает его.

public class ScrollViewerWithTouch : ScrollViewer   
{
      /// <summary>
      /// Original panning mode.
      /// </summary>
      private PanningMode panningMode;

  /// <summary>
  /// Set panning mode only once.
  /// </summary>
  private bool panningModeSet;

  /// <summary>
  /// Initializes static members of the <see cref="ScrollViewerWithTouch"/> class.
  /// </summary>
  static ScrollViewerWithTouch()
  {
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ScrollViewerWithTouch), new FrameworkPropertyMetadata(typeof(ScrollViewerWithTouch)));
  }

  protected override void OnManipulationCompleted(ManipulationCompletedEventArgs e)
  {
     base.OnManipulationCompleted(e);

     // set it back
     this.PanningMode = this.panningMode;
  }

  protected override void OnManipulationStarted(ManipulationStartedEventArgs e)
  {
     // figure out what has the user touched
     var result = VisualTreeHelper.HitTest(this, e.ManipulationOrigin);
     if (result != null && result.VisualHit != null)
     {
        var hasButtonParent = this.HasButtonParent(result.VisualHit);

        // if user touched a button then turn off panning mode, let style bubble down, in other case let it scroll
        this.PanningMode = hasButtonParent ? PanningMode.None : this.panningMode;
     }

     base.OnManipulationStarted(e);
  }

  protected override void OnTouchDown(TouchEventArgs e)
  {
     // store panning mode or set it back to it's original state. OnManipulationCompleted does not do it every time, so we need to set it once more.
     if (this.panningModeSet == false)
     {
        this.panningMode = this.PanningMode;
        this.panningModeSet = true;
     }
     else
     {
        this.PanningMode = this.panningMode;
     }

     base.OnTouchDown(e);         
  }

  private bool HasButtonParent(DependencyObject obj)
  {
     var parent = VisualTreeHelper.GetParent(obj);

     if ((parent != null) && (parent is ButtonBase) == false)
     {
        return HasButtonParent(parent);
     }

     return parent != null;
  }
}
11.11.2013
  • Да, я тоже примерно с этого начинал! Это примерно 80% того, что я хотел сейчас. Как вы думаете, есть ли способ разрешить прокрутку при запуске с кнопки (в вашем случае) или любого объекта с моим поведением (в моем случае)? 11.11.2013
  • Вы имеете в виду, если пользователь сначала коснется контента и начнет прокручивать его пальцами? В этом случае должны помочь PanningMode и IsManipulationEnabled ( msdn.microsoft.com/en-us/library/). Основная проблема заключается в том, что касания будут щелчками мыши, пожалуйста, ознакомьтесь с этой статьей: nui.joshland.org/2010/04/ 12.11.2013
  • Да. Я решил это только сейчас. Я сделал дополнительную проверку в своем customBehaviour, чтобы обнаружить touchMove. Искал scrollviewer из моего VisualTree. Затем передал мой сенсорный захват из моего поведения в просмотрщик прокрутки вручную. Таким образом, я могу прокручивать касанием при запуске объекта, который реализует мое пользовательское поведение. Твоя помощь была неоценима. Так что примите мою благодарность. 12.11.2013
  • Я рад, что смог помочь :) Ура 12.11.2013
  • Новые материалы

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

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

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

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

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

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

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