关闭并重新打开后的Windows窗体,FindForm()为null(async await WinForms with WPF content)

时间:2016-07-20 05:52:40

标签: wpf winforms async-await winforms-interop

我有一个windows usercontrol,后者又有一个elementhost(在usercontrol中显示wpf内容)。

public partial class HostControl : UserControl
{
    internal ElementHost elementHost { get; set; }
    internal System.Windows.Controls.Control Content { get; set; }

    public HostControl()
    {
        InitializeComponent();
    }

    private void HostControl_Load(object sender, EventArgs e)
    {
        this.elementHost = new ElementHost();            
        this.elementHost.Dock = DockStyle.Fill;            
        this.elementHost.Child = this.Content; 
        this.Controls.Add(this.elementHost);
    }

    public void CloseWindow(object sender, EventArgs e)
    {
        this.FindForm().Close();

    }
}

HostControl.Load事件绑定到HostControl_Load事件处理程序(上图)。 来自hostcontrol的closewindow eventhandler(上图)绑定到wpf视图中的按钮

            HostControl control = new HostControl();
            AView aView = new AView();             //WPF View
            control.Content = aView;
            if(aView.DataContext != null && aView.DataContext is AViewModel )
            {
                var viewModel = aView.DataContext as AViewModel;
                viewModel.CloseRequest += control.CloseWindow;
            }

WPF视图是一个用户控件,xaml代码看起来像

 <UserControl.DataContext>
        <local:AViewModel/>
  </UserControl.DataContext>

此wpf视图中的按钮绑定到

下面的OK命令处理程序
public class AViewModel
{
        public event EventHandler CloseRequest; //bound to hostcontrol's CloseWindow handler

        private async  void OK(object parameter)
        {

                await Generate();
                CloseRequest(this, EventArgs.Empty)
        }

        private async void Generate()
        {

            //Some processing here
            await Task.Delay(TimeSpan.FromSeconds(10));
        }

}

我面临的问题如下:

1)一旦await Generate()完成,CloseRequest就会触发HostControl中的CloseWindow事件处理程序。

2)如果我没有关闭wpf视图,Generate()方法完成并调用CLoseWindow处理程序 - FindForm()有一个有效的父视图并且视图关闭。

3)如果我关闭wpf视图并在Generate()方法执行时重新打开视图,稍后一旦CloseWindow处理程序被执行,FindForm()将为Null并且发生空引用异常(基本上是hostcontrol&#39 ;重新打开表单后,父级为空)

4)我注意到使用async和await结构会导致问题(?)

我的问题是为什么在重新打开窗口时Windows窗体UserControl的父级会被设置为null?

0 个答案:

没有答案