我正在用MvvmCross编写WPF应用程序。我想要一个自定义视图演示者。这是我写的:
public class ViewPresenter : MvxWpfViewPresenter
{
ContentControl _contentControl;
FrameworkElement _currentContentView;
FrameworkElement _rootContentView;
public ViewPresenter(ContentControl c)
{
_contentControl = c;
AddPresentationHintHandler<SetRootHint>(SetRootHintHandler);
AddPresentationHintHandler<PopToRootHint>(PopToRootHintHandler);
}
protected override void ShowContentView(FrameworkElement element, MvxContentPresentationAttribute attribute, MvxViewModelRequest request)
{
base.ShowContentView(element, attribute, request);
_currentContentView = element;
}
private bool SetRootHintHandler(SetRootHint hint)
{
_rootContentView = _currentContentView;
return true;
}
private bool PopToRootHintHandler(PopToRootHint hint)
{
return true;
}
}
我正在Setup
类中注册它:
public class Setup : MvxWpfSetup<Core.App>
{
protected override IMvxWpfViewPresenter CreateViewPresenter(ContentControl root)
{
return new ViewPresenter(root);
}
}
当我尝试显示我的第一个视图时,它在此行崩溃:
base.ShowContentView(element, attribute, request);
显示消息:
System.InvalidOperationException:'序列不包含任何元素'
如果我没有改写ShowContentView
,它仍然会崩溃。而且,如果我不打电话给base.ShowContentView(element, attribute, request)
,它也不会显示我的视图。
编辑
在我的Visual Studio环境中启用Common Language Runtime Exceptions
后,我可以看到异常实际上来自mscorlib.dll
,并要求AsyncMethodBuilder.cs
查看调用堆栈帧的源。引发异常。我所有的nuget程序包都是最新的,并且在Windows 10上运行。我相信从Windows 10开始不赞成使用WPF。我的WPF项目针对.NET 4.7.2,而我的Core项目针对.NET Standard 2.0。但是我仍然不知道该如何解决。.我也使用最新的MvvmCross(6.1.2.0)。
编辑2
我制作了一个带有相同问题的小型示例应用程序:
https://drive.google.com/file/d/1uROc8TYzWdx54BV8LtgCNLtwhc_MhXq3/view?usp=sharing
答案 0 :(得分:1)
感谢您的样品。我能够弄清楚。
由于没有在base
上调用ViewPresenter
构造函数,因此遇到了此问题。将您的ViewPresenter
代码更改为此:
public ViewPresenter(ContentControl c) : base(c)
{
_contentControl = c;
AddPresentationHintHandler<SetRootHint>(SetRootHintHandler);
AddPresentationHintHandler<PopToRootHint>(PopToRootHintHandler);
}
这样,base constructor将被调用,ContentControl
将被添加到_frameworkElementsDictionary
,而不会抛出异常
序列不包含任何元素
'因为其中将包含一个元素