WPF AutomationPeer TouchScreen设备崩溃

时间:2016-03-01 16:00:41

标签: c# visual-studio

我创建了一个WPF应用程序。它在桌面上完全正常,但是当应用程序在触摸屏上运行时它会崩溃。我关闭了触摸屏流程,应用程序完全正常。我想知道是否有人找到了更好的"修复比禁用触摸屏过程,因为这不适用于微软表面或Windows平板电脑。

我目前正在使用.Net 4.5

1 个答案:

答案 0 :(得分:4)

我在WPF AutomationPeer也遇到了很多问题。

您可以通过强制WPF UI元素使用自定义AutomationPeer来解决您的问题,该自定义AutomationPeer的行为与默认值不同,方法是不返回子控件的AutomationPeers。这可能会阻止任何UI自动化工作,但希望在您的情况下,就像在我的情况下,您没有使用UI自动化..

创建一个继承自FrameworkElementAutomationPeer的自定义自动化同级类,并覆盖GetChildrenCore方法,以返回空列表而不是子控件自动化同级。这可以阻止当某些东西试图迭代AutomationPeers树时出现的问题。

还覆盖GetAutomationControlTypeCore以指定您将使用自动化同级的控件类型。在这个例子中,我传递AutomationControlType作为构造函数参数。如果您将自定义自动化同级应用程序应用到Windows,它应该解决您的问题,因为我认为root元素用于返回所有子项。

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