如何访问xaml.cs文件中动态创建的Entry控件以获取输入内容
动态Entry控件取值解决方案
有两种成熟的实现方案,你可以根据自己的业务场景选择:
方案1:遍历当前页面控件树取值(无需额外存储)
不需要修改现有创建逻辑,直接在点击事件中通过控件树遍历拿到所有Entry,适合Entry数量较少的场景:
- 先在你的类中添加两个通用的控件树遍历辅助方法:
// 查找指定类型的父控件 private T FindParent<T>(VisualElement element) where T : VisualElement { while (element != null) { if (element is T parent) return parent; element = element.Parent as VisualElement; } return null; } // 查找指定类型的所有子控件 private IEnumerable<T> FindChildren<T>(VisualElement parent) where T : VisualElement { if (parent == null) yield break; if (parent is T target) { yield return target; } if (parent is Layout layout) { foreach (var child in layout.Children) { foreach (var subChild in FindChildren<T>(child as VisualElement)) { yield return subChild; } } } else if (parent is ScrollView scrollView) { foreach (var subChild in FindChildren<T>(scrollView.Content as VisualElement)) { yield return subChild; } } }
- 在
GenerateReport_OnClicked的逻辑块中调用辅助方法取值:
if (answer == true){ // 从点击事件源拿到当前按钮 var reportBtn = sender as Button; // 找到按钮所属的当前页面 var currentPage = FindParent<ContentPage>(reportBtn); // 找到当前页面下所有Entry控件 var allEntries = FindChildren<Entry>(currentPage); // 遍历所有Entry,按你设置的AutomationId区分取值 foreach (var entry in allEntries) { if (entry.AutomationId.StartsWith("weerstand")) { string entryId = entry.AutomationId; string userInput = entry.Text; // 这里可以把拿到的id和输入值存入报表数据源 } } }
方案2:用字典缓存Entry实例(性能更高,取值更直接)
适合Entry数量多、频繁需要取值的场景,只需要加少量存储逻辑:
- 在你的类中定义一个成员字典,用来存储动态创建的Entry:
// 类的全局成员变量,key存储Entry的AutomationId,value存储Entry实例 private Dictionary<string, Entry> _dynamicEntryCache = new Dictionary<string, Entry>();
- 修改创建Entry的逻辑,创建完成后加入缓存:
// 原来的Entry创建逻辑 var newEntry = new Entry { AutomationId = "weerstand" + lusnummer.ToString(), Text = "[weerstand]", TextColor = Color.Black, FontSize = 18, }; grid.Children.Add(newEntry, 2, rownumber); // 新增:存入缓存 _dynamicEntryCache.Add(newEntry.AutomationId, newEntry);
- 点击事件中直接从缓存取值即可:
if (answer == true){ foreach (var kvp in _dynamicEntryCache) { string entryId = kvp.Key; string userInput = kvp.Value.Text; // 直接处理拿到的输入值即可 } }
注意:如果你的业务有删除动态页面的需求,删除页面对应的Entry时需要同步删除字典中对应的缓存项,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Mars
相关产品推荐
相关产品推荐

