From 02b05767a1ed2d971056e0106b5da918b8da764b Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 18 Jul 2024 13:35:08 -0500 Subject: [PATCH 01/16] Obsolete setting mainpage via application --- .../src/Core/Application/Application.cs | 6 +++ src/Controls/src/Core/Shell/Shell.cs | 45 +++++++++++++++-- .../Platform/iOS/UIApplicationExtensions.cs | 37 -------------- .../src/Platform/iOS/UIWindowExtensions.cs | 48 +++++++++++++++++++ .../src/templates/maui-blazor/App.xaml.cs | 5 +- .../src/templates/maui-mobile/App.xaml.cs | 5 +- .../maui-multiproject/MauiApp.1/App.xaml.cs | 5 +- 7 files changed, 107 insertions(+), 44 deletions(-) create mode 100644 src/Core/src/Platform/iOS/UIWindowExtensions.cs diff --git a/src/Controls/src/Core/Application/Application.cs b/src/Controls/src/Core/Application/Application.cs index 404ec6f21398..b403e1f2a516 100644 --- a/src/Controls/src/Core/Application/Application.cs +++ b/src/Controls/src/Core/Application/Application.cs @@ -85,6 +85,7 @@ public IAppLinks AppLinks /// public Page? MainPage { + [Obsolete("This property has been deprecated. For single-window applications, use Windows[0].Page. For multi-window applications, identify and use the appropriate Window object to access the desired Page."")] get { if (Windows.Count == 0) @@ -92,6 +93,7 @@ public Page? MainPage return Windows[0].Page; } + [Obsolete("This property is deprecated. Initialize your application by overriding Application.CreateWindow rather than setting MainPage. To modify the root page in an active application, use Windows[0].Page for applications with a single window. For applications with multiple windows, use Application.Windows to identify and update the root page on the correct window.")] set { if (MainPage == value) @@ -513,7 +515,9 @@ protected virtual Window CreateWindow(IActivationState? activationState) return window; if (Windows.Count > 1) +#pragma warning disable CS0618 // Type or member is obsolete throw new NotImplementedException($"Either set {nameof(MainPage)} or override {nameof(Application.CreateWindow)}."); +#pragma warning restore CS0618 // Type or member is obsolete if (Windows.Count > 0) return Windows[0]; @@ -521,7 +525,9 @@ protected virtual Window CreateWindow(IActivationState? activationState) if (_singleWindowMainPage is not null) return new Window(_singleWindowMainPage); +#pragma warning disable CS0618 // Type or member is obsolete throw new NotImplementedException($"Either set {nameof(MainPage)} or override {nameof(Application.CreateWindow)}."); +#pragma warning restore CS0618 // Type or member is obsolete } void AddWindow(Window window) diff --git a/src/Controls/src/Core/Shell/Shell.cs b/src/Controls/src/Core/Shell/Shell.cs index 836be18951bf..39bf8d7d12ad 100644 --- a/src/Controls/src/Core/Shell/Shell.cs +++ b/src/Controls/src/Core/Shell/Shell.cs @@ -950,14 +950,51 @@ public static Shell Current { get { - if (Application.Current == null) + if (Application.Current is null || Application.Current.Windows.Count == 0) return null; + if (Application.Current.Windows.Count == 1) + { + return Application.Current.Windows[0].Page as Shell; + } + + // Check if shell is activated + Shell currentShell = null; + Shell returnIfThereIsJustOneShell = null; + bool tooManyShells = false; foreach (var window in Application.Current.Windows) - if (window is Window && window.IsActivated && window.Page is Shell shell) - return shell; + { + if (window.Page is Shell shell) + { + if (window.IsActivated) + { + if(currentShell is not null) + { + currentShell = null; + break; + } + + currentShell = shell; + } + + if (returnIfThereIsJustOneShell is not null) + { + tooManyShells = true; + } + } + } + + if (currentShell is not null) + { + return currentShell; + } + + if (!tooManyShells && returnIfThereIsJustOneShell is not null) + { + return returnIfThereIsJustOneShell; + } - return Application.Current?.MainPage as Shell; + throw new InvalidOperationException($"Unable to determine the current Shell instance you want to use. Please access Shell via the Windows property on {Application.Current.GetType()}."); } } diff --git a/src/Core/src/Platform/iOS/UIApplicationExtensions.cs b/src/Core/src/Platform/iOS/UIApplicationExtensions.cs index 30d15a76ff56..3157fcfcad43 100644 --- a/src/Core/src/Platform/iOS/UIApplicationExtensions.cs +++ b/src/Core/src/Platform/iOS/UIApplicationExtensions.cs @@ -73,42 +73,5 @@ internal static UIEdgeInsets GetSafeAreaInsetsForWindow(this UIApplication appli return application.GetKeyWindow().GetWindow(); } - - public static IWindow? GetWindow(this UIWindow? platformWindow) - { - if (platformWindow is null) - return null; - - foreach (var window in IPlatformApplication.Current?.Application?.Windows ?? Array.Empty()) - { - if (window?.Handler?.PlatformView == platformWindow) - return window; - } - - return null; - } - - public static IWindow? GetWindow(this UIWindowScene? windowScene) - { - if (windowScene is null) - return null; - -#pragma warning disable CA1416 // TODO: 'UIApplication.Windows' is unsupported on: 'ios' 15.0 and later - foreach (var window in windowScene.Windows) - { - var managedWindow = window.GetWindow(); - - if (managedWindow is not null) - return managedWindow; - } -#pragma warning restore CA1416 - - if (!OperatingSystem.IsIOSVersionAtLeast(13)) - return null; - else if (windowScene.Delegate is IUIWindowSceneDelegate sd) - return sd.GetWindow().GetWindow(); - - return null; - } } } \ No newline at end of file diff --git a/src/Core/src/Platform/iOS/UIWindowExtensions.cs b/src/Core/src/Platform/iOS/UIWindowExtensions.cs new file mode 100644 index 000000000000..77e3ca2a7c07 --- /dev/null +++ b/src/Core/src/Platform/iOS/UIWindowExtensions.cs @@ -0,0 +1,48 @@ +using System; +using ObjCRuntime; +using UIKit; + +namespace Microsoft.Maui.Platform +{ + public static class UIWindowExtensions + { + // TODO Add public docs + public static IWindow? GetWindow(this UIWindow? platformWindow) + { + if (platformWindow is null) + return null; + + foreach (var window in IPlatformApplication.Current?.Application?.Windows ?? Array.Empty()) + { + if (window?.Handler?.PlatformView == platformWindow) + return window; + } + + return null; + } + + // TODO Add public docs + public static IWindow? GetWindow(this UIWindowScene? windowScene) + { + if (windowScene is null) + return null; + +#pragma warning disable CA1416 // TODO: 'UIApplication.Windows' is unsupported on: 'ios' 15.0 and later + foreach (var window in windowScene.Windows) + { + var managedWindow = window.GetWindow(); + + if (managedWindow is not null) + return managedWindow; + } +#pragma warning restore CA1416 + + if (!OperatingSystem.IsIOSVersionAtLeast(13)) + return null; + else if (windowScene.Delegate is IUIWindowSceneDelegate sd) + return sd.GetWindow().GetWindow(); + + return null; + } + } +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-blazor/App.xaml.cs b/src/Templates/src/templates/maui-blazor/App.xaml.cs index 68334f8da5d1..a547442489c6 100644 --- a/src/Templates/src/templates/maui-blazor/App.xaml.cs +++ b/src/Templates/src/templates/maui-blazor/App.xaml.cs @@ -5,7 +5,10 @@ public partial class App : Application public App() { InitializeComponent(); + } - MainPage = new MainPage(); + protected override Window CreateWindow(IActivationState? activationState) + { + return new Window(new MainPage()); } } diff --git a/src/Templates/src/templates/maui-mobile/App.xaml.cs b/src/Templates/src/templates/maui-mobile/App.xaml.cs index 7f3b59d3ba7d..34e52c22bf6a 100644 --- a/src/Templates/src/templates/maui-mobile/App.xaml.cs +++ b/src/Templates/src/templates/maui-mobile/App.xaml.cs @@ -5,7 +5,10 @@ public partial class App : Application public App() { InitializeComponent(); + } - MainPage = new AppShell(); + protected override Window CreateWindow(IActivationState? activationState) + { + return new Window(new AppShell()); } } diff --git a/src/Templates/src/templates/maui-multiproject/MauiApp.1/App.xaml.cs b/src/Templates/src/templates/maui-multiproject/MauiApp.1/App.xaml.cs index 7f3b59d3ba7d..34e52c22bf6a 100644 --- a/src/Templates/src/templates/maui-multiproject/MauiApp.1/App.xaml.cs +++ b/src/Templates/src/templates/maui-multiproject/MauiApp.1/App.xaml.cs @@ -5,7 +5,10 @@ public partial class App : Application public App() { InitializeComponent(); + } - MainPage = new AppShell(); + protected override Window CreateWindow(IActivationState? activationState) + { + return new Window(new AppShell()); } } From 69515de2e70c4d4b1eca8d62f453fe26e50e2d97 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 18 Jul 2024 14:49:10 -0500 Subject: [PATCH 02/16] - fix up our samples --- src/Controls/samples/Controls.Sample/Pages/Base/BasePage.cs | 2 +- .../Pages/Compatibility/TabbedPageGalleryMainPage.xaml.cs | 2 +- .../Controls.Sample/Pages/Core/FlyoutPageGallery.xaml.cs | 2 +- .../Pages/Core/ShellGalleries/ShellChromeGallery.cs | 2 +- .../iOS/iOSTranslucentNavigationBarPage.xaml.cs | 2 +- .../samples/Controls.Sample/Pages/SettingsPage.xaml.cs | 2 +- src/Controls/src/Core/Application/Application.cs | 4 ++-- src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt | 2 ++ .../src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt | 2 ++ 9 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Controls/samples/Controls.Sample/Pages/Base/BasePage.cs b/src/Controls/samples/Controls.Sample/Pages/Base/BasePage.cs index 09116a00a769..79e76c35aaaf 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Base/BasePage.cs +++ b/src/Controls/samples/Controls.Sample/Pages/Base/BasePage.cs @@ -23,7 +23,7 @@ public BasePage() { if (SelectedItem != null) { - if (Application.Current.MainPage is FlyoutPage fp) + if (this.Window.Page is FlyoutPage fp) await fp.Detail.Navigation.PushAsync(PreparePage(SelectedItem)); else await Navigation.PushAsync(PreparePage(SelectedItem)); diff --git a/src/Controls/samples/Controls.Sample/Pages/Compatibility/TabbedPageGalleryMainPage.xaml.cs b/src/Controls/samples/Controls.Sample/Pages/Compatibility/TabbedPageGalleryMainPage.xaml.cs index 6fafbe2185b0..db7b21c96343 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Compatibility/TabbedPageGalleryMainPage.xaml.cs +++ b/src/Controls/samples/Controls.Sample/Pages/Compatibility/TabbedPageGalleryMainPage.xaml.cs @@ -50,7 +50,7 @@ void OnSetToBottomTabs(object sender, EventArgs e) SetNewMainPage(bottomTabs); AndroidSpecific.TabbedPage.SetToolbarPlacement(bottomTabs, AndroidSpecific.ToolbarPlacement.Bottom); - Application.Current!.MainPage = bottomTabs; + this.Window!.Page = bottomTabs; } void OnChangeTabIndex(object sender, EventArgs e) diff --git a/src/Controls/samples/Controls.Sample/Pages/Core/FlyoutPageGallery.xaml.cs b/src/Controls/samples/Controls.Sample/Pages/Core/FlyoutPageGallery.xaml.cs index 620fb8c858da..34384c66626a 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Core/FlyoutPageGallery.xaml.cs +++ b/src/Controls/samples/Controls.Sample/Pages/Core/FlyoutPageGallery.xaml.cs @@ -6,7 +6,7 @@ namespace Maui.Controls.Sample.Pages public partial class FlyoutPageGallery { - FlyoutPage? FlyoutPage => Application.Current!.MainPage as FlyoutPage; + FlyoutPage? FlyoutPage => this.Window!.Page as FlyoutPage; public FlyoutPageGallery() { InitializeComponent(); diff --git a/src/Controls/samples/Controls.Sample/Pages/Core/ShellGalleries/ShellChromeGallery.cs b/src/Controls/samples/Controls.Sample/Pages/Core/ShellGalleries/ShellChromeGallery.cs index 508f04d8f04b..f8516b5b4878 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Core/ShellGalleries/ShellChromeGallery.cs +++ b/src/Controls/samples/Controls.Sample/Pages/Core/ShellGalleries/ShellChromeGallery.cs @@ -12,7 +12,7 @@ namespace Maui.Controls.Sample.Pages.ShellGalleries { public partial class ShellChromeGallery { - AppShell? AppShell => Application.Current!.MainPage as AppShell; + AppShell? AppShell => this.Window!.Page as AppShell; public ShellChromeGallery() { diff --git a/src/Controls/samples/Controls.Sample/Pages/PlatformSpecifics/iOS/iOSTranslucentNavigationBarPage.xaml.cs b/src/Controls/samples/Controls.Sample/Pages/PlatformSpecifics/iOS/iOSTranslucentNavigationBarPage.xaml.cs index f9d4d5608556..1c706d495df3 100644 --- a/src/Controls/samples/Controls.Sample/Pages/PlatformSpecifics/iOS/iOSTranslucentNavigationBarPage.xaml.cs +++ b/src/Controls/samples/Controls.Sample/Pages/PlatformSpecifics/iOS/iOSTranslucentNavigationBarPage.xaml.cs @@ -18,7 +18,7 @@ public iOSTranslucentNavigationBarPage(ICommand restore) void OnTranslucentNavigationBarButtonClicked(object sender, EventArgs e) { - (Microsoft.Maui.Controls.Application.Current!.MainPage as Microsoft.Maui.Controls.NavigationPage)!.On().SetIsNavigationBarTranslucent(!(Microsoft.Maui.Controls.Application.Current!.MainPage as Microsoft.Maui.Controls.NavigationPage)!.On().IsNavigationBarTranslucent()); + (this.Window!.Page as Microsoft.Maui.Controls.NavigationPage)!.On().SetIsNavigationBarTranslucent(!(this.Window!.Page as Microsoft.Maui.Controls.NavigationPage)!.On().IsNavigationBarTranslucent()); } void OnReturnButtonClicked(object sender, EventArgs e) diff --git a/src/Controls/samples/Controls.Sample/Pages/SettingsPage.xaml.cs b/src/Controls/samples/Controls.Sample/Pages/SettingsPage.xaml.cs index b3f6c34f23bb..e3537f5cc27c 100644 --- a/src/Controls/samples/Controls.Sample/Pages/SettingsPage.xaml.cs +++ b/src/Controls/samples/Controls.Sample/Pages/SettingsPage.xaml.cs @@ -18,7 +18,7 @@ void OnTapGestureRecognizerTapped(object sender, EventArgs args) void OnRTLToggled(object sender, ToggledEventArgs e) { - var mainPage = Application.Current!.MainPage; + var mainPage = this.Window!.Page; if (mainPage == null) return; diff --git a/src/Controls/src/Core/Application/Application.cs b/src/Controls/src/Core/Application/Application.cs index b403e1f2a516..cc3b0ea4156c 100644 --- a/src/Controls/src/Core/Application/Application.cs +++ b/src/Controls/src/Core/Application/Application.cs @@ -85,7 +85,7 @@ public IAppLinks AppLinks /// public Page? MainPage { - [Obsolete("This property has been deprecated. For single-window applications, use Windows[0].Page. For multi-window applications, identify and use the appropriate Window object to access the desired Page."")] + [Obsolete("This property has been deprecated. For single-window applications, use Windows[0].Page. For multi-window applications, identify and use the appropriate Window object to access the desired Page. Additionally, each element features a Window property, accessible when it's part of the current window.")] get { if (Windows.Count == 0) @@ -93,7 +93,7 @@ public Page? MainPage return Windows[0].Page; } - [Obsolete("This property is deprecated. Initialize your application by overriding Application.CreateWindow rather than setting MainPage. To modify the root page in an active application, use Windows[0].Page for applications with a single window. For applications with multiple windows, use Application.Windows to identify and update the root page on the correct window.")] + [Obsolete("This property is deprecated. Initialize your application by overriding Application.CreateWindow rather than setting MainPage. To modify the root page in an active application, use Windows[0].Page for applications with a single window. For applications with multiple windows, use Application.Windows to identify and update the root page on the correct window. Additionally, each element features a Window property, accessible when it's part of the current window.")] set { if (MainPage == value) diff --git a/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt index 4e3395a8eecb..4549b04752be 100644 --- a/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt @@ -131,6 +131,8 @@ static Microsoft.Maui.Handlers.WebViewHandler.MapUserAgent(Microsoft.Maui.Handle static Microsoft.Maui.Platform.ApplicationExtensions.UpdateUserInterfaceStyle(this Microsoft.Maui.IApplication! application) -> void static Microsoft.Maui.Platform.TextFieldExtensions.UpdateIsSpellCheckEnabled(this UIKit.UITextField! textField, Microsoft.Maui.IEntry! entry) -> void static Microsoft.Maui.Platform.TextViewExtensions.UpdateIsSpellCheckEnabled(this UIKit.UITextView! textView, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Platform.UIWindowExtensions.GetWindow(this UIKit.UIWindow? platformWindow) -> Microsoft.Maui.IWindow? +static Microsoft.Maui.Platform.UIWindowExtensions.GetWindow(this UIKit.UIWindowScene? windowScene) -> Microsoft.Maui.IWindow? static Microsoft.Maui.Platform.WebViewExtensions.UpdateUserAgent(this WebKit.WKWebView! platformWebView, Microsoft.Maui.IWebView! webView) -> void *REMOVED*Microsoft.Maui.WeakEventManager.HandleEvent(object! sender, object! args, string! eventName) -> void Microsoft.Maui.WeakEventManager.HandleEvent(object? sender, object? args, string! eventName) -> void diff --git a/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt index 476c14dbcc44..de081f7cc423 100644 --- a/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt @@ -134,6 +134,8 @@ static Microsoft.Maui.Handlers.WebViewHandler.MapUserAgent(Microsoft.Maui.Handle static Microsoft.Maui.Platform.ApplicationExtensions.UpdateUserInterfaceStyle(this Microsoft.Maui.IApplication! application) -> void static Microsoft.Maui.Platform.TextFieldExtensions.UpdateIsSpellCheckEnabled(this UIKit.UITextField! textField, Microsoft.Maui.IEntry! entry) -> void static Microsoft.Maui.Platform.TextViewExtensions.UpdateIsSpellCheckEnabled(this UIKit.UITextView! textView, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Platform.UIWindowExtensions.GetWindow(this UIKit.UIWindow? platformWindow) -> Microsoft.Maui.IWindow? +static Microsoft.Maui.Platform.UIWindowExtensions.GetWindow(this UIKit.UIWindowScene? windowScene) -> Microsoft.Maui.IWindow? static Microsoft.Maui.Platform.WebViewExtensions.UpdateUserAgent(this WebKit.WKWebView! platformWebView, Microsoft.Maui.IWebView! webView) -> void *REMOVED*Microsoft.Maui.WeakEventManager.HandleEvent(object! sender, object! args, string! eventName) -> void Microsoft.Maui.WeakEventManager.HandleEvent(object? sender, object? args, string! eventName) -> void From b90c2704256b64218f8c89059363488451f38e4e Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 18 Jul 2024 15:07:36 -0500 Subject: [PATCH 03/16] - Add templates for creating a window --- .../.template.config/ide.host.json | 21 ++++++++ .../.template.config/ide/MauiWindowCSFile.ico | Bin 0 -> 406134 bytes .../localize/templatestrings.cs.json | 7 +++ .../localize/templatestrings.de.json | 7 +++ .../localize/templatestrings.en.json | 7 +++ .../localize/templatestrings.es.json | 7 +++ .../localize/templatestrings.fr.json | 7 +++ .../localize/templatestrings.it.json | 7 +++ .../localize/templatestrings.ja.json | 7 +++ .../localize/templatestrings.json | 7 +++ .../localize/templatestrings.ko.json | 7 +++ .../localize/templatestrings.pl.json | 7 +++ .../localize/templatestrings.pt-BR.json | 7 +++ .../localize/templatestrings.ru.json | 7 +++ .../localize/templatestrings.tr.json | 7 +++ .../localize/templatestrings.zh-Hans.json | 7 +++ .../localize/templatestrings.zh-Hant.json | 7 +++ .../.template.config/template.json | 43 ++++++++++++++++ .../maui-window-csharp/NewWindow1.cs | 18 +++++++ .../.template.config/ide.host.json | 21 ++++++++ .../ide/MauiWindowXamlFile.ico | Bin 0 -> 406134 bytes .../localize/templatestrings.cs.json | 7 +++ .../localize/templatestrings.de.json | 7 +++ .../localize/templatestrings.en.json | 7 +++ .../localize/templatestrings.es.json | 7 +++ .../localize/templatestrings.fr.json | 7 +++ .../localize/templatestrings.it.json | 7 +++ .../localize/templatestrings.ja.json | 7 +++ .../localize/templatestrings.json | 7 +++ .../localize/templatestrings.ko.json | 7 +++ .../localize/templatestrings.pl.json | 7 +++ .../localize/templatestrings.pt-BR.json | 7 +++ .../localize/templatestrings.ru.json | 7 +++ .../localize/templatestrings.tr.json | 7 +++ .../localize/templatestrings.zh-Hans.json | 7 +++ .../localize/templatestrings.zh-Hant.json | 7 +++ .../.template.config/template.json | 47 ++++++++++++++++++ .../maui-window-xaml/NewWindow1.xaml | 12 +++++ .../maui-window-xaml/NewWindow1xaml.cs | 19 +++++++ 39 files changed, 391 insertions(+) create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/ide.host.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/ide/MauiWindowCSFile.ico create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.cs.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.de.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.en.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.es.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.fr.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.it.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.ja.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.ko.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.pl.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.pt-BR.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.ru.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.tr.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.zh-Hans.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/localize/templatestrings.zh-Hant.json create mode 100644 src/Templates/src/templates/maui-window-csharp/.template.config/template.json create mode 100644 src/Templates/src/templates/maui-window-csharp/NewWindow1.cs create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/ide.host.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/ide/MauiWindowXamlFile.ico create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.cs.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.de.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.en.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.es.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.fr.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.it.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ja.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ko.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pl.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pt-BR.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ru.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.tr.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hans.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hant.json create mode 100644 src/Templates/src/templates/maui-window-xaml/.template.config/template.json create mode 100644 src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml create mode 100644 src/Templates/src/templates/maui-window-xaml/NewWindow1xaml.cs diff --git a/src/Templates/src/templates/maui-window-csharp/.template.config/ide.host.json b/src/Templates/src/templates/maui-window-csharp/.template.config/ide.host.json new file mode 100644 index 000000000000..94f65d8f44bc --- /dev/null +++ b/src/Templates/src/templates/maui-window-csharp/.template.config/ide.host.json @@ -0,0 +1,21 @@ +{ + "$schema": "http://json.schemastore.org/ide.host", + "appliesTo": "UseMaui", + "defaultItemExtension": "cs", + "itemHierarchyPaths": [ ".NET MAUI" ], + "icon": "ide/MauiWindowCSFile.ico", + "unsupportedHosts": [ + { + "id": "vs", + "version": "(,17.3)" + } + ], + "requiredComponents": [ + { + "id": "Microsoft.VisualStudio.ComponentGroup.Maui.All", + "hostId": "vs", + "componentType": "SetupComponent" + } + + ] +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-csharp/.template.config/ide/MauiWindowCSFile.ico b/src/Templates/src/templates/maui-window-csharp/.template.config/ide/MauiWindowCSFile.ico new file mode 100644 index 0000000000000000000000000000000000000000..feb917041f15009cc3e27fb831e6ce06d9d67b55 GIT binary patch literal 406134 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 literal 0 HcmV?d00001 diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.cs.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.cs.json new file mode 100644 index 000000000000..339799b232d0 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.cs.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Otevře soubor NewWindow1.xaml v editoru.", + "symbols/namespace/description": "obor názvů pro vygenerovaný kód" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.de.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.de.json new file mode 100644 index 000000000000..3402fd99de2a --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.de.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Öffnet \"NewWindow1.xaml\" im Editor.", + "symbols/namespace/description": "Namespace für den generierten Code" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.en.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.en.json new file mode 100644 index 000000000000..56b2f808762a --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.en.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Opens NewWindow1.xaml in the editor.", + "symbols/namespace/description": "namespace for the generated code" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.es.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.es.json new file mode 100644 index 000000000000..68ee38647044 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.es.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Abre NewWindow1.xaml en el editor.", + "symbols/namespace/description": "espacio de nombres para el código generado" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.fr.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.fr.json new file mode 100644 index 000000000000..243afcca1a52 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.fr.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Ouvre NewWindow1.xaml dans l’éditeur.", + "symbols/namespace/description": "espace de noms pour le code généré" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.it.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.it.json new file mode 100644 index 000000000000..ed53949e2fee --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.it.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Apre NewWindow1.xaml nell'editor.", + "symbols/namespace/description": "spazio dei nomi per il codice generato" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ja.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ja.json new file mode 100644 index 000000000000..682bc3f4cdbf --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ja.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "エディターで NewWindow1.xaml を開きます。", + "symbols/namespace/description": "生成されたコードの名前空間" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.json new file mode 100644 index 000000000000..56b2f808762a --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Opens NewWindow1.xaml in the editor.", + "symbols/namespace/description": "namespace for the generated code" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ko.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ko.json new file mode 100644 index 000000000000..e35b00f63110 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ko.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window(XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "편집기에서 NewWindow1.xaml을 엽니다.", + "symbols/namespace/description": "생성된 코드의 네임스페이스" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pl.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pl.json new file mode 100644 index 000000000000..e739a1e2a84e --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pl.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Otwiera plik NewWindow1.xaml w edytorze.", + "symbols/namespace/description": "przestrzeń nazw wygenerowanego kodu." +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pt-BR.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pt-BR.json new file mode 100644 index 000000000000..6d8ce9e50553 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.pt-BR.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": "Window do .NET MAUI (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Abre NewWindow1.xaml no editor.", + "symbols/namespace/description": "namespace do código gerado" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ru.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ru.json new file mode 100644 index 000000000000..af580f1178e0 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.ru.json @@ -0,0 +1,7 @@ +{ + "author": "Майкрософт", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Открывает NewWindow1.xaml в редакторе.", + "symbols/namespace/description": "пространство имен для созданного кода" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.tr.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.tr.json new file mode 100644 index 000000000000..7e92283b8b58 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.tr.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "Düzenleyicide NewWindow1.xaml dosyasını açar.", + "symbols/namespace/description": "oluşturulan kod için ad alanı" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hans.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hans.json new file mode 100644 index 000000000000..f758e7dedf20 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hans.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "在编辑器中打开 NewWindow1.xaml。", + "symbols/namespace/description": "生成的代码的命名空间" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hant.json b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hant.json new file mode 100644 index 000000000000..3d1eda8f9aee --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hant.json @@ -0,0 +1,7 @@ +{ + "author": "Microsoft", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "postActions/openInEditor/description": "在編輯器中開啟 NewWindow1.xaml。", + "symbols/namespace/description": "適用於產生之程式碼的命名空間" +} \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/.template.config/template.json b/src/Templates/src/templates/maui-window-xaml/.template.config/template.json new file mode 100644 index 000000000000..17c8f482f0a0 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/.template.config/template.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json.schemastore.org/template", + "author": "Microsoft", + "classifications": [ "MAUI", "Android", "iOS", "macOS", "Mac Catalyst", "WinUI", "Tizen", "Xaml", "Code" ], + "identity": "Microsoft.Maui.XamlWindow.DOTNET_TFM_VERSION_VALUE", + "groupIdentity": "Microsoft.Maui.XamlWindow", + "precedence": "DOTNET_TFM_VERSION_MAJOR_VALUE", + "name": ".NET MAUI Window (XAML)", + "description": "A window for displaying a page using XAML.", + "shortName": "maui-window-xaml", + "tags": { + "language": "C#", + "type": "item" + }, + "primaryOutputs": [ + { + "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")", + "path": "NewWindow1.xaml" + }, + { + "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")", + "path": "NewWindow1.xaml.cs" + } + ], + "postActions": [ + { + "id": "openInEditor", + "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")", + "description": "Opens NewWindow1.xaml in the editor.", + "manualInstructions": [], + "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6", + "args": { + "files": "0" + }, + "continueOnError": true + } + ], + "sourceName": "NewWindow1", + "defaultName": "NewWindow1", + "symbols": { + "namespace": { + "description": "namespace for the generated code", + "replaces": "MauiApp1", + "type": "parameter" + } + } + } diff --git a/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml b/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml new file mode 100644 index 000000000000..ef6678c5c2d0 --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/src/Templates/src/templates/maui-window-xaml/NewWindow1xaml.cs b/src/Templates/src/templates/maui-window-xaml/NewWindow1xaml.cs new file mode 100644 index 000000000000..19f8637a8f2d --- /dev/null +++ b/src/Templates/src/templates/maui-window-xaml/NewWindow1xaml.cs @@ -0,0 +1,19 @@ +namespace MauiApp1; + +public partial class NewWindow1 : Window +{ + public NewWindow1() + { + InitializeComponent(); + Page = new ContentPage() + { + Content = new VerticalStackLayout + { + Children = { + new Label { HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, Text = "Welcome to .NET MAUI!" + } + } + } + }; + } +} \ No newline at end of file From 6c3ee5e625f9417d8fbd764aed831cdd1e097451 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 18 Jul 2024 15:19:33 -0500 Subject: [PATCH 04/16] - fixes --- src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt | 1 + .../src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt | 1 + .../src/templates/maui-window-xaml/NewWindow1.xaml | 6 ------ 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt index 4549b04752be..d06828b0f191 100644 --- a/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt @@ -167,6 +167,7 @@ virtual Microsoft.Maui.MauiUIApplicationDelegate.ReceivedRemoteNotification(UIKi Microsoft.Maui.Platform.MauiView.CacheMeasureConstraints(double widthConstraint, double heightConstraint) -> void Microsoft.Maui.Platform.MauiView.InvalidateConstraintsCache() -> void Microsoft.Maui.Platform.MauiView.IsMeasureValid(double widthConstraint, double heightConstraint) -> bool +Microsoft.Maui.Platform.UIWindowExtensions *REMOVED*override Microsoft.Maui.Platform.ContentView.SetNeedsLayout() -> void *REMOVED*override Microsoft.Maui.Platform.ContentView.SizeThatFits(CoreGraphics.CGSize size) -> CoreGraphics.CGSize *REMOVED*override Microsoft.Maui.Platform.LayoutView.LayoutSubviews() -> void diff --git a/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt index de081f7cc423..edf21f56b339 100644 --- a/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt @@ -48,6 +48,7 @@ Microsoft.Maui.Platform.MauiView.CrossPlatformLayout.get -> Microsoft.Maui.ICros Microsoft.Maui.Platform.MauiView.CrossPlatformLayout.set -> void Microsoft.Maui.Platform.MauiView.InvalidateConstraintsCache() -> void Microsoft.Maui.Platform.MauiView.IsMeasureValid(double widthConstraint, double heightConstraint) -> bool +Microsoft.Maui.Platform.UIWindowExtensions Microsoft.Maui.SizeRequest.Equals(Microsoft.Maui.SizeRequest other) -> bool Microsoft.Maui.Platform.MauiScrollView Microsoft.Maui.Platform.MauiScrollView.MauiScrollView() -> void diff --git a/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml b/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml index ef6678c5c2d0..d24ab7f794dc 100644 --- a/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml +++ b/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml @@ -3,10 +3,4 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MauiApp1.NewWindow1" Title="NewWindow1"> - - \ No newline at end of file From 83f8c8fff668b346106a3387d053ac753597118d Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 18 Jul 2024 16:24:07 -0500 Subject: [PATCH 05/16] - fix naming --- .../maui-window-xaml/{NewWindow1xaml.cs => NewWindow1.xaml.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Templates/src/templates/maui-window-xaml/{NewWindow1xaml.cs => NewWindow1.xaml.cs} (100%) diff --git a/src/Templates/src/templates/maui-window-xaml/NewWindow1xaml.cs b/src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml.cs similarity index 100% rename from src/Templates/src/templates/maui-window-xaml/NewWindow1xaml.cs rename to src/Templates/src/templates/maui-window-xaml/NewWindow1.xaml.cs From 61bd069fa48f3ad4c7ddaae95d7e38cfb1efff0f Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Thu, 18 Jul 2024 17:04:46 -0500 Subject: [PATCH 06/16] - fix mainpage --- .../TestCases.HostApp/CoreViews/CorePageView.cs | 2 +- .../tests/TestCases.HostApp/Issues/Issue11501.cs | 16 ++++++++-------- .../tests/TestCases.HostApp/Issues/Issue17490.cs | 2 +- .../tests/TestCases.HostApp/Issues/Issue19955.cs | 4 ++-- .../TestCases.HostApp/Issues/Issue20439.xaml.cs | 2 +- .../TestCases.HostApp/Issues/Issue20696.xaml.cs | 2 +- .../TestCases.HostApp/Issues/Issue21630.xaml.cs | 6 +++--- .../Issues/Issue21630_navPage.xaml.cs | 2 +- .../tests/TestCases.HostApp/MauiProgram.cs | 8 +------- .../Android/Issue21109NumericKeyListener.cs | 3 ++- .../tests/TestCases.HostApp/TestCases.cs | 2 +- 11 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs b/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs index 81c73b5107c6..8a90fd115507 100644 --- a/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs +++ b/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs @@ -136,7 +136,7 @@ public CorePageView(Page rootPage) var realize = page.Realize(); if (realize is Shell) { - Application.Current.MainPage = realize; + this.Window.Page = realize; } else { diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs index d5154fc75091..1ab8b6f12601 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs @@ -30,7 +30,7 @@ public TestPage() private void OnLoaded(object sender, EventArgs e) { _window = Window; - _mainPage = Application.Current.MainPage; + _mainPage = this.Window.Page; _modalStack = Navigation.ModalStack.ToList(); } @@ -66,13 +66,13 @@ protected override void Init() AutomationId = "SwapMainPage", Command = new Command( () => { - Application.Current.MainPage = + this.Window.Page = new ContentPage() { Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; ConnectToWindow(); _currentTest = () => { - Application.Current.MainPage = CreateDestinationPage(); + this.Window.Page = CreateDestinationPage(); return Task.CompletedTask; }; }) @@ -92,7 +92,7 @@ protected override void Init() }, }; - Application.Current.MainPage = flyoutPage; + this.Window.Page = flyoutPage; ConnectToWindow(); _currentTest = () => @@ -110,11 +110,11 @@ protected override void Init() AutomationId = "SwapTabbedPage", Command = new Command( () => { - Application.Current.MainPage = new ContentPage() { Title = "Test", Content = new Label() {AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; + this.Window.Page = new ContentPage() { Title = "Test", Content = new Label() {AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; ConnectToWindow(); _currentTest = () => { - Application.Current.MainPage = new TabbedPage() + this.Window.Page = new TabbedPage() { Children = { @@ -147,7 +147,7 @@ protected override void Init() } }; - Application.Current.MainPage = tabbedPage; + this.Window.Page = tabbedPage; ConnectToWindow(); _currentTest = () => @@ -174,7 +174,7 @@ ContentPage CreateDestinationPage() Text = "Restore", Command = new Command(async ()=> { - Application.Current.MainPage = _mainPage; + this.Window.Page = _mainPage; await Task.Yield(); diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs index 73e8e0eb818a..2d96b6e44dcc 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs @@ -62,7 +62,7 @@ protected override void OnHandlerChanged() return; } - var mainWindowHandle = (Application.Current.MainPage.Window.Handler.PlatformView as MauiWinUIWindow).GetWindowHandle(); + var mainWindowHandle = (this.Window.Page.Window.Handler.PlatformView as MauiWinUIWindow).GetWindowHandle(); var childWindowHandle = (Handler.PlatformView as MauiWinUIWindow).GetWindowHandle(); Platform.PlatformMethods.SetParent(childWindowHandle, mainWindowHandle); diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue19955.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue19955.cs index 53cfc0dcff9e..5224ec2e1376 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue19955.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue19955.cs @@ -64,7 +64,7 @@ public FirstPage() async void Button_Clicked() { - await Application.Current.MainPage.Navigation.PushAsync(new SecondPage()); + await this.Window.Page.Navigation.PushAsync(new SecondPage()); } } @@ -84,7 +84,7 @@ public SecondPage() async void Button_Clicked() { - await Application.Current.MainPage.Navigation.PopAsync(); + await this.Window.Page.Navigation.PopAsync(); } } } diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue20439.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue20439.xaml.cs index 5f115ae07e1e..82409fce194d 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue20439.xaml.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue20439.xaml.cs @@ -16,7 +16,7 @@ public Issue20439Test() { Text = "Go To Test", AutomationId = "GoToTest", - Command = new Command(() => Application.Current.MainPage = new Issue20439()) + Command = new Command(() => this.Window.Page = new Issue20439()) } } }; diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue20696.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue20696.xaml.cs index 35e12653e8f8..0a952bc3a8cf 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue20696.xaml.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue20696.xaml.cs @@ -18,7 +18,7 @@ public Issue20696Test() { Text = "Go To Test", AutomationId = "GoToTest", - Command = new Command(() => Application.Current.MainPage = new Issue20696()) + Command = new Command(() => this.Window.Page = new Issue20696()) } } }; diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue21630.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue21630.xaml.cs index b27ef44a8bff..a202ad0c19e4 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue21630.xaml.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue21630.xaml.cs @@ -21,17 +21,17 @@ public Issue21630() private void OnLoaded(object sender, EventArgs e) { - _page = Application.Current.MainPage; + _page = this.Window.Page; _modalStack = Navigation.ModalStack.ToList(); } void SwapMainPageNav (object sender, EventArgs e) { - Application.Current.MainPage = new NavigationPage(new Issue21630_navPage(_page, _modalStack)); + this.Window.Page = new NavigationPage(new Issue21630_navPage(_page, _modalStack)); } void SwapMainPageShell (object sender, EventArgs e) { - Application.Current.MainPage = new Issue21630_shellPage(_page, _modalStack); + this.Window.Page = new Issue21630_shellPage(_page, _modalStack); } } diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue21630_navPage.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue21630_navPage.xaml.cs index 5b6302e7824f..70fae48bf501 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue21630_navPage.xaml.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue21630_navPage.xaml.cs @@ -37,7 +37,7 @@ void FocusNavBarEntryShell (object sender, EventArgs e) async void RestoreMainPage (object sender, EventArgs e) { - Application.Current.MainPage = _page; + this.Window.Page = _page; await Task.Yield(); foreach(var page in _modalStack) diff --git a/src/Controls/tests/TestCases.HostApp/MauiProgram.cs b/src/Controls/tests/TestCases.HostApp/MauiProgram.cs index d7bb7df073df..424554702bf8 100644 --- a/src/Controls/tests/TestCases.HostApp/MauiProgram.cs +++ b/src/Controls/tests/TestCases.HostApp/MauiProgram.cs @@ -36,16 +36,10 @@ class App : Application public App() { - SetMainPage(CreateDefaultMainPage()); } public static bool PreloadTestCasesIssuesList { get; set; } = true; - public void SetMainPage(Page rootPage) - { - MainPage = rootPage; - } - public Page CreateDefaultMainPage() { return new CoreNavigationPage(); @@ -59,7 +53,7 @@ protected override void OnAppLinkRequestReceived(Uri uri) #if WINDOWS || MACCATALYST protected override Window CreateWindow(IActivationState activationState) { - var window = base.CreateWindow(activationState); + var window = new Window(CreateDefaultMainPage()); // For desktop use a fixed window size, so that screenshots are deterministic, // matching (as much as possible) between dev machines and CI. Currently diff --git a/src/Controls/tests/TestCases.HostApp/Platforms/Android/Issue21109NumericKeyListener.cs b/src/Controls/tests/TestCases.HostApp/Platforms/Android/Issue21109NumericKeyListener.cs index 9ce1099c40bf..4c9bb4e6bec1 100644 --- a/src/Controls/tests/TestCases.HostApp/Platforms/Android/Issue21109NumericKeyListener.cs +++ b/src/Controls/tests/TestCases.HostApp/Platforms/Android/Issue21109NumericKeyListener.cs @@ -2,6 +2,7 @@ using Android.Text.Method; using Android.Views; using Microsoft.Maui.Controls; +using Microsoft.Maui.Platform; using AView = Android.Views.View; namespace Maui.Controls.Sample.Platform; @@ -19,7 +20,7 @@ public Issue21109NumericKeyListener(InputTypes inputType) public override bool OnKeyDown(AView view, IEditable content, Keycode keyCode, KeyEvent e) { - Application.Current.MainPage.DisplayAlert("OnKeyDown", string.Empty, "Ok"); + ((Microsoft.Maui.Controls.Window)view.Context.GetWindow()).Page.DisplayAlert("OnKeyDown", string.Empty, "Ok"); return base.OnKeyDown(view, content, keyCode, e); } } \ No newline at end of file diff --git a/src/Controls/tests/TestCases.HostApp/TestCases.cs b/src/Controls/tests/TestCases.HostApp/TestCases.cs index a8341e1fcf1d..465e03a89df2 100644 --- a/src/Controls/tests/TestCases.HostApp/TestCases.cs +++ b/src/Controls/tests/TestCases.HostApp/TestCases.cs @@ -58,7 +58,7 @@ Action ActivatePageAndNavigate(IssueAttribute issueAttribute, Type type) return () => { var page = ActivatePage(type); - Application.Current.MainPage = page; + this.Window.Page = page; }; } From edcc273e8f6576232d06ab02a86003e4e131cf34 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Fri, 19 Jul 2024 12:55:30 -0500 Subject: [PATCH 07/16] Update WindowTests.cs --- src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs b/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs index 4fdd4e279896..0cb9d3c78c27 100644 --- a/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs +++ b/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs @@ -73,7 +73,7 @@ public async Task ChangingToNewMauiContextDoesntCrash(bool useAppMainPage, Type if (useAppMainPage) { var app = ApplicationServices.GetService() as ApplicationStub; - app.MainPage = rootPage; + app.Windows[0].Page = rootPage; window = await InvokeOnMainThreadAsync(() => (app as IApplication).CreateWindow(null)); } From 403c8d060143f6ab778b4b5d2a6e288795a8895d Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sat, 20 Jul 2024 15:25:51 -0500 Subject: [PATCH 08/16] - restore mainpage test --- src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs b/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs index 0cb9d3c78c27..741d35ec91d7 100644 --- a/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs +++ b/src/Controls/tests/DeviceTests/Elements/Window/WindowTests.cs @@ -73,7 +73,9 @@ public async Task ChangingToNewMauiContextDoesntCrash(bool useAppMainPage, Type if (useAppMainPage) { var app = ApplicationServices.GetService() as ApplicationStub; - app.Windows[0].Page = rootPage; +#pragma warning disable CS0618 // Type or member is obsolete + app.MainPage = rootPage; +#pragma warning restore CS0618 // Type or member is obsolete window = await InvokeOnMainThreadAsync(() => (app as IApplication).CreateWindow(null)); } From 687933913c495e8025122dfad34c95282ad95f30 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sat, 20 Jul 2024 16:38:28 -0500 Subject: [PATCH 09/16] - fix --- src/Controls/tests/TestCases.HostApp/MauiProgram.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Controls/tests/TestCases.HostApp/MauiProgram.cs b/src/Controls/tests/TestCases.HostApp/MauiProgram.cs index 424554702bf8..c22c2bd8a985 100644 --- a/src/Controls/tests/TestCases.HostApp/MauiProgram.cs +++ b/src/Controls/tests/TestCases.HostApp/MauiProgram.cs @@ -50,10 +50,10 @@ protected override void OnAppLinkRequestReceived(Uri uri) base.OnAppLinkRequestReceived(uri); } -#if WINDOWS || MACCATALYST protected override Window CreateWindow(IActivationState activationState) { var window = new Window(CreateDefaultMainPage()); +#if WINDOWS || MACCATALYST // For desktop use a fixed window size, so that screenshots are deterministic, // matching (as much as possible) between dev machines and CI. Currently @@ -85,9 +85,10 @@ protected override Window CreateWindow(IActivationState activationState) window.MinimumHeight = desktopWindowHeight; #endif +#endif + return window; } -#endif } } \ No newline at end of file From 44fedfcd2423e27326353280fd919db67fa57846 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sun, 21 Jul 2024 11:14:55 -0500 Subject: [PATCH 10/16] - fix page setter --- src/Controls/tests/TestCases.HostApp/TestCases.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/tests/TestCases.HostApp/TestCases.cs b/src/Controls/tests/TestCases.HostApp/TestCases.cs index 465e03a89df2..75e30c85cd7e 100644 --- a/src/Controls/tests/TestCases.HostApp/TestCases.cs +++ b/src/Controls/tests/TestCases.HostApp/TestCases.cs @@ -58,7 +58,7 @@ Action ActivatePageAndNavigate(IssueAttribute issueAttribute, Type type) return () => { var page = ActivatePage(type); - this.Window.Page = page; + Application.Current.Windows[0].Page = page; }; } From d5b239bef8b1f66896c110f48486f297f3d65718 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sun, 21 Jul 2024 12:13:04 -0500 Subject: [PATCH 11/16] - fix essentials --- src/Essentials/samples/Samples/App.xaml.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Essentials/samples/Samples/App.xaml.cs b/src/Essentials/samples/Samples/App.xaml.cs index f25fecea37f9..fe621f9cf5cb 100644 --- a/src/Essentials/samples/Samples/App.xaml.cs +++ b/src/Essentials/samples/Samples/App.xaml.cs @@ -1,6 +1,8 @@ using System.Diagnostics; +using Microsoft.Maui; using Microsoft.Maui.ApplicationModel; using Microsoft.Maui.Controls; +using Microsoft.Maui.Controls.PlatformConfiguration; using Microsoft.Maui.Controls.Xaml; using Samples.View; using Device = Microsoft.Maui.Controls.Device; @@ -14,8 +16,11 @@ public partial class App : Application public App() { InitializeComponent(); + } - MainPage = new NavigationPage(new HomePage()); + protected override Window CreateWindow(IActivationState activationState) + { + return new Window(new NavigationPage(new HomePage())); } public static void HandleAppActions(AppAction appAction) @@ -31,8 +36,8 @@ public static void HandleAppActions(AppAction appAction) if (page != null) { - await Application.Current.MainPage.Navigation.PopToRootAsync(); - await Application.Current.MainPage.Navigation.PushAsync(page); + await Application.Current.Windows[0].Page.Navigation.PopToRootAsync(); + await Application.Current.Windows[0].Page.Navigation.PushAsync(page); } }); } From b44b0906ddaa4f84c3cbf36b18602e5fdca4abd1 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sun, 21 Jul 2024 12:15:09 -0500 Subject: [PATCH 12/16] - winui fix --- src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs index 2d96b6e44dcc..34d8730375c1 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue17490.cs @@ -62,7 +62,7 @@ protected override void OnHandlerChanged() return; } - var mainWindowHandle = (this.Window.Page.Window.Handler.PlatformView as MauiWinUIWindow).GetWindowHandle(); + var mainWindowHandle = (Application.Current.Windows[0].Handler.PlatformView as MauiWinUIWindow).GetWindowHandle(); var childWindowHandle = (Handler.PlatformView as MauiWinUIWindow).GetWindowHandle(); Platform.PlatformMethods.SetParent(childWindowHandle, mainWindowHandle); From 860b4a21a667c2bdc8233f6df10072efebb9cd6e Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sun, 21 Jul 2024 13:02:18 -0500 Subject: [PATCH 13/16] - more fixes --- .../samples/Samples/ViewModel/TextToSpeechViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Essentials/samples/Samples/ViewModel/TextToSpeechViewModel.cs b/src/Essentials/samples/Samples/ViewModel/TextToSpeechViewModel.cs index f84cd8fac83c..53283c208d56 100644 --- a/src/Essentials/samples/Samples/ViewModel/TextToSpeechViewModel.cs +++ b/src/Essentials/samples/Samples/ViewModel/TextToSpeechViewModel.cs @@ -97,7 +97,7 @@ async Task OnPickLocale() .Select(i => string.IsNullOrEmpty(i.Country) ? i.Language : $"{i.Language} ({i.Country})") .ToArray(); - var result = await Application.Current.MainPage.DisplayActionSheet("Pick", "OK", null, languages); + var result = await Application.Current.Windows[0].Page.DisplayActionSheet("Pick", "OK", null, languages); if (!string.IsNullOrEmpty(result) && Array.IndexOf(languages, result) is int idx && idx != -1) { From a94607206d651deb996b370e7724bbe445c08de8 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sun, 21 Jul 2024 17:41:26 -0500 Subject: [PATCH 14/16] - fix --- .../ControlGallery/src/iOS/AppDelegate.cs | 2 +- .../TestCases.HostApp/Issues/Issue11501.cs | 184 +++++++++--------- src/ProfiledAot/src/maui/MainPage.xaml.cs | 2 +- .../MauiApp.1/App.xaml.cs | 5 +- 4 files changed, 98 insertions(+), 95 deletions(-) diff --git a/src/Compatibility/ControlGallery/src/iOS/AppDelegate.cs b/src/Compatibility/ControlGallery/src/iOS/AppDelegate.cs index 5a4d415ac351..f5de87919a98 100644 --- a/src/Compatibility/ControlGallery/src/iOS/AppDelegate.cs +++ b/src/Compatibility/ControlGallery/src/iOS/AppDelegate.cs @@ -162,7 +162,7 @@ public void StartPressed40911() button.TouchUpInside += (sender, e) => { - Maui.Controls.Application.Current.MainPage = new ContentPage { Content = new Label { Text = "40911 Success" } }; + Maui.Controls.Application.Current.Windows[0].Page = new ContentPage { Content = new Label { Text = "40911 Success" } }; loginViewController.DismissViewController(true, null); }; diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs index 1ab8b6f12601..b894fd1f283f 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs @@ -59,106 +59,106 @@ void DisconnectFromWindow() protected override void Init() { Content = new VerticalStackLayout() - { - new Button() { - Text = "Swap Main Page", - AutomationId = "SwapMainPage", - Command = new Command( () => + new Button() { - this.Window.Page = - new ContentPage() { Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; - - ConnectToWindow(); - _currentTest = () => + Text = "Swap Main Page", + AutomationId = "SwapMainPage", + Command = new Command( () => { - this.Window.Page = CreateDestinationPage(); - return Task.CompletedTask; - }; - }) - }, - new Button() - { - Text = "Changing Details/Flyout on FlyoutPage in Background", - AutomationId = "SwapFlyoutPage", - Command = new Command(()=> + this.Window.Page = + new ContentPage() { Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; + + ConnectToWindow(); + _currentTest = () => + { + this.Window.Page = CreateDestinationPage(); + return Task.CompletedTask; + }; + }) + }, + new Button() { - var flyoutPage = new FlyoutPage() + Text = "Changing Details/Flyout on FlyoutPage in Background", + AutomationId = "SwapFlyoutPage", + Command = new Command(()=> { - Flyout = new ContentPage() { Title = "Test", Content = new Label(){Text = "Background/Minimize the app" } }, - Detail = new NavigationPage(new ContentPage(){ Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }) + var flyoutPage = new FlyoutPage() { - Title = "Test" - }, - }; + Flyout = new ContentPage() { Title = "Test", Content = new Label(){Text = "Background/Minimize the app" } }, + Detail = new NavigationPage(new ContentPage(){ Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }) + { + Title = "Test" + }, + }; - this.Window.Page = flyoutPage; - ConnectToWindow(); + this.Window.Page = flyoutPage; + ConnectToWindow(); - _currentTest = () => - { - flyoutPage.Flyout = CreateDestinationPage(); - flyoutPage.Detail = new NavigationPage(CreateDestinationPage()); - return Task.CompletedTask; - }; - }) - }, - - new Button() - { - Text = "Swap Tabbed Page", - AutomationId = "SwapTabbedPage", - Command = new Command( () => + _currentTest = () => + { + flyoutPage.Flyout = CreateDestinationPage(); + flyoutPage.Detail = new NavigationPage(CreateDestinationPage()); + return Task.CompletedTask; + }; + }) + }, + + new Button() { - this.Window.Page = new ContentPage() { Title = "Test", Content = new Label() {AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; - ConnectToWindow(); - _currentTest = () => + Text = "Swap Tabbed Page", + AutomationId = "SwapTabbedPage", + Command = new Command( () => { - this.Window.Page = new TabbedPage() + this.Window.Page = new ContentPage() { Title = "Test", Content = new Label() {AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; + ConnectToWindow(); + _currentTest = () => { - Children = + this.Window.Page = new TabbedPage() { - new NavigationPage(CreateDestinationPage()) + Children = { - Title = "Test" - }, - new ContentPage() { Title = "Test", Content = new Label(){Text = "Second Page" } }, - } + new NavigationPage(CreateDestinationPage()) + { + Title = "Test" + }, + new ContentPage() { Title = "Test", Content = new Label(){Text = "Second Page" } }, + } + }; + return Task.CompletedTask; }; - return Task.CompletedTask; - }; - }) - }, - new Button() - { - Text = "Removing and Changing Tabs", - AutomationId = "RemoveAddTabs", - Command = new Command(() => + }) + }, + new Button() { - var tabbedPage = new TabbedPage() + Text = "Removing and Changing Tabs", + AutomationId = "RemoveAddTabs", + Command = new Command(() => { - Children = + var tabbedPage = new TabbedPage() { - new ContentPage() { Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }, - new NavigationPage(CreateDestinationPage()) + Children = { - Title = "Test" + new ContentPage() { Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }, + new NavigationPage(CreateDestinationPage()) + { + Title = "Test" + } } - } - }; + }; - this.Window.Page = tabbedPage; - ConnectToWindow(); + this.Window.Page = tabbedPage; + ConnectToWindow(); - _currentTest = () => - { - tabbedPage.Children.RemoveAt(0); - tabbedPage.Children.Add(CreateDestinationPage()); - return Task.CompletedTask; - }; - }) - }, - }; + _currentTest = () => + { + tabbedPage.Children.RemoveAt(0); + tabbedPage.Children.Add(CreateDestinationPage()); + return Task.CompletedTask; + }; + }) + }, + }; } ContentPage CreateDestinationPage() @@ -167,24 +167,24 @@ ContentPage CreateDestinationPage() { Title = "Test", Content = new VerticalStackLayout() - { - new Button() { - AutomationId = "Restore", - Text = "Restore", - Command = new Command(async ()=> + new Button() { - this.Window.Page = _mainPage; + AutomationId = "Restore", + Text = "Restore", + Command = new Command(async ()=> + { + Application.Current.Windows[0].Page = _mainPage; - await Task.Yield(); + await Task.Yield(); - foreach(var page in _modalStack) - { - await _mainPage.Navigation.PushModalAsync(page); - } - }) + foreach(var page in _modalStack) + { + await _mainPage.Navigation.PushModalAsync(page); + } + }) + } } - } }; } } diff --git a/src/ProfiledAot/src/maui/MainPage.xaml.cs b/src/ProfiledAot/src/maui/MainPage.xaml.cs index 865da1575a23..af7ebb7c1b04 100644 --- a/src/ProfiledAot/src/maui/MainPage.xaml.cs +++ b/src/ProfiledAot/src/maui/MainPage.xaml.cs @@ -35,7 +35,7 @@ async void LoadFlyoutPage() if (_isLoaded && _startCompleted && Application.Current != null) { await Task.Delay(500); - Application.Current.MainPage = new AppFlyoutPage(); + Application.Current.Windows[0].Page = new AppFlyoutPage(); } } diff --git a/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs b/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs index 666dfbf75975..28193fa867e9 100644 --- a/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs +++ b/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs @@ -5,7 +5,10 @@ public partial class App : Application public App() { InitializeComponent(); + } - MainPage = new MainPage(); + protected override Window CreateWindow(IActivationState activationState) + { + return new Window(new MainPage()); } } From 1e442659660b8b44d780f0c2248b524dda04f0d2 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sun, 21 Jul 2024 18:48:46 -0500 Subject: [PATCH 15/16] - fix --- .../tests/TestCases.HostApp/Issues/Issue11501.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs index b894fd1f283f..0436db929c60 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue11501.cs @@ -30,7 +30,7 @@ public TestPage() private void OnLoaded(object sender, EventArgs e) { _window = Window; - _mainPage = this.Window.Page; + _mainPage = Application.Current.Windows[0].Page; _modalStack = Navigation.ModalStack.ToList(); } @@ -66,13 +66,13 @@ protected override void Init() AutomationId = "SwapMainPage", Command = new Command( () => { - this.Window.Page = + Application.Current.Windows[0].Page = new ContentPage() { Title = "Test", Content = new Label() { AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; ConnectToWindow(); _currentTest = () => { - this.Window.Page = CreateDestinationPage(); + Application.Current.Windows[0].Page = CreateDestinationPage(); return Task.CompletedTask; }; }) @@ -92,7 +92,7 @@ protected override void Init() }, }; - this.Window.Page = flyoutPage; + Application.Current.Windows[0].Page = flyoutPage; ConnectToWindow(); _currentTest = () => @@ -110,11 +110,11 @@ protected override void Init() AutomationId = "SwapTabbedPage", Command = new Command( () => { - this.Window.Page = new ContentPage() { Title = "Test", Content = new Label() {AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; + Application.Current.Windows[0].Page = new ContentPage() { Title = "Test", Content = new Label() {AutomationId = "BackgroundMe", Text = "Background/Minimize the app" } }; ConnectToWindow(); _currentTest = () => { - this.Window.Page = new TabbedPage() + Application.Current.Windows[0].Page = new TabbedPage() { Children = { @@ -147,7 +147,7 @@ protected override void Init() } }; - this.Window.Page = tabbedPage; + Application.Current.Windows[0].Page = tabbedPage; ConnectToWindow(); _currentTest = () => From c5032a401f2476d3d9d92a2da2892c46521d28ba Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Sun, 21 Jul 2024 20:41:30 -0500 Subject: [PATCH 16/16] Update App.xaml.cs --- .../src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs b/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs index 28193fa867e9..a1a067ff4484 100644 --- a/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs +++ b/src/Templates/src/templates/maui-blazor-solution/MauiApp.1/App.xaml.cs @@ -7,7 +7,7 @@ public App() InitializeComponent(); } - protected override Window CreateWindow(IActivationState activationState) + protected override Window CreateWindow(IActivationState? activationState) { return new Window(new MainPage()); }