1

我是 WPF 和 Prism 的新手,但我已经了解到您必须在 Unity 中将视图注册为对象:

Container.RegisterType<Object,MyView>("My.Assembly.MyView");

不过,当我使用

var RelativeUriToMyView = new Uri("My.Assembly.MyView",UriKind.Relative);    
RegionManager.RequestNavigate(RelativeUriToMyView, RegionName, CallbackResult);

MyView 显示为 System.Object,并且 CallbackResult 不包含错误。

我错过了什么?如果需要,我很乐意提供更多信息。

4

2 回答 2

2

您可能想查看 PRISM 源代码中的 RegionNavigationContentLoader.cs;这是为您加载视图的代码。

    protected virtual object CreateNewRegionItem(string candidateTargetContract)
    {
        object newRegionItem;

        try
        {
            newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract);
        }
        catch (ActivationException e)
        {
            throw new InvalidOperationException(
                string.Format(CultureInfo.CurrentCulture, Resources.CannotCreateNavigationTarget, candidateTargetContract),
                e);
        }
        return newRegionItem;
    }

有几个辅助方法可以获取 URI,提取查询字符串,并创建用于查找视图并将其转换为对象的“名称”。

本质上,您用于将具体类作为对象与 Unity 相关联的名称与您尝试使用 Unity 解析对象时需要使用的名称相同。这是一些要解释的伪代码,

Container.RegisterType<object, ConcreteClass>(typeof(ConcreteClass).FullName);

Locator.GetInstance<object>(UriWithFullName)

如果这些都没有帮助,请发布 RelativeUriToMyView 以便我可以查看内容。祝你好运。

于 2011-08-02T20:12:24.573 回答
1

该问题似乎是由使用其全名 (My.Assembly.MyView) 而不是其名称 (MyView) 注册视图引起的。

编辑: 更改了问题以更准确地反映问题。

于 2011-08-02T15:23:23.830 回答