我有一个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?