.NET MAUI TimePicker在Windows运行时出现空引用异常问题
问题描述
我有一个名为timePicker3的TimePicker控件,在Android模拟器上运行应用时,标签lblShowTime可正常展示选中的时间;但在Windows设备上运行时,会抛出**"Object reference not set to an instance of an object"**错误。
相关代码
XAML代码
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MyApp___Samples.DatePickerPage" Title="DatePickerPage"> <VerticalStackLayout Padding="10"> <Label x:Name="lblShowTime" /> <TimePicker x:Name="timePicker3" Time="4:59:7" HorizontalOptions="Center" Format="T" PropertyChanged="TimePicker3_PropertyChanged" /> </VerticalStackLayout> </ContentPage>
C#后台代码
namespace MyApp___Samples; public partial class DatePickerPage : ContentPage { public DatePickerPage() { InitializeComponent(); } private void TimePicker3_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { lblShowTime.Text = timePicker3.Time.ToString(); } }
问题原因分析
这个空引用错误的核心原因是Windows平台上TimePicker的PropertyChanged事件会在页面控件初始化完成前提前触发:
- Android平台的控件初始化逻辑是先完成所有页面元素的实例化,再触发TimePicker初始属性变更的事件,此时
lblShowTime已经存在,不会报错; - 但Windows平台中,TimePicker的初始
Time属性赋值会在lblShowTime标签完成实例化前触发PropertyChanged事件,这时lblShowTime还是null,访问其Text属性就会抛出空引用异常。
另外,代码中直接访问全局的timePicker3也存在潜在风险,建议改用sender参数获取当前TimePicker实例,并增加null检查,修改后的事件处理代码如下:
private void TimePicker3_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (sender is TimePicker picker && lblShowTime != null) { lblShowTime.Text = picker.Time.ToString(); } }
内容的提问来源于stack exchange,提问作者CleverWolf
相关产品推荐
相关产品推荐

