gpt4 book ai didi

wpf - 如何对使用 VisualTreeHelper 的东西进行单元测试?

转载 作者:行者123 更新时间:2023-12-04 08:38:26 26 4
gpt4 key购买 nike

我有这个静态辅助函数:

    public static DependencyObject GetParentObject(DependencyObject child)
{
if (child == null) return null;
ContentElement contentElement = child as ContentElement;

if (contentElement != null)
{
var parent = ContentOperations.GetParent(contentElement);
if (parent != null) return parent;

var fce = contentElement as FrameworkContentElement;
return fce != null ? fce.Parent : null;
}

//if it's not a ContentElement, rely on VisualTreeHelper
return VisualTreeHelper.GetParent(child);
}

它适用于实际应用程序,但我正在尝试为它编写一些单元测试。这是我的第一次尝试:
    [Test]
public void GetParentObject_returns_immediate_parent()
{
var contentControl = new ContentControl();
var textBox = new TextBox();

contentControl.BeginInit();
contentControl.Content = textBox;
contentControl.EndInit();

var result = UIHelper.GetParentObject(textBox);
Assert.AreSame(contentControl, result);
}

不幸的是,它失败了,因为 VisualTreeHelper正在返回 null。我如何模拟一个可以工作的可视化树?

最佳答案

基于 printing documents via Wpf-controls and convert to XPS 上的这个答案我想出了以下扩展方法来创建可视化树。它在没有 STA 线程或任何东西的 NUnit 中运行良好。

/// <summary>
/// Render a UIElement such that the visual tree is generated,
/// without actually displaying the UIElement
/// anywhere
/// </summary>
public static void CreateVisualTree(this UIElement element)
{
var fixedDoc = new FixedDocument();
var pageContent = new PageContent();
var fixedPage = new FixedPage();
fixedPage.Children.Add(element);
pageContent.ToMaybeOf<IAddChild>().Do(c => c.AddChild(fixedPage));
fixedDoc.Pages.Add(pageContent);

var f = new XpsSerializerFactory();
var w = f.CreateSerializerWriter(new MemoryStream());
w.Write(fixedDoc);
}

请注意
  • 另一个答案使用了一个看起来不像我看到的 API 的 Reach-dll 的 API。我假设 .NET Framework 3.5 版和 4.0 版之间存在差异
  • ToMaybeOf stuff 基本上意味着对待pageContentIAddChild并对该界面执行操作
  • 这将不是 使用类型为 的元素窗口因为该元素本质上是作为子元素添加到 Visual 和 Window 的,因此会对此提示。
  • 关于wpf - 如何对使用 VisualTreeHelper 的东西进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4255446/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com