触摸屏设备上的WPF AutomationPeer崩溃

我创建了一个WPF应用程序。 它在桌面上运行得非常好,但应用程序在运行在触摸屏上的应用程序崩溃了。 我关闭了触摸屏流程,应用程序运行良好。 我想知道有没有人发现一个“更好”的修复比禁用触摸屏进程,因为这不适用于微软的表面或Windows平板电脑。

我目前使用.Net 4.5


WPF AutomationPeer也遇到过很多问题。

您可能可以通过强制您的WPF UI元素使用自定义AutomationPeer来解决您的问题,该自定义AutomationPeer的行为与缺省行为不同,因为它不返回子控件的AutomationPeers。 这可能会阻止任何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方法,例如Window:

protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
{
    return new MockAutomationPeer(this, AutomationControlType.Window);
}
链接地址: http://www.djcxy.com/p/32511.html

上一篇: WPF AutomationPeer Crash on TouchScreen Devices

下一篇: How to use providers in a service?