You need to enable JavaScript to run this app. Xamarin Forms 如何用For循环简化关联XAML元素Id的字典创建
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 11:27:02