2016-03-01 66 views
7

我創建了一個WPF應用程序。它在桌面上運行得非常好,但應用程序在運行在觸摸屏上的應用程序崩潰了。我關閉了觸摸屏流程,應用程序運行良好。我不知道有沒有人發現了一個「更好」的修復,而不是禁用觸摸屏的過程,因爲這不是微軟的Surface或和Windows平板電腦上運行。WPF的AutomationPeer崩潰在觸摸屏設備

我目前使用.NET 4.5

+0

你可以顯示在代碼中你得到一個異常拋出? – Terrance

回答

3

我曾與WPF AutomationPeer太多的問題。

您可能能夠通過迫使你的WPF UI元素使用的是通過不返回子控件的AutomationPeers表現不同的默認一個自定義的AutomationPeer解決您的問題。這可能會阻止任何UI自動化的東西的工作,但希望在你的情況,因爲在我,你是不是使用UI自動化..

創建從FrameworkElementAutomationPeer繼承和覆蓋GetChildrenCore方法定製自動化同級類,返回一個空列表而不是子控制自動化同行。當某些事情試圖通過AutomationPeers樹進行迭代時,這應該可以避免發生問題。

而且覆蓋GetAutomationControlTypeCore指定要使用的自動化同級控件類型。在這個例子中,我通過AutomationControlType作爲構造函數參數。如果你申請你的自定義自動對您的Windows應該解決您的問題,我認爲根元素用於返回所有兒童。

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

要使用自定義自動化對等項,請覆蓋UI元素中的OnCreateAutomationPeer方法,例如,窗口:

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

投票的任何特定原因?我試圖回答這個問題:「有沒有人發現一個」更好「的解決方案,而不是禁用觸摸屏進程」。如果我的回答沒有用,請說明您的理由。 –

+0

喜@Glen托馬斯感謝您抽出時間來回答。這已解決了我的自動化對等問題。 – Master