MVVMCross WPF如何在根MvxWindow中加载MaterialDesign DialogHost
问题原因
你遇到的异常本质是运行时不存在标识符为RootDialog的已加载DialogHost实例,核心原因出在MvvmCross(Mvx)的Wpf视图加载逻辑和DialogHost的使用方式两个方面:
- MvxWpf的主窗口如果没有显式声明名为
ContentViewPresenter的内容承载控件,框架会直接将启动页(你的DashboardView)设置为MainWindow的Content属性值,直接覆盖了你在MainWindow.xaml里定义的DialogHost控件,导致运行时根窗口里根本没有你声明的RootDialog实例。 - MaterialDesign的DialogHost是内容控件,必须将你的页面内容放在DialogHost的内部才能正常工作,单独声明空的DialogHost没有实际作用,也无法正常弹出对话框。
你把DialogHost放在DashboardView里能正常运行的原因是此时DialogHost跟随DashboardView一起被Mvx加载到窗口中,实例确实存在,所以可以被找到,但这种方式无法实现全局复用。
解决方案
修改MainWindow.xaml的结构,在DialogHost内部添加Mvx约定的内容承载控件即可:
<views:MvxWindow ... > <materialDesign:DialogHost Identifier="RootDialog"> <!-- Mvx会自动将对应ViewModel的View加载到这个约定名称的ContentControl中 --> <ContentControl x:Name="ContentViewPresenter" /> </materialDesign:DialogHost> </views:MvxWindow>
修改后DialogHost会常驻在根窗口,不会被Mvx的视图加载逻辑覆盖,所有子页面都可以通过RootDialog这个标识符调用全局对话框,不需要在每个子页面单独声明DialogHost。
内容的提问来源于stack exchange,提问作者JF-Mechs
相关产品推荐
相关产品推荐

