在 Windows 11 上运行的 .Net Maui 应用程序中关闭辅助窗口时如何解决未处理的异常

问题描述 投票:0回答:1

在 C# .net Maui 桌面应用程序中,当使用打开多个窗口时 Application.Current.OpenWindow() 使用标题栏中的关闭按钮关闭窗口(不是主应用程序窗口)会在 Windows 11 中引发未处理的异常。

相同的代码在 Windows 10 中运行得非常好。

在 Windows 11 中,当使用代码从代码中关闭窗口时,一切都很好 Application.Current.CloseWindow().

这里有一个 GitHub 存储库,其中有一个简单的程序来演示这个问题: https://github.com/Raminiya/MauiAppWindowTest

我发现了多个关于同一问题的报告,但没有解决方法。 他们主要将问题与第二个窗口中的 Web 视图相关,并通过首先关闭 Web 视图来解决它。 我在第二个窗口页面上注明特殊内容时遇到问题。 还建议了一种解决方法 https://github.com/dotnet/maui/issues/7317 但没有成功。

我还尝试使用以下代码覆盖关闭按钮功能: https://learn.microsoft.com/en-us/answers/questions/1384175/how-to-override-the-close-button-in-the-title-bar 只需忽略该事件,以便我可以从代码中关闭窗口,但是在按下标题栏关闭按钮后(并且我忽略该事件),然后当我使用 Application.Current.CloseWindow() 关闭窗口时 我会得到同样的异常。(仅在 Windows 11 上)

windows controls maui desktop-application windows-11
1个回答
0
投票

虽然该问题不会出现在所有 Windows 11 机器上,而且我不知道为什么,但解决方案如下:

通过将以下行添加到 MauiProgram.cs 中以便能够调用该函数

SetBorderAndTitleBar(false, false);

问题已解决。 (只是 #If Windows 和 #endif 之间的线。)

/// Need to use the 2 following name spaces:
#if WINDOWS 
using Microsoft.UI;
using Microsoft.UI.Windowing;
#endif

namespace MauiAppWindowTest
{
    public static class MauiProgram
    {
        public static bool NoTitleBar=false;
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });
/// The Code below was added
#if WINDOWS
           builder.ConfigureLifecycleEvents(events =>
           {
               events.AddWindows(wndLifeCycleBuilder =>
               { 
                   wndLifeCycleBuilder.OnWindowCreated(window =>
                   {  
                          IntPtr nativeWindowHandle = WinRT.Interop.WindowNative.GetWindowHandle(window);
                          WindowId win32WindowsId = Win32Interop.GetWindowIdFromWindow(nativeWindowHandle);
                          AppWindow appWindow = AppWindow.GetFromWindowId(win32WindowsId);
                          if (appWindow.Presenter is OverlappedPresenter p)
                          {
                              /// Calling this function resolves the issue
                              p.SetBorderAndTitleBar(false, false);
                          }
                   });
               });
           });
#endif
/// Up to Here

            return builder.Build();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.