【问题标题】:Why are my XAML controls null?为什么我的 XAML 控件为空?
【发布时间】:2015-04-04 19:28:48
【问题描述】:

我有一个类似这样的 XAML 布局:

<Grid>
    <TextBox x:Name="inputTextBox" LostFocus="inputTextBox_LostFocus" TextChanged="inputTextBox_TextChanged" GotFocus="inputTextBox_GotFocus" />
    <ComboBox x:Name="inputComboBox" SelectionChanged="inputComboBox_SelectionChanged">
        <ComboBoxItem IsSelected="True">10</ComboBoxItem>
        <ComboBoxItem>15</ComboBoxItem>
        <ComboBoxItem>20</ComboBoxItem>
    </ComboBox>
    <ComboBox x:Name="inputComboBoxTwo" SelectionChanged="inputComboBoxTwo_SelectionChanged">
        <ComboBoxItem IsSelected="True">1</ComboBoxItem>
        <ComboBoxItem>2</ComboBoxItem>
        <ComboBoxItem>3</ComboBoxItem>
    </ComboBox>
</Grid>

很简单。在代码隐藏 C# 文件中,我使用这些控件从 TextBox 中获取双精度,从 ComboBoxes 中获取更多整数,然后使用来自控件的数据创建一个计算器类型对象。我进行计算并在其他一些 TextBlocks 中显示结果。

namespace TipCalc
{
    public sealed partial class MainPage : Page
    {
        Calc x = new Calc();

        public MainPage()
        {
            this.InitializeComponent();

            this.NavigationCacheMode = NavigationCacheMode.Required;
        }

        //
        //Appropriate event handlers from XAML controls that all call the calculation method.
        //

        private void calcIt()
        { 
            x.amt = double.Parse(inputTextBox.Text);
            x.cal1 = int.Parse(inputComboBox.SelectedItem.ToString());
            x.cal2 = int.Parse(inputComboBoxTwo.SelectedItem.ToString());

            //Send calculated values to output TextBlocks.
        }
    }
}

当我运行这个程序时,我遇到了一个空指针异常,当我尝试访问 TextBox 的 text 属性时会抛出该异常。事实证明,所有 XAML 控件都是空的。但是,_contentLoaded 设置为 true,并且 this.IntializeComponent 的代码定义在幕后看起来是正确的。

为什么我的所有控件都设置为空,而看起来一切正常?如果它们没有被正确地自动初始化,有没有办法手动初始化它们?我做错了什么吗?

【问题讨论】:

    标签: c# xaml windows-phone-8


    【解决方案1】:

    代码运行如下:

    1. Calc x = new Calc();
    2. this.InitializeComponent();

    Calc() 先于 InitializeComponent(),但 InitializeComponent() 创建您的控件。

    你可以改成:

    Calc x;
    
    public MainPage()
    {
        this.InitializeComponent();
        x = new Calc();
        this.NavigationCacheMode = NavigationCacheMode.Required;
    }
    

    【讨论】:

    • 我已经尝试过到处设置 Calc。无论在哪里创建 Calc,我的控件仍然为空。
    • 您的 Calc() 第一次调用在哪里?
    • Calc 仅在我在原始帖子中概述的 calcIt() 方法中被引用。它从未在其他任何地方使用过。编辑:此外,无论在代码中的何处初始化,都使用每个实例中的默认属性和值正确创建了 Calc 对象。空指针专门指向 TextBox 对象。
    • 您是否将代码中的Calc x = new Calc(); 更改为Calc x;
    • 是的,我做到了。不管我把它放在哪里,控件仍然是空的。
    【解决方案2】:

    当类初始化时,我的一些 TextBox 控件也有同样的问题。我为解决这个问题所做的并不是真正完美的解决方案,因为在类运行时并非所有控件(TextBox、ComboBox、RadioButton 等)都为空,并且我的代码、我的应用程序或我的 VS 中发生了一些事情'我失踪或做错了......但至少现在工作正常。希望对你有用:

    if(TextBox1 == null)
    {
         //I'm re-initializing the control because is null
         TextBox1 = new TextBox();
    }
    

    对于您的代码,它应该是这样的:

    if(inputTextBox == null)
    {
         inputTextBox.Text = new TextBox();
    }
    
    x.amt = double.Parse(inputTextBox.Text);
    

    我希望这个“解决方案”对你来说已经足够好了。对于我糟糕的英语,如果我有错误,我深表歉意,这不是我的母语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      相关资源
      最近更新 更多