C# 类型为';的未处理异常;System.NullReferenceException';发生在mscorlib.dll中

C# 类型为';的未处理异常;System.NullReferenceException';发生在mscorlib.dll中,c#,wpf,exception,C#,Wpf,Exception,我的代码总是在mscorlib.dll 其他信息:对象引用未设置为对象的实例 我正在使用visualstudio和执行异步wait,以在鼠标按下事件中执行平铺。现在我想显示来自父窗口内的用户控件的消息async 我在中跟踪错误,它来自我对Metro窗口的声明。希望你能帮我解决这个问题 这是我的代码: public async void tileLockUser_MouseDown(object sender, MouseButtonEventArgs e) {

我的代码总是在
mscorlib.dll

其他信息:对象引用未设置为对象的实例

我正在使用
visualstudio
执行异步
wait,以在鼠标按下事件中执行平铺。现在我想显示来自父窗口内的用户控件的消息async

我在中跟踪错误,它来自我对Metro窗口的声明。希望你能帮我解决这个问题

这是我的代码

        public async void tileLockUser_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (dtgUserManagement.SelectedItems.Count > 0)
        {
            if (Convert.ToInt32(dtgUserManagement.SelectedValue) != 1)
            {
                MessageBox.Show(dtgUserManagement.SelectedValue.ToString());
                var confirm = new MetroDialogSettings()
                {
                    AffirmativeButtonText = "YES",
                    NegativeButtonText = "NO"
                };

                MetroWindow metroWindow = (Application.Current.MainWindow as MetroWindow);

                MessageDialogResult save = await metroWindow.ShowMessageAsync("CONFIRMATION", "DO YOU WANT TO LOCK USER?",
                                                                               MessageDialogStyle.AffirmativeAndNegative, confirm);

                if (save == MessageDialogResult.Affirmative)
                {
                    foreach (var row in dtgUserManagement.SelectedItems)
                    {
                        Membership user = db.Memberships.Find(dtgUserManagement.SelectedValue);
                        user.IsLockedOut = true;
                        user.LastLockedOutDate = DateTime.Now;
                    }
                    db.SaveChanges();
                    DataGridRefresh();
                    await metroWindow.ShowMessageAsync("USER", "Successfully locked!");
                }
            }
            else
            {
                //MessageBox.Show("User restricted to be lock!", "User Management");
                await metroWindow.ShowMessageAsync("WARNING", "User restricted to be lock!");
            }
        }
        else
        {
            //MessageBox.Show("Select use to lock", "User Management");
            await metroWindow.ShowMessageAsync("WARNING", "Select user to lock!");
        }
    }
从它看来,如果你删除

MetroWindow metroWindow = (Application.Current.MainWindow as MetroWindow);

然后用
this
关键字替换所有发生的
metroWindow
,这样它就可以工作了。

我会在创建metroWindow的行上添加一个断点,然后您可以将鼠标悬停在Application.Current.main窗口的每个部分上,查看哪个部分为空。您还可以在调试时使用“立即数”或“局部数”窗口检查变量值。谢谢。如果成功的话,我会尝试更新你。我尝试过添加断点。Application.Current.Maindow的每个部分都不是空的,但当它变为MetroWindow时,作为一个整体,它是空的。
Application.Current.Maindow
不是
MetroWindow
因此
MetroWindow
变量被设置为空,并且您尝试调用
ShowMessageAsync
的下一行将失败。您可以尝试使用
is
关键字,然后使用
(MetroWindow)Application.Current.MainWindow进行强制转换,但我怀疑这也会失败。尝试对其调用
GetType()
方法,查看
应用程序.Current.MainWindow
的底层类型,然后您可以研究如何从中强制转换(或构造)一个
MetroWindow
。参考链接:和。“此关键字”不可能,因为我正在使用用户控件。要将应用程序的真实精简版本添加到“粘贴站”,以便我可以查看。这是WPF应用,对吗?找到了。就像我的问题一样