如何在Xamarin.Forms中获取弹窗Entry值以动态创建按钮?
嘿,这个问题其实很好解决,你只需要把弹窗里的输入值通过事件回调或者异步等待的方式传递到创建按钮的方法里就行。下面给你两种实用的方案:
方案一:自定义事件回调
这种方式通过给弹窗添加自定义事件,当用户输入完成并点击保存时,触发事件把输入的名称传递出去。
第一步:修改弹窗的后台代码
给Namenseingabe添加自定义事件,并在保存/输入完成时触发它:
public partial class Namenseingabe : ContentView { // 定义一个自定义事件,用来传递输入的按钮名称 public event EventHandler<string> OnNameSubmitted; public Namenseingabe() { InitializeComponent(); } // Entry完成输入时的处理 private void EntryValue_Completed(object sender, EventArgs e) { SubmitInput(); } // 保存按钮点击时的处理(记得给XAML里的Save按钮绑定这个Click事件) private void SaveButton_Clicked(object sender, EventArgs e) { SubmitInput(); } private void SubmitInput() { if (!string.IsNullOrWhiteSpace(EntryValue.Text)) { // 触发事件,把输入的名称传出去 OnNameSubmitted?.Invoke(this, EntryValue.Text); // 这里可以处理弹窗关闭,比如用MAUI Community Toolkit的Popup的话,调用Close() } } }
第二步:修改创建按钮的方法
在实例化弹窗时订阅自定义事件,拿到输入值后创建按钮:
// 记得给id变量做自增,不然所有按钮的AutomationId都会重复 private int id = 0; void Mainpage_button_addNewButton_Clicked(object sender, EventArgs e) { var nameInputPopup = new Namenseingabe(); // 订阅弹窗的事件,拿到输入的名称后创建按钮 nameInputPopup.OnNameSubmitted += (popup, buttonName) => { Button newButton = new Button { Text = buttonName, AutomationId = id.ToString(), Margin = new Thickness(5) // 加个边距让布局更美观 }; MainPageButtonStackLayout.Children.Add(newButton); mainPageButtons.Add(newButton); id++; // 自增id,保证每个按钮的AutomationId唯一 }; // 显示弹窗,这里假设你用的是MAUI Community Toolkit的Popup,调用ShowPopupAsync // 如果是其他弹窗框架,换成对应的显示方法即可 _ = this.ShowPopupAsync(nameInputPopup); }
方案二:用TaskCompletionSource实现异步等待
这种方式更简洁,通过异步等待弹窗的输入结果,代码逻辑更连贯。
第一步:修改弹窗的后台代码
添加TaskCompletionSource来异步返回输入结果:
public partial class Namenseingabe : ContentView { private TaskCompletionSource<string> _inputTaskSource; // 提供一个异步方法,用来等待用户输入完成 public Task<string> WaitForInputCompletionAsync() { _inputTaskSource = new TaskCompletionSource<string>(); return _inputTaskSource.Task; } public Namenseingabe() { InitializeComponent(); } private void EntryValue_Completed(object sender, EventArgs e) { CompleteInput(); } private void SaveButton_Clicked(object sender, EventArgs e) { CompleteInput(); } // 处理用户完成输入的逻辑 private void CompleteInput() { _inputTaskSource?.SetResult(EntryValue.Text); // 关闭弹窗 } // 可选:添加取消按钮的处理 private void CancelButton_Clicked(object sender, EventArgs e) { _inputTaskSource?.SetCanceled(); // 关闭弹窗 } }
第二步:修改创建按钮的方法(改成异步方法)
通过异步等待拿到输入值后创建按钮:
private int id = 0; async void Mainpage_button_addNewButton_Clicked(object sender, EventArgs e) { var nameInputPopup = new Namenseingabe(); // 启动异步等待输入结果的任务 var inputTask = nameInputPopup.WaitForInputCompletionAsync(); // 显示弹窗 _ = this.ShowPopupAsync(nameInputPopup); try { var buttonName = await inputTask; if (!string.IsNullOrWhiteSpace(buttonName)) { Button newButton = new Button { Text = buttonName, AutomationId = id.ToString(), Margin = new Thickness(5) }; MainPageButtonStackLayout.Children.Add(newButton); mainPageButtons.Add(newButton); id++; } } catch (TaskCanceledException) { // 用户取消了输入,这里可以添加提示或者什么都不做 } }
小提示
- 记得给XAML里的Save按钮绑定
Clicked事件(方案一里的SaveButton_Clicked,方案二里的同理) - 如果你的弹窗不是用MAUI Community Toolkit的Popup,换成你当前使用的弹窗框架的显示/关闭方法即可
- 一定要给
id变量做自增,否则所有新创建的按钮都会有相同的AutomationId,这不符合最佳实践
内容的提问来源于stack exchange,提问作者BummzuaBua
相关产品推荐
相关产品推荐

