如何在Xamarin StackLayout中获取嵌套的CtrlButton控件
你当前的代码只遍历了xGrpTabBtns的直接子元素,但你的CtrlButton是嵌套在Grid这类容器控件里的间接子元素,所以直接筛选Children会返回空。要拿到所有层级的CtrlButton,得用递归遍历的方式,把每个容器控件的子元素都查一遍。
递归查找方法
写一个通用的递归方法,遍历所有层级的控件:
private IEnumerable<CtrlButton> FindAllCtrlButtons(VisualElement parent) { var buttonList = new List<CtrlButton>(); // 判断当前父元素是否是布局容器 if (parent is Layout layoutContainer) { foreach (var child in layoutContainer.Children) { // 找到直接的CtrlButton就加入列表 if (child is CtrlButton targetBtn) { buttonList.Add(targetBtn); } // 如果子元素也是容器,继续递归查找 else if (child is VisualElement nestedContainer) { buttonList.AddRange(FindAllCtrlButtons(nestedContainer)); } } } return buttonList; }
调用方式
直接传入你的StackLayout实例就能获取所有嵌套的CtrlButton:
var allCtrlButtons = FindAllCtrlButtons(this.xGrpTabBtns);
注意事项
- 确保
CtrlButton继承自VisualElement(MAUI/Xamarin.Forms的自定义控件一般都满足这个前提); - 如果你的项目用的是其他UI框架,只需调整判断容器控件的类型(比如WPF里的
Panel)即可适配。
内容的提问来源于stack exchange,提问作者하하파파
相关产品推荐
相关产品推荐

