Spectre.Console中如何实现多选菜单内的单选组?
实现Spectre.Console多选菜单中指定组的单选功能
这个需求可以实现,核心是利用MultiSelectionPrompt的SelectionChanged事件手动控制EUR组内的单选逻辑,具体实现如下:
修正原代码的链式调用错误
原代码中.choiceConfig.AddChoiceGroup是冗余写法,链式调用时直接使用.AddChoiceGroup即可,无需重复引用变量名。
完整实现代码
// 声明变量接收选中结果 string[] currencies; var choiceConfig = new MultiSelectionPrompt<string>() .Title("Choose currencies to process") .PageSize(10) .InstructionsText( "[grey](Press [blue]<space>[/] to toggle a currency, " + "[green]<enter>[/] to accept)[/]") .AddChoiceGroup("EUR", ["EUR", "EUR2"]) .AddChoices(new[] { "GBP", "USD", "CAD" }) // 监听选中变化事件,处理EUR组内单选逻辑 .OnSelectionChanged((prompt, selectedItems, currentItem) => { // 仅处理EUR组内的两个选项 if (currentItem is "EUR" or "EUR2") { // 获取同组的另一个选项 var siblingItem = currentItem == "EUR" ? "EUR2" : "EUR"; // 如果另一个选项已被选中,自动取消它 if (selectedItems.Contains(siblingItem)) { prompt.Unselect(siblingItem); } } }); currencies = AnsiConsole.Prompt(choiceConfig).ToArray();
逻辑说明
- 当用户切换EUR或EUR2的选中状态时,
OnSelectionChanged事件会触发 - 事件处理逻辑会判断当前操作的是EUR组内的选项,然后检查同组的另一个选项是否已被选中
- 如果已选中,则调用
prompt.Unselect方法取消该选项的选中状态,实现组内单选效果 - GBP、USD、CAD等其他选项不受此逻辑影响,依然保持多选功能
内容的提问来源于stack exchange,提问作者Mitch Bukaner
相关产品推荐
相关产品推荐

