Gong-wpf-dragdrop: Arrastrar y soltar ListBox - pantalla táctil

Creado en 1 oct. 2014  ·  19Comentarios  ·  Fuente: punker76/gong-wpf-dragdrop

No puedo usar la funcionalidad de arrastrar y soltar en pantallas táctiles con ListBox / ListView.

¿Está planeado en el futuro o alguien tiene una solución alternativa?

Feature Request

Comentario más útil

Agregar ScrollViewer.PanningMode="None" a ListBox solucionó. ¡Pasé la mitad del día trabajando en esto y me salvaste la otra mitad! ¡¡¡Muchas gracias!!!

Todos 19 comentarios

@psoma haría esto, pero no puedo probar esto en el mundo real, porque no tengo ningún dispositivo táctil :-(

También está la cuestión de cómo se quiere comenzar la operación de arrastre,
algunas cosas tienen sentido para comenzar a arrastrar al aterrizar, otras probablemente quieran
una pulsación larga.
El 1 de octubre de 2014 a las 11:28 a. M., "Jan Karger" [email protected] escribió:

@psoma https://github.com/psoma haría esto, pero no puedo probar esto
en el mundo real, porque no tengo ningún dispositivo táctil :-(

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/punker76/gong-wpf-dragdrop/issues/110#issuecomment -57512449
.

¿Qué tipo de pantalla táctil estás usando? Estoy usando esta biblioteca con una pantalla táctil resistiva y no tengo ningún problema.

Se crea mediante DoDragDrop ().

La pantalla táctil estaba en nuestra máquina de prueba, creo que una tableta Lenovo Yoga 2.

Tener el mismo problema en todas las pantallas táctiles. Pruebas con Surface Pro 2, 3 y 4.

Tuve un problema similar y al final decidí que era un conflicto entre el desplazamiento inercial nativo en el cuadro de lista y los controles derivados. Tiene sentido porque es bastante difícil distinguir entre "presionar y mover, es decir, desplazar la ventana" y "presionar y mover. Es decir, recoger ese elemento para arrastrarlo".

Podría intentar deshabilitar PanningMode, ¿eso puede ayudar?

Agregar ScrollViewer.PanningMode="None" a ListBox solucionó. ¡Pasé la mitad del día trabajando en esto y me salvaste la otra mitad! ¡¡¡Muchas gracias!!!

No hay problema, me alegro de que te haya ayudado: D

El problema es que configurar PanningMode es apenas una solución alternativa, y tener una aplicación con capacidad táctil en la que no puede desplazarse por una lista con la función táctil es imposible. ¿Algún problema con esto? @ punker76
Algo basado en un gesto de retención para activar el arrastre sería genial, pero todavía tengo que descubrir cómo implementarlo

No sé si esto ayuda, o si hay agujeros obvios en esto que aún no me he dado cuenta, pero una solución que parece estar funcionando para mí es:

  • Deje PanningMode establecido en su valor predeterminado ( Both , ¿creo?)
  • En el evento SelectionChanged , cambie PanningMode a None
  • Establecer un temporizador que se active después de un breve intervalo (800 milisegundos parece razonable para mi aplicación particular)
  • Cuando se active el temporizador, apáguelo y restablezca PanningMode a Both

Código pseudo-y:

  ctor()
  {
    // There are of course a bunch of different timers. When coding this, I got my
    // grubby fingers onto System.Timers.Timer first, so that's what I used here :-P
    _touchDragTimer = new Timer();
    _touchDragTimer.Interval = 800;
    _touchDragTimer.Elapsed += _touchDragTimer_Elapsed;
  }

  void lstItems_SelectionChanged(sender, e)
  {
    _touchDragTimer.Stop();
    lstItems.SetValue(ScrollViewer.PanningMode, PanningMode.None);
    _touchDragTimer.Start();
  }

  void _touchDragTimer_Elapsed(sender, e)
  {
    _touchDragTimer.Stop();

    Dispatcher.Invoke(
      () =>
      {
        lstItems.SetValue(ScrollViewer.PanningMode, PanningMode.Both);
      });
  }

Con este código, puede arrastrar la vista tanto como desee, pero si desea arrastrar un elemento, tóquelo una vez para seleccionarlo y luego tendrá un breve intervalo para iniciar una operación de arrastre. Déjelo reposar y volverá a comportarse como una voluta.

No he investigado si esto sería fácil de integrar directamente en GongSolutions.Wpf.DragDrop, pero tal vez alguien lo encuentre útil (¡o pueda decirme por qué no debería hacerlo! :-D).

Tocar-soltar-mantener-arrastrar es un gesto bastante común para indicar que desea hacer un arrastre en lugar de un desplazamiento.

También estoy interesado en esta función, ¡sería genial tenerla!

No sé si esto ayuda, o si hay agujeros obvios en esto que aún no me he dado cuenta, pero una solución que parece estar funcionando para mí es:

  • Deje PanningMode establecido en su valor predeterminado ( Both , ¿creo?)
  • En el evento SelectionChanged , cambie PanningMode a None
  • Establecer un temporizador que se active después de un breve intervalo (800 milisegundos parece razonable para mi aplicación particular)
  • Cuando se active el temporizador, apáguelo y restablezca PanningMode a Both

Código pseudo-y:

  ctor()
  {
    // There are of course a bunch of different timers. When coding this, I got my
    // grubby fingers onto System.Timers.Timer first, so that's what I used here :-P
    _touchDragTimer = new Timer();
    _touchDragTimer.Interval = 800;
    _touchDragTimer.Elapsed += _touchDragTimer_Elapsed;
  }

  void lstItems_SelectionChanged(sender, e)
  {
    _touchDragTimer.Stop();
    lstItems.SetValue(ScrollViewer.PanningMode, PanningMode.None);
    _touchDragTimer.Start();
  }

  void _touchDragTimer_Elapsed(sender, e)
  {
    _touchDragTimer.Stop();

    Dispatcher.Invoke(
      () =>
      {
        lstItems.SetValue(ScrollViewer.PanningMode, PanningMode.Both);
      });
  }

Con este código, puede arrastrar la vista tanto como desee, pero si desea arrastrar un elemento, tóquelo una vez para seleccionarlo y luego tendrá un breve intervalo para iniciar una operación de arrastre. Déjelo reposar y volverá a comportarse como una voluta.

No he investigado si esto sería fácil de integrar directamente en GongSolutions.Wpf.DragDrop, pero tal vez alguien lo encuentre útil (¡o pueda decirme por qué no debería hacerlo! :-D).

Intenté esto, pero esta parte lstItems.SetValue(ScrollViewer.PanningMode, PanningMode.Both); arroja un error

Se requiere una referencia de objeto para el campo no estático 'ScrollViewer.PanningMode'

Intenté esto, pero esta parte lstItems.SetValue(ScrollViewer.PanningMode, PanningMode.Both); arroja un error

Se requiere una referencia de objeto para el campo no estático 'ScrollViewer.PanningMode'

Utilice ScrollViewer.PanningModeProperty lugar.

Vaya, sí, lo siento, fue un error tipográfico. 😳

Cambié un poco el código. En lugar de cambiar PanningMode en el evento SelectionChanged, lo tengo en PreviewTouchDown, de esta manera el arrastre es instantáneo en lugar de tener que seleccionar el elemento y luego arrastrarlo.

private void list_PreviewTouchDown(object sender, System.Windows.Input.TouchEventArgs e)
{
            _touchDragTimer.Stop();
            lst_scheduled.SetValue(ScrollViewer.PanningModeProperty, PanningMode.None);
            _touchDragTimer.Start();
}

Cambié un poco el código. En lugar de cambiar PanningMode en el evento SelectionChanged, lo tengo en PreviewTouchDown, de esta manera el arrastre es instantáneo en lugar de tener que seleccionar el elemento y luego arrastrarlo.

Pero entonces ya no harás el gesto de tocar dos veces y arrastrar, ¿verdad?

De hecho, ¿cómo se desplaza el contenedor del artículo? Con ese cambio, ¿por qué incluso tener diferentes modos de panorámica? Podría dejarlo configurado permanentemente en None , ¿no es así?

De hecho, ¿cómo se desplaza el contenedor del artículo? Con ese cambio, ¿por qué incluso tener diferentes modos de panorámica? Podría dejarlo configurado permanentemente en None , ¿no es así?

Sí, tiene usted razón. Cuando probé inicialmente, solo había un par de elementos en el cuadro :( Solo quiero un arrastre suave sin el doble toque. Tal vez mantenerlo y arrastrarlo sea suficiente.

¿Fue útil esta página
0 / 5 - 0 calificaciones