Wpf UriFormatException:无效的URI:指定的端口无效

Wpf UriFormatException:无效的URI:指定的端口无效,wpf,xaml,resources,uri,Wpf,Xaml,Resources,Uri,下面用作Uri参数的程序集限定字符串在XAML中工作,但在代码中使用时会显示错误 我试了各种方法,结果都一样。我怎样才能解决这个问题 [测试] public void LargeImageSource_IsKnown() { var uri=新uri( "pack://application:,,,/" + “MyAssembly.Core.Presentation.Wpf;组件/”+ “Images/Delete.png”,UriKind.RelativeOrAbsolute); 断言( _

下面用作Uri参数的程序集限定字符串在XAML中工作,但在代码中使用时会显示错误

我试了各种方法,结果都一样。我怎样才能解决这个问题

[测试]
public void LargeImageSource_IsKnown()
{
var uri=新uri(
"pack://application:,,,/" + 
“MyAssembly.Core.Presentation.Wpf;组件/”+
“Images/Delete.png”,UriKind.RelativeOrAbsolute);
断言(
_pickerActivityCollectionVm.DeleteActivityCommand.LargeImageSource,
Is.EqualTo(uri));
}
System.UriFormatException:无效URI:指定的端口无效。
在System.Uri.CreateThis(字符串Uri、布尔顿特斯卡普、UriKind)
在System.Uri..ctor(字符串uriString,UriKind-UriKind)
更新 基于Thomas出色的回答和我自己关于可读性的评论,我在BaseTestFixture类中使用了以下内容。希望这对其他人有帮助

受保护的虚拟void onfixtresetup(){
//日志记录,其他一次性安装的东西。。。
常量字符串scheme=“pack”;
if(!UriParser.IsKnownScheme(scheme)){
断言(PackUriHelper.UriSchemePack,Is.EqualTo(scheme));
}
}

这是因为您在执行此代码时,
包://
方案尚未注册。创建
应用程序
对象时,将注册此方案。您可以在测试夹具的设置中添加以下代码:

[设置]
公共作废设置()
{
如果(!UriParser.IsKnownScheme(“pack”))
新的System.Windows.Application();
}

编辑:实际上,
pack://
方案似乎是在
PackUriHelper
类的类型初始值设定项中注册的(该类恰好由
应用程序使用)。因此,实际上您不需要创建
应用程序的实例
,只需要访问
PackUriHelper
的静态成员即可确保类型初始值设定项已运行:

[设置]
公共作废设置()
{
字符串s=System.IO.Packaging.PackUriHelper.UriSchemePack;
}

访问
PackUriHelper.UriSchemePack
似乎只注册
pack
方案,而不是
应用程序
方案,我需要使用
pack://application:,,,/
我的单元测试中的语法。因此,我不得不使用
new Application()
方法,这对注册两个方案都很有效。

如果您在Windows应用商店/WinRT项目中看到此错误:

在我的C#应用程序中加载资源时,我根本无法使用“pack://”语法。起作用的是ms appx://这种语法:

ms-appx://[project folder]/[resource path]
例如,我想从“core”文件夹加载一个名为“styles.xaml”的资源字典。这个URI最终为我工作:

dictionary.Source = new System.Uri("ms-appx:///core/styles.xaml");
尽管问题指定了WPF,但问题看起来非常相似,但最终得到了一个完全不同的解决方案,这需要一段时间才能找到,现有的答案根本没有帮助


同样,此解决方案不适用于WPF

甚至更好,尽管我确实喜欢第一个版本的可读性。我将字符串从's'更改为'ensurePackSchemeIsKnown',这样我就有机会回忆起一周左右以后为什么要这样做。Cheers+1第一个代码示例对我有效,但第二个没有。通过这样做,我能够对第一个示例进行一些改进:var current=Application.current;访问应用程序类就足以触发应用程序静态构造函数,它设置了我需要的所有Uri内容。…@CameronPeters,我很惊讶第二个代码段对您不起作用,因为Uri方案已在PackUriHelper的静态构造函数中注册。。。静态构造函数必须在访问UriSchemePack之前执行。@ThomasLevesque,在我的例子中,我需要“应用程序”方案,该方案仅在应用程序静态构造函数执行时才会初始化……或者,仅引用应用程序类将运行静态构造函数,该构造函数将初始化您所需的内容。只需使用这个:var current=Application.current;仅供参考:我在使用托管在本机进程中的WPF窗口时面临同样的问题。