在运行时获取XAML类型的URI

3

我想让下面这段代码正常工作:

Type pageType = typeof(Page1);
Uri pageUri = GetPackUriForType(pageType);

问题出在GetPackUriForType方法上 - 我找不到任何.NET框架中可以执行此操作的内容。在编译时生成的.g.cs文件中,URI作为InitializeComponent代码的一部分嵌入其中:
public void InitializeComponent() {
    if (_contentLoaded) {
        return;
    }
    _contentLoaded = true;
    System.Uri resourceLocater = new System.Uri("/PageCollection;component/pages/page1.xaml", System.UriKind.Relative);

    #line 1 "..\..\..\Pages\Page1.xaml"
    System.Windows.Application.LoadComponent(this, resourceLocater);

    #line default
    #line hidden
}

但是那个URI似乎没有公开在任何地方。我知道可以在运行时使用IUriContext,但我试图避免实例化该类型只是为了获取其URI。

我能想到的唯一解决方案是根据命名空间基于约定尝试假设URI。但我希望有一个更不易出错的解决方案。

1个回答

1

.g.cs文件中包含了你所提到的内容。此外,.g.resources文件中也包含了所有的URI。但是你需要打开.g.resources中的baml文件才能理解根类型。

V4版本在这方面没有任何变化...除了打开.baml文件有一个公共API。

你为什么要从类型转换为PackUri? 如果你有一个PackUri并想创建正确的类型,Application.LoadComponent调用应该可以正常工作...你不需要像.g.cs那样传递根实例。

希望这可以帮助到你。 -Rob


我使用反射根据一些元数据解析类型,但是WPF的导航系统会在直接实例化页面并导航到它时出现问题(它保留了引用,因此页面永远不会被GC回收)。因此,我必须使用URI调用NavigationService.Navigate - 这意味着需要将类型映射到URI。BAML在3.5和4.0之间是否有变化?我可以查看4.0 BAML读取器逻辑,并为3.5实现类似的内容。 - Paul Stovell
BAML在4.0中没有改变。格式仍然相同。编译器会以相同的方式编写它。Baml2006Reader是4.0中的新公共API。 - Rob Relyea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接