63 messaggi dal 08 giugno 2010
Salve a tutti,
Il mio problema come da titolo è che ho scritto una applicazione Wpf dove nelle varie listview, Datagrid, Treeview ecc..ho sempre eseguito azioni tramite l'evento MouseDoubleClick (anche involotariamente come nel caso dell'apertura dei treeview) ed ad oggi invece con gli ultimi schermi touch questo evento non scatta correttamente al doppio tocco su schermo come invece avviene per tutti gli altri eventi come mouse down oppure click ecc..

Come posso fare per non riscrivere tutti gli eventi legati al MouseDoubleClick con l'evento TouchDown?

Grazie infinite per l'attenzione
11.885 messaggi dal 09 febbraio 2002
Contributi
Ciao,
l'evento TouchDown dovrai per forza gestirlo, e poi misurare la distanza e il tempo che intercorrono da un secondo TouchDown, per verificare se si tratta di un doppio tap o meno.
Qui trovi una possibile implementazione.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/b7c43047-c9d6-450b-9786-cc47452f6a40/how-can-we-use-windows-8-touch-gestures-double-tap-hold-in-wpf-45-apps?forum=wpf

Ora, per evitare di dover modificare ogni singolo bottone, potresti crearti uno stile e, grazie ad un EventSetter, andare ad assegnare un gestore all'evento TouchDown. Qui trovi un esempio col KeyDown, ma concettualmente è lo stesso.
http://stackoverflow.com/questions/6042971/wpf-is-it-possible-to-assign-an-event-in-a-style

Così, con poco sforzo, puoi capire se si è verificato un doppio tap su un bottone. Per finire, solleva l'evento DoubleClick per quel bottone usando il metodo RaiseEvent. Se la previsione è giusta, sarà come se l'utente avesse fatto un doppio click col mouse. Qui un esempio:
http://stackoverflow.com/questions/2421304/raising-wpf-mouseleftbuttondownevent-event#answers-header

Se funziona, fammi sapere. E' una cosa che non ho mai provato.


ciao,
Moreno

Enjoy learning and just keep making
63 messaggi dal 08 giugno 2010
Ciao Moreno,
Innanzi tutto ti ringrazio per l'aiuto!!

In realtà in questo tempo che è trascorso mi ero già arreso ed è per questo che avevo già approcciato la strada del TouchDown. Infatti come anche tu mi hai suggerito ho fatto in questo modo:

private void Lista_TouchDown(object sender, TouchEventArgs e)
{
if (IsDoubleTap(e, this))
{
LbxArticoli_MouseDown(sender, null);
}
}

Per quanto riguarda invece EventSetter e RaiseEvent non credo di utilizzarli perchè comunque dovendo mettere mano inevitabilmente su ogni pagina, non ne trovo tanto giovamento o forse non ho ben capito le loro potenzialità.

Grazie ancora
Francesco
11.885 messaggi dal 09 febbraio 2002
Contributi
ciao Francesco, prego :)


perchè comunque dovendo mettere mano inevitabilmente su ogni pagina

Potresti impostarlo come stile "globale", all'interno dell'App.xaml.
    <Application.Resources>
        <Style TargetType="{x:Type Button}">
            <EventSetter Event="TouchDown" Handler="SimulaDoppioClick" />
        </Style>
    </Application.Resources>


e nel codefile metti un gestore con del codice tipo questo.
protected void SimulaDoppioClick(object sender, TouchEventArgs e)
{
    var btn = (sender as Button);
    if (IsDoubleTap(e, btn))
    {
        btn.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) { RoutedEvent = Control.MouseDoubleClickEvent });
    }
}

In pratica: se si è verificato un doppio tap, allora sollevi l'evento MouseDoubleClickEvent da codice. Il gestore che avevi legato al doppioclick di quel particolare bottone, andrà in esecuzione.


ciao,
Moreno

Enjoy learning and just keep making
63 messaggi dal 08 giugno 2010
Si, praticamente devo mettere l'evento SimulaDoppioClick su ogni pagina che ha questo bottone è giusto?

Grazie ancora
11.885 messaggi dal 09 febbraio 2002
Contributi
No, solo nel file App.xaml.cs.

Enjoy learning and just keep making
63 messaggi dal 08 giugno 2010
Perfetto, provo il tutto e ti faccio sapere.
63 messaggi dal 08 giugno 2010
Funziona tutto perfettamente te ne sono davvero grato!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.