You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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");
    }
    
  • 第三步:补全初始化与非空校验
    1. 确保App.xaml.cs的启动方法中已经初始化Xaml Islands运行时:
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        // 必须提前初始化Xaml Host运行时
        Microsoft.Toolkit.Wpf.UI.XamlHost.WindowsXamlHostManager.EnsureWindowsXamlHostInitialized();
    }
    
    1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 16:36:00