.NET MAUI中如何通过名称以编程方式获取Grid项?
.NET MAUI中替代ClassId访问Grid子项的方法
首先纠正一个小问题:你之前Xamarin里的代码其实存在逻辑偏差——RowDefinitions是Grid的行定义集合,本身并不包含Button这类子控件,正确的查找对象应该是Grid的Children集合。在.NET MAUI里ClassId被移除了,下面是几种实用的替代方案:
使用AutomationId
这是MAUI官方推荐的替代方案,原本用于自动化测试,也可用来标识元素。
先在XAML里给Button设置AutomationId:<Button AutomationId="btnUserName" Text="确认" />后台查找代码:
Button targetBtn = grdOptions.Children.OfType<Button>() .FirstOrDefault(btn => btn.AutomationId == "btn" + name);使用Tag属性
MAUI所有View控件都自带Tag属性,可存储任意自定义标识值:
XAML设置:<Button Tag="btnUserName" Text="确认" />后台查找:
Button targetBtn = grdOptions.Children.OfType<Button>() .FirstOrDefault(btn => btn.Tag?.ToString() == "btn" + name);直接用x:Name(静态场景)
如果按钮是静态定义在XAML里的,最直接的方式是给按钮设置x:Name,后台直接调用即可,无需遍历查找:<Button x:Name="btnUserName" Text="确认" />后台直接操作:
btnUserName.IsEnabled = false;自定义附加属性(复杂场景)
若需要更灵活的标识逻辑,可自定义附加属性标记控件,适合批量动态生成控件的场景:
先定义附加属性:public static class ControlIdentifier { public static readonly BindableProperty IdProperty = BindableProperty.CreateAttached("Id", typeof(string), typeof(ControlIdentifier), null); public static string GetId(BindableObject bindable) { return (string)bindable.GetValue(IdProperty); } public static void SetId(BindableObject bindable, string value) { bindable.SetValue(IdProperty, value); } }XAML里使用:
<Button local:ControlIdentifier.Id="btnUserName" Text="确认" />后台查找:
Button targetBtn = grdOptions.Children.OfType<Button>() .FirstOrDefault(btn => ControlIdentifier.GetId(btn) == "btn" + name);
内容的提问来源于stack exchange,提问作者Prens
相关产品推荐
相关产品推荐

