我是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。对象,并且CallbackResult不包含Error。
我错过了什么?如有需要,我很乐意提供更多信息。
你会想看看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,提取查询字符串,并创建用于查找视图的'name',并将其转换为对象。
从本质上讲,你用来将你的具体类作为一个对象与Unity相关联的名称与你在尝试用Unity解析对象时需要使用的名称是相同的。下面是一些伪代码来解释,
Container.RegisterType<object, ConcreteClass>(typeof(ConcreteClass).FullName);
Locator.GetInstance<object>(UriWithFullName)
如果这些都没有帮助,张贴RelativeUriToMyView,所以我可以看到的内容。好运。
这个问题似乎是由于用它的FullName (My.Assembly.MyView)而不是它的Name (MyView)注册视图引起的。
编辑:修改了问题,以更准确地反映问题