2016-03-01 22 views
7

私はWPFアプリケーションを作成しました。デスクトップ上ではまったく問題なく動作しますが、タッチスクリーン上でアプリケーションを実行するとクラッシュします。私はタッチスクリーンプロセスをオフにして、アプリケーションは完全にうまくいった。私は誰もが、これはマイクロソフトの表面またはWindowsのタブレットでは動作しないので、タッチスクリーンプロセスを無効にするよりも "良い"修正を見つけたのだろうかと思っています。WPF AutomationPeerがTouchScreenデバイスでクラッシュする

私は現在、私はあまりにもWPF AutomationPeerには多くの問題があったの.Net 4.5に

+0

例外がスローされるコードの場所を表示できますか? – Terrance

答えて

3

を使用しています。

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 Thomas答えていただきありがとうございます。これは私のオートメーションピアの問題を解決しました。 – Master

関連する問題