MvvmCross WPF打开独立新窗口报错,寻求解决方法
问题排查与解决方案
异常原因
这个System.InvalidOperationException异常的核心原因是:MvvmCross的导航系统错误地将BolusView(继承MvxWindow)当作子控件,试图添加到现有视图的Visual树中,而WPF的Window控件必须作为视觉树的根元素,不能成为其他Visual控件的子元素。
具体解决步骤
1. 修正MvxWindowPresentation特性配置
确保BolusView上的特性明确指定该视图作为独立根窗口,避免被嵌入到父容器中:
using MvvmCross.Platforms.Wpf.Presenters.Attributes; using MvvmCross.Platforms.Wpf.Views; [MvxWindowPresentation(Mode = MvxWindowPresentationMode.New, Root = true)] public partial class BolusView : MvxWindow { public BolusView() { InitializeComponent(); } }
Mode = MvxWindowPresentationMode.New:强制创建新窗口实例Root = true:标记该窗口为视觉树根元素,禁止作为子控件嵌入
2. 检查导航调用逻辑
确认MainViewModel中的导航代码没有传递错误参数,标准调用方式如下:
private readonly IMvxNavigationService _navigationService; public MainViewModel(IMvxNavigationService navigationService) { _navigationService = navigationService; SettingsCommand = new MvxAsyncCommand(async () => await _navigationService.Navigate<BolusViewModel>()); } public IMvxAsyncCommand SettingsCommand { get; }
无需额外指定容器,特性配置已足够告诉MvvmCross如何展示窗口。
3. 确保BolusView的XAML结构正确
检查BolusView的XAML根元素必须是MvxWindow,不能嵌套在任何其他控件内:
<views:MvxWindow x:Class="YourAppNamespace.BolusView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf" Title="设置窗口" Height="400" Width="600"> <Grid> <!-- 窗口内容 --> </Grid> </views:MvxWindow>
4. 验证导航Presenter配置(可选)
如果上述步骤无效,检查项目Setup.cs中的导航Presenter是否正确配置,确保使用支持窗口导航的实现:
using MvvmCross.Platforms.Wpf.Presenters; using MvvmCross.Platforms.Wpf.Views; using MvvmCross.ViewModels; public class Setup : MvxWpfSetup<Core.App> { protected override IMvxNavigationPresenter CreateNavigationPresenter() { return new MvxWindowNavigationPresenter(Window); } }
这个配置会强制导航系统优先处理窗口类型的视图,避免嵌入逻辑冲突。
内容的提问来源于stack exchange,提问作者Thor Schierbeck
相关产品推荐
相关产品推荐

