UWP中Grid.SetColumn/SetRow/SetColumnSpan方法无法使用问题
UWP动态为Grid分配子元素时SetRow/SetColumn/SetColumnSpan方法调用异常排查
问题描述
- 场景:UWP开发中,通过后台代码动态为XAML定义的Grid容器添加、排列子元素
- 异常:调用Grid提供的
SetRow、SetColumn、SetColumnSpan方法时无法正常工作,触发运行/编译报错 - 参考信息:
- 实现代码参考:

- 报错信息参考:

- 实现代码参考:
- 疑问:同类方法其他开发者可正常调用,需定位当前操作的问题点
核心问题定位
这几个方法是Grid定义的静态附加属性方法,不是Grid实例的成员方法,90%的调用异常都来自调用方式错误,其次是参数传参错误,按以下顺序排查即可解决:
1. 修正调用语法(最高发问题)
- 错误写法(直接用Grid实例调用方法,会直接触发报错):
// 错误写法,不要这么写 myGridInstance.SetRow(targetElement, 0);
- 正确写法:必须通过Grid基类名直接调用静态方法,第一个参数传入要定位的子UI元素,第二个参数传入对应索引值:
// 正确调用示例 // 1. 给目标元素设置所在行、列、跨列值 Grid.SetRow(targetElement, 1); // 将元素放到第2行(索引从0开始) Grid.SetColumn(targetElement, 0); // 将元素放到第1列 Grid.SetColumnSpan(targetElement, 2); // 让元素横向跨2列 // 2. 必须将元素加入Grid的子元素集合,否则设置不会生效 myGridInstance.Children.Add(targetElement);
2. 检查参数合法性
- 不要将Grid容器本身作为第一个参数传入,第一个参数永远是你要排列的子UI元素(继承自
UIElement类型),普通数据对象、非UI类无法传入 - 传入的行、列索引不能超出XAML中定义的行/列总数:比如你在Grid里只定义了2个
RowDefinition,合法行索引只有0和1,传入2就会触发布局异常 - 跨列/跨行值必须为大于等于1的正整数,传0或者负数会导致布局错乱或报错
3. 其他边缘场景排查
- 调用时机不要早于页面初始化完成:必须在
InitializeComponent()方法执行完成后再操作Grid元素,否则容器本身未加载完成会触发空引用类报错 - 跨线程更新UI时必须切回UI主线程:如果在后台线程、异步任务中直接调用这些方法,会触发线程访问权限错误,需要通过
Dispatcher.RunAsync切回UI线程执行 - 同一个子元素不要同时加入多个父容器,否则会触发值已属于另一个容器的报错,需要先从原父容器的Children集合中移除再添加到当前Grid
内容的提问来源于stack exchange,提问作者Henk Bembom
相关产品推荐
相关产品推荐

