程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 從WinForm程序中顯示WPF Window出現“The URI prefix is not recognized”異

從WinForm程序中顯示WPF Window出現“The URI prefix is not recognized”異

編輯:關於.NET

從WinForm程序中顯示WPF Window出現“The URI prefix is not recognized”異常的解決方法

從WinForm App中顯示WPF窗口的代碼:

MyWindow wpfWindow = new MyWindow();
WindowInteropHelper wih = new WindowInteropHelper(wpfWindow);
wih.Owner = ownerHwnd;
wpfWindow.ShowDialog();

一般情況下,這都可以正常工作。

但是如果在MyWindow的代碼(不是XAML)中需要顯示加載其他xaml文件(可 能是資源文件):

_dictionary.Source = new Uri ("/RibbonControlsLibrary;component/Themes/RibbonWindow.xaml" , UriKind.Relative);

你在new MyWindow()就會得到NotSupportedException:"The URI prefix is not recognized". 有兩種方法來解決這個問題:

1.如果你有MyWindow的源代碼,添加前綴pack://application:,,,

_dictionary.Source = new Uri ("pack://application:,,,/RibbonControlsLibrary;component/Themes/R ibbonWindow.xaml", UriKind.Relative);

2.如果MyWindow是第三方提供的,你就需要在new MyWindow()之前加上下面 的語句:

System.Windows.Application app = new  System.Windows.Application();
app.ShutdownMode =  System.Windows.ShutdownMode.OnExplicitShutdown;

分析Applicaiton的源代碼其實就會發現,在它的靜態構造函數中有下面的代 碼:

// Add an instance of the ResourceContainer to PreloadedPackages so that PackWebRequestFactory can find it
 // and mark it as thread-safe so PackWebResponse won't protect returned streams with a synchronizing wrapper
 PreloadedPackages.AddPackage(PackUriHelper.GetPackageUri (BaseUriHelper.PackAppBaseUri), new ResourceContainer(), true);

它的作用其實就是在後面的Uri定位過程中自動添加必要的 "pack://application:,,,"

由於app.ShutdownMode的缺省值是OnLastWindowClose,這會在程序中的最後 一個Wpf窗口關閉時自動關閉Wpf Application,如果你需要反復顯示關閉Wpf窗口 ,有必要更改其值。

在使用第二種方法的過程中其實你會注意到我並沒有調用app.Run方法,按我 的理解完全沒有必要調用,因為我所需要的只是Application的靜態構造函數進 行必要的初始化:PreloadedPackages.AddPackage(...)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved