【问题标题】:Getting URI's for XAML types at runtime在运行时获取 XAML 类型的 URI
【发布时间】:2009-11-25 03:17:11
【问题描述】:

我正在尝试编写一些类似这样的代码:

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

问题在于 GetPackUriForType 方法 - 我在 .NET 框架中找不到任何可以执行此操作的方法。

在编译时构建的 .g.cs 文件中,URI 作为 初始化组件代码:

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 使用基于命名空间的约定。但我想要一个不那么脆弱的解决方案。

【问题讨论】:

    标签: .net wpf xaml


    【解决方案1】:

    .g.cs 包含您提到的它。 .g.resources 还包含所有 URI。但是你需要破解打开.g.resources中的baml来了解root类型。

    V4 没有任何变化...除了破解打开 baml 有一个公共 API。

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

    希望对您有所帮助。 -罗伯

    【讨论】:

    • 我使用反射来解析基于某些元数据的类型,但是如果我实例化一个页面并直接导航到它,WPF 的导航系统会导致问题(它保留一个引用,因此该页面永远不会被 GC) .所以我必须用 URI 调用 NavigationService.Navigate - 这意味着以某种方式将类型映射到 URI。 BAML 会在 3.5 和 4.0 之间变化吗?我可以查看 4.0 BAML 阅读器逻辑并为 3.5 实现类似的东西。
    • BAML 在 4.0 中没有改变。格式是一样的。编译器以相同的方式编写它。 Baml2006Reader 是 4.0 中的新公共 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多