You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:18:31