Xamarin Forms 如何用For循环简化关联XAML元素Id的字典创建
问题本质
C#运行时不存在“靠拼接字符串直接获取编译期变量引用”的能力——变量名只是给开发人员看的编译期标识,编译完成后程序集的元数据里不会保留这些变量名,你根本没法在循环里拼个emoji1就拿到emoji1对象的内存引用。
另外你提到的“减少代码缩小安装包”的收益其实非常有限:那8行字典初始化代码编译成IL指令后总共也就几十字节,对安装包大小的影响可以忽略不计,没必要为了这点收益硬走“拼接找变量”的弯路。
正确实现路径
方案1:预存元素引用到数组(性能最优,首推)
在循环之前,把所有已经定义的命名emoji元素,按照计数器对应的顺序存入一维数组,循环时直接按索引取值即可:
// 按counter的取值顺序,存入所有XAML中定义的emoji命名元素 var emojiList = new[] { emoji0, emoji1, emoji2, emoji3, emoji4, emoji5, emoji6, emoji7 }; // 原循环框架补全参数即可,注意你笔误的emojiArray其实就是目标字典emojiSelect for(int counter = 0; counter <= 7; counter++) { emojiSelect.Add(emojiList[counter].Id, counter); }
后续如果要新增emoji元素,只需要在数组里补充对应引用、调整循环的上限值即可,完全不需要重复写冗余的字典键值对逻辑。
方案2:XAML命名范围按名查找(少写引用列表的选择)
如果是WPF/WinUI/UWP这类基于XAML的开发框架,可以借助页面提供的FindName能力,根据拼接出的元素名找到对应对象:
for(int counter = 0; counter <= 7; counter++) { // 拼接出元素在XAML中注册的x:Name值 var elementName = $"emoji{counter}"; // 从当前页面的命名作用域中查找对应元素 var emojiElement = FindName(elementName) as FrameworkElement; emojiSelect.Add(emojiElement.Id, counter); }
注意事项:这种写法的运行时性能比直接存引用低不少,且如果执行查找时XAML还没完成初始化加载,会因为找不到元素触发空引用异常,仅适合元素数量少、对性能不敏感的场景。
内容的提问来源于stack exchange,提问作者Matthew Swallow
相关产品推荐
相关产品推荐

