对象引用为null

时间:2013-09-15 16:06:38

标签: c# .net wpf

我的WPF应用程序中有一个MainWindow和一个user-control。我想在MainWindow中调用user-control的函数,而不是creating new instance of MainWindow。为此我做了用户控件的主窗口父级。我在下面编写了这段代码,用于调用Parent的功能。

儿童用户控制

public partial class AppLogo : UserControl
    {
    public MainWindow myparent { get; set; }
       private void activate_Click_1(object sender, RoutedEventArgs e)
        {
           myparent.function();

         }
          . . .
     }

父窗口:

      public MainWindow()
          {
            InitializeComponent();
             AppLogo childWindow = new AppLogo(); 
       . . .

问题:

  1. 是否可以创建Window的父user-control
  2. 如果上述问题的答案为Yes,那么为什么会产生Object Reference is Null错误。
  3. 如果答案是No it is not possible那么我该如何实现这一目标。 因为需要在我的应用程序中创建用户控件。

5 个答案:

答案 0 :(得分:1)

我假设空引用适用于myparent上的AppLogo属性?

在此行AppLogo childWindow = new AppLogo();之后添加一句childWindow.myparent = this;

答案 1 :(得分:1)

如果您想在UserControl中引用MainWindow,请使用以下代码:

MainWindow mw = Application.Current.MainWindow as MainWindow;

http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow.aspx

private void activate_Click_1(object sender, RoutedEventArgs e)
{
    MainWindow mw = Application.Current.MainWindow as MainWindow;
    if(mw != null)
    {
        mw.function();
    }
}

第二个解决方案:

在您的代码中,您应该在myparent构造函数中设置MainWindow属性:

public MainWindow()
{
    InitializeComponent();
    AppLogo childWindow = new AppLogo(); 
    childWindow.myparent = this;
    ...
}

activate_Click_1事件处理程序中,检查myparent是否为空的好习惯:

private void activate_Click_1(object sender, RoutedEventArgs e)
{
    if(myparent != null)
        myparent.function();
    else
        ...
}

答案 2 :(得分:0)

您可以按照建议引入子父依赖,但是由于您没有实例化MainWindow,因此在调用myparent.function()时应该会出现空引用异常;

首先,您需要实例化MainWindow,然后通过调用AppLogo .set_myparent来设置子父关系,只有这样您的调用才会失败。

答案 3 :(得分:0)

您需要将对MainWindow实例的引用作为参数传递给AppLogo的构造函数,然后将其设置为AppLogo的MainWindow变量。

public AppLogo(MainWindow mainWindow)
{
    this.myparent = mainWindow;
}

答案 4 :(得分:0)

  1. 如果您在UserControl内直接找到Window,则其Parent媒体资源会引用您的窗口。

  2. 当您尝试访问包含null值的字段时,会调用该异常。它包含null,因为没有人放置任何其他内容。您可能想要设置它:

    AppLogo childWindow = new AppLogo(); 
    childWindow.myparent = <something>;
    
  3. 您只需要递归搜索UserControl的父母,直到获得Window的实例,这将是您的目标。


  4. public static Window GetWindow(FrameworkElement element)
    {
        return (element.Parent as Window) ?? GetWindow(element.Parent);
    }