You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问xaml.cs文件中动态创建的Entry控件以获取输入内容

动态Entry控件取值解决方案

有两种成熟的实现方案,你可以根据自己的业务场景选择:


方案1:遍历当前页面控件树取值(无需额外存储)

不需要修改现有创建逻辑,直接在点击事件中通过控件树遍历拿到所有Entry,适合Entry数量较少的场景:

  1. 先在你的类中添加两个通用的控件树遍历辅助方法:
// 查找指定类型的父控件
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;
        }
    }
}
  1. 在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数量多、频繁需要取值的场景,只需要加少量存储逻辑:

  1. 在你的类中定义一个成员字典,用来存储动态创建的Entry:
// 类的全局成员变量,key存储Entry的AutomationId,value存储Entry实例
private Dictionary<string, Entry> _dynamicEntryCache = new Dictionary<string, Entry>();
  1. 修改创建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);
  1. 点击事件中直接从缓存取值即可:
if (answer == true){
    foreach (var kvp in _dynamicEntryCache)
    {
        string entryId = kvp.Key;
        string userInput = kvp.Value.Text;
        // 直接处理拿到的输入值即可
    }
}

注意:如果你的业务有删除动态页面的需求,删除页面对应的Entry时需要同步删除字典中对应的缓存项,避免内存泄漏。


内容的提问来源于stack exchange,提问作者Mars

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:54:03