2016-03-01 15 views
7

Ho creato un'applicazione WPF. Funziona perfettamente sui desktop, ma nel momento in cui l'applicazione viene eseguita su un touchscreen si blocca. Ho disattivato i processi touchscreen e l'applicazione ha funzionato perfettamente. Mi chiedo se qualcuno abbia trovato una soluzione "migliore" che disabilitare i processi del touchscreen, in quanto ciò non funzionerebbe su Microsoft Surface o Windows Tablet.WPF AutomationPeer Crash su dispositivi TouchScreen

Attualmente sto usando .Net 4.5

+0

Potrebbe mostrare dove nel codice si ottiene un'eccezione generata? – Terrance

risposta

3

Ho avuto molti problemi con WPF AutomationPeer troppo.

Potrebbe essere possibile risolvere il problema forzando gli elementi dell'interfaccia utente WPF a utilizzare un AutomationPeer personalizzato che si comporta in modo diverso rispetto a quello predefinito non restituendo AutomationPeers dei controlli figlio. Questo potrebbe fermare qualsiasi roba di lavoro di automazione interfaccia utente, ma si spera che nel tuo caso, come nel mio, non si utilizza l'automazione interfaccia utente ..

creare una classe peer di automazione personalizzata che eredita da FrameworkElementAutomationPeer e l'override del metodo GetChildrenCore, per restituire un elenco vuoto invece dei peer di automazione controllo figlio. Questo dovrebbe fermare i problemi che si verificano quando qualcosa tenta di scorrere l'albero di AutomationPeers.

Ignorare anche GetAutomationControlTypeCore per specificare il tipo di controllo su cui verrà utilizzato il peer di automazione. In questo esempio sto passando lo AutomationControlType come parametro costruttore. Se applichi il tuo peer di automazione personalizzato a Windows, dovrebbe risolvere i tuoi problemi poiché penso che l'elemento radice sia usato per restituire tutti i bambini.

public class MockAutomationPeer : FrameworkElementAutomationPeer 
{ 
    AutomationControlType _controlType; 

    public MockAutomationPeer(FrameworkElement owner, AutomationControlType controlType) 
     : base(owner) 
    { 
     _controlType = controlType; 
    } 

    protected override string GetNameCore() 
    { 
     return "MockAutomationPeer"; 
    } 

    protected override AutomationControlType GetAutomationControlTypeCore() 
    { 
     return _controlType; 
    } 

    protected override List<AutomationPeer> GetChildrenCore() 
    { 
     return new List<AutomationPeer>(); 
    } 
} 

Per utilizzare il peer di automazione personalizzato l'override del metodo OnCreateAutomationPeer nel vostro elemento dell'interfaccia utente per esempio Finestra:

protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer() 
{ 
    return new MockAutomationPeer(this, AutomationControlType.Window); 
} 
+0

Qualche ragione particolare per il voto negativo? Sto tentando di rispondere alla domanda "qualcuno ha trovato una soluzione" migliore "che disabilitare i processi del touchscreen". Se la mia risposta non è utile, si prega di indicare le ragioni. –

+0

Ciao @Glen Thomas Grazie per aver trovato il tempo di rispondere. Questo ha risolto il mio problema di automazione peer. – Master

Problemi correlati