2016-03-01 12 views
7

Stworzyłem aplikację WPF. Działa całkiem dobrze na komputerach, ale w momencie uruchomienia aplikacji na ekranie dotykowym ulega awarii. Wyłączyłem procesy z ekranem dotykowym, a aplikacja działała zupełnie dobrze. Zastanawiam się, czy ktoś znalazł "lepszą" poprawkę niż wyłączyć procesy na ekranie dotykowym, ponieważ nie działałoby to na powierzchni Microsoft lub Windows.WPF AutomationPeer Crash na urządzeniach TouchScreen

obecnie używam .NET 4.5

+0

Czy możesz pokazać, gdzie w kodzie otrzymujesz wyjątek? – Terrance

Odpowiedz

3

miałem wiele problemów z WPF AutomationPeer też.

Być może uda ci się rozwiązać problem, zmuszając elementy interfejsu użytkownika WPF do korzystania z niestandardowego programu AutomationPeer, który zachowuje się inaczej niż domyślny, nie zwracając elementów sterujących podrzędnych programu AutomationPeers. To może zatrzymać wszelkie UI automatyzacji pracy rzeczy, ale mam nadzieję, że w Twoim przypadku, jak w kopalni, nie jesteś przy użyciu automatyzacji UI ..

Tworzenie niestandardowego automatyki klasy rówieśniczej, która dziedziczy FrameworkElementAutomationPeer i przesłania metodę GetChildrenCore, aby zwracać pusta lista zamiast rówieśników automatyki sterowania dziećmi. To powinno zatrzymać problemy występujące, gdy coś próbuje powtórzyć przez drzewo AutomationPeers.

Zastępuj również GetAutomationControlTypeCore, aby określić typ kontrolki, którego będziesz używać w trybie automatyzacji. W tym przykładzie przekazuję AutomationControlType jako parametr konstruktora. Jeśli zastosujesz niestandardowy peer automatyzacji do swojego systemu Windows, powinno to rozwiązać twoje problemy, ponieważ myślę, że element główny jest używany do zwracania wszystkich dzieci.

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>(); 
    } 
} 

Aby korzystać peer zwyczaj automatyzacji zastąpić metodę OnCreateAutomationPeer w elemencie np UI Okno:

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

Jakiś konkretny powód głosowania w dół? Próbuję odpowiedzieć na pytanie "czy ktoś znalazł" lepszą "poprawkę niż wyłączyć procesy na ekranie dotykowym". Jeśli moja odpowiedź nie jest przydatna, proszę podać powody. –

+0

Witam @Glen Thomas Dziękujemy za poświęcenie czasu na odpowiedź. To rozwiązało problem z moim oprogramowaniem do automatyzacji. – Master