WPF做UserControl之类的时候,有时候UserControl嵌入到WinForm里使用,这时候,Application.Current会不存在,而把这个UserControl改成Application运行,则可以正常运行。那是因为这个Application是定义在App.xaml里的,UserControl方式编译,没有使用它,从而导致Application是没有定义的。
自己写的代码部分可以规避这个,然而如果引用了第三方的组件,需要调用这个Application.Current的时候,比如使用CrystalReportsViewer在UserControl里显示报表,按“打印”按钮的时候,它就会发生Application.Current是null的错误。
要解决它的办法是,把下面的代码放到UserControl的构造器或者加载事件里,人为给它生成一个Application即可:
if (System.Windows.Application.Current == null)
{
new System.Windows.Application();
}
上面的代码能解决前面提到的问题,可是会有一个问题是,默认Application会在它所拥有的最后一个WPF窗口的关闭而关闭,第一次使用CrystalReportsViewer打印完关闭报表查看界面,第二次再在这个UserControl里调用CrystalReportsViewer窗口来打开报表的时候,会显示 Application已经被关闭的错误。
要解决这个错误,我们在新建Application的时候指定这个Application必须被显式的关闭就好了,代码如下:
if (System.Windows.Application.Current == null)
{
var app = new System.Windows.Application
{
// 设置为显式关闭,防止窗口关闭时 Application 被自动终结
ShutdownMode = ShutdownMode.OnExplicitShutdown
};
}