当我尝试到达Rectangle时,空值

时间:2018-05-31 06:51:43

标签: c# xaml uwp

我有一个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

1 个答案:

答案 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。此外,我使用泛型来立即返回正确的类型,不需要铸造。