From 4f7296f8a6ecfc8edcf5746376e99091eca993f6 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:12:26 +0530 Subject: [PATCH 01/14] fix added --- src/Controls/src/Core/TitleBar/TitleBar.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 51e0a7cbc375..a23081580c7d 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -318,6 +318,27 @@ public TitleBar() { PassthroughElements = new List(); PropertyChanged += TitleBar_PropertyChanged; + SizeChanged += (s, e) => + { + #if MACCATALYST + if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) + { + if (OperatingSystem.IsMacCatalystVersionAtLeast(16)) + { + var windowScene = uiwindow.WindowScene; + if (windowScene != null) + { + var fullScreen = windowScene.FullScreen; + if (_templateRoot is Grid contentGrid) + { + // If in fullscreen, remove left margin, otherwise set 80px margin + contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(80, 0, 0, 0); + } + } + } + } + #endif + }; if (ControlTemplate is null) { From b38dd5cdc16cf0e95492b30971d02867d1fbed67 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:40:31 +0530 Subject: [PATCH 02/14] fix modified --- src/Controls/src/Core/TitleBar/TitleBar.cs | 23 ++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index a23081580c7d..28b693b34443 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -318,9 +318,17 @@ public TitleBar() { PassthroughElements = new List(); PropertyChanged += TitleBar_PropertyChanged; - SizeChanged += (s, e) => - { - #if MACCATALYST + SizeChanged += OnSizeChanged; + + if (ControlTemplate is null) + { + ControlTemplate = DefaultTemplate; + } + } + + void OnSizeChanged(object sender, EventArgs e) + { +#if MACCATALYST if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) { if (OperatingSystem.IsMacCatalystVersionAtLeast(16)) @@ -337,18 +345,13 @@ public TitleBar() } } } - #endif - }; - - if (ControlTemplate is null) - { - ControlTemplate = DefaultTemplate; - } +#endif } internal void Cleanup() { PropertyChanged -= TitleBar_PropertyChanged; + SizeChanged -= OnSizeChanged; if (Window is not null) { Window.Activated -= Window_Activated; From 0796d48acdaec3b5fdc42bdf6b734d35e11cede1 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:00:21 +0530 Subject: [PATCH 03/14] changes updated --- src/Controls/src/Core/TitleBar/TitleBar.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 28b693b34443..7bc6cf36c65e 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -326,7 +326,7 @@ public TitleBar() } } - void OnSizeChanged(object sender, EventArgs e) + void OnSizeChanged(object? sender, EventArgs e) { #if MACCATALYST if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) From c49cf5aaadd24f0d936860c9c1b96a3a8d2bfc01 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Wed, 2 Jul 2025 16:04:40 +0530 Subject: [PATCH 04/14] test case added --- src/Controls/src/Core/TitleBar/TitleBar.cs | 2 + .../TestCases.HostApp/Issues/Issue30248.cs | 50 +++++++++++++++++++ .../Tests/Issues/Issue30248.cs | 25 ++++++++++ 3 files changed, 77 insertions(+) create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 7bc6cf36c65e..949ffb9cdfc4 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -318,7 +318,9 @@ public TitleBar() { PassthroughElements = new List(); PropertyChanged += TitleBar_PropertyChanged; +#if MACCATALYST SizeChanged += OnSizeChanged; +#endif if (ControlTemplate is null) { diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs new file mode 100644 index 000000000000..39eed839ff89 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs @@ -0,0 +1,50 @@ +namespace Maui.Controls.Sample.Issues; + +[Issue(IssueTracker.Github, 30248, "TitleBar, MacCatalyst - content is not aligned to left on fullscreen", PlatformAffected.macOS)] + +public class Issue30248 : ContentPage +{ + public Issue30248() + { + Title = "Issue 30248"; + + // Create TitleBar + var titleBar = new TitleBar + { + Title = "Maui App", + Subtitle = "Hello, World!", + ForegroundColor = Colors.Red, + HeightRequest = 48 + }; + + titleBar.LeadingContent = new Image {Source = "dotnet_bot.png", HeightRequest = 24}; + + // Set the TitleBar on the current Window when this page appears + this.Loaded += (sender, e) => + { + if (Window != null) + { + Window.TitleBar = titleBar; + } + }; + + // Create the page content with a Label + Content = new VerticalStackLayout + { + Spacing = 25, + Padding = new Thickness(30), + VerticalOptions = LayoutOptions.Center, + Children = + { + new Label + { + Text = "TitleBar should be aligned to the left in fullscreen mode", + AutomationId = "TitleBarAlignmentLabel", + FontSize = 32, + HorizontalOptions = LayoutOptions.Center + }, + } + }; + } +} + diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs new file mode 100644 index 000000000000..f74d1a50117c --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs @@ -0,0 +1,25 @@ +#if MACCATALYST //This is the Mac Specific issue, so restricting other platforms +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests.Issues; + +public class Issue30248 : _IssuesUITest +{ + public override string Issue => "TitleBar, MacCatalyst - content is not aligned to left on fullscreen"; + + public Issue30248(TestDevice device) + : base(device) + { } + + [Test] + [Category(UITestCategories.Window)] + public void VerifyTitleBarContentinFullScreenmode() + { + App.WaitForElement("TitleBarAlignmentLabel"); + App.EnterFullScreen(); + VerifyScreenshot(includeTitleBar: true); + } +} +#endif \ No newline at end of file From baf4ec3957eb31695d7ac324915e0b1867e6e70c Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Wed, 2 Jul 2025 18:49:36 +0530 Subject: [PATCH 05/14] platform condition updated --- src/Controls/src/Core/TitleBar/TitleBar.cs | 38 ++++++++++++---------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 949ffb9cdfc4..f2337ef8f57f 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -328,32 +328,34 @@ public TitleBar() } } +#if MACCATALYST void OnSizeChanged(object? sender, EventArgs e) { -#if MACCATALYST - if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) - { - if (OperatingSystem.IsMacCatalystVersionAtLeast(16)) - { - var windowScene = uiwindow.WindowScene; - if (windowScene != null) - { - var fullScreen = windowScene.FullScreen; - if (_templateRoot is Grid contentGrid) - { - // If in fullscreen, remove left margin, otherwise set 80px margin - contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(80, 0, 0, 0); - } - } - } - } -#endif + if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) + { + if (OperatingSystem.IsMacCatalystVersionAtLeast(16)) + { + var windowScene = uiwindow.WindowScene; + if (windowScene != null) + { + var fullScreen = windowScene.FullScreen; + if (_templateRoot is Grid contentGrid) + { + // If in fullscreen, remove left margin, otherwise set 80px margin + contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(80, 0, 0, 0); + } + } + } + } } +#endif internal void Cleanup() { PropertyChanged -= TitleBar_PropertyChanged; +#if MACCATALYST SizeChanged -= OnSizeChanged; +#endif if (Window is not null) { Window.Activated -= Window_Activated; From 864f4d235f8cc1bb7e5203eaeeb1a03fd12b9a9d Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Thu, 3 Jul 2025 18:19:59 +0530 Subject: [PATCH 06/14] mac snapshot added --- src/Controls/src/Core/TitleBar/TitleBar.cs | 3 ++- .../VerifyTitleBarContentinFullScreenmode.png | Bin 0 -> 35563 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/Controls/tests/TestCases.Mac.Tests/snapshots/mac/VerifyTitleBarContentinFullScreenmode.png diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index f2337ef8f57f..98d796a655c7 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -58,6 +58,7 @@ static int GetMacCatalystLeadingMargin() => // Margin space (150px) required for Windows title bar system buttons const int WindowsMargin = 150; + // Margin space (80px) required for Mac Catalyst window traffic light controls when not in fullscreen /// Bindable property for . public static readonly BindableProperty IconProperty = BindableProperty.Create(nameof(Icon), typeof(ImageSource), @@ -342,7 +343,7 @@ void OnSizeChanged(object? sender, EventArgs e) if (_templateRoot is Grid contentGrid) { // If in fullscreen, remove left margin, otherwise set 80px margin - contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(80, 0, 0, 0); + contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(MacCatalystMargin, 0, 0, 0); } } } diff --git a/src/Controls/tests/TestCases.Mac.Tests/snapshots/mac/VerifyTitleBarContentinFullScreenmode.png b/src/Controls/tests/TestCases.Mac.Tests/snapshots/mac/VerifyTitleBarContentinFullScreenmode.png new file mode 100644 index 0000000000000000000000000000000000000000..904c43285e23a0ccbd23b379e85481d7c4d66461 GIT binary patch literal 35563 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 Date: Fri, 4 Jul 2025 11:33:37 +0530 Subject: [PATCH 07/14] condition places swapped --- src/Controls/src/Core/TitleBar/TitleBar.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 98d796a655c7..878b2d066507 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -332,9 +332,9 @@ public TitleBar() #if MACCATALYST void OnSizeChanged(object? sender, EventArgs e) { - if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) + if (OperatingSystem.IsMacCatalystVersionAtLeast(16)) { - if (OperatingSystem.IsMacCatalystVersionAtLeast(16)) + if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) { var windowScene = uiwindow.WindowScene; if (windowScene != null) From 62511be092b8dc694d3b358a1c79643a9450ba49 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Tue, 24 Mar 2026 11:37:38 +0530 Subject: [PATCH 08/14] optimized the code --- src/Controls/src/Core/TitleBar/TitleBar.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 878b2d066507..ca9bb857729a 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -342,8 +342,8 @@ void OnSizeChanged(object? sender, EventArgs e) var fullScreen = windowScene.FullScreen; if (_templateRoot is Grid contentGrid) { - // If in fullscreen, remove left margin, otherwise set 80px margin - contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(MacCatalystMargin, 0, 0, 0); + // If in fullscreen, remove left margin, otherwise set version-appropriate margin + contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(GetMacCatalystLeadingMargin(), 0, 0, 0); } } } From c9fde1456ceeb9da4a63d677135d99c3c1abf904 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Tue, 2 Jun 2026 12:14:03 +0530 Subject: [PATCH 09/14] Update TitleBar.cs --- src/Controls/src/Core/TitleBar/TitleBar.cs | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index ca9bb857729a..6e511c29c224 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -54,6 +54,13 @@ public partial class TitleBar : TemplatedView, ITitleBar, ISafeAreaView #if MACCATALYST static int GetMacCatalystLeadingMargin() => OperatingSystem.IsMacCatalystVersionAtLeast(26) ? MacCatalystMarginLiquidGlass : MacCatalystMargin; + + bool IsMacCatalystFullScreen() + { + if (OperatingSystem.IsMacCatalystVersionAtLeast(16) + && Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) + { + return uiwindow.WindowScene?.FullScreen ?? false; #endif // Margin space (150px) required for Windows title bar system buttons @@ -387,6 +394,9 @@ void UpdateFlowDirectionState() : TitleBarLTRState; ApplyVisibleState(flowDirectionState); +#if MACCATALYST + ApplyMacCatalystMargin(); +#endif } internal void ApplyVisibleState(string stateGroup) @@ -457,7 +467,7 @@ static View BuildDefaultTemplate() var contentGrid = new Grid() { #if MACCATALYST - Margin = new Thickness(GetMacCatalystLeadingMargin(), 0, 0, 0), + Margin = new Thickness(0), #endif HorizontalOptions = LayoutOptions.Fill, ColumnDefinitions = @@ -659,30 +669,26 @@ static View BuildDefaultTemplate() // Left-to-Right state (default) var ltrState = new VisualState() { Name = TitleBarLTRState }; +#if !MACCATALYST ltrState.Setters.Add(new Setter() { Property = MarginProperty, TargetName = TemplateRootName, -#if MACCATALYST - Value = new Thickness(GetMacCatalystLeadingMargin(), 0, 0, 0) // System buttons on left in macOS -#else Value = new Thickness(0, 0, WindowsMargin, 0) // System buttons on right in Windows -#endif }); +#endif flowDirectionGroup.States.Add(ltrState); // Right-to-Left state var rtlState = new VisualState() { Name = TitleBarRTLState }; +#if !MACCATALYST rtlState.Setters.Add(new Setter() { Property = MarginProperty, TargetName = TemplateRootName, -#if MACCATALYST - Value = new Thickness(0, 0, GetMacCatalystLeadingMargin(), 0) // System buttons on right in macOS RTL -#else Value = new Thickness(WindowsMargin, 0, 0, 0) // System buttons on left in Windows RTL -#endif }); +#endif flowDirectionGroup.States.Add(rtlState); visualStateGroups.Add(flowDirectionGroup); From ff084437ebb88245250d0c82edf6ef5b2fa562a4 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Tue, 2 Jun 2026 12:25:57 +0530 Subject: [PATCH 10/14] Update TitleBar.cs --- src/Controls/src/Core/TitleBar/TitleBar.cs | 38 +++++++++++++--------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 6e511c29c224..8ff4b223c39d 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -61,6 +61,26 @@ bool IsMacCatalystFullScreen() && Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) { return uiwindow.WindowScene?.FullScreen ?? false; + } + + return false; + } + + void ApplyMacCatalystMargin() + { + if (_templateRoot is not Grid contentGrid) + return; + + if (IsMacCatalystFullScreen()) + { + contentGrid.Margin = new Thickness(0); + return; + } + + contentGrid.Margin = FlowDirection == FlowDirection.RightToLeft + ? new Thickness(0, 0, GetMacCatalystLeadingMargin(), 0) + : new Thickness(GetMacCatalystLeadingMargin(), 0, 0, 0); + } #endif // Margin space (150px) required for Windows title bar system buttons @@ -339,22 +359,7 @@ public TitleBar() #if MACCATALYST void OnSizeChanged(object? sender, EventArgs e) { - if (OperatingSystem.IsMacCatalystVersionAtLeast(16)) - { - if (Window?.Handler?.PlatformView is UIKit.UIWindow uiwindow) - { - var windowScene = uiwindow.WindowScene; - if (windowScene != null) - { - var fullScreen = windowScene.FullScreen; - if (_templateRoot is Grid contentGrid) - { - // If in fullscreen, remove left margin, otherwise set version-appropriate margin - contentGrid.Margin = fullScreen ? new Thickness(0) : new Thickness(GetMacCatalystLeadingMargin(), 0, 0, 0); - } - } - } - } + ApplyMacCatalystMargin(); } #endif @@ -394,6 +399,7 @@ void UpdateFlowDirectionState() : TitleBarLTRState; ApplyVisibleState(flowDirectionState); + #if MACCATALYST ApplyMacCatalystMargin(); #endif From 4db7adb05328d4939f16e1b0d2db88bf8d3e450d Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Tue, 2 Jun 2026 12:44:50 +0530 Subject: [PATCH 11/14] Update TitleBar.cs --- src/Controls/src/Core/TitleBar/TitleBar.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 8ff4b223c39d..81a305f027ef 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -69,7 +69,9 @@ bool IsMacCatalystFullScreen() void ApplyMacCatalystMargin() { if (_templateRoot is not Grid contentGrid) + { return; + } if (IsMacCatalystFullScreen()) { @@ -346,6 +348,7 @@ public TitleBar() { PassthroughElements = new List(); PropertyChanged += TitleBar_PropertyChanged; + #if MACCATALYST SizeChanged += OnSizeChanged; #endif @@ -366,9 +369,11 @@ void OnSizeChanged(object? sender, EventArgs e) internal void Cleanup() { PropertyChanged -= TitleBar_PropertyChanged; + #if MACCATALYST SizeChanged -= OnSizeChanged; #endif + if (Window is not null) { Window.Activated -= Window_Activated; @@ -403,6 +408,7 @@ void UpdateFlowDirectionState() #if MACCATALYST ApplyMacCatalystMargin(); #endif + } internal void ApplyVisibleState(string stateGroup) @@ -675,6 +681,7 @@ static View BuildDefaultTemplate() // Left-to-Right state (default) var ltrState = new VisualState() { Name = TitleBarLTRState }; + #if !MACCATALYST ltrState.Setters.Add(new Setter() { @@ -683,10 +690,12 @@ static View BuildDefaultTemplate() Value = new Thickness(0, 0, WindowsMargin, 0) // System buttons on right in Windows }); #endif + flowDirectionGroup.States.Add(ltrState); // Right-to-Left state var rtlState = new VisualState() { Name = TitleBarRTLState }; + #if !MACCATALYST rtlState.Setters.Add(new Setter() { @@ -695,6 +704,7 @@ static View BuildDefaultTemplate() Value = new Thickness(WindowsMargin, 0, 0, 0) // System buttons on left in Windows RTL }); #endif + flowDirectionGroup.States.Add(rtlState); visualStateGroups.Add(flowDirectionGroup); From b4c4f231f6f8e1841c534fcfcab1acce0e3a2cf5 Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Wed, 3 Jun 2026 14:20:24 +0530 Subject: [PATCH 12/14] AI suggestion addressed --- src/Controls/src/Core/TitleBar/TitleBar.cs | 12 ++++++++++++ .../Tests/Issues/Issue30248.cs | 12 ++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index 81a305f027ef..bdb730e46a4f 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -68,6 +68,11 @@ bool IsMacCatalystFullScreen() void ApplyMacCatalystMargin() { + if (!_isDefaultControlTemplate) + { + return; + } + if (_templateRoot is not Grid contentGrid) { return; @@ -343,6 +348,9 @@ public Color ForegroundColor static ControlTemplate? _defaultTemplate; View? _templateRoot; +#if MACCATALYST + bool _isDefaultControlTemplate; +#endif public TitleBar() { @@ -442,6 +450,10 @@ protected override void OnApplyTemplate() _templateRoot = controlTemplate?.TemplateRoot as View; +#if MACCATALYST + _isDefaultControlTemplate = ReferenceEquals(ControlTemplate, DefaultTemplate); +#endif + if (controlTemplate?.GetTemplateChild(TitleBarLeading) is IView leadingContent) { PassthroughElements.Add(leadingContent); diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs index f74d1a50117c..e8d81eb53765 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs @@ -18,8 +18,16 @@ public Issue30248(TestDevice device) public void VerifyTitleBarContentinFullScreenmode() { App.WaitForElement("TitleBarAlignmentLabel"); - App.EnterFullScreen(); - VerifyScreenshot(includeTitleBar: true); + try + { + App.EnterFullScreen(); + App.WaitForElement("TitleBarAlignmentLabel"); + VerifyScreenshot(includeTitleBar: true); + } + finally + { + App.ExitFullScreen(); + } } } #endif \ No newline at end of file From 89dfab861bb6992fb0a3ca691d527830171dc7ec Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Fri, 26 Jun 2026 13:31:16 +0530 Subject: [PATCH 13/14] test modified --- src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs | 6 ++++++ .../tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs | 1 + 2 files changed, 7 insertions(+) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs index 39eed839ff89..fa2376317792 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue30248.cs @@ -43,6 +43,12 @@ public Issue30248() FontSize = 32, HorizontalOptions = LayoutOptions.Center }, + new Button + { + Text = "Empty Button", + AutomationId = "EmptyButton", + HorizontalOptions = LayoutOptions.Center + } } }; } diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs index e8d81eb53765..7813cdad6382 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30248.cs @@ -22,6 +22,7 @@ public void VerifyTitleBarContentinFullScreenmode() { App.EnterFullScreen(); App.WaitForElement("TitleBarAlignmentLabel"); + App.Tap("EmptyButton"); VerifyScreenshot(includeTitleBar: true); } finally From 64a5fed27480a237808a8339d96f6d19b6039c9d Mon Sep 17 00:00:00 2001 From: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com> Date: Fri, 26 Jun 2026 13:39:38 +0530 Subject: [PATCH 14/14] Update TitleBar.cs --- src/Controls/src/Core/TitleBar/TitleBar.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Controls/src/Core/TitleBar/TitleBar.cs b/src/Controls/src/Core/TitleBar/TitleBar.cs index bdb730e46a4f..e851f76da6a0 100644 --- a/src/Controls/src/Core/TitleBar/TitleBar.cs +++ b/src/Controls/src/Core/TitleBar/TitleBar.cs @@ -92,7 +92,6 @@ void ApplyMacCatalystMargin() // Margin space (150px) required for Windows title bar system buttons const int WindowsMargin = 150; - // Margin space (80px) required for Mac Catalyst window traffic light controls when not in fullscreen /// Bindable property for . public static readonly BindableProperty IconProperty = BindableProperty.Create(nameof(Icon), typeof(ImageSource),