0

我的 WPF 应用程序中有一个MainWindow和一个user-control。我想调用我的函数MainWindowin user-control,没有creating new instance of MainWindow. 为此,我将主窗口设为用户控件的父级。我在下面写了这段代码来调用父函数。

子用户控制

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那么我该如何实现这个目标。因为有必要根据需要在我的应用程序中创建用户控件。
4

5 回答 5

1

我假设空引用是myparent针对AppLogo?

在这一行之后AppLogo childWindow = new AppLogo();添加一个说法childWindow.myparent = this;

于 2013-09-15T16:10:43.817 回答
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
        ...
}
于 2013-09-15T16:13:39.103 回答
0

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

首先需要实例化MainWindow,然后调用AppLogo.set_myparent设置子父关系,这样调用才不会失败。

于 2013-09-15T16:10:57.423 回答
0

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

public AppLogo(MainWindow mainWindow)
{
    this.myparent = mainWindow;
}
于 2013-09-15T16:12:40.090 回答
0
  1. 如果您UserControl直接在您的内部找到您的Window,那么它的Parent属性将引用您的窗口。

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

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


public static Window GetWindow(FrameworkElement element)
{
    return (element.Parent as Window) ?? GetWindow(element.Parent);
}
于 2013-09-15T16:12:59.310 回答