在WPF项目中通过Xaml Islands使用NavigationView时出现内存访问冲突问题
问题复现
你在WPF项目中通过Xaml Islands引入WinUI的NavigationView控件,外观显示正常、切换动态新建的页面也正常,但调用frame.Navigate跳转到项目中已存在的页面时抛出System.AccessViolationException内存访问违规错误。
修复方案
- 第一步:确认页面类型匹配
WinUI的UIControls.Frame只能承载WinUI/UWP类型的Page,不能直接承载WPF的System.Windows.Controls.Page。如果你的Configure、CanBusFilterPage是WPF页面,需要将其改写为WinRT类库中的WinUI Page,或者单独用WindowsXamlHost封装后再挂载,不能直接传给WinUI的Frame。 - 第二步:修正跨框架类型混用问题
你当前混用了WPF的System.Windows.Media.FontFamily和WinUI控件,跨框架的资源对象传递会触发非托管内存访问错误。将字体定义改为WinUI类型:// 替换原有的WPF FontFamily定义 private UIControls.FontFamily segoeFontFamily; public MainWindow() { InitializeComponent(); // 用WinUI的FontFamily构造 segoeFontFamily = new UIControls.FontFamily("Segoe MDL2 Assets"); } - 第三步:补全初始化与非空校验
- 确保App.xaml.cs的启动方法中已经初始化Xaml Islands运行时:
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); // 必须提前初始化Xaml Host运行时 Microsoft.Toolkit.Wpf.UI.XamlHost.WindowsXamlHostManager.EnsureWindowsXamlHostInitialized(); }- 在SelectionChanged事件中补全frame非空判断,同时修正Content的比较逻辑,避免初始化时序问题和类型匹配失败导致的错误:
private void NavigationView_SelectionChanged(UIControls.NavigationView sender, UIControls.NavigationViewSelectionChangedEventArgs args) { try { if (frame == null) return; // 新增非空判断 if (args.SelectedItem is UIControls.NavigationViewItem item) { // 转为字符串后再比较,避免object类型匹配失败 switch (item.Content.ToString()) { case "Configure": frame.Navigate(typeof(Configure)); break; case "Filter": frame.Navigate(typeof(CanBusFilterPage)); break; default: break; } } } catch (Exception ex) { // 调试阶段建议输出异常信息,方便定位问题 System.Diagnostics.Debug.WriteLine(ex.Message); } } - 第四步:校验版本兼容性
确保你安装的Microsoft.Toolkit.Wpf.UI.Controls包版本、项目目标Windows SDK版本、系统运行的Windows版本三者兼容,最低要求Windows 10 1903及以上版本才能正常使用Xaml Islands承载WinUI控件。
内容的提问来源于stack exchange,提问作者voltac
相关产品推荐
相关产品推荐

