C# UWP应用XAML:TextBox赋值TextBlock遇空引用异常
UWP BMI计算器:解决NullReferenceException并传递TextBox内容
兄弟,我太懂你被空引用异常折磨的两天了!你完全搞错方向了——根本不需要手动创建TextBox类的实例,UWP框架会在页面初始化时自动根据XAML里的x:Name生成对应的后台控件实例,你遇到的System.NullReferenceException,99%是因为控件实例还没初始化就去访问,或者XAML和后台的命名不匹配。
下面给你一步步解决:
1. 先确认XAML控件的命名完全匹配
先检查你的XAML里,两个TextBox的x:Name是不是和后台代码里的完全一致,大小写也不能错!比如:
return (<TextBox x:Name="txtKG" .../> )return (<TextBox x:Name="txtDescription" .../> )
要是后台写的是TxtKG或者txtKg,那肯定找不到控件,直接报空引用。
2. 绝对不能在构造函数里直接访问控件
UWP的页面构造函数(比如MainPage())里只会执行InitializeComponent(),此时控件还没被渲染初始化,你要是在构造函数里直接写txtDescription.Text = txtKG.Text,百分百报错。
正确的做法是等控件加载完成后再操作,比如用页面的Loaded事件,或者放在用户触发的操作里(比如计算按钮的点击事件):
后台C#示例代码
public MainPage() { this.InitializeComponent(); // 这里别碰txtKG或txtDescription! // 绑定Loaded事件,等控件加载完再操作 this.Loaded += MainPage_Loaded; } private void MainPage_Loaded(object sender, RoutedEventArgs e) { // 现在控件已经初始化完成,放心访问 txtDescription.Text = txtKG.Text; } // 或者如果是点击计算按钮触发传递 private void btnCalculateBMI_Click(object sender, RoutedEventArgs e) { txtDescription.Text = txtKG.Text; }
3. 别手动new页面实例!
如果你在其他地方自己new MainPage()然后访问这个实例的控件,也会报空引用——因为手动创建的页面实例没有经过UWP的初始化流程,控件根本不会被实例化。必须用框架导航出来的页面实例。
4. 试试更优雅的数据绑定(推荐)
其实UWP更推荐用数据绑定来传递值,不仅能避免空引用问题,还符合MVVM开发模式,以后扩展功能也更方便:
第一步:后台实现绑定属性
using System.ComponentModel; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; public sealed partial class MainPage : Page, INotifyPropertyChanged { private string _kgValue; public string KgValue { get => _kgValue; set { _kgValue = value; OnPropertyChanged(); // 自动同步到描述文本 DescriptionText = value; } } private string _descriptionText; public string DescriptionText { get => _descriptionText; set { _descriptionText = value; OnPropertyChanged(); } } public MainPage() { this.InitializeComponent(); } // 实现INotifyPropertyChanged接口,用于通知UI更新 public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
第二步:XAML里绑定控件
<TextBox x:Name="txtKG" Text="{x:Bind KgValue, Mode=TwoWay}" PlaceholderText="输入体重(kg)"/> <TextBox x:Name="txtDescription" Text="{x:Bind DescriptionText, Mode=OneWay}" IsReadOnly="True"/>
这样只要txtKG里的文本变化,txtDescription会自动同步,完全不用手动操作控件,再也不会有空引用的烦恼。
内容的提问来源于stack exchange,提问作者Kselos Max
相关产品推荐
相关产品推荐

