从WinForm程序中显示WPF Window出现"The URI prefix is not recognized"异常的解决方法

从WinForm App中显示WPF窗口的代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
MyWindow wpfWindow = new MyWindow();
WindowInteropHelper wih 
= new WindowInteropHelper(wpfWindow);
wih.Owner 
= ownerHwnd;
wpfWindow.ShowDialog();

一般情况下,这都可以正常工作。

但是如果在MyWindow的代码(不是XAML)中需要显示加载其他xaml文件(可能是资源文件):

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

你在new MyWindow()就会得到NotSupportedException:"The URI prefix is not recognized". 有两种方法来解决这个问题:

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

ContractedBlock.gif ExpandedBlockStart.gif Code
 _dictionary.Source = new Uri("pack://application:,,,/RibbonControlsLibrary;component/Themes/RibbonWindow.xaml", UriKind.Relative);

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

ContractedBlock.gif ExpandedBlockStart.gif Code
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(...)。

转载于:https://www.cnblogs.com/wyong27/archive/2009/03/29/1424389.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值