WPF做UserControl之類的時(shí)候,有時(shí)候UserControl嵌入到WinForm里使用,這時(shí)候,Application.Current會不存在,而把這個(gè)UserControl改成Application運(yùn)行,則可以正常運(yùn)行。那是因?yàn)檫@個(gè)Application是定義在App.xaml里的,UserControl方式編譯,沒有使用它,從而導(dǎo)致Application是沒有定義的。
自己寫的代碼部分可以規(guī)避這個(gè),然而如果引用了第三方的組件,需要調(diào)用這個(gè)Application.Current的時(shí)候,比如使用CrystalReportsViewer在UserControl里顯示報(bào)表,按“打印”按鈕的時(shí)候,它就會發(fā)生Application.Current是null的錯(cuò)誤。
要解決它的辦法是,把下面的代碼放到UserControl的構(gòu)造器或者加載事件里,人為給它生成一個(gè)Application即可:
if (System.Windows.Application.Current == null)
{
new System.Windows.Application();
}
上面的代碼能解決前面提到的問題,可是會有一個(gè)問題是,默認(rèn)Application會在它所擁有的最后一個(gè)WPF窗口的關(guān)閉而關(guān)閉,第一次使用CrystalReportsViewer打印完關(guān)閉報(bào)表查看界面,第二次再在這個(gè)UserControl里調(diào)用CrystalReportsViewer窗口來打開報(bào)表的時(shí)候,會顯示 Application已經(jīng)被關(guān)閉的錯(cuò)誤。
要解決這個(gè)錯(cuò)誤,我們在新建Application的時(shí)候指定這個(gè)Application必須被顯式的關(guān)閉就好了,代碼如下:
if (System.Windows.Application.Current == null)
{
var app = new System.Windows.Application
{
// 設(shè)置為顯式關(guān)閉,防止窗口關(guān)閉時(shí) Application 被自動終結(jié)
ShutdownMode = ShutdownMode.OnExplicitShutdown
};
}