首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutomationPeer.GetChildrenCore ()只向VisualStudio.TestTools报告第一个孩子

AutomationPeer.GetChildrenCore ()只向VisualStudio.TestTools报告第一个孩子
EN

Stack Overflow用户
提问于 2018-02-16 17:44:23
回答 1查看 175关注 0票数 0

我无法正确地覆盖GetChildrenCore。我用这个作为画布来获取关于它的子(行,矩形)的信息。

输出正确地指示第一个子级,但忽略第二个子级。尽管画布已经包含了两者。

代码语言:javascript
复制
Custom Canvas  
    Custom Line Childs of Canvas parent: 2  

相反,应该是这样的:

代码语言:javascript
复制
Custom Canvas  
    Custom Line Childs of Canvas parent: 2  
    Custom Rectangle Childs of Canvas parent: 2  

应用程序侧:

代码语言:javascript
复制
public class ElementAP : FrameworkElementAutomationPeer
{
    private FrameworkElement Owner = null;
    private Int32 Count = 0;

    public ElementAP(FrameworkElement owner, Int32 count) : base (owner)
    {
        Owner = owner;
        Count = count;
    }

    protected override AutomationControlType GetAutomationControlTypeCore()
    {
        return AutomationControlType.Custom;
    }

    protected override string GetClassNameCore()
    {
        return $"{Owner.GetType().Name} Childs of Canvas parent: {Count}"; 
    }
}

public class CanvasAP : FrameworkElementAutomationPeer
{
    public CanvasAP(Windows.UI.Xaml.Controls.Canvas owner) : base(owner)
    {
    }

    protected override AutomationControlType GetAutomationControlTypeCore()
    {
        return AutomationControlType.Custom;
    }

    protected override string GetClassNameCore()
    {
        return "Canvas";
    }

    protected override IList<AutomationPeer> GetChildrenCore()
    {
        var owner = (Windows.UI.Xaml.Controls.Canvas)Owner;           
        var list = new List<AutomationPeer> ();

        foreach (var child in owner.Children)
        {
            var peer = new ElementAP(child as FrameworkElement, owner.Children.Count);

            list.Add(peer);
        }

        return list;
    }
}       

UI测试端:

代码语言:javascript
复制
private static string WalkTree(UITestControl element, Int32 level = 0)
{
    var children = element.GetChildren();

    var str = "";
    foreach (var c in children)
    {
        str += GetElementString(c, level);
        str += WalkTree(c, level + 1);
    }

    return str;
}

private static string GetElementString(UITestControl element, Int32 level = 0)
{
    var xaml = element as XamlControl;
    var str = "";
    for (var i = 0; i < level; i++)
        str += "  ";

    str += $"{element.ControlType} {element.ClassName} {element.Name} {xaml?.AutomationId ?? ""}\n";

    return str;
}   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-21 16:37:03

我终于找到了答案。当为儿童的AutomationPeers使用缓存时,它工作得非常完美。

代码语言:javascript
复制
public class ElementAP : FrameworkElementAutomationPeer
{
    public UIElement Element { get { return Owner; } }

    public ElementAP(FrameworkElement owner) : base(owner)
    {
    }

    protected override AutomationControlType GetAutomationControlTypeCore()
    {
        return AutomationControlType.Custom;
    }

    protected override string GetClassNameCore()
    {
        return Owner.GetType().Name;
    }
}

public class CanvasAP : FrameworkElementAutomationPeer
{
    private List<ElementAP> _cachedAutomationPeers = new List<ElementAP>();

    public CanvasAP(Windows.UI.Xaml.Controls.Canvas owner) : base(owner)
    {
    }

    protected override AutomationControlType GetAutomationControlTypeCore()
    {
        return AutomationControlType.Custom;
    }

    protected override string GetClassNameCore()
    {
        return "Canvas";
    }

    protected override IList<AutomationPeer> GetChildrenCore()
    {
        var owner = (Windows.UI.Xaml.Controls.Canvas)Owner;

        if (owner.Children.All(c => c is CanvasA))
            return base.GetChildrenCore();

        var list = new List<ElementAP>();

        foreach (var child in owner.Children)
        {
            var peer = _cachedAutomationPeers.FirstOrDefault(p => p.Element == child) ?? new ElementAP(child as FrameworkElement);

            list.Add(peer);
        }

        _cachedAutomationPeers = list;

        return list.Cast<AutomationPeer>().ToList();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48832213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档