Xamarin UWP如何在共用CheckedChanged事件中通过sender获取控件x:Name
解决方案
你可以通过以下两种方式实现需求,不需要为每个CheckBox单独编写事件处理逻辑:
方式1:直接比对控件实例(更推荐,无需额外加属性)
sender参数本身就是触发事件的CheckBox实例,你可以将它强转后直接和XAML中x:Name对应的控件实例比对即可,代码如下:
void Check_Changed(object sender, CheckedChangedEventArgs e) { // 先把sender强转为CheckBox类型 var checkBox = sender as CheckBox; if (checkBox == null) return; switch (checkBox) { case var cb when cb == myCheckbox: // 处理myCheckbox的勾选逻辑 break; case var cb when cb == otherCheckbox: // 处理otherCheckbox的勾选逻辑 break; // 其余控件的逻辑以此类推 } }
如果你使用C# 9及以上版本,还可以用更简洁的模式匹配写法。
方式2:附加标识属性获取字符串名称
如果你习惯用字符串匹配的方式处理逻辑,可以在XAML中给每个CheckBox添加StyleId或者ClassId属性,值和x:Name保持一致即可:
<StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand"> <Label Text="My Checkbox" VerticalOptions="Center" TextColor="White"></Label> <CheckBox x:Name="myCheckbox" StyleId="myCheckbox" WidthRequest="150" VerticalOptions="Center" Color="#ff914d" CheckedChanged="Check_Changed"></CheckBox> <Label Text="Other Checkbox" VerticalOptions="Center" TextColor="White"></Label> <CheckBox x:Name="otherCheckbox" StyleId="otherCheckbox" WidthRequest="150" VerticalOptions="Center" Color="#ff914d" CheckedChanged="Check_Changed"></CheckBox> </StackLayout>
后台直接读取StyleId属性就能拿到你设置的标识字符串:
void Check_Changed(object sender, CheckedChangedEventArgs e) { var checkBox = sender as CheckBox; if (checkBox == null) return; switch (checkBox.StyleId) { case "myCheckbox": // 处理myCheckbox的勾选逻辑 break; case "otherCheckbox": // 处理otherCheckbox的勾选逻辑 break; } }
补充说明
Xamarin.Forms中x:Name是编译阶段用来生成后台类对应字段的标记,运行时控件实例本身不会存储这个名称,所以没有直接的属性能读取到x:Name的值,以上两种方案都可以稳定实现你的需求。
内容的提问来源于stack exchange,提问作者Drakyn_
相关产品推荐
相关产品推荐

