我有一个uwp项目,我有一个预订功能,并很乐意为你提供一些帮助。
所以我想从我的Rectangle
文件中找到UserControl
中的Main.xaml.cs
,这样我就可以设置Rectangles
填充属性。
我就是这样做的:
Main.xaml.cs
中用于查找子属性的方法:
private DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName)
{
int childNumber = VisualTreeHelper.GetChildrenCount(control);
for (int i = 0; i < childNumber; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(control, i);
FrameworkElement fe = child as FrameworkElement;
// Not a framework element or is null
if (fe == null) return null;
if (child is T && fe.Name == ctrlName)
{
// Found the control so return
return child;
}
else
{
// Not found it - search children
DependencyObject nextLevel = FindChildControl<T>(child, ctrlName);
if (nextLevel != null)
return nextLevel;
}
}
return null;
}
在我要调用名为Rectangle
的{{1}}的函数中,我执行此操作:
StatusColor
但不知怎的,当我尝试执行代码时,我得到了变量Rectangle Rec = FindChildControl<Rectangle>(GridView1, "StatusColor") as Rectangle;
的错误:
System.NullReferenceException:'对象引用未设置为对象的实例。'
我知道有很多关于这个例外的帖子,但我仍然没有看到它们更聪明......
但正如我所说,我会对某些人的帮助感到非常满意
提前致谢!
编辑:
我在Rec
xaml
宣布Main.xaml
:
UserControl
这就是我的代码在<GridView x:Name="GridView1" ItemContainerStyle="{StaticResource testgrid}" ItemsSource="{x:Bind Rooms}" Width="1740" Height="835" IsHitTestVisible="False" ScrollViewer.HorizontalScrollBarVisibility="Hidden" Margin="75,190,75,100" FontFamily="Segoe MDL2 Assets" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False">
<GridView.ItemTemplate>
<DataTemplate x:DataType="data:Room">
<local:TemplateGrid x:Name="TemplateGrid"/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
:
Rectangle
答案 0 :(得分:1)
正是这些界限:
// Not a framework element or is null
if (fe == null) return null;
您过早退出循环。当元素i
不是框架元素时,您应该忽略它并继续下一个元素。
因此,当您遇到非框架元素时,不要退出,只有当它是一个时才执行下一行:
if (fe != null)
{
// rest of checking
}
或者:
if (fe == null) continue;
修改强>
稍微修改一下代码:
private T FindChildControl<T>(DependencyObject control, string ctrlName)
where T: FrameworkElement
{
int childNumber = VisualTreeHelper.GetChildrenCount(control);
for (int i = 0; i < childNumber; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(control, i);
FrameworkElement fe = child as FrameworkElement;
// Not a framework element or is null
if (fe == null)
{
continue;
}
if (child is T && fe.Name == ctrlName)
{
// Found the control so return
return (T)child;
}
else
{
// Not found it - search children
T nextLevel = this.FindChildControl<T>(child, ctrlName);
if (nextLevel != null)
{
return nextLevel;
}
}
}
return null;
}
应该用调用
Rectangle rec = FindChildControl<Rectangle>(GridView1, "StatusColor");
给出正确的结果。至少它在我的测试情况下(调整参数)。
唯一真正的变化是使用continue
代替return
。此外,我使用泛型来立即返回正确的类型,不需要铸造。