感谢您阅读本文。我正在研究自定义控件。假设我有abc.xaml,并且在abc文件夹中也有类abc.cs(请注意,这是自定义控件)。我无法实例化控件。在c#中从单元测试调用它时,它会为null,但在实际应用程序运行时不会为null。我想简要解释一下我的情况。假设我有网格,并且我有一个int [] x并计算了此数组保存的值,让它说3,然后我的网格应添加3个矩形。下面是一种返回任何控件的方法,以查找特定控件中存在的子代数。在这里,我发现网格中存在3个矩形,但是有些不能在单元测试中使用下面的方法来获取它。
public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
{
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == childName)
{
return child as T;
}
else
{
T result = FindChild<T>(child, childName);
if (result != null)
{
return result;
}
}
}
return null;
}
仅当应用程序运行时,此代码才会在OnApplyTemplate()上实例化矩形的数量,但是如果在单元测试中调用此代码,则它将获取null。
在下面,获取gridObj为NULL。 abc.xaml文件中存在DP_Grid。
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
gridObj = (Grid)GetTemplateChild("DP_Grid");
}
我不知道为什么会这样。我是否忘记在单元测试VerifyGrid_Test())中的OnApplyTemplate()之前或之后调用任何其他方法?下面是单元测试。
[TestMethod]
public void VerifyNumberOfBars_Test()
{
ds.OnApplyTemplate();
ds.Signals = Signals;
Grid getGrid = VisualTreeHelperExtensions.FindChild<System.Windows.Controls.Grid>(ds, "DensityBars_Grid");
if (ExpectedChildrenCountFalse)
{
//assert fail;
}
}