From 28b80e29432fe7c05b1625b1e20c7600e3090eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Sua=CC=81rez=20Ruiz?= Date: Sun, 18 Apr 2021 13:37:50 +0200 Subject: [PATCH 001/425] Initial commit --- ...osoft.Maui.Controls.MultiTargeting.targets | 16 ++++- Microsoft.Maui.sln | 31 ++++++++++ NuGet.config | 1 + .../Controls.Sample.Linux.csproj | 9 +++ .../samples/Controls.Sample.Linux/Program.cs | 9 +++ src/Core/src/Core.csproj | 2 +- .../src/Fonts/EmbeddedFontLoader.Linux.cs | 12 ++++ src/Core/src/Fonts/FontManager.Linux.cs | 12 ++++ src/Core/src/Fonts/IFontManager.Linux.cs | 7 +++ .../ActivityIndicatorHandler.Linux.cs | 20 +++++++ .../Handlers/Button/ButtonHandler.Linux.cs | 59 +++++++++++++++++++ .../CheckBox/CheckBoxHandler.Linux.cs | 17 ++++++ .../DatePicker/DatePickerHandler.Linux.cs | 31 ++++++++++ .../Handlers/Editor/EditorHandler.Linux.cs | 41 +++++++++++++ .../src/Handlers/Entry/EntryHandler.Linux.cs | 53 +++++++++++++++++ src/Core/src/Handlers/IViewHandler.Linux.cs | 7 +++ .../src/Handlers/Label/LabelHandler.Linux.cs | 48 +++++++++++++++ .../Handlers/Layout/LayoutHandler.Linux.cs | 20 +++++++ .../Handlers/Picker/PickerHandler.Linux.cs | 27 +++++++++ .../ProgressBar/ProgressBarHandler.Linux.cs | 17 ++++++ .../SearchBar/SearchBarHandler.Linux.cs | 37 ++++++++++++ .../Handlers/Slider/SliderHandler.Linux.cs | 37 ++++++++++++ .../Handlers/Stepper/StepperHandler.Linux.cs | 25 ++++++++ .../Handlers/Switch/SwitchHandler.Linux.cs | 23 ++++++++ .../TimePicker/TimePickerHandler.Linux.cs | 25 ++++++++ src/Core/src/Handlers/View/ViewHandler.cs | 2 + .../src/Handlers/View/ViewHandlerOfT.Linux.cs | 29 +++++++++ src/Core/src/Handlers/View/ViewHandlerOfT.cs | 4 +- .../Linux/ActivityIndicatorExtensions.cs | 15 +++++ .../src/Platform/Linux/AlignmentExtensions.cs | 20 +++++++ .../src/Platform/Linux/ButtonExtensions.cs | 12 ++++ .../src/Platform/Linux/CheckBoxExtensions.cs | 12 ++++ .../src/Platform/Linux/ColorExtensions.cs | 21 +++++++ .../Platform/Linux/DatePickerExtensions.cs | 7 +++ .../src/Platform/Linux/EditorExtensions.cs | 16 +++++ .../src/Platform/Linux/EntryExtensions.cs | 15 +++++ .../src/Platform/Linux/LabelExtensions.cs | 58 ++++++++++++++++++ src/Core/src/Platform/Linux/LayoutView.cs | 18 ++++++ src/Core/src/Platform/Linux/MauiDatePicker.cs | 7 +++ src/Core/src/Platform/Linux/MauiSearchBar.cs | 7 +++ src/Core/src/Platform/Linux/MauiTimePicker.cs | 7 +++ .../src/Platform/Linux/PickerExtensions.cs | 7 +++ .../Platform/Linux/ProgressBarExtensions.cs | 13 ++++ .../src/Platform/Linux/SearchBarExtensions.cs | 7 +++ .../src/Platform/Linux/SliderExtensions.cs | 20 +++++++ .../src/Platform/Linux/StepperExtensions.cs | 7 +++ .../src/Platform/Linux/SwitchExtensions.cs | 12 ++++ .../Platform/Linux/TimePickerExtensions.cs | 7 +++ src/Core/src/Platform/Linux/ViewExtensions.cs | 27 +++++++++ 49 files changed, 933 insertions(+), 3 deletions(-) create mode 100644 src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj create mode 100644 src/Controls/samples/Controls.Sample.Linux/Program.cs create mode 100644 src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs create mode 100644 src/Core/src/Fonts/FontManager.Linux.cs create mode 100644 src/Core/src/Fonts/IFontManager.Linux.cs create mode 100644 src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Button/ButtonHandler.Linux.cs create mode 100644 src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs create mode 100644 src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Editor/EditorHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Entry/EntryHandler.Linux.cs create mode 100644 src/Core/src/Handlers/IViewHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Label/LabelHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Picker/PickerHandler.Linux.cs create mode 100644 src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs create mode 100644 src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Slider/SliderHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs create mode 100644 src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs create mode 100644 src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs create mode 100644 src/Core/src/Platform/Linux/ActivityIndicatorExtensions.cs create mode 100644 src/Core/src/Platform/Linux/AlignmentExtensions.cs create mode 100644 src/Core/src/Platform/Linux/ButtonExtensions.cs create mode 100644 src/Core/src/Platform/Linux/CheckBoxExtensions.cs create mode 100644 src/Core/src/Platform/Linux/ColorExtensions.cs create mode 100644 src/Core/src/Platform/Linux/DatePickerExtensions.cs create mode 100644 src/Core/src/Platform/Linux/EditorExtensions.cs create mode 100644 src/Core/src/Platform/Linux/EntryExtensions.cs create mode 100644 src/Core/src/Platform/Linux/LabelExtensions.cs create mode 100644 src/Core/src/Platform/Linux/LayoutView.cs create mode 100644 src/Core/src/Platform/Linux/MauiDatePicker.cs create mode 100644 src/Core/src/Platform/Linux/MauiSearchBar.cs create mode 100644 src/Core/src/Platform/Linux/MauiTimePicker.cs create mode 100644 src/Core/src/Platform/Linux/PickerExtensions.cs create mode 100644 src/Core/src/Platform/Linux/ProgressBarExtensions.cs create mode 100644 src/Core/src/Platform/Linux/SearchBarExtensions.cs create mode 100644 src/Core/src/Platform/Linux/SliderExtensions.cs create mode 100644 src/Core/src/Platform/Linux/StepperExtensions.cs create mode 100644 src/Core/src/Platform/Linux/SwitchExtensions.cs create mode 100644 src/Core/src/Platform/Linux/TimePickerExtensions.cs create mode 100644 src/Core/src/Platform/Linux/ViewExtensions.cs diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index d8f241e8cf10..fe90766eb126 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -35,7 +35,12 @@ - + + + + + + Platform\Windows\ @@ -60,10 +65,15 @@ $(DefineConstants);IOS + $(DefineConstants);MACCATALYST;IOS + + + $(DefineConstants);LINUX + false @@ -84,6 +94,10 @@ + + + + UAP diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index c06acb6316c4..43407076a1d8 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -140,6 +140,8 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Compatibility.ControlGaller EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Compatibility.ControlGallery.Core", "src\Compatibility\ControlGallery\src\Core\Compatibility.ControlGallery.Core.csproj", "{B5F94CCB-5868-43BD-89B5-B66C97C3A741}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Linux", "src\Controls\samples\Controls.Sample.Linux\Controls.Sample.Linux.csproj", "{A7B49F6D-913A-4286-8E8B-76D5E5250891}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Compatibility\ControlGallery\src\Issues.Shared\Compatibility.ControlGallery.Issues.Shared.projitems*{ae2513cb-4e5e-4e5c-8237-88954d4c9433}*SharedItemsImports = 13 @@ -1249,6 +1251,34 @@ Global {B5F94CCB-5868-43BD-89B5-B66C97C3A741}.Release|x64.Build.0 = Release|Any CPU {B5F94CCB-5868-43BD-89B5-B66C97C3A741}.Release|x86.ActiveCfg = Release|Any CPU {B5F94CCB-5868-43BD-89B5-B66C97C3A741}.Release|x86.Build.0 = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM.ActiveCfg = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM.Build.0 = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM64.Build.0 = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhone.Build.0 = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x64.ActiveCfg = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x64.Build.0 = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x86.ActiveCfg = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x86.Build.0 = Debug|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|Any CPU.Build.0 = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM.ActiveCfg = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM.Build.0 = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM64.ActiveCfg = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM64.Build.0 = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhone.ActiveCfg = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhone.Build.0 = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x64.ActiveCfg = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x64.Build.0 = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x86.ActiveCfg = Release|Any CPU + {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1305,6 +1335,7 @@ Global {D816B818-F58F-4738-93AE-924EFAB7A07F} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} {AE2513CB-4E5E-4E5C-8237-88954D4C9433} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} {B5F94CCB-5868-43BD-89B5-B66C97C3A741} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} + {A7B49F6D-913A-4286-8E8B-76D5E5250891} = {806499EB-C2CC-4E85-BC19-613F3DE5E0C3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {650AE971-2F29-46A8-822C-FB4FCDC6A9A0} diff --git a/NuGet.config b/NuGet.config index 6b25b1dfb849..eb503ee85aee 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,6 +6,7 @@ + diff --git a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj new file mode 100644 index 000000000000..384d1fe2f947 --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj @@ -0,0 +1,9 @@ + + + + WinExe + net5.0 + false + + + \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/Program.cs b/src/Controls/samples/Controls.Sample.Linux/Program.cs new file mode 100644 index 000000000000..09827d83e086 --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/Program.cs @@ -0,0 +1,9 @@ +using System; + +namespace Controls.Sample.Linux +{ + class Program + { + + } +} diff --git a/src/Core/src/Core.csproj b/src/Core/src/Core.csproj index 5df2989ab7fa..6afe815711f5 100644 --- a/src/Core/src/Core.csproj +++ b/src/Core/src/Core.csproj @@ -1,6 +1,6 @@ - netstandard2.1;netstandard2.0;Xamarin.iOS10;MonoAndroid10.0 + netstandard2.1;netstandard2.0;net5.0;Xamarin.iOS10;MonoAndroid10.0 Microsoft.Maui Microsoft.Maui enable diff --git a/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs b/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs new file mode 100644 index 000000000000..afedd344488d --- /dev/null +++ b/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs @@ -0,0 +1,12 @@ +using System; + +namespace Microsoft.Maui +{ + public class EmbeddedFontLoader : IEmbeddedFontLoader + { + public (bool success, string? filePath) LoadFont(EmbeddedFont font) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Core/src/Fonts/FontManager.Linux.cs b/src/Core/src/Fonts/FontManager.Linux.cs new file mode 100644 index 000000000000..e7cf25872b93 --- /dev/null +++ b/src/Core/src/Fonts/FontManager.Linux.cs @@ -0,0 +1,12 @@ +namespace Microsoft.Maui +{ + public class FontManager : IFontManager + { + readonly IFontRegistrar _fontRegistrar; + + public FontManager(IFontRegistrar fontRegistrar) + { + _fontRegistrar = fontRegistrar; + } + } +} \ No newline at end of file diff --git a/src/Core/src/Fonts/IFontManager.Linux.cs b/src/Core/src/Fonts/IFontManager.Linux.cs new file mode 100644 index 000000000000..220aeb743d01 --- /dev/null +++ b/src/Core/src/Fonts/IFontManager.Linux.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public interface IFontManager + { + + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs new file mode 100644 index 000000000000..1dbd7974db30 --- /dev/null +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs @@ -0,0 +1,20 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class ActivityIndicatorHandler : ViewHandler + { + protected override Spinner CreateNativeView() + { + return new Spinner(); + } + + public static void MapIsRunning(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) + { + handler.NativeView?.UpdateIsRunning(activityIndicator); + } + + [MissingMapper] + public static void MapColor(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { } + } +} diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs b/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs new file mode 100644 index 000000000000..505cd8bbbf2e --- /dev/null +++ b/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs @@ -0,0 +1,59 @@ +using System; +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class ButtonHandler : ViewHandler + { + protected override Button CreateNativeView() + { + return new Button(); + } + + protected override void ConnectHandler(Button nativeView) + { + nativeView.Clicked += OnButtonClicked; + nativeView.ButtonPressEvent += OnButtonPressEvent; + nativeView.ButtonReleaseEvent += OnButtonReleaseEvent; + } + + protected override void DisconnectHandler(Button nativeView) + { + nativeView.Clicked -= OnButtonClicked; + nativeView.ButtonPressEvent -= OnButtonPressEvent; + nativeView.ButtonReleaseEvent -= OnButtonReleaseEvent; + } + + public static void MapText(ButtonHandler handler, IButton button) + { + handler.NativeView?.UpdateText(button); + } + + [MissingMapper] + public static void MapTextColor(ButtonHandler handler, IButton button) { } + + [MissingMapper] + public static void MapCharacterSpacing(ButtonHandler handler, IButton button) { } + + [MissingMapper] + public static void MapFont(ButtonHandler handler, IButton button) { } + + [MissingMapper] + public static void MapPadding(ButtonHandler handler, IButton button) { } + + void OnButtonPressEvent(object? o, ButtonPressEventArgs args) + { + VirtualView?.Pressed(); + } + + void OnButtonReleaseEvent(object? o, ButtonReleaseEventArgs args) + { + VirtualView?.Released(); + } + + void OnButtonClicked(object? sender, EventArgs e) + { + VirtualView?.Clicked(); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs new file mode 100644 index 000000000000..3b565da8ae28 --- /dev/null +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs @@ -0,0 +1,17 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class CheckBoxHandler : ViewHandler + { + protected override CheckButton CreateNativeView() + { + return new CheckButton(); + } + + public static void MapIsChecked(CheckBoxHandler handler, ICheckBox check) + { + handler.NativeView?.UpdateIsChecked(check); + } + } +} diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs new file mode 100644 index 000000000000..fae3509065ea --- /dev/null +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs @@ -0,0 +1,31 @@ +namespace Microsoft.Maui.Handlers +{ + public partial class DatePickerHandler : ViewHandler + { + protected override MauiDatePicker CreateNativeView() + { + return new MauiDatePicker(); + } + + [MissingMapper] + public static void MapFormat(DatePickerHandler handler, IDatePicker datePicker) { } + + [MissingMapper] + public static void MapDate(DatePickerHandler handler, IDatePicker datePicker) { } + + [MissingMapper] + public static void MapMinimumDate(DatePickerHandler handler, IDatePicker datePicker) { } + + [MissingMapper] + public static void MapMaximumDate(DatePickerHandler handler, IDatePicker datePicker) { } + + [MissingMapper] + public static void MapCharacterSpacing(DatePickerHandler handler, IDatePicker datePicker) { } + + [MissingMapper] + public static void MapFont(DatePickerHandler handler, IDatePicker datePicker) { } + + [MissingMapper] + public static void MapTextColor(DatePickerHandler handler, IDatePicker datePicker) { } + } +} diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs new file mode 100644 index 000000000000..22c36d6ef213 --- /dev/null +++ b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs @@ -0,0 +1,41 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class EditorHandler : ViewHandler + { + protected override TextView CreateNativeView() + { + return new TextView(); + } + + public static void MapText(EditorHandler handler, IEditor editor) + { + handler.NativeView?.UpdateText(editor); + } + + [MissingMapper] + public static void MapPlaceholder(IViewHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapPlaceholderColor(IViewHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapCharacterSpacing(IViewHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapMaxLength(IViewHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapIsTextPredictionEnabled(EditorHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapFont(IViewHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapIsReadOnly(IViewHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapTextColor(EditorHandler handler, IEditor editor) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs b/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs new file mode 100644 index 000000000000..11f237c65c60 --- /dev/null +++ b/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs @@ -0,0 +1,53 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class EntryHandler : ViewHandler + { + protected override Entry CreateNativeView() + { + return new Entry(); + } + + public static void MapText(EntryHandler handler, IEntry entry) + { + handler.NativeView?.UpdateText(entry); + } + + [MissingMapper] + public static void MapTextColor(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapIsPassword(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapHorizontalTextAlignment(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapIsTextPredictionEnabled(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapMaxLength(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapPlaceholder(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapIsReadOnly(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapFont(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapReturnType(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapClearButtonVisibility(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) { } + + [MissingMapper] + public static void MapKeyboard(EntryHandler handler, IEntry entry) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/IViewHandler.Linux.cs b/src/Core/src/Handlers/IViewHandler.Linux.cs new file mode 100644 index 000000000000..80600e12f537 --- /dev/null +++ b/src/Core/src/Handlers/IViewHandler.Linux.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public interface INativeViewHandler : IViewHandler + { + new Gtk.Widget? NativeView { get; } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs new file mode 100644 index 000000000000..bc6b1b83bdb6 --- /dev/null +++ b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs @@ -0,0 +1,48 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class LabelHandler : ViewHandler + { + protected override Label CreateNativeView() + { + return new Label(); + } + + public static void MapText(LabelHandler handler, ILabel label) + { + handler.NativeView?.UpdateText(label); + } + + [MissingMapper] + public static void MapTextColor(LabelHandler handler, ILabel label) { } + + [MissingMapper] + public static void MapCharacterSpacing(LabelHandler handler, ILabel label) { } + + [MissingMapper] + public static void MapFont(LabelHandler handler, ILabel label) { } + + public static void MapHorizontalTextAlignment(LabelHandler handler, ILabel label) + { + handler.NativeView?.UpdateTextAlignment(label); + } + + public static void MapLineBreakMode(LabelHandler handler, ILabel label) + { + handler.NativeView?.UpdateLineBreakMode(label); + } + + [MissingMapper] + public static void MapTextDecorations(LabelHandler handler, ILabel label) { } + + [MissingMapper] + public static void MapMaxLines(LabelHandler handler, ILabel label) { } + + [MissingMapper] + public static void MapPadding(LabelHandler handler, ILabel label) { } + + [MissingMapper] + public static void MapLineHeight(LabelHandler handler, ILabel label) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs new file mode 100644 index 000000000000..612435eed055 --- /dev/null +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs @@ -0,0 +1,20 @@ +namespace Microsoft.Maui.Handlers +{ + public partial class LayoutHandler : ViewHandler + { + protected override LayoutView CreateNativeView() + { + return new LayoutView(); + } + + public void Add(IView child) + { + + } + + public void Remove(IView child) + { + + } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs b/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs new file mode 100644 index 000000000000..691baaae118a --- /dev/null +++ b/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs @@ -0,0 +1,27 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class PickerHandler : ViewHandler + { + protected override ComboBox CreateNativeView() + { + return new ComboBox(); + } + + [MissingMapper] + public static void MapTitle(PickerHandler handler, IPicker view) { } + + [MissingMapper] + public static void MapSelectedIndex(PickerHandler handler, IPicker view) { } + + [MissingMapper] + public static void MapCharacterSpacing(PickerHandler handler, IPicker view) { } + + [MissingMapper] + public static void MapFont(PickerHandler handler, IPicker view) { } + + [MissingMapper] + public static void MapTextColor(PickerHandler handler, IPicker view) { } + } +} diff --git a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs new file mode 100644 index 000000000000..1e10fa7182b7 --- /dev/null +++ b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs @@ -0,0 +1,17 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class ProgressBarHandler : ViewHandler + { + protected override ProgressBar CreateNativeView() + { + return new ProgressBar(); + } + + public static void MapProgress(ProgressBarHandler handler, IProgress progress) + { + handler.NativeView?.UpdateProgress(progress); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs new file mode 100644 index 000000000000..9cc6e966cc6c --- /dev/null +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs @@ -0,0 +1,37 @@ +namespace Microsoft.Maui.Handlers +{ + public partial class SearchBarHandler : ViewHandler + { + protected override MauiSearchBar CreateNativeView() + { + return new MauiSearchBar(); + } + + [MissingMapper] + public static void MapText(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapPlaceholder(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapHorizontalTextAlignment(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapFont(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapCharacterSpacing(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapTextColor(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapIsTextPredictionEnabled(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapMaxLength(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapIsReadOnly(IViewHandler handler, ISearchBar searchBar) { } + } +} diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs b/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs new file mode 100644 index 000000000000..06f5121b3ec2 --- /dev/null +++ b/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs @@ -0,0 +1,37 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class SliderHandler : ViewHandler + { + protected override Scale CreateNativeView() + { + var adjustment = new Adjustment(0, 0, 1, 1, 1, 1); + return new Scale(Orientation.Horizontal, adjustment); + } + + public static void MapMinimum(SliderHandler handler, ISlider slider) + { + handler.NativeView?.UpdateRange(slider); + } + + public static void MapMaximum(SliderHandler handler, ISlider slider) + { + handler.NativeView?.UpdateRange(slider); + } + + public static void MapValue(SliderHandler handler, ISlider slider) + { + handler.NativeView?.UpdateValue(slider); + } + + [MissingMapper] + public static void MapMinimumTrackColor(SliderHandler handler, ISlider slider) { } + + [MissingMapper] + public static void MapMaximumTrackColor(SliderHandler handler, ISlider slider) { } + + [MissingMapper] + public static void MapThumbColor(SliderHandler handler, ISlider slider) { } + } +} diff --git a/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs b/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs new file mode 100644 index 000000000000..429cc09b7a1a --- /dev/null +++ b/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs @@ -0,0 +1,25 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class StepperHandler : ViewHandler + { + protected override SpinButton CreateNativeView() + { + var adjustment = new Adjustment(0, 0, 1, 1, 1, 1); + return new SpinButton(adjustment, 1, 1); + } + + [MissingMapper] + public static void MapMinimum(IViewHandler handler, IStepper stepper) { } + + [MissingMapper] + public static void MapMaximum(IViewHandler handler, IStepper stepper) { } + + [MissingMapper] + public static void MapIncrement(IViewHandler handler, IStepper stepper) { } + + [MissingMapper] + public static void MapValue(IViewHandler handler, IStepper stepper) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs new file mode 100644 index 000000000000..88f9c6390c5b --- /dev/null +++ b/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs @@ -0,0 +1,23 @@ +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + public partial class SwitchHandler : ViewHandler + { + protected override Switch CreateNativeView() + { + return new Switch(); + } + + public static void MapIsToggled(SwitchHandler handler, ISwitch view) + { + handler.NativeView?.UpdateIsToggled(view); + } + + [MissingMapper] + public static void MapTrackColor(SwitchHandler handler, ISwitch view) { } + + [MissingMapper] + public static void MapThumbColor(SwitchHandler handler, ISwitch view) { } + } +} diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs new file mode 100644 index 000000000000..4dd5dd8b50a5 --- /dev/null +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs @@ -0,0 +1,25 @@ +namespace Microsoft.Maui.Handlers +{ + public partial class TimePickerHandler : ViewHandler + { + protected override MauiTimePicker CreateNativeView() + { + return new MauiTimePicker(); + } + + [MissingMapper] + public static void MapFormat(TimePickerHandler handler, ITimePicker view) { } + + [MissingMapper] + public static void MapTime(TimePickerHandler handler, ITimePicker view) { } + + [MissingMapper] + public static void MapCharacterSpacing(TimePickerHandler handler, ITimePicker view) { } + + [MissingMapper] + public static void MapFont(TimePickerHandler handler, ITimePicker view) { } + + [MissingMapper] + public static void MapTextColor(TimePickerHandler handler, ITimePicker timePicker) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/View/ViewHandler.cs b/src/Core/src/Handlers/View/ViewHandler.cs index be3183d19b6f..2fbaaf13c488 100644 --- a/src/Core/src/Handlers/View/ViewHandler.cs +++ b/src/Core/src/Handlers/View/ViewHandler.cs @@ -6,6 +6,8 @@ using NativeView = AppKit.NSView; #elif MONOANDROID using NativeView = Android.Views.View; +#elif LINUX +using NativeView = Gtk.Widget; #elif WINDOWS using NativeView = Microsoft.UI.Xaml.FrameworkElement; #elif NETSTANDARD diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs new file mode 100644 index 000000000000..9af818b848dd --- /dev/null +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs @@ -0,0 +1,29 @@ +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui.Handlers +{ + public partial class ViewHandler : INativeViewHandler + { + Gtk.Widget? INativeViewHandler.NativeView => (Gtk.Widget?)base.NativeView; + + public override void SetFrame(Rectangle rect) + { + + } + + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + return new Size(widthConstraint, heightConstraint); + } + + protected override void SetupContainer() + { + + } + + protected override void RemoveContainer() + { + + } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.cs index 3759b2a20df2..6d47ab49afb5 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.cs @@ -5,6 +5,8 @@ using NativeView = AppKit.NSView; #elif MONOANDROID using NativeView = Android.Views.View; +#elif LINUX +using NativeView = Gtk.Widget; #elif WINDOWS using NativeView = Microsoft.UI.Xaml.FrameworkElement; #elif NETSTANDARD || (NET6_0 && !IOS && !ANDROID) @@ -16,7 +18,7 @@ namespace Microsoft.Maui.Handlers public abstract partial class ViewHandler : ViewHandler, IViewHandler where TVirtualView : class, IView -#if !NETSTANDARD || IOS || ANDROID || WINDOWS +#if !NETSTANDARD || IOS || ANDROID || LINUX || WINDOWS where TNativeView : NativeView #else where TNativeView : class diff --git a/src/Core/src/Platform/Linux/ActivityIndicatorExtensions.cs b/src/Core/src/Platform/Linux/ActivityIndicatorExtensions.cs new file mode 100644 index 000000000000..e40b987d06e5 --- /dev/null +++ b/src/Core/src/Platform/Linux/ActivityIndicatorExtensions.cs @@ -0,0 +1,15 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class ActivityIndicatorExtensions + { + public static void UpdateIsRunning(this Spinner nativeActivityIndicator, IActivityIndicator activityIndicator) + { + if (activityIndicator.IsRunning) + nativeActivityIndicator.Start(); + else + nativeActivityIndicator.Stop(); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/AlignmentExtensions.cs b/src/Core/src/Platform/Linux/AlignmentExtensions.cs new file mode 100644 index 000000000000..b14d2d8dadcf --- /dev/null +++ b/src/Core/src/Platform/Linux/AlignmentExtensions.cs @@ -0,0 +1,20 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class AlignmentExtensions + { + public static Align ToNative(this TextAlignment alignment) + { + switch (alignment) + { + case TextAlignment.Start: + return Align.Start; + case TextAlignment.End: + return Align.End; + default: + return Align.Center; + } + } + } +} diff --git a/src/Core/src/Platform/Linux/ButtonExtensions.cs b/src/Core/src/Platform/Linux/ButtonExtensions.cs new file mode 100644 index 000000000000..4a40fde87f56 --- /dev/null +++ b/src/Core/src/Platform/Linux/ButtonExtensions.cs @@ -0,0 +1,12 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class ButtonExtensions + { + public static void UpdateText(this Button nativeButton, IButton button) + { + nativeButton.Label = button.Text; + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/CheckBoxExtensions.cs b/src/Core/src/Platform/Linux/CheckBoxExtensions.cs new file mode 100644 index 000000000000..b34639e6db1c --- /dev/null +++ b/src/Core/src/Platform/Linux/CheckBoxExtensions.cs @@ -0,0 +1,12 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class CheckBoxExtensions + { + public static void UpdateIsChecked(this CheckButton nativeCheckBox, ICheckBox checkBox) + { + nativeCheckBox.Active = checkBox.IsChecked; + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ColorExtensions.cs b/src/Core/src/Platform/Linux/ColorExtensions.cs new file mode 100644 index 000000000000..b04a9fbe995f --- /dev/null +++ b/src/Core/src/Platform/Linux/ColorExtensions.cs @@ -0,0 +1,21 @@ +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui +{ + public static class ColorExtensions + { + public static Gdk.RGBA ToNative(this Color color) + { + string hex = color.ToHex(); + Gdk.RGBA nativeColor = new Gdk.RGBA(); + nativeColor.Parse(hex); + + return nativeColor; + } + + public static Color ToColor(this Gdk.Color color, float opacity = 255) + { + return new Color(color.Red, color.Green, color.Blue, opacity); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/DatePickerExtensions.cs b/src/Core/src/Platform/Linux/DatePickerExtensions.cs new file mode 100644 index 000000000000..b30a3ac2ef9d --- /dev/null +++ b/src/Core/src/Platform/Linux/DatePickerExtensions.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public static class DatePickerExtensions + { + + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/EditorExtensions.cs b/src/Core/src/Platform/Linux/EditorExtensions.cs new file mode 100644 index 000000000000..6c04f66f8afc --- /dev/null +++ b/src/Core/src/Platform/Linux/EditorExtensions.cs @@ -0,0 +1,16 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class EditorExtensions + { + public static void UpdateText(this TextView nativeEditor, IEditor editor) + { + var text = editor.Text; + TextBuffer buffer = nativeEditor.Buffer; + + if (buffer.Text != text) + buffer.Text = text; + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/EntryExtensions.cs b/src/Core/src/Platform/Linux/EntryExtensions.cs new file mode 100644 index 000000000000..b0f818782e27 --- /dev/null +++ b/src/Core/src/Platform/Linux/EntryExtensions.cs @@ -0,0 +1,15 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class EntryExtensions + { + public static void UpdateText(this Entry nativeEntry, IEntry entry) + { + var text = entry.Text; + + if (nativeEntry.Text != text) + nativeEntry.Text = text; + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LabelExtensions.cs b/src/Core/src/Platform/Linux/LabelExtensions.cs new file mode 100644 index 000000000000..642b71089e54 --- /dev/null +++ b/src/Core/src/Platform/Linux/LabelExtensions.cs @@ -0,0 +1,58 @@ +using System; +using Gtk; + +namespace Microsoft.Maui +{ + public static class LabelExtensions + { + public static void UpdateText(this Label nativeLabel, ILabel label) + { + nativeLabel.Text = label.Text; + } + + public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) + { + switch (label.LineBreakMode) + { + case LineBreakMode.NoWrap: + nativeLabel.LineWrap = false; + nativeLabel.Ellipsize = Pango.EllipsizeMode.None; + break; + case LineBreakMode.WordWrap: + nativeLabel.LineWrap = true; + nativeLabel.LineWrapMode = Pango.WrapMode.Word; + nativeLabel.Ellipsize = Pango.EllipsizeMode.None; + break; + case LineBreakMode.CharacterWrap: + nativeLabel.LineWrap = true; + nativeLabel.LineWrapMode = Pango.WrapMode.Char; + nativeLabel.Ellipsize = Pango.EllipsizeMode.None; + break; + case LineBreakMode.HeadTruncation: + nativeLabel.LineWrap = false; + nativeLabel.LineWrapMode = Pango.WrapMode.Word; + nativeLabel.Ellipsize = Pango.EllipsizeMode.Start; + break; + case LineBreakMode.TailTruncation: + nativeLabel.LineWrap = false; + nativeLabel.LineWrapMode = Pango.WrapMode.Word; + nativeLabel.Ellipsize = Pango.EllipsizeMode.End; + break; + case LineBreakMode.MiddleTruncation: + nativeLabel.LineWrap = false; + nativeLabel.LineWrapMode = Pango.WrapMode.Word; + nativeLabel.Ellipsize = Pango.EllipsizeMode.Middle; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + public static void UpdateTextAlignment(this Label nativeLabel, ILabel label) + { + var hAlignmentValue = label.HorizontalTextAlignment.ToNative(); + + nativeLabel.Halign = hAlignmentValue; + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LayoutView.cs b/src/Core/src/Platform/Linux/LayoutView.cs new file mode 100644 index 000000000000..776bdd4d6d05 --- /dev/null +++ b/src/Core/src/Platform/Linux/LayoutView.cs @@ -0,0 +1,18 @@ +using Gdk; +using Gtk; + +namespace Microsoft.Maui +{ + public class LayoutView : Fixed + { + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + { + base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); + } + + protected override void OnSizeAllocated(Rectangle allocation) + { + base.OnSizeAllocated(allocation); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiDatePicker.cs b/src/Core/src/Platform/Linux/MauiDatePicker.cs new file mode 100644 index 000000000000..1965fc51873d --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiDatePicker.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public class MauiDatePicker : Gtk.Widget + { + + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiSearchBar.cs b/src/Core/src/Platform/Linux/MauiSearchBar.cs new file mode 100644 index 000000000000..8ecf34122676 --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiSearchBar.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public class MauiSearchBar : Gtk.Widget + { + + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiTimePicker.cs b/src/Core/src/Platform/Linux/MauiTimePicker.cs new file mode 100644 index 000000000000..14da53132282 --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiTimePicker.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public class MauiTimePicker : Gtk.Widget + { + + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/PickerExtensions.cs b/src/Core/src/Platform/Linux/PickerExtensions.cs new file mode 100644 index 000000000000..ac9ffced380c --- /dev/null +++ b/src/Core/src/Platform/Linux/PickerExtensions.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public static class PickerExtensions + { + + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ProgressBarExtensions.cs b/src/Core/src/Platform/Linux/ProgressBarExtensions.cs new file mode 100644 index 000000000000..d24b594d09f8 --- /dev/null +++ b/src/Core/src/Platform/Linux/ProgressBarExtensions.cs @@ -0,0 +1,13 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class ProgressBarExtensions + { + public static void UpdateProgress(this ProgressBar nativeProgressBar, IProgress progress) + { + nativeProgressBar.PulseStep = progress.Progress; + nativeProgressBar.TooltipText = string.Format("{0}%", progress.Progress * 100); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/SearchBarExtensions.cs b/src/Core/src/Platform/Linux/SearchBarExtensions.cs new file mode 100644 index 000000000000..1927a2ed4d89 --- /dev/null +++ b/src/Core/src/Platform/Linux/SearchBarExtensions.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public static class SearchBarExtensions + { + + } +} diff --git a/src/Core/src/Platform/Linux/SliderExtensions.cs b/src/Core/src/Platform/Linux/SliderExtensions.cs new file mode 100644 index 000000000000..fdbbba7502c9 --- /dev/null +++ b/src/Core/src/Platform/Linux/SliderExtensions.cs @@ -0,0 +1,20 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class SliderExtensions + { + public static void UpdateRange(this Scale nativeSlider, ISlider slider) + { + var minimum = slider.Minimum; + var maximum = slider.Maximum; + + nativeSlider.SetRange(minimum, maximum); + } + + public static void UpdateValue(this Scale nativeSlider, ISlider slider) + { + nativeSlider.Value = (float)slider.Value; + } + } +} diff --git a/src/Core/src/Platform/Linux/StepperExtensions.cs b/src/Core/src/Platform/Linux/StepperExtensions.cs new file mode 100644 index 000000000000..00cd5c978e4f --- /dev/null +++ b/src/Core/src/Platform/Linux/StepperExtensions.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public static class StepperExtensions + { + + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/SwitchExtensions.cs b/src/Core/src/Platform/Linux/SwitchExtensions.cs new file mode 100644 index 000000000000..f00ee1b401e3 --- /dev/null +++ b/src/Core/src/Platform/Linux/SwitchExtensions.cs @@ -0,0 +1,12 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class SwitchExtensions + { + public static void UpdateIsToggled(this Switch nativeSwitch, ISwitch virtualSwitch) + { + nativeSwitch.Active = virtualSwitch.IsToggled; + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/TimePickerExtensions.cs b/src/Core/src/Platform/Linux/TimePickerExtensions.cs new file mode 100644 index 000000000000..6675e9a30e92 --- /dev/null +++ b/src/Core/src/Platform/Linux/TimePickerExtensions.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui +{ + public static class TimePickerExtensions + { + + } +} diff --git a/src/Core/src/Platform/Linux/ViewExtensions.cs b/src/Core/src/Platform/Linux/ViewExtensions.cs new file mode 100644 index 000000000000..f0d4ff8f74de --- /dev/null +++ b/src/Core/src/Platform/Linux/ViewExtensions.cs @@ -0,0 +1,27 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class ViewExtensions + { + public static void UpdateAutomationId(this Widget nativeView, IView view) + { + + } + + public static void UpdateBackgroundColor(this Widget nativeView, IView view) + { + + } + + public static void UpdateIsEnabled(this Widget nativeView, IView view) + { + + } + + public static void UpdateSemantics(this Widget nativeView, IView view) + { + + } + } +} \ No newline at end of file From a7efd1ac014e9482969f332840cd8d32c0e8b4c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Sua=CC=81rez=20Ruiz?= Date: Wed, 21 Apr 2021 20:11:30 +0200 Subject: [PATCH 002/425] Added Linux HandlerExtensions --- .../src/Platform/Linux/HandlerExtensions.cs | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/Core/src/Platform/Linux/HandlerExtensions.cs diff --git a/src/Core/src/Platform/Linux/HandlerExtensions.cs b/src/Core/src/Platform/Linux/HandlerExtensions.cs new file mode 100644 index 000000000000..1f13ad2c2863 --- /dev/null +++ b/src/Core/src/Platform/Linux/HandlerExtensions.cs @@ -0,0 +1,37 @@ +using Gtk; +using System; + +namespace Microsoft.Maui +{ + public static class HandlerExtensions + { + public static Widget ToNative(this IView view, IMauiContext context) + { + _ = view ?? throw new ArgumentNullException(nameof(view)); + _ = context ?? throw new ArgumentNullException(nameof(context)); + + var handler = view.Handler; + + if (handler == null) + { + handler = context.Handlers.GetHandler(view.GetType()); + + if (handler == null) + throw new Exception($"Handler not found for view {view}"); + + handler.SetMauiContext(context); + + view.Handler = handler; + } + + handler.SetVirtualView(view); + + if (handler.NativeView is not Widget result) + { + throw new InvalidOperationException($"Unable to convert {view} to {typeof(Widget)}"); + } + + return result; + } + } +} \ No newline at end of file From 5ce87eb9040e7bd513a152ca1c0b8a9d5f7722c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Sua=CC=81rez=20Ruiz?= Date: Wed, 21 Apr 2021 20:37:53 +0200 Subject: [PATCH 003/425] Add Linux MauiWindow --- .../src/Platform/Linux/ActivationState.cs | 14 ++++++ src/Core/src/Platform/Linux/MauiContext.cs | 27 +++++++++++ src/Core/src/Platform/Linux/MauiWindow.cs | 47 +++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 src/Core/src/Platform/Linux/ActivationState.cs create mode 100644 src/Core/src/Platform/Linux/MauiContext.cs create mode 100644 src/Core/src/Platform/Linux/MauiWindow.cs diff --git a/src/Core/src/Platform/Linux/ActivationState.cs b/src/Core/src/Platform/Linux/ActivationState.cs new file mode 100644 index 000000000000..6719e581c7ce --- /dev/null +++ b/src/Core/src/Platform/Linux/ActivationState.cs @@ -0,0 +1,14 @@ +using System; + +namespace Microsoft.Maui +{ + public class ActivationState : IActivationState + { + public ActivationState(IMauiContext context) + { + Context = context ?? throw new ArgumentNullException(nameof(context)); + } + + public IMauiContext Context { get; } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiContext.cs b/src/Core/src/Platform/Linux/MauiContext.cs new file mode 100644 index 000000000000..e6549d784177 --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiContext.cs @@ -0,0 +1,27 @@ +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.Maui +{ + public class MauiContext : IMauiContext + { + readonly IServiceProvider? _services; + readonly IMauiHandlersServiceProvider? _mauiHandlersServiceProvider; + + public MauiContext() + { + } + + public MauiContext(IServiceProvider services) + { + _services = services ?? throw new ArgumentNullException(nameof(services)); + _mauiHandlersServiceProvider = Services.GetRequiredService(); + } + + public IServiceProvider Services => + _services ?? throw new InvalidOperationException($"No service provider was specified during construction."); + + public IMauiHandlersServiceProvider Handlers => + _mauiHandlersServiceProvider ?? throw new InvalidOperationException($"No service provider was specified during construction."); + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiWindow.cs b/src/Core/src/Platform/Linux/MauiWindow.cs new file mode 100644 index 000000000000..9c335b0ad165 --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiWindow.cs @@ -0,0 +1,47 @@ +using System; +using Gtk; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Maui.Hosting; +using Microsoft.Maui.LifecycleEvents; + +namespace Microsoft.Maui +{ + public class MauiWindow : Window + where TStartup : IStartup, new() + { + public MauiWindow() : base(WindowType.Toplevel) + { + var startup = new TStartup(); + + var host = startup + .CreateAppHostBuilder() + .ConfigureServices(ConfigureNativeServices) + .ConfigureUsing(startup) + .Build(); + + Services = host.Services; + Application = Services.GetRequiredService(); + + var mauiContext = new MauiContext(Services); + + var activationState = new ActivationState(mauiContext); + var window = Application.CreateWindow(activationState); + window.MauiContext = mauiContext; + + var content = (window.Page as IView) ?? window.Page.View; + + Add(content.ToNative(window.MauiContext)); + Child.ShowAll(); + } + + public new IApplication Application { get; protected set; } = null!; + + public IServiceProvider Services { get; protected set; } = null!; + + // Configure native services like HandlersContext, ImageSourceHandlers etc.. + void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollection services) + { + } + } +} \ No newline at end of file From 54673458239957547202d9bd7d70fa72d59e9073 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 20:52:09 +0200 Subject: [PATCH 004/425] Core.csproj Platform & ILinuxLifecycle, MauiContext, MauiGtkApplication, MauiGtkMainWindow --- .../Linux/ILinuxLifecycleBuilder.cs | 6 + .../LifecycleEvents/Linux/LinuxLifecycle.cs | 32 +++ .../Linux/LinuxLifecycleBuilderExtensions.cs | 10 + .../Linux/LinuxLifecycleExtensions.cs | 29 +++ src/Core/src/Platform/Linux/MauiContext.cs | 28 +++ .../src/Platform/Linux/MauiGtkApplication.cs | 225 ++++++++++++++++++ .../src/Platform/Linux/MauiGtkMainWindow.cs | 58 +++++ 7 files changed, 388 insertions(+) create mode 100644 src/Core/src/LifecycleEvents/Linux/ILinuxLifecycleBuilder.cs create mode 100644 src/Core/src/LifecycleEvents/Linux/LinuxLifecycle.cs create mode 100644 src/Core/src/LifecycleEvents/Linux/LinuxLifecycleBuilderExtensions.cs create mode 100644 src/Core/src/LifecycleEvents/Linux/LinuxLifecycleExtensions.cs create mode 100644 src/Core/src/Platform/Linux/MauiContext.cs create mode 100644 src/Core/src/Platform/Linux/MauiGtkApplication.cs create mode 100644 src/Core/src/Platform/Linux/MauiGtkMainWindow.cs diff --git a/src/Core/src/LifecycleEvents/Linux/ILinuxLifecycleBuilder.cs b/src/Core/src/LifecycleEvents/Linux/ILinuxLifecycleBuilder.cs new file mode 100644 index 000000000000..dfb1afc4cbf1 --- /dev/null +++ b/src/Core/src/LifecycleEvents/Linux/ILinuxLifecycleBuilder.cs @@ -0,0 +1,6 @@ +namespace Microsoft.Maui.LifecycleEvents +{ + public interface ILinuxLifecycleBuilder : ILifecycleBuilder + { + } +} \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Linux/LinuxLifecycle.cs b/src/Core/src/LifecycleEvents/Linux/LinuxLifecycle.cs new file mode 100644 index 000000000000..a55555901995 --- /dev/null +++ b/src/Core/src/LifecycleEvents/Linux/LinuxLifecycle.cs @@ -0,0 +1,32 @@ +using System; +using GLib; + +namespace Microsoft.Maui.LifecycleEvents +{ + + public static class LinuxLifecycle + { + + public delegate void OnStartup(Gtk.Application application, EventArgs args); + + public delegate void OnLaunched(Gtk.Application application, EventArgs args); + + public delegate void OnOpened(Gtk.Application application, OpenedArgs args); + + public delegate void OnApplicationActivated(Gtk.Application application, EventArgs args); + + public delegate void OnShutdown(Gtk.Application application, EventArgs args); + + public delegate void OnShown(Gtk.Window window, EventArgs args); + + public delegate void OnHidden(Gtk.Window window, EventArgs args); + + public delegate void OnVisibilityChanged(Gtk.Window window, Gtk.VisibilityNotifyEventArgs args); + + public delegate void OnStateChanged(Gtk.Window window, Gtk.WindowStateEventArgs args); + + public delegate void OnDelete(Gtk.Window window, Gtk.DeleteEventArgs args); + + } + +} \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleBuilderExtensions.cs b/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleBuilderExtensions.cs new file mode 100644 index 000000000000..a774662985f8 --- /dev/null +++ b/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleBuilderExtensions.cs @@ -0,0 +1,10 @@ +namespace Microsoft.Maui.LifecycleEvents +{ + public static class LinuxLifecycleBuilderExtensions + { + public static ILinuxLifecycleBuilder OnActivated(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnShown del) => lifecycle.OnEvent(del); + public static ILinuxLifecycleBuilder OnClosed(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnHidden del) => lifecycle.OnEvent(del); + public static ILinuxLifecycleBuilder OnLaunched(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnStartup del) => lifecycle.OnEvent(del); + public static ILinuxLifecycleBuilder OnVisibilityChanged(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnVisibilityChanged del) => lifecycle.OnEvent(del); + } +} \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleExtensions.cs b/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleExtensions.cs new file mode 100644 index 000000000000..ea0eff8a2a64 --- /dev/null +++ b/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleExtensions.cs @@ -0,0 +1,29 @@ +using System; + +namespace Microsoft.Maui.LifecycleEvents +{ + public static class LinuxLifecycleExtensions + { + public static ILifecycleBuilder AddWindows(this ILifecycleBuilder builder, Action configureDelegate) + { + var windows = new LifecycleBuilder(builder); + + configureDelegate?.Invoke(windows); + + return builder; + } + + class LifecycleBuilder : ILinuxLifecycleBuilder + { + readonly ILifecycleBuilder _builder; + + public LifecycleBuilder(ILifecycleBuilder builder) + { + _builder = builder; + } + + public void AddEvent(string eventName, Delegate action) => + _builder.AddEvent(eventName, action); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiContext.cs b/src/Core/src/Platform/Linux/MauiContext.cs new file mode 100644 index 000000000000..8def5180ed8c --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiContext.cs @@ -0,0 +1,28 @@ +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.Maui +{ + public class MauiContext : IMauiContext + { + readonly IServiceProvider? _services; + readonly IMauiHandlersServiceProvider? _mauiHandlersServiceProvider; + + public MauiContext() + { + } + + public MauiContext(IServiceProvider services) + { + _services = services ?? throw new ArgumentNullException(nameof(services)); + _mauiHandlersServiceProvider = Services.GetRequiredService(); + } + + public IServiceProvider Services => + _services ?? throw new InvalidOperationException($"No service provider was specified during construction."); + + public IMauiHandlersServiceProvider Handlers => + _mauiHandlersServiceProvider ?? throw new InvalidOperationException($"No service provider was specified during construction."); + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiGtkApplication.cs b/src/Core/src/Platform/Linux/MauiGtkApplication.cs new file mode 100644 index 000000000000..25fd40d0e502 --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiGtkApplication.cs @@ -0,0 +1,225 @@ +using System; +using System.Diagnostics; +using Gdk; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Maui.Hosting; +using Microsoft.Maui.LifecycleEvents; +using Gtk; +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui +{ + + public class MauiGtkApplication : MauiGtkApplication + where TStartup : IStartup, new() + { + + public void Run() + { + Launch(new EventArgs()); + } + + protected void RegisterLifecycleEvents(Gtk.Application app) + { + + app.Startup += OnStartup; + app.Shutdown += OnShutdown; + app.Opened += OnOpened; + app.WindowAdded += OnWindowAdded; + app.Activated += OnActivated; + app.WindowRemoved += OnWindowRemoved; + app.CommandLine += OnCommandLine; + + } + + protected void OnStartup(object sender, EventArgs args) + { + + StartupMainWindow(); + + Services.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + } + + protected void OnOpened(object o, GLib.OpenedArgs args) + { + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + } + + protected void OnActivated(object sender, EventArgs args) + { + StartupLauch(sender, args); + + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + } + + protected void OnShutdown(object sender, EventArgs args) + { + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + + MauiGtkApplication.DispatchPendingEvents(); + + } + + protected void OnCommandLine(object o, GLib.CommandLineArgs args) + { + ; + } + + protected void OnWindowRemoved(object o, WindowRemovedArgs args) + { + ; + } + + protected void OnWindowAdded(object o, WindowAddedArgs args) + { + ; + } + + // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid + // TODO: find a better algo for id + public string ApplicationId => $"{typeof(TStartup).Namespace}.{typeof(TStartup).Name}.{base.Name}".PadRight(255, ' ').Substring(0, 255).Trim(); + + Widget CreateRootContainer(Widget nativePage) + { + var b = new VBox + { + Expand = true, + }; + b.PackStart(nativePage, true, true, 0); + + return b; + } + + protected void StartupLauch(object sender, EventArgs args) + { + var startup = new TStartup(); + + var host = startup + .CreateAppHostBuilder() + .ConfigureServices(ConfigureNativeServices) + .ConfigureUsing(startup) + .Build(); + + Services = host.Services; + Application = Services.GetRequiredService(); + + var mauiContext = new MauiContext(Services); + + var activationState = new ActivationState(mauiContext); + var window = Application.CreateWindow(activationState); + window.MauiContext = mauiContext; + + var content = (window.Page as IView) ?? window.Page.View; + var nativeContent = content.ToNative(window.MauiContext); + + var canvas = TopContainerOverride?.Invoke(nativeContent) ?? CreateRootContainer(nativeContent); +#if DEBUG + nativeContent.SetBackgroundColor(Colors.White); +#endif + MainWindow.Child = canvas; + MainWindow.QueueDraw(); + MainWindow.ShowAll(); + + MainWindow.Present(); + + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + } + + void StartupMainWindow() + { + MainWindow = new MauiGtkMainWindow(); + CurrentGtkApplication.AddWindow(MainWindow); + + } + + protected void Launch(EventArgs args) + { + + Gtk.Application.Init(); + var app = new Gtk.Application(ApplicationId, GLib.ApplicationFlags.None); + + RegisterLifecycleEvents(app); + + CurrentGtkApplication = app; + + Current = this; + + ((GLib.Application)app).Run(); + + } + + protected void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollection services) + { } + + } + + public abstract class MauiGtkApplication + { + + /// + /// overrides creation of rootcontainer + /// rootcontainer is MainWindow 's + /// paramter is Maui's Mainwindows as Gtk.Widget + /// + public Func TopContainerOverride { get; set; } = null!; + + protected MauiGtkApplication() + { } + + string? _name; + + // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid + public string? Name + { + get => _name ??= $"A{Guid.NewGuid()}"; + set { _name = value; } + } + + // https://developer.gnome.org/gtk3/stable/GtkApplication.html + public static Gtk.Application CurrentGtkApplication { get; internal set; } = null!; + + public static MauiGtkApplication Current { get; internal set; } = null!; + + public MauiGtkMainWindow MainWindow { get; protected set; } = null!; + + public IServiceProvider Services { get; protected set; } = null!; + + public IApplication Application { get; protected set; } = null!; + + public static void DispatchPendingEvents() + { + // The loop is limited to 1000 iterations as a workaround for an issue that some users + // have experienced. Sometimes EventsPending starts return 'true' for all iterations, + // causing the loop to never end. + + int n = 1000; +#pragma warning disable 612 + Gdk.Threads.Enter(); +#pragma warning restore 612 + + while (Gtk.Application.EventsPending() && --n > 0) + { + Gtk.Application.RunIteration(false); + } + +#pragma warning disable 612 + Gdk.Threads.Leave(); +#pragma warning restore 612 + } + + public static void Invoke(System.Action action) + { + if (action == null) + throw new ArgumentNullException("action"); + + // Switch to no Invoke(Action) once a gtk# release is done. + Gtk.Application.Invoke((o, args) => + { + action(); + }); + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiGtkMainWindow.cs b/src/Core/src/Platform/Linux/MauiGtkMainWindow.cs new file mode 100644 index 000000000000..6bdf6958893a --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiGtkMainWindow.cs @@ -0,0 +1,58 @@ +using System; +using System.Diagnostics; +using Gtk; +using Microsoft.Maui.LifecycleEvents; +using Application = GLib.Application; + +namespace Microsoft.Maui +{ + + public class MauiGtkMainWindow : Gtk.Window + { + + public MauiGtkMainWindow() : base(WindowType.Toplevel) + { + WindowStateEvent += OnWindowStateEvent; + Shown += OnShown; + Hidden += OnHidden; + VisibilityNotifyEvent += OnVisibilityNotifyEvent; + DeleteEvent += OnDeleteEvent; + + } + + void OnDeleteEvent(object o, DeleteEventArgs args) + { + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + + if (MauiGtkApplication.Current.MainWindow == o) + { + + ((Application)MauiGtkApplication.CurrentGtkApplication).Quit(); + + args.Event.SendEvent = true; + } + } + + void OnVisibilityNotifyEvent(object o, VisibilityNotifyEventArgs args) + { + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + } + + void OnHidden(object? sender, EventArgs args) + { + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + } + + void OnShown(object? sender, EventArgs args) + { + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + } + + void OnWindowStateEvent(object o, WindowStateEventArgs args) + { + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + } + + } + +} \ No newline at end of file From 8c9d7eec19454787905c84aa3036d049cf3cdcb0 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 20:57:40 +0200 Subject: [PATCH 005/425] Core.csproj Gtk Infrastructure: Gtk-specific extensions, FontManager, ViewHandlerOfT --- src/Core/src/Fonts/FontManager.Linux.cs | 138 ++++++++++++- src/Core/src/Fonts/IFontManager.Linux.cs | 11 +- .../src/Handlers/View/ViewHandlerOfT.Linux.cs | 45 ++++- .../src/Platform/Linux/ActivationState.cs | 14 ++ .../src/Platform/Linux/AlignmentExtensions.cs | 20 -- .../src/Platform/Linux/ColorExtensions.cs | 21 -- src/Core/src/Platform/Linux/FontExtensions.cs | 63 ++++++ .../src/Platform/Linux/HandlerExtensions.cs | 47 +++++ .../src/Platform/Linux/ThicknessExtensions.cs | 40 ++++ src/Core/src/Platform/Linux/ViewExtensions.cs | 8 +- .../Platform/Linux/WidgetColorExtensions.cs | 185 ++++++++++++++++++ .../src/Platform/Linux/WidgetExtensions.cs | 88 +++++++++ .../Linux/ColorExtensions.cs | 42 ++++ .../Linux/GraphicsExtensions.cs | 13 ++ 14 files changed, 681 insertions(+), 54 deletions(-) create mode 100644 src/Core/src/Platform/Linux/ActivationState.cs delete mode 100644 src/Core/src/Platform/Linux/AlignmentExtensions.cs delete mode 100644 src/Core/src/Platform/Linux/ColorExtensions.cs create mode 100644 src/Core/src/Platform/Linux/FontExtensions.cs create mode 100644 src/Core/src/Platform/Linux/HandlerExtensions.cs create mode 100644 src/Core/src/Platform/Linux/ThicknessExtensions.cs create mode 100644 src/Core/src/Platform/Linux/WidgetColorExtensions.cs create mode 100644 src/Core/src/Platform/Linux/WidgetExtensions.cs create mode 100644 src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs create mode 100644 src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs diff --git a/src/Core/src/Fonts/FontManager.Linux.cs b/src/Core/src/Fonts/FontManager.Linux.cs index e7cf25872b93..90fcc114c67d 100644 --- a/src/Core/src/Fonts/FontManager.Linux.cs +++ b/src/Core/src/Fonts/FontManager.Linux.cs @@ -1,12 +1,148 @@ -namespace Microsoft.Maui +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Maui.Graphics; +using Pango; + +namespace Microsoft.Maui { + + // see: https://developer.gnome.org/pygtk/stable/class-pangofontdescription.html + /* + public enum Pango.Weight + { + Thin = 100, // 0x00000064 + Ultralight = 200, // 0x000000C8 + Light = 300, // 0x0000012C + Semilight = 350, // 0x0000015E + Book = 380, // 0x0000017C + Normal = 400, // 0x00000190 + Medium = 500, // 0x000001F4 + Semibold = 600, // 0x00000258 + Bold = 700, // 0x000002BC + Ultrabold = 800, // 0x00000320 + Heavy = 900, // 0x00000384 + Ultraheavy = 1000, // 0x000003E8 + } + + public enum Stretch + { + UltraCondensed, + ExtraCondensed, + Condensed, + SemiCondensed, + Normal, + SemiExpanded, + Expanded, + ExtraExpanded, + UltraExpanded, + } + + + public enum Style { Normal, Oblique, Italic } + + public enum Variant + { + Normal, + SmallCaps, + } + + public enum Gravity + { + South, + East, + North, + West, + Auto, + } + + */ + public class FontManager : IFontManager { + readonly IFontRegistrar _fontRegistrar; + static Pango.Context? _systemContext; + + Pango.Context SystemContext => _systemContext ??= Gdk.PangoHelper.ContextGet(); + public FontManager(IFontRegistrar fontRegistrar) { _fontRegistrar = fontRegistrar; } + + FontDescription? _defaultFontFamily; + + public FontDescription DefaultFontFamily + { + get => _defaultFontFamily ??= GetFontFamily(default); + } + + double? _defaultFontSize; + + public double DefaultFontSize => _defaultFontSize ??= DefaultFontFamily?.GetSize() ?? 0; + + public FontDescription GetFontFamily(Font font) => + font == default ? SystemContext.FontDescription : font.ToFontDescription(); + + public double GetFontSize(Font font) + { + if (font.UseNamedSize) + return GetFontSize(font.NamedSize); + + return font.FontSize; + } + + public double GetFontSize(NamedSize namedSize) + { + // TODO: Hmm, maybe we need to revisit this, since we no longer support Windows Phone OR WinRT. + // These are values pulled from the mapped sizes on Windows Phone, WinRT has no equivalent sizes, only intents. + + return namedSize switch + { + NamedSize.Default => DefaultFontSize, + NamedSize.Micro => 15.667, + NamedSize.Small => 18.667, + NamedSize.Medium => 22.667, + NamedSize.Large => 32, + NamedSize.Body => 14, + NamedSize.Caption => 12, + NamedSize.Header => 46, + NamedSize.Subtitle => 20, + NamedSize.Title => 24, + _ => throw new ArgumentOutOfRangeException(nameof(namedSize)), + }; + } + + private IEnumerable<(Pango.FontFamily family, Pango.FontDescription description)> GetAvailableFamilyFaces(Pango.FontFamily family) + { + + if (family != default) + { + foreach (var face in family.Faces) + yield return (family, face.Describe()); + } + + yield break; + } + + private FontDescription[] GetAvailableFontStyles() + { + var fontFamilies = SystemContext.FontMap?.Families.ToArray(); + + var styles = new List(); + + if (fontFamilies != null) + { + styles.AddRange(fontFamilies.SelectMany(GetAvailableFamilyFaces).Select(font => font.description) + .OrderBy(d=>d.Family)); + } + + + return styles.ToArray(); + } + } + } \ No newline at end of file diff --git a/src/Core/src/Fonts/IFontManager.Linux.cs b/src/Core/src/Fonts/IFontManager.Linux.cs index 220aeb743d01..cca517f46fba 100644 --- a/src/Core/src/Fonts/IFontManager.Linux.cs +++ b/src/Core/src/Fonts/IFontManager.Linux.cs @@ -1,7 +1,16 @@ -namespace Microsoft.Maui +using Pango; + +namespace Microsoft.Maui { public interface IFontManager { + FontDescription DefaultFontFamily { get; } + + double DefaultFontSize { get; } + + FontDescription GetFontFamily(Font font); + + double GetFontSize(Font font); } } \ No newline at end of file diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs index 9af818b848dd..12cebf0cdf33 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs @@ -1,29 +1,62 @@ -using Microsoft.Maui.Graphics; +using System; +using System.Diagnostics; +using Gdk; +using Microsoft.Maui.Graphics.Native.Gtk; +using Rectangle = Microsoft.Maui.Graphics.Rectangle; +using Size = Microsoft.Maui.Graphics.Size; namespace Microsoft.Maui.Handlers { + public partial class ViewHandler : INativeViewHandler { + Gtk.Widget? INativeViewHandler.NativeView => (Gtk.Widget?)base.NativeView; public override void SetFrame(Rectangle rect) { + var nativeView = NativeView; + + if (nativeView == null) + return; + + if (rect.IsEmpty) + return; + + if (rect != nativeView.Allocation.ToRectangle()) + { + nativeView.SizeAllocate(rect.ToNative()); + nativeView.QueueResize(); + } } public override Size GetDesiredSize(double widthConstraint, double heightConstraint) - { - return new Size(widthConstraint, heightConstraint); - } + => NativeView.GetDesiredSize(widthConstraint, heightConstraint); protected override void SetupContainer() - { + { } + protected override void RemoveContainer() + { } + + protected void InvokeEvent(Action action) + { + MauiGtkApplication.Invoke(action); } - protected override void RemoveContainer() + public void MapFont(ITextStyle textStyle) { + var nativeView = NativeView; + + if (nativeView == null) + return; + + var fontManager = this.GetRequiredService(); + nativeView.UpdateFont(textStyle, fontManager); } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ActivationState.cs b/src/Core/src/Platform/Linux/ActivationState.cs new file mode 100644 index 000000000000..2356a2f1094d --- /dev/null +++ b/src/Core/src/Platform/Linux/ActivationState.cs @@ -0,0 +1,14 @@ +using System; + +namespace Microsoft.Maui +{ + public class ActivationState : IActivationState + { + public ActivationState(IMauiContext context) + { + Context = context ?? throw new ArgumentNullException(nameof(context)); + } + + public IMauiContext Context { get; } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/AlignmentExtensions.cs b/src/Core/src/Platform/Linux/AlignmentExtensions.cs deleted file mode 100644 index b14d2d8dadcf..000000000000 --- a/src/Core/src/Platform/Linux/AlignmentExtensions.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Gtk; - -namespace Microsoft.Maui -{ - public static class AlignmentExtensions - { - public static Align ToNative(this TextAlignment alignment) - { - switch (alignment) - { - case TextAlignment.Start: - return Align.Start; - case TextAlignment.End: - return Align.End; - default: - return Align.Center; - } - } - } -} diff --git a/src/Core/src/Platform/Linux/ColorExtensions.cs b/src/Core/src/Platform/Linux/ColorExtensions.cs deleted file mode 100644 index b04a9fbe995f..000000000000 --- a/src/Core/src/Platform/Linux/ColorExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Microsoft.Maui.Graphics; - -namespace Microsoft.Maui -{ - public static class ColorExtensions - { - public static Gdk.RGBA ToNative(this Color color) - { - string hex = color.ToHex(); - Gdk.RGBA nativeColor = new Gdk.RGBA(); - nativeColor.Parse(hex); - - return nativeColor; - } - - public static Color ToColor(this Gdk.Color color, float opacity = 255) - { - return new Color(color.Red, color.Green, color.Blue, opacity); - } - } -} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/FontExtensions.cs b/src/Core/src/Platform/Linux/FontExtensions.cs new file mode 100644 index 000000000000..8ccb3b3aad41 --- /dev/null +++ b/src/Core/src/Platform/Linux/FontExtensions.cs @@ -0,0 +1,63 @@ +using System; +using System.Linq; +using Gtk; + +namespace Microsoft.Maui +{ + + public static class FontExtensions + { + + public static Pango.FontDescription GetPangoFontDescription(this Widget it) +#pragma warning disable 612 + => it.StyleContext.GetFont(it.StateFlags); +#pragma warning restore 612 + + /// + /// size in points + /// + /// the size of a font description is specified in pango units. + /// There are pango units in one device unit (the device unit is a point for font sizes). + /// + /// + /// + public static double GetSize(this Pango.FontDescription it) + => it.Size / Pango.Scale.PangoScale; + + public static Pango.FontFamily GetPangoFontFamily(this Widget it) + => it.FontMap.Families.First(); + + // enum Pango.Style { Normal, Oblique, Italic } + public static Pango.Style ToFontStyle(this FontAttributes it) => it switch + { + FontAttributes.Bold => Pango.Style.Oblique, // ?? + FontAttributes.Italic => Pango.Style.Italic, + _ => Pango.Style.Normal + }; + + // enum Pango.Weight { Thin = 100, Ultralight = 200, Light = 300, Semilight = 350, Book = 380, Normal = 400, Medium = 500, Semibold = 600, Bold = 700, Ultrabold = 800, Heavy = 900, Ultraheavy = 1000,} + public static Pango.Weight ToFontWeight(this FontAttributes it) => it switch + { + FontAttributes.Bold => Pango.Weight.Bold, + _ => Pango.Weight.Normal + }; + + // enum Pango.Stretch { UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, Normal, SemiExpanded, Expanded, ExtraExpanded, UltraExpanded, } + + public static Pango.Stretch ToFontStretch(this Font it) => Pango.Stretch.Normal; + + public static Pango.FontDescription ToFontDescription(this Font it) + => new() + { + Family = it.FontFamily, + Size = (int)(it.FontSize * Pango.Scale.PangoScale), + Style = it.FontAttributes.ToFontStyle(), + Weight = it.FontAttributes.ToFontWeight(), + Stretch = it.ToFontStretch() + }; + + + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/HandlerExtensions.cs b/src/Core/src/Platform/Linux/HandlerExtensions.cs new file mode 100644 index 000000000000..6bddf5444643 --- /dev/null +++ b/src/Core/src/Platform/Linux/HandlerExtensions.cs @@ -0,0 +1,47 @@ +using System; +using Gtk; + +namespace Microsoft.Maui +{ + + public static class HandlerExtensions + { + public static Widget ToNative(this IView view, IMauiContext context) + { + _ = view ?? throw new ArgumentNullException(nameof(view)); + _ = context ?? throw new ArgumentNullException(nameof(context)); + + var handler = view.Handler; + + if (handler == null) + { + handler = context.Handlers.GetHandler(view.GetType()); + + if (handler == null) + throw new Exception($"Handler not found for view {view}"); + + handler.SetMauiContext(context); + + view.Handler = handler; + } + + handler.SetVirtualView(view); + + if (!(handler.NativeView is Widget result)) + { + throw new InvalidOperationException($"Unable to convert {view} to {typeof(Widget)}"); + } + + return result; + } + + public static Gtk.Requisition ToGtkRequisition(this Graphics.Size size) => + new() + { + Height = (int)size.Height, + Width = (int)size.Width + }; + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ThicknessExtensions.cs b/src/Core/src/Platform/Linux/ThicknessExtensions.cs new file mode 100644 index 000000000000..55691ea700ec --- /dev/null +++ b/src/Core/src/Platform/Linux/ThicknessExtensions.cs @@ -0,0 +1,40 @@ +using Gtk; + +namespace Microsoft.Maui +{ + + public static class ThicknessExtensions + { + + public static Thickness ToThickness(this Border it) + => new(it.Left, it.Top, it.Right, it.Bottom); + + public static Border ToNative(this Thickness it) + => new() { Left = (short)it.Left, Top = (short)it.Top, Right = (short)it.Right, Bottom = (short)it.Bottom }; + + public static TWidget? WithMargin(this TWidget? it, Thickness margin) where TWidget : Widget + { + if (it == default) + return it; + + // https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--margin-start + it.MarginStart = (int)margin.Left; + it.MarginTop = (int)margin.Top; + it.MarginEnd = (int)margin.Right; + it.MarginBottom = (int)margin.Bottom; + + return it; + } + + public static Thickness GetMargin(this TWidget? it) where TWidget : Widget => + it == default ? default : new Thickness(it.MarginStart, it.MarginTop, it.MarginEnd, it.MarginBottom); + + public static Thickness GetPadding(this TWidget? it) where TWidget : Widget + { + + return it?.StyleContext.GetPadding(StateFlags.Normal).ToThickness() ?? default; + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ViewExtensions.cs b/src/Core/src/Platform/Linux/ViewExtensions.cs index f0d4ff8f74de..84c69ecba158 100644 --- a/src/Core/src/Platform/Linux/ViewExtensions.cs +++ b/src/Core/src/Platform/Linux/ViewExtensions.cs @@ -11,13 +11,11 @@ public static void UpdateAutomationId(this Widget nativeView, IView view) public static void UpdateBackgroundColor(this Widget nativeView, IView view) { - + nativeView.SetBackgroundColor(view.BackgroundColor); } - public static void UpdateIsEnabled(this Widget nativeView, IView view) - { - - } + public static void UpdateIsEnabled(this Widget nativeView, IView view) => + nativeView?.UpdateIsEnabled(view.IsEnabled); public static void UpdateSemantics(this Widget nativeView, IView view) { diff --git a/src/Core/src/Platform/Linux/WidgetColorExtensions.cs b/src/Core/src/Platform/Linux/WidgetColorExtensions.cs new file mode 100644 index 000000000000..5349fff17560 --- /dev/null +++ b/src/Core/src/Platform/Linux/WidgetColorExtensions.cs @@ -0,0 +1,185 @@ +using System; +using Gtk; +using Microsoft.Maui.Graphics.Native.Gtk; + +namespace Microsoft.Maui +{ + + public static class WidgetColorExtensions + { + + public static void SetBackgroundColor(this Gtk.Widget widget, Graphics.Color color) + { + if (color == null) + return; + + widget.SetBackgroundColor(Gtk.StateType.Normal, color); + } + + public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateType state, Graphics.Color color) + { + widget.SetBackgroundColor(state.ToStateFlag(), color); + } + + public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateFlags state, Graphics.Color color) + { +#pragma warning disable 612 + widget.OverrideBackgroundColor(state, color.ToGdkRgba()); +#pragma warning restore 612 + } + + public static Graphics.Color GetBackgroundColor(this Gtk.Widget widget) + { + return widget.GetBackgroundColor(Gtk.StateFlags.Normal); + } + + public static Graphics.Color GetBackgroundColor(this Gtk.Widget widget, Gtk.StateType state) + { + return widget.GetBackgroundColor(state.ToStateFlag()); + } + + public static Graphics.Color GetBackgroundColor(this Gtk.Widget widget, Gtk.StateFlags state) + { +#pragma warning disable 612 + return widget.StyleContext.GetBackgroundColor(state).ToColor(); +#pragma warning restore 612 + } + + public static Graphics.Color GetForegroundColor(this Gtk.Widget widget) + { + return widget.GetForegroundColor(Gtk.StateType.Normal); + } + + public static Graphics.Color GetForegroundColor(this Gtk.Widget widget, Gtk.StateType state) + { + return widget.GetForegroundColor(state.ToStateFlag()); + } + + public static Graphics.Color GetForegroundColor(this Gtk.Widget widget, Gtk.StateFlags state) + { + return widget.StyleContext.GetColor(state).ToColor(); + } + + public static void SetForegroundColor(this Gtk.Widget widget, Gtk.StateType state, Graphics.Color color) + { + widget.SetForegroundColor(state.ToStateFlag(), color); + } + + public static void SetForegroundColor(this Gtk.Widget widget, Gtk.StateFlags state, Graphics.Color color) + { + if (color == null) + return; +#pragma warning disable 612 + widget.OverrideColor(state, color.ToGdkRgba()); +#pragma warning restore 612 + } + + public static void SetForegroundColor(this Gtk.Widget widget, Graphics.Color color) + { + widget.SetForegroundColor(Gtk.StateType.Normal, color); + } + + public static void UpdateTextColor(this Gtk.Widget widget, Graphics.Color textColor) + { + if (textColor == null) + return; + + widget.SetForegroundColor(textColor); + widget.SetForegroundColor(Gtk.StateFlags.Prelight, textColor); + } + + public static Gtk.StateFlags ToStateFlag(this Gtk.StateType state) + { + switch (state) + { + case Gtk.StateType.Active: + return Gtk.StateFlags.Active; + case Gtk.StateType.Prelight: + return Gtk.StateFlags.Prelight; + case Gtk.StateType.Insensitive: + return Gtk.StateFlags.Insensitive; + case Gtk.StateType.Focused: + return Gtk.StateFlags.Active; + case Gtk.StateType.Inconsistent: + return Gtk.StateFlags.Normal; + case Gtk.StateType.Selected: + return Gtk.StateFlags.Selected; + } + + return Gtk.StateFlags.Normal; + } + + public static Gdk.Color ColorFor(this Gtk.StyleContext ctx, string postfix, Gtk.StateType state) + { + var prefix = string.Empty; + // see: https://developer.gnome.org/gtk3/stable/gtk-migrating-GtkStyleContext-css.html + // examples: (see: gtk.css) selected_bg_color insensitive_bg_color base_color theme_text_color insensitive_base_color theme_unfocused_fg_color theme_unfocused_text_color theme_unfocused_bg_color + + switch (state) + { + case StateType.Normal: + prefix = "theme_unfocused_"; + + break; + case StateType.Active: + break; + case StateType.Prelight: + break; + case StateType.Selected: + prefix = "selected_"; + + break; + case StateType.Insensitive: + prefix = "insensitive_"; + + break; + case StateType.Inconsistent: + break; + case StateType.Focused: + break; + default: + throw new ArgumentOutOfRangeException(nameof(state), state, null); + } + + if (ctx.LookupColor($"{prefix}{postfix}_color", out var col)) + { + return col.ToGdkColor(); + } + + ctx.LookupColor("base_color", out col); + + return col.ToGdkColor(); + } + + public static Gdk.Color Background(this Gtk.Style it, Gtk.StateType state) + { + + return it.Context.ColorFor("bg", state); + } + + public static Gdk.Color Dark(this Gtk.Style it, Gtk.StateType state) + { + // TODO + return it.Foreground(state); + + } + + public static Gdk.Color Foreground(this Gtk.Style it, Gtk.StateType state) + { + return it.Context.ColorFor("fg", state); + + } + + public static Gdk.Color Base(this Gtk.Style it, Gtk.StateType state) + { + return it.Context.ColorFor("", state); + } + + public static void ModifyBase(this Gtk.Widget it, Gtk.StateType state, Gdk.Color color) + { + // TODO + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/WidgetExtensions.cs b/src/Core/src/Platform/Linux/WidgetExtensions.cs new file mode 100644 index 000000000000..155311c17484 --- /dev/null +++ b/src/Core/src/Platform/Linux/WidgetExtensions.cs @@ -0,0 +1,88 @@ +using System; +using Gtk; + +namespace Microsoft.Maui +{ + + public static class WidgetExtensions + { + + public static void UpdateIsEnabled(this Widget native, bool isEnabled) => + native.Sensitive = isEnabled; + + public static SizeRequest GetDesiredSize( + this Widget? nativeView, + double widthConstraint, + double heightConstraint) + { + if (nativeView == null) + return Graphics.Size.Zero; + + nativeView.GetPreferredSize(out var minimumSize, out var req); + + var desiredSize = new Gdk.Size( + req.Width > 0 ? req.Width : 0, + req.Height > 0 ? req.Height : 0); + + var widthFits = widthConstraint >= desiredSize.Width; + var heightFits = heightConstraint >= desiredSize.Height; + + if (widthFits && heightFits) // Enough space with given constraints + { + return new SizeRequest(new Graphics.Size(desiredSize.Width, desiredSize.Height)); + } + + if (!widthFits) + { + nativeView.SetSize((int)widthConstraint, -1); + + nativeView.GetPreferredSize(out minimumSize, out req); + + desiredSize = new Gdk.Size( + req.Width > 0 ? req.Width : 0, + req.Height > 0 ? req.Height : 0); + + heightFits = heightConstraint >= desiredSize.Height; + } + + var size = new Graphics.Size(desiredSize.Width, heightFits ? desiredSize.Height : (int)heightConstraint); + + return new SizeRequest(size); + + } + + public static void SetSize(this Gtk.Widget self, double width, double height) + { + int calcWidth = (int)Math.Round(width); + int calcHeight = (int)Math.Round(height); + + // Avoid negative values + if (calcWidth < -1) + { + calcWidth = -1; + } + + if (calcHeight < -1) + { + calcHeight = -1; + } + + if (calcWidth != self.WidthRequest || calcHeight != self.HeightRequest) + { + self.SetSizeRequest(calcWidth, calcHeight); + } + } + + public static void UpdateFont(this Widget widget, ITextStyle textStyle, IFontManager fontManager) + { + var font = textStyle.Font; + + var fontFamily = fontManager.GetFontFamily(font); +#pragma warning disable 612 + widget.ModifyFont(fontFamily); +#pragma warning restore 612 + + } + } + +} \ No newline at end of file diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs new file mode 100644 index 000000000000..232110695215 --- /dev/null +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs @@ -0,0 +1,42 @@ +namespace Microsoft.Maui.Graphics.Native.Gtk +{ + + public static class ColorExtensions + { + + private static Gdk.RGBA ToNative_(this Color color) + { + var hex = color.ToHex(); + var nativeColor = new Gdk.RGBA(); + nativeColor.Parse(hex); + + return nativeColor; + } + + public static Gdk.RGBA ToGdkRgba(this Color color) + => color == default ? default : new() { Red = color.Red, Green = color.Green, Blue = color.Blue, Alpha = color.Alpha }; + + public static Gdk.Color ToGdkColor(this Gdk.RGBA color) + => new((byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255)); + + public static Color ToColor(this Gdk.Color color, float opacity = 255) + => new(color.Red, color.Green, color.Blue, opacity); + + public static Color ToColor(this Gdk.RGBA color) + => new((byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255), (byte)(color.Alpha * 255)); + + public static Cairo.Color ToCairoColor(this Color color) + => color == default ? default : new(color.Red, color.Green, color.Blue, color.Alpha); + + public static Cairo.Color ToCairoColor(this Gdk.RGBA color) + => new(color.Red, color.Green, color.Blue, color.Alpha); + + public static Gdk.Color ToGdkColor(this Color color) + => color == default ? default : new((byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255)); + + public static Color ToColor(this Gdk.Color color) + => new((float)color.Red / (float)ushort.MaxValue, (float)color.Green / (float)ushort.MaxValue, (float)color.Blue / (float)ushort.MaxValue); + + } + +} \ No newline at end of file diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs new file mode 100644 index 000000000000..8efc474ab745 --- /dev/null +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs @@ -0,0 +1,13 @@ +namespace Microsoft.Maui.Graphics.Native.Gtk +{ + + public static class GraphicsExtensions + { + + public static Rectangle ToRectangle(this Gdk.Rectangle it) + => new(it.X, it.Y, it.Width, it.Height); + public static Gdk.Rectangle ToNative(this Rectangle it) + => new Gdk.Rectangle((int)it.X, (int)it.Y, (int)it.Width, (int)it.Height); + } + +} \ No newline at end of file From de99fcfe5cde59fbd2e8ee09fcefe8283e305229 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 21:02:12 +0200 Subject: [PATCH 006/425] Core.csproj Gtk Handlers: ActivityIndicatorHandler, ButtonHandler, CheckBoxHandler, EditorHandler, EntryHandler, LabelHandler --- .../ActivityIndicatorHandler.Linux.cs | 12 ++-- .../Handlers/Button/ButtonHandler.Linux.cs | 28 +++++++--- .../CheckBox/CheckBoxHandler.Linux.cs | 31 +++++++++-- .../Handlers/Editor/EditorHandler.Linux.cs | 34 ++++++++---- .../src/Handlers/Entry/EntryHandler.Linux.cs | 55 +++++++++++++------ .../src/Handlers/Label/LabelHandler.Linux.cs | 27 ++++++--- .../src/Platform/Linux/EditorExtensions.cs | 18 +++++- .../src/Platform/Linux/EntryExtensions.cs | 15 ++++- .../src/Platform/Linux/LabelExtensions.cs | 16 +++++- .../Linux/LayoutAlignmentExtensions.cs | 29 ++++++++++ 10 files changed, 207 insertions(+), 58 deletions(-) create mode 100644 src/Core/src/Platform/Linux/LayoutAlignmentExtensions.cs diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs index 1dbd7974db30..018409141773 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs @@ -2,11 +2,11 @@ namespace Microsoft.Maui.Handlers { - public partial class ActivityIndicatorHandler : ViewHandler + public partial class ActivityIndicatorHandler : ViewHandler { protected override Spinner CreateNativeView() { - return new Spinner(); + return new(); } public static void MapIsRunning(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) @@ -14,7 +14,11 @@ public static void MapIsRunning(ActivityIndicatorHandler handler, IActivityIndic handler.NativeView?.UpdateIsRunning(activityIndicator); } - [MissingMapper] - public static void MapColor(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { } + + public static void MapColor(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) + { + handler.NativeView?.SetForegroundColor(activityIndicator.Color); + + } } } diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs b/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs index 505cd8bbbf2e..6200c923bc58 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs @@ -3,8 +3,10 @@ namespace Microsoft.Maui.Handlers { + public partial class ButtonHandler : ViewHandler { + protected override Button CreateNativeView() { return new Button(); @@ -29,31 +31,39 @@ public static void MapText(ButtonHandler handler, IButton button) handler.NativeView?.UpdateText(button); } - [MissingMapper] - public static void MapTextColor(ButtonHandler handler, IButton button) { } + public static void MapTextColor(ButtonHandler handler, IButton button) + { + handler.NativeView?.UpdateTextColor(button.TextColor); + } [MissingMapper] public static void MapCharacterSpacing(ButtonHandler handler, IButton button) { } - [MissingMapper] - public static void MapFont(ButtonHandler handler, IButton button) { } + public static void MapFont(ButtonHandler handler, IButton button) + { + handler.MapFont(button); + } - [MissingMapper] - public static void MapPadding(ButtonHandler handler, IButton button) { } + public static void MapPadding(ButtonHandler handler, IButton button) + { + handler.NativeView.WithMargin(button.Padding); + } void OnButtonPressEvent(object? o, ButtonPressEventArgs args) { - VirtualView?.Pressed(); + InvokeEvent(() => VirtualView?.Pressed()); } void OnButtonReleaseEvent(object? o, ButtonReleaseEventArgs args) { - VirtualView?.Released(); + InvokeEvent(() => VirtualView?.Released()); } void OnButtonClicked(object? sender, EventArgs e) { - VirtualView?.Clicked(); + InvokeEvent(() => VirtualView?.Clicked()); } + } + } \ No newline at end of file diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs index 3b565da8ae28..44ce4a32264e 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs @@ -1,17 +1,36 @@ -using Gtk; +using System; +using Gtk; namespace Microsoft.Maui.Handlers { + public partial class CheckBoxHandler : ViewHandler { - protected override CheckButton CreateNativeView() - { - return new CheckButton(); - } + + protected override CheckButton CreateNativeView() => new(); public static void MapIsChecked(CheckBoxHandler handler, ICheckBox check) { handler.NativeView?.UpdateIsChecked(check); } + + protected override void ConnectHandler(CheckButton nativeView) + { + nativeView.Toggled += OnToggledEvent; + } + + protected override void DisconnectHandler(CheckButton nativeView) + { + nativeView.Toggled -= OnToggledEvent; + } + + protected void OnToggledEvent(object? sender, EventArgs e) + { + if (sender is CheckButton nativeView && VirtualView != null) + VirtualView.IsChecked = nativeView.Active; + + } + } -} + +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs index 22c36d6ef213..887823bae333 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs @@ -2,11 +2,13 @@ namespace Microsoft.Maui.Handlers { + public partial class EditorHandler : ViewHandler { + protected override TextView CreateNativeView() { - return new TextView(); + return new(); } public static void MapText(EditorHandler handler, IEditor editor) @@ -15,27 +17,37 @@ public static void MapText(EditorHandler handler, IEditor editor) } [MissingMapper] - public static void MapPlaceholder(IViewHandler handler, IEditor editor) { } + public static void MapPlaceholder(EditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapPlaceholderColor(IViewHandler handler, IEditor editor) { } + public static void MapPlaceholderColor(EditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapCharacterSpacing(IViewHandler handler, IEditor editor) { } + public static void MapCharacterSpacing(EditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapMaxLength(IViewHandler handler, IEditor editor) { } + public static void MapMaxLength(EditorHandler handler, IEditor editor) { } [MissingMapper] public static void MapIsTextPredictionEnabled(EditorHandler handler, IEditor editor) { } - [MissingMapper] - public static void MapFont(IViewHandler handler, IEditor editor) { } + public static void MapFont(EditorHandler handler, IEditor editor) + { + handler.MapFont(editor); - [MissingMapper] - public static void MapIsReadOnly(IViewHandler handler, IEditor editor) { } + } + + public static void MapIsReadOnly(EditorHandler handler, IEditor editor) + { + if (handler.NativeView is { } nativeView) + nativeView.Editable = editor.IsReadOnly; + } + + public static void MapTextColor(EditorHandler handler, IEditor editor) + { + handler.NativeView?.UpdateTextColor(editor.TextColor); + } - [MissingMapper] - public static void MapTextColor(EditorHandler handler, IEditor editor) { } } + } \ No newline at end of file diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs b/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs index 11f237c65c60..8da64c166cd8 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs @@ -2,11 +2,13 @@ namespace Microsoft.Maui.Handlers { - public partial class EntryHandler : ViewHandler + + public partial class EntryHandler : ViewHandler { + protected override Entry CreateNativeView() { - return new Entry(); + return new(); } public static void MapText(EntryHandler handler, IEntry entry) @@ -14,29 +16,48 @@ public static void MapText(EntryHandler handler, IEntry entry) handler.NativeView?.UpdateText(entry); } - [MissingMapper] - public static void MapTextColor(EntryHandler handler, IEntry entry) { } + public static void MapTextColor(EntryHandler handler, IEntry entry) + { + handler.NativeView?.UpdateTextColor(entry.TextColor); + } - [MissingMapper] - public static void MapIsPassword(EntryHandler handler, IEntry entry) { } + public static void MapIsPassword(EntryHandler handler, IEntry entry) + { + if (handler.NativeView != null && entry.IsPassword) + handler.NativeView.InputPurpose = InputPurpose.Password; + } - [MissingMapper] - public static void MapHorizontalTextAlignment(EntryHandler handler, IEntry entry) { } + public static void MapHorizontalTextAlignment(EntryHandler handler, IEntry entry) + { + if (handler.NativeView is { } nativeView) + nativeView.Alignment = entry.HorizontalTextAlignment.ToXyAlign(); + } [MissingMapper] public static void MapIsTextPredictionEnabled(EntryHandler handler, IEntry entry) { } - [MissingMapper] - public static void MapMaxLength(EntryHandler handler, IEntry entry) { } + public static void MapMaxLength(EntryHandler handler, IEntry entry) + { + if (handler.NativeView is { } nativeView) + nativeView.MaxLength = entry.MaxLength; + } - [MissingMapper] - public static void MapPlaceholder(EntryHandler handler, IEntry entry) { } + public static void MapPlaceholder(EntryHandler handler, IEntry entry) + { + if (handler.NativeView is { } nativeView) + nativeView.PlaceholderText = entry.Placeholder; + } - [MissingMapper] - public static void MapIsReadOnly(EntryHandler handler, IEntry entry) { } + public static void MapIsReadOnly(EntryHandler handler, IEntry entry) + { + if (handler.NativeView is { } nativeView) + nativeView.IsEditable = entry.IsReadOnly; + } - [MissingMapper] - public static void MapFont(EntryHandler handler, IEntry entry) { } + public static void MapFont(EntryHandler handler, IEntry entry) + { + handler.MapFont(entry); + } [MissingMapper] public static void MapReturnType(EntryHandler handler, IEntry entry) { } @@ -49,5 +70,7 @@ public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) { } [MissingMapper] public static void MapKeyboard(EntryHandler handler, IEntry entry) { } + } + } \ No newline at end of file diff --git a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs index bc6b1b83bdb6..5fcde7b6febb 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs @@ -2,8 +2,11 @@ namespace Microsoft.Maui.Handlers { + public partial class LabelHandler : ViewHandler { + + // https://developer.gnome.org/gtk3/stable/GtkLabel.html protected override Label CreateNativeView() { return new Label(); @@ -14,14 +17,19 @@ public static void MapText(LabelHandler handler, ILabel label) handler.NativeView?.UpdateText(label); } - [MissingMapper] - public static void MapTextColor(LabelHandler handler, ILabel label) { } + public static void MapTextColor(LabelHandler handler, ILabel label) + { + handler.NativeView?.UpdateTextColor(label.TextColor); + } [MissingMapper] - public static void MapCharacterSpacing(LabelHandler handler, ILabel label) { } + public static void MapCharacterSpacing(LabelHandler handler, ILabel label) + { } - [MissingMapper] - public static void MapFont(LabelHandler handler, ILabel label) { } + public static void MapFont(LabelHandler handler, ILabel label) + { + handler.MapFont(label); + } public static void MapHorizontalTextAlignment(LabelHandler handler, ILabel label) { @@ -39,10 +47,15 @@ public static void MapTextDecorations(LabelHandler handler, ILabel label) { } [MissingMapper] public static void MapMaxLines(LabelHandler handler, ILabel label) { } - [MissingMapper] - public static void MapPadding(LabelHandler handler, ILabel label) { } + public static void MapPadding(LabelHandler handler, ILabel label) + { + handler.NativeView.WithMargin(label.Padding); + + } [MissingMapper] public static void MapLineHeight(LabelHandler handler, ILabel label) { } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/EditorExtensions.cs b/src/Core/src/Platform/Linux/EditorExtensions.cs index 6c04f66f8afc..8760201de1fe 100644 --- a/src/Core/src/Platform/Linux/EditorExtensions.cs +++ b/src/Core/src/Platform/Linux/EditorExtensions.cs @@ -2,15 +2,29 @@ namespace Microsoft.Maui { + public static class EditorExtensions { + public static void UpdateText(this TextView nativeEditor, IEditor editor) { var text = editor.Text; - TextBuffer buffer = nativeEditor.Buffer; + var buffer = nativeEditor.Buffer; + + if (buffer.Text == text) return; + + if (text == null) + { + buffer.Clear(); + } - if (buffer.Text != text) + else + { buffer.Text = text; + } + } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/EntryExtensions.cs b/src/Core/src/Platform/Linux/EntryExtensions.cs index b0f818782e27..84acdbf3c88c 100644 --- a/src/Core/src/Platform/Linux/EntryExtensions.cs +++ b/src/Core/src/Platform/Linux/EntryExtensions.cs @@ -2,14 +2,27 @@ namespace Microsoft.Maui { + public static class EntryExtensions { + public static void UpdateText(this Entry nativeEntry, IEntry entry) { var text = entry.Text; if (nativeEntry.Text != text) - nativeEntry.Text = text; + { + if (text != null) + nativeEntry.Text = text; + else + { + nativeEntry.Buffer.SetText(string.Empty, -1); + + } + } + } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LabelExtensions.cs b/src/Core/src/Platform/Linux/LabelExtensions.cs index 642b71089e54..a84d3c6fd7ef 100644 --- a/src/Core/src/Platform/Linux/LabelExtensions.cs +++ b/src/Core/src/Platform/Linux/LabelExtensions.cs @@ -3,8 +3,10 @@ namespace Microsoft.Maui { + public static class LabelExtensions { + public static void UpdateText(this Label nativeLabel, ILabel label) { nativeLabel.Text = label.Text; @@ -17,31 +19,37 @@ public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) case LineBreakMode.NoWrap: nativeLabel.LineWrap = false; nativeLabel.Ellipsize = Pango.EllipsizeMode.None; + break; case LineBreakMode.WordWrap: nativeLabel.LineWrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.None; + break; case LineBreakMode.CharacterWrap: nativeLabel.LineWrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Char; nativeLabel.Ellipsize = Pango.EllipsizeMode.None; + break; case LineBreakMode.HeadTruncation: nativeLabel.LineWrap = false; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.Start; + break; case LineBreakMode.TailTruncation: nativeLabel.LineWrap = false; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.End; + break; case LineBreakMode.MiddleTruncation: nativeLabel.LineWrap = false; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.Middle; + break; default: throw new ArgumentOutOfRangeException(); @@ -50,9 +58,13 @@ public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) public static void UpdateTextAlignment(this Label nativeLabel, ILabel label) { - var hAlignmentValue = label.HorizontalTextAlignment.ToNative(); + nativeLabel.Justify = label.HorizontalTextAlignment.ToJustification(); + nativeLabel.Xalign = label.HorizontalTextAlignment.ToXyAlign(); - nativeLabel.Halign = hAlignmentValue; } + + + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LayoutAlignmentExtensions.cs b/src/Core/src/Platform/Linux/LayoutAlignmentExtensions.cs new file mode 100644 index 000000000000..f111c1356477 --- /dev/null +++ b/src/Core/src/Platform/Linux/LayoutAlignmentExtensions.cs @@ -0,0 +1,29 @@ +using Gtk; +using Microsoft.Maui.Primitives; + +namespace Microsoft.Maui +{ + + public static class LayoutAlignmentExtensions + { + + public static Align ToNative(this LayoutAlignment alignment) => + alignment switch + { + LayoutAlignment.Start => Align.Start, + LayoutAlignment.End => Align.End, + LayoutAlignment.Fill => Align.Fill, + _ => Align.Center + }; + + public static LayoutAlignment ToMaui(this Align alignment) => + alignment switch + { + Align.Start => LayoutAlignment.Start, + Align.End => LayoutAlignment.End, + Align.Fill => LayoutAlignment.Fill, + _ => LayoutAlignment.Center + }; + } + +} \ No newline at end of file From eb2a9583468759eff1c97d07cdef349ab9c775a7 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 21:04:14 +0200 Subject: [PATCH 007/425] Core.csproj Gtk Prototype of LayoutHandler, LayoutView --- .../Handlers/Layout/LayoutHandler.Linux.cs | 64 ++- src/Core/src/Platform/Linux/LayoutView.cs | 387 +++++++++++++++++- 2 files changed, 444 insertions(+), 7 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs index 612435eed055..77b27c6b6253 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs @@ -1,20 +1,80 @@ -namespace Microsoft.Maui.Handlers +using System; +using Gtk; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Layouts; + +namespace Microsoft.Maui.Handlers { + public partial class LayoutHandler : ViewHandler { + protected override LayoutView CreateNativeView() { - return new LayoutView(); + if (VirtualView == null) + { + throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a {nameof(LayoutViewAsFixed)}"); + } + + return new LayoutView + { + CrossPlatformVirtualView = () => VirtualView, + + }; + } + + public override void SetVirtualView(IView view) + { + base.SetVirtualView(view); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + NativeView.CrossPlatformVirtualView = () => VirtualView; + + foreach (var child in VirtualView.Children) + { + if (child.ToNative(MauiContext) is { } nativeChild) + NativeView.Add(child, nativeChild); + + } + + NativeView.QueueAllocate(); + NativeView.QueueResize(); } public void Add(IView child) { + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + if (child.ToNative(MauiContext) is { } nativeChild) + NativeView.Add(child, nativeChild); + NativeView.QueueAllocate(); } public void Remove(IView child) { + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + if (child.ToNative(MauiContext) is { } nativeChild) + NativeView.Remove(nativeChild); + + NativeView.QueueAllocate(); + } + + public override void SetFrame(Rectangle rect) + { + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + NativeView.SetFrame(rect); } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LayoutView.cs b/src/Core/src/Platform/Linux/LayoutView.cs index 776bdd4d6d05..cf7e479d4969 100644 --- a/src/Core/src/Platform/Linux/LayoutView.cs +++ b/src/Core/src/Platform/Linux/LayoutView.cs @@ -1,18 +1,395 @@ -using Gdk; +using System; +using System.Collections.Generic; +using System.Linq; using Gtk; +using Microsoft.Maui.Graphics.Native.Gtk; +using Rectangle = Microsoft.Maui.Graphics.Rectangle; +using Size = Microsoft.Maui.Graphics.Size; namespace Microsoft.Maui { - public class LayoutView : Fixed + + // refactored from: https://github.com/mono/xwt/blob/501f6b529fca632655295169094f637627c74c47/Xwt.Gtk/Xwt.GtkBackend/BoxBackend.cs + + public class LayoutView : Container { - protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + +#if DEBUG + + protected override bool OnDrawn(Cairo.Context cr) + { + var r = base.OnDrawn(cr); + + cr.Save(); + cr.SetSourceColor(Graphics.Colors.Red.ToCairoColor()); + cr.Rectangle(0, 0, Allocation.Width, Allocation.Height); + cr.Stroke(); + cr.Restore(); + + return r; + } +#endif + + public Func? CrossPlatformVirtualView { get; set; } + + public ILayout? VirtualView => CrossPlatformVirtualView?.Invoke(); + + public bool IsReallocating; + Dictionary _children = new(); + + struct ChildAllocation + { + + public Rectangle Rect; + public Widget Widget; + + } + + public LayoutView() + { + HasWindow = false; + } + + public void ReplaceChild(Widget oldWidget, Widget newWidget) + { + var view = _children.FirstOrDefault(kvp => kvp.Value.Widget == oldWidget).Key; + ChildAllocation r = default; + + if (view != null) + { + r = _children[view]; + } + + Remove(oldWidget); + Add(newWidget); + + if (view != null) + { + r.Widget = newWidget; + _children[view] = r; + } + } + + // this is maybe not needed: + void UpdateFocusChain() + { + Orientation GetOrientation() => + // TODO: find out what orientation it has, or find another sort kriteria, eg. tabstop + Orientation.Vertical; + + var orientation = GetOrientation(); + + var focusChain = _children + // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) + .Select(kvp => kvp.Value.Widget) + .ToArray(); + + FocusChain = focusChain; + } + + public bool SetAllocation(IView w, Rectangle rect) + { + if (VirtualView == null) + { + return false; + } + + _children.TryGetValue(w, out ChildAllocation r); + + if (r.Rect == rect) return false; + + r.Rect = rect; + _children[w] = r; + UpdateFocusChain(); + + return true; + + } + + public void Add(IView view, Widget gw) + { + _children.Add(view, new ChildAllocation + { + Widget = gw, + Rect = new Rectangle(0, 0, 0, 0) + }); + + Add(gw); + } + + protected override void OnAdded(Widget widget) + { + widget.Parent = this; + } + + protected override void OnRemoved(Widget widget) + { + + var view = _children.FirstOrDefault(kvp => kvp.Value.Widget == widget).Key; + + if (view != null) + _children.Remove(view); + + widget.Unparent(); + QueueResize(); + } + + protected void OnReallocate(Gdk.Rectangle allocation = default) + { + if (VirtualView == null) + { + return; + } + + if (allocation == default) + { + allocation = new Gdk.Rectangle(0, 0, Allocation.Width, Allocation.Height); + } + + } + + protected Requisition OnGetRequisition(SizeConstraint widthConstraint, SizeConstraint heightConstraint) { - base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); + if (VirtualView == null) + + { + return Requisition.Zero; + } + + var size = GetSizeRequest(widthConstraint, heightConstraint); + + return size.ToGtkRequisition(); } - protected override void OnSizeAllocated(Rectangle allocation) + protected override void OnSizeAllocated(Gdk.Rectangle allocation) { base.OnSizeAllocated(allocation); + + try + { + IsReallocating = true; + OnReallocate(allocation); + } + finally + { + IsReallocating = false; + } + + foreach (var cr in _children.ToArray()) + { + var r = cr.Value.Rect; + cr.Value.Widget.SizeAllocate(new Gdk.Rectangle(allocation.X + (int)r.X, allocation.Y + (int)r.Y, (int)r.Width, (int)r.Height)); + } + } + + protected override void ForAll(bool includeInternals, Callback callback) + { + base.ForAll(includeInternals, callback); + + foreach (var c in _children.Values.Select(v => v.Widget).ToArray()) + callback(c); + } + + public void QueueResizeIfRequired() + { + // since we have no SizeRequest event, we must always queue up for resize + QueueResize(); + } + + protected override void OnUnrealized() + { + // force reallocation on next realization, since allocation may be lost + IsReallocating = false; + base.OnUnrealized(); + } + + protected override void OnRealized() + { + // force reallocation, if unrealized previously + if (!IsReallocating) + { + try + { + OnReallocate(); + } + catch + { + IsReallocating = false; + } + } + + base.OnRealized(); + } + + protected override SizeRequestMode OnGetRequestMode() + { + // dirty fix: unwrapped labels report fixed sizes, forcing parents to fixed mode + // -> report always width_for_height, since we don't support angles + return SizeRequestMode.WidthForHeight; + // return base.OnGetRequestMode(); + } + + protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight) + { + base.OnGetPreferredHeight(out minimumHeight, out naturalHeight); + // containers need initial width in heigt_for_width mode + // dirty fix: do not constrain width on first allocation + var forceWidth = SizeConstraint.Unconstrained; + + if (IsReallocating) + forceWidth = SizeConstraint.WithSize(Allocation.Width); + + var size = OnGetRequisition(forceWidth, SizeConstraint.Unconstrained); + + if (size.Height < HeightRequest) + minimumHeight = naturalHeight = HeightRequest; + else + minimumHeight = naturalHeight = size.Height; + } + + protected override void OnGetPreferredWidth(out int minimumWidth, out int naturalWidth) + { + base.OnGetPreferredWidth(out minimumWidth, out naturalWidth); + // containers need initial height in width_for_height mode + // dirty fix: do not constrain height on first allocation + var forceHeight = SizeConstraint.Unconstrained; + + if (IsReallocating) + forceHeight = SizeConstraint.WithSize(Allocation.Width); + + var size = OnGetRequisition(SizeConstraint.Unconstrained, forceHeight); + + if (size.Width < WidthRequest) + minimumWidth = naturalWidth = WidthRequest; + else + minimumWidth = naturalWidth = size.Width; + } + + protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) + { + base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); + var size = OnGetRequisition(SizeConstraint.WithSize(width), SizeConstraint.Unconstrained); + + if (size.Height < HeightRequest) + minimumHeight = naturalHeight = HeightRequest; + else + minimumHeight = naturalHeight = size.Height; + } + + protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) + { + base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); + var size = OnGetRequisition(SizeConstraint.Unconstrained, SizeConstraint.WithSize(height)); + + if (size.Width < WidthRequest) + minimumWidth = naturalWidth = WidthRequest; + else + minimumWidth = naturalWidth = size.Width; + } + + #region adoptions + + public void SetFrame(Rectangle rect) + { + var nativeView = this; + var virtualView = VirtualView; + + if (nativeView == null || virtualView == null) + return; + + if (rect.Width < 0 || rect.Height < 0) + return; + + if (rect != virtualView.Frame) + { + nativeView.SizeAllocate(rect.ToNative()); + nativeView.QueueResize(); + } + } + + public Size GetSizeRequest(SizeConstraint widthConstraint, SizeConstraint heightConstraint) + { + if (VirtualView == null) + { + return Size.Zero; + } + + VirtualView.InvalidateMeasure(); + + var size1 = VirtualView.Measure(widthConstraint.IsConstrained ? widthConstraint.AvailableSize : -1, heightConstraint.IsConstrained ? heightConstraint.AvailableSize : -1); + + var size = Size.Zero; + + foreach (var v in VirtualView.Children) + { + if (v.IsMeasureValid) + { + size.Width = Math.Max(size.Width, v.DesiredSize.Width + v.Frame.X); + size.Height = Math.Max(size.Height, v.DesiredSize.Height + v.Frame.Y); + } + + v.InvalidateArrange(); + v.Arrange(v.Frame); + SetAllocation(v, v.Frame); + + } + + var mesured = new Size(size.Width > 0 ? size.Width : widthConstraint.AvailableSize, size.Height > 0 ? size.Height : heightConstraint.AvailableSize); + VirtualView.InvalidateMeasure(); + VirtualView.InvalidateArrange(); + VirtualView.Arrange(new Rectangle(Graphics.Point.Zero, mesured)); + + return mesured; + + } + + #endregion + + } + + public struct SizeConstraint : IEquatable + { + + // The value '0' is used for Unconstrained, since that's the default value of SizeContraint + // Since a constraint of '0' is valid, we use NegativeInfinity as a marker for constraint=0. + double _value; + + public static readonly SizeConstraint Unconstrained = new(); + + public static implicit operator SizeConstraint(double size) => new() { AvailableSize = size }; + + public static SizeConstraint WithSize(double size) => new() { AvailableSize = size }; + + public double AvailableSize + { + get => double.IsNegativeInfinity(_value) ? 0 : _value; + set + { + _value = value <= 0 ? double.NegativeInfinity : value; + } } + + public bool IsConstrained + { + get => _value != 0; + } + + public static bool operator ==(SizeConstraint s1, SizeConstraint s2) => (s1._value == s2._value); + + public static bool operator !=(SizeConstraint s1, SizeConstraint s2) => (s1._value != s2._value); + + public static SizeConstraint operator +(SizeConstraint c, double s) => !c.IsConstrained ? c : WithSize(c.AvailableSize + s); + + public static SizeConstraint operator -(SizeConstraint c, double s) => !c.IsConstrained ? c : WithSize(Math.Max(c.AvailableSize - s, 0)); + + public override bool Equals(object ob) => (ob is SizeConstraint constraint) && this == constraint; + + public bool Equals(SizeConstraint other) => this == other; + + public override int GetHashCode() => _value.GetHashCode(); + + public override string ToString() => IsConstrained ? AvailableSize.ToString() : "Unconstrained"; + } + } \ No newline at end of file From ab2bb8a697642300e9844b7b2b3ade4e3a542176 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 21:06:37 +0200 Subject: [PATCH 008/425] Core.csproj Gtk TextAlignmentExtensions --- .../Platform/Linux/TextAlignmentExtensions.cs | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/Core/src/Platform/Linux/TextAlignmentExtensions.cs diff --git a/src/Core/src/Platform/Linux/TextAlignmentExtensions.cs b/src/Core/src/Platform/Linux/TextAlignmentExtensions.cs new file mode 100644 index 000000000000..92784725075e --- /dev/null +++ b/src/Core/src/Platform/Linux/TextAlignmentExtensions.cs @@ -0,0 +1,58 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class TextAlignmentExtensions + { + + // https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--halign + // How to distribute horizontal space if widget gets extra space, see GtkAlign + + internal static Align ToGtkAlign(this TextAlignment alignment) + { + switch (alignment) + { + case TextAlignment.Start: + return Align.Start; + case TextAlignment.End: + return Align.End; + default: + return Align.Center; + } + } + + public static Justification ToJustification(this TextAlignment alignment) + { + switch (alignment) + { + case TextAlignment.Start: + return Justification.Left; + case TextAlignment.End: + return Justification.Right; + default: + return Justification.Center; + } + } + + /// + /// https://developer.gnome.org/gtk3/stable/GtkLabel.html#gtk-label-set-xalign + /// The xalign property determines the horizontal aligment of the label text inside the labels size allocation. + /// Compare this to “halign”, which determines how the labels size allocation is positioned in the space available for the label. + /// + /// + /// + public static float ToXyAlign(this TextAlignment alignment) + { + switch (alignment) + { + case TextAlignment.Start: + return 0f; + case TextAlignment.End: + return 1f; + default: + return 0.5f; + } + } + + } +} From 678c45840ed03d0746e2b4f05f1cbd8d97897e5e Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 21:08:21 +0200 Subject: [PATCH 009/425] Core.csproj Gtk Readme [Microsoft.Maui.Graphics]/Linux --- src/Core/src/[Microsoft.Maui.Graphics]/Linux/Readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Core/src/[Microsoft.Maui.Graphics]/Linux/Readme.md diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/Readme.md b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/Readme.md new file mode 100644 index 000000000000..8add4a138122 --- /dev/null +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/Readme.md @@ -0,0 +1 @@ +this directory should be moved to Microsoft.Maui.Graphics \ No newline at end of file From 3cdb67f71c73d3b758516f5cde3a4819783d1f94 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 21:26:00 +0200 Subject: [PATCH 010/425] Core.csproj Gtk: LayoutView, MauiGtkApplication: adjust null handling to satisfy net5 --- src/Core/src/Platform/Linux/LayoutView.cs | 2 +- src/Core/src/Platform/Linux/MauiGtkApplication.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Core/src/Platform/Linux/LayoutView.cs b/src/Core/src/Platform/Linux/LayoutView.cs index cf7e479d4969..33235d0f2f39 100644 --- a/src/Core/src/Platform/Linux/LayoutView.cs +++ b/src/Core/src/Platform/Linux/LayoutView.cs @@ -382,7 +382,7 @@ public bool IsConstrained public static SizeConstraint operator -(SizeConstraint c, double s) => !c.IsConstrained ? c : WithSize(Math.Max(c.AvailableSize - s, 0)); - public override bool Equals(object ob) => (ob is SizeConstraint constraint) && this == constraint; + public override bool Equals(object? ob) => (ob is SizeConstraint constraint) && this == constraint; public bool Equals(SizeConstraint other) => this == other; diff --git a/src/Core/src/Platform/Linux/MauiGtkApplication.cs b/src/Core/src/Platform/Linux/MauiGtkApplication.cs index 25fd40d0e502..810d264e3e21 100644 --- a/src/Core/src/Platform/Linux/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Linux/MauiGtkApplication.cs @@ -23,11 +23,11 @@ public void Run() protected void RegisterLifecycleEvents(Gtk.Application app) { - app.Startup += OnStartup; - app.Shutdown += OnShutdown; + app.Startup += OnStartup!; + app.Shutdown += OnShutdown!; app.Opened += OnOpened; app.WindowAdded += OnWindowAdded; - app.Activated += OnActivated; + app.Activated += OnActivated!; app.WindowRemoved += OnWindowRemoved; app.CommandLine += OnCommandLine; From 622316ed64d88dca0da99d984abd155e7381f2af Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 28 Apr 2021 21:29:42 +0200 Subject: [PATCH 011/425] Core.csproj Gtk: fix LayoutHandler prototype slack --- src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs index 77b27c6b6253..149189ad1129 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs @@ -13,7 +13,7 @@ protected override LayoutView CreateNativeView() { if (VirtualView == null) { - throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a {nameof(LayoutViewAsFixed)}"); + throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a {nameof(LayoutView)}"); } return new LayoutView From a9a7cb5546ad8007873a30b10d80847680c1d4b7 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 30 Apr 2021 16:11:52 +0200 Subject: [PATCH 012/425] Core.csproj Gtk: merge a7efd1ac & 5ce87eb9 --- .../src/Platform/Linux/HandlerExtensions.cs | 6 +-- src/Core/src/Platform/Linux/MauiContext.cs | 1 - src/Core/src/Platform/Linux/MauiWindow.cs | 47 +++++++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 src/Core/src/Platform/Linux/MauiWindow.cs diff --git a/src/Core/src/Platform/Linux/HandlerExtensions.cs b/src/Core/src/Platform/Linux/HandlerExtensions.cs index 6bddf5444643..0b2dc8127c8b 100644 --- a/src/Core/src/Platform/Linux/HandlerExtensions.cs +++ b/src/Core/src/Platform/Linux/HandlerExtensions.cs @@ -1,9 +1,8 @@ -using System; using Gtk; +using System; namespace Microsoft.Maui { - public static class HandlerExtensions { public static Widget ToNative(this IView view, IMauiContext context) @@ -27,7 +26,7 @@ public static Widget ToNative(this IView view, IMauiContext context) handler.SetVirtualView(view); - if (!(handler.NativeView is Widget result)) + if (handler.NativeView is not Widget result) { throw new InvalidOperationException($"Unable to convert {view} to {typeof(Widget)}"); } @@ -43,5 +42,4 @@ public static Gtk.Requisition ToGtkRequisition(this Graphics.Size size) => }; } - } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiContext.cs b/src/Core/src/Platform/Linux/MauiContext.cs index 8def5180ed8c..0126bd2ab8e2 100644 --- a/src/Core/src/Platform/Linux/MauiContext.cs +++ b/src/Core/src/Platform/Linux/MauiContext.cs @@ -24,5 +24,4 @@ public MauiContext(IServiceProvider services) public IMauiHandlersServiceProvider Handlers => _mauiHandlersServiceProvider ?? throw new InvalidOperationException($"No service provider was specified during construction."); } - } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiWindow.cs b/src/Core/src/Platform/Linux/MauiWindow.cs new file mode 100644 index 000000000000..1300e5c68f20 --- /dev/null +++ b/src/Core/src/Platform/Linux/MauiWindow.cs @@ -0,0 +1,47 @@ +using System; +using Gtk; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Maui.Hosting; +using Microsoft.Maui.LifecycleEvents; + +namespace Microsoft.Maui +{ + public class MauiWindow : Window + where TStartup : IStartup, new() + { + public MauiWindow() : base(WindowType.Toplevel) + { + var startup = new TStartup(); + + var host = startup + .CreateAppHostBuilder() + .ConfigureServices(ConfigureNativeServices) + .ConfigureUsing(startup) + .Build(); + + Services = host.Services; + Application = Services.GetRequiredService(); + + var mauiContext = new MauiContext(Services); + + var activationState = new ActivationState(mauiContext); + var window = Application.CreateWindow(activationState); + window.MauiContext = mauiContext; + + var content = (window.Page as IView) ?? window.Page.View; + + Add(content.ToNative(window.MauiContext)); + Child.ShowAll(); + } + + public new IApplication Application { get; protected set; } = null!; + + public IServiceProvider Services { get; protected set; } = null!; + + // Configure native services like HandlersContext, ImageSourceHandlers etc.. + void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollection services) + { + } + } +} \ No newline at end of file From c3af1b9f526fe70d1674680dbbf8f8dc4d183a6b Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 30 Apr 2021 16:12:30 +0200 Subject: [PATCH 013/425] Core.csproj Gtk: remove MauiWindow.cs --- src/Core/src/Platform/Linux/MauiWindow.cs | 47 ----------------------- 1 file changed, 47 deletions(-) delete mode 100644 src/Core/src/Platform/Linux/MauiWindow.cs diff --git a/src/Core/src/Platform/Linux/MauiWindow.cs b/src/Core/src/Platform/Linux/MauiWindow.cs deleted file mode 100644 index 1300e5c68f20..000000000000 --- a/src/Core/src/Platform/Linux/MauiWindow.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using Gtk; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Maui.Hosting; -using Microsoft.Maui.LifecycleEvents; - -namespace Microsoft.Maui -{ - public class MauiWindow : Window - where TStartup : IStartup, new() - { - public MauiWindow() : base(WindowType.Toplevel) - { - var startup = new TStartup(); - - var host = startup - .CreateAppHostBuilder() - .ConfigureServices(ConfigureNativeServices) - .ConfigureUsing(startup) - .Build(); - - Services = host.Services; - Application = Services.GetRequiredService(); - - var mauiContext = new MauiContext(Services); - - var activationState = new ActivationState(mauiContext); - var window = Application.CreateWindow(activationState); - window.MauiContext = mauiContext; - - var content = (window.Page as IView) ?? window.Page.View; - - Add(content.ToNative(window.MauiContext)); - Child.ShowAll(); - } - - public new IApplication Application { get; protected set; } = null!; - - public IServiceProvider Services { get; protected set; } = null!; - - // Configure native services like HandlersContext, ImageSourceHandlers etc.. - void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollection services) - { - } - } -} \ No newline at end of file From 78a134e797b363656d05c23ba28ae872ea66ead4 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 30 Apr 2021 16:29:37 +0200 Subject: [PATCH 014/425] Core.csproj Gtk: WidgetColorExtensions.cs remove Dark, ModifyBase --- src/Core/src/Platform/Linux/WidgetColorExtensions.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Core/src/Platform/Linux/WidgetColorExtensions.cs b/src/Core/src/Platform/Linux/WidgetColorExtensions.cs index 5349fff17560..c993ac3c1534 100644 --- a/src/Core/src/Platform/Linux/WidgetColorExtensions.cs +++ b/src/Core/src/Platform/Linux/WidgetColorExtensions.cs @@ -157,13 +157,6 @@ public static Gdk.Color Background(this Gtk.Style it, Gtk.StateType state) return it.Context.ColorFor("bg", state); } - public static Gdk.Color Dark(this Gtk.Style it, Gtk.StateType state) - { - // TODO - return it.Foreground(state); - - } - public static Gdk.Color Foreground(this Gtk.Style it, Gtk.StateType state) { return it.Context.ColorFor("fg", state); @@ -175,11 +168,6 @@ public static Gdk.Color Base(this Gtk.Style it, Gtk.StateType state) return it.Context.ColorFor("", state); } - public static void ModifyBase(this Gtk.Widget it, Gtk.StateType state, Gdk.Color color) - { - // TODO - } - } } \ No newline at end of file From 90ad67a57a7abc001bef111553f771f42a9d1dbe Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 30 Apr 2021 16:46:48 +0200 Subject: [PATCH 015/425] Core.csproj Gtk: add comments for future use --- src/Core/src/Platform/Linux/MauiGtkApplication.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Core/src/Platform/Linux/MauiGtkApplication.cs b/src/Core/src/Platform/Linux/MauiGtkApplication.cs index 810d264e3e21..596b3653fe18 100644 --- a/src/Core/src/Platform/Linux/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Linux/MauiGtkApplication.cs @@ -63,17 +63,17 @@ protected void OnShutdown(object sender, EventArgs args) protected void OnCommandLine(object o, GLib.CommandLineArgs args) { - ; + // future use: to resolove command line arguments at cross platform Application level } protected void OnWindowRemoved(object o, WindowRemovedArgs args) { - ; + // future use: to have notifications at cross platform Window level } protected void OnWindowAdded(object o, WindowAddedArgs args) { - ; + // future use: to have notifications at cross platform Window level } // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid @@ -150,7 +150,9 @@ protected void Launch(EventArgs args) } protected void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollection services) - { } + { + //future use: there will be a need of GtkNativeServices, eg. for WebView + } } From b6699f3ed132528ecb8f548f26612d77aca25033 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:44:16 +0200 Subject: [PATCH 016/425] Directory.Build.props, Microsoft.Maui.Controls.MultiTargeting.targets: adjust to compile with linux --- ...osoft.Maui.Controls.MultiTargeting.targets | 23 ++++++++++++++++++- Directory.Build.props | 5 ++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index 1008f09bfefd..670a32459e62 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -1,4 +1,9 @@ + + + $(DefineConstants);LINUX;GTK + + @@ -41,7 +46,12 @@ - + + + + + + Platform\Windows\ @@ -97,6 +107,17 @@ + + + + $(SolutionDir)\src\Microsoft.Maui.Graphics.Gtk\Microsoft.Maui.Graphics.Gtk.dll + + + + + + + UAP diff --git a/Directory.Build.props b/Directory.Build.props index 59ef2dcce4c1..3a2a769d3d42 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,8 +14,9 @@ net6.0-android - Xamarin.iOS10;MonoAndroid10.0 - netstandard2.0;netstandard2.1;Xamarin.iOS10;MonoAndroid90;MonoAndroid10.0;tizen40;Xamarin.Mac20; + net5 + $(MauiLinuxTargets) + netstandard2.0;netstandard2.1;MonoAndroid10.0 $(NonNet6EssentialsPlatforms);uap10.0.16299; false From 5d62b3522840a2f9e269c35958a591a1ec86d889 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:45:09 +0200 Subject: [PATCH 017/425] Compatibility.GTK.csproj: rename to Compatibility.Gtk2.csproj --- .../src/{GTK => Gtk2}/Animations/BaseAnimation.cs | 0 .../src/{GTK => Gtk2}/Animations/FloatAnimation.cs | 0 .../Core/src/{GTK => Gtk2}/Cells/CellBase.cs | 0 .../Core/src/{GTK => Gtk2}/Cells/CellRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/Cells/EntryCell.cs | 0 .../src/{GTK => Gtk2}/Cells/EntryCellRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/Cells/ImageCell.cs | 0 .../src/{GTK => Gtk2}/Cells/ImageCellRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/Cells/SwitchCell.cs | 0 .../src/{GTK => Gtk2}/Cells/SwitchCellRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/Cells/TextCell.cs | 0 .../src/{GTK => Gtk2}/Cells/TextCellRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/Cells/ViewCell.cs | 0 .../src/{GTK => Gtk2}/Cells/ViewCellRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/Compatibility.GTK.csproj | 0 .../src/{GTK => Gtk2}/Controls/ActivityIndicator.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/BoxView.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/Carousel.cs | 0 .../src/{GTK => Gtk2}/Controls/CustomComboBox.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/CustomFrame.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/DatePicker.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/EntryWrapper.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/FlyoutPage.cs | 0 .../src/{GTK => Gtk2}/Controls/GLWidget/GLWidget.cs | 0 .../GLWidget/OSX/OSXWindowInfoInitializer.cs | 0 .../GLWidget/Win/WinWindowsInfoInitializer.cs | 0 .../Controls/GLWidget/X11/XWindowInfoInitializer.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/ImageButton.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/ImageControl.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/ListView.cs | 0 .../{GTK => Gtk2}/Controls/NavigationChildPage.cs | 0 .../src/{GTK => Gtk2}/Controls/NotebookWrapper.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/OpenGLView.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/Page.cs | 0 .../src/{GTK => Gtk2}/Controls/PageContainer.cs | 0 .../src/{GTK => Gtk2}/Controls/ScrolledTextView.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/SearchEntry.cs | 0 .../src/{GTK => Gtk2}/Controls/TabbedPageHeader.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/TableView.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/TimePicker.cs | 0 .../Core/src/{GTK => Gtk2}/Controls/WebView.cs | 0 .../src/{GTK => Gtk2}/ElementChangedEventArgs.cs | 0 .../Core/src/{GTK => Gtk2}/ExportCellAttribute.cs | 0 .../ExportImageSourceHandlerAttribute.cs | 0 .../src/{GTK => Gtk2}/ExportRendererAttribute.cs | 0 .../{GTK => Gtk2}/Extensions/AlignmentExtensions.cs | 0 .../Extensions/ButtonContentLayoutExtensions.cs | 0 .../src/{GTK => Gtk2}/Extensions/ColorExtensions.cs | 0 .../Extensions/GtkRectangleExtensions.cs | 0 .../src/{GTK => Gtk2}/Extensions/ImageExtensions.cs | 0 .../src/{GTK => Gtk2}/Extensions/LabelExtensions.cs | 0 .../src/{GTK => Gtk2}/Extensions/PageExtensions.cs | 0 .../Extensions/VisualElementExtensions.cs | 0 .../{GTK => Gtk2}/Extensions/WidgetExtensions.cs | 0 src/Compatibility/Core/src/{GTK => Gtk2}/Forms.cs | 0 .../Core/src/{GTK => Gtk2}/FormsWindow.cs | 0 .../Core/src/{GTK => Gtk2}/GtkDeviceInfo.cs | 0 .../Core/src/{GTK => Gtk2}/GtkExpressionSearch.cs | 0 .../Core/src/{GTK => Gtk2}/GtkFormsContainer.cs | 0 .../src/{GTK => Gtk2}/GtkIsolatedStorageFile.cs | 0 .../Core/src/{GTK => Gtk2}/GtkOpenGL.cs | 0 .../Core/src/{GTK => Gtk2}/GtkPlatformServices.cs | 0 .../Core/src/{GTK => Gtk2}/GtkSerializer.cs | 0 .../src/{GTK => Gtk2}/GtkSynchronizationContext.cs | 0 .../Core/src/{GTK => Gtk2}/GtkThemes.cs | 0 .../Core/src/{GTK => Gtk2}/GtkTicker.cs | 0 .../Core/src/{GTK => Gtk2}/GtkToolbarConstants.cs | 0 .../Core/src/{GTK => Gtk2}/GtkToolbarTracker.cs | 0 .../Core/src/{GTK => Gtk2}/Helpers/DialogHelper.cs | 0 .../{GTK => Gtk2}/Helpers/FontDescriptionHelper.cs | 0 .../Core/src/{GTK => Gtk2}/Helpers/GrabHelper.cs | 0 .../src/{GTK => Gtk2}/Helpers/PlatformHelper.cs | 0 .../Core/src/{GTK => Gtk2}/IDesiredSizeProvider.cs | 0 .../src/{GTK => Gtk2}/IVisualElementRenderer.cs | 0 .../{GTK => Gtk2}/IVisualNativeElementRenderer.cs | 0 .../src/{GTK => Gtk2}/Libs/gtk-sharp/README.txt | 0 .../src/{GTK => Gtk2}/Libs/webkit-sharp/README.txt | 0 .../Libs/webkit-sharp/webkit-sharp.dll.config | 0 .../Packagers/LayoutElementPackager.cs | 0 .../{GTK => Gtk2}/Packagers/PageElementPackager.cs | 0 .../Packagers/VisualElementPackager.cs | 0 .../Core/src/{GTK => Gtk2}/Platform.cs | 0 .../PlatformConfigurationExtensions.cs | 0 .../Core/src/{GTK => Gtk2}/PlatformEffect.cs | 0 .../Core/src/{GTK => Gtk2}/PlatformRenderer.cs | 0 .../src/{GTK => Gtk2}/Properties/AssemblyInfo.cs | 0 .../Core/src/{GTK => Gtk2}/RendererFactory.cs | 0 .../{GTK => Gtk2}/Renderers/AbstractPageRenderer.cs | 0 .../Renderers/ActivityIndicatorRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/BoxViewRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/ButtonRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/CarouselPageRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/DatePickerRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/EditorRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/EntryRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/FlyoutPageRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/FrameRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/IPageControl.cs | 0 .../src/{GTK => Gtk2}/Renderers/IToolbarTracker.cs | 0 .../src/{GTK => Gtk2}/Renderers/ImageRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/LabelRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/LayoutRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/ListViewRenderer.cs | 0 .../Renderers/NavigationPageRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/OpenGLViewRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/PageRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/PickerRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/ProgressBarRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/ScrollViewRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/SearchBarRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/SliderRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/StepperRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/SwitchRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/TabbedPageRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/TableViewRenderer.cs | 0 .../{GTK => Gtk2}/Renderers/TimePickerRenderer.cs | 0 .../src/{GTK => Gtk2}/Renderers/WebViewRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/Resources/hamburger.png | Bin .../Core/src/{GTK => Gtk2}/ResourcesProvider.cs | 0 .../Core/src/{GTK => Gtk2}/ViewRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/VisualElementRenderer.cs | 0 .../Core/src/{GTK => Gtk2}/VisualElementTracker.cs | 0 src/Compatibility/Core/src/{GTK => Gtk2}/app.config | 0 .../Core/src/{GTK => Gtk2}/webkit-sharp.dll.config | 0 124 files changed, 0 insertions(+), 0 deletions(-) rename src/Compatibility/Core/src/{GTK => Gtk2}/Animations/BaseAnimation.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Animations/FloatAnimation.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/CellBase.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/CellRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/EntryCell.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/EntryCellRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/ImageCell.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/ImageCellRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/SwitchCell.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/SwitchCellRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/TextCell.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/TextCellRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/ViewCell.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Cells/ViewCellRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Compatibility.GTK.csproj (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/ActivityIndicator.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/BoxView.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/Carousel.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/CustomComboBox.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/CustomFrame.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/DatePicker.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/EntryWrapper.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/FlyoutPage.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/GLWidget/GLWidget.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/GLWidget/OSX/OSXWindowInfoInitializer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/GLWidget/Win/WinWindowsInfoInitializer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/GLWidget/X11/XWindowInfoInitializer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/ImageButton.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/ImageControl.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/ListView.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/NavigationChildPage.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/NotebookWrapper.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/OpenGLView.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/Page.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/PageContainer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/ScrolledTextView.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/SearchEntry.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/TabbedPageHeader.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/TableView.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/TimePicker.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Controls/WebView.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/ElementChangedEventArgs.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/ExportCellAttribute.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/ExportImageSourceHandlerAttribute.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/ExportRendererAttribute.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/AlignmentExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/ButtonContentLayoutExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/ColorExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/GtkRectangleExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/ImageExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/LabelExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/PageExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/VisualElementExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Extensions/WidgetExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Forms.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/FormsWindow.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkDeviceInfo.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkExpressionSearch.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkFormsContainer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkIsolatedStorageFile.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkOpenGL.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkPlatformServices.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkSerializer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkSynchronizationContext.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkThemes.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkTicker.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkToolbarConstants.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/GtkToolbarTracker.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Helpers/DialogHelper.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Helpers/FontDescriptionHelper.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Helpers/GrabHelper.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Helpers/PlatformHelper.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/IDesiredSizeProvider.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/IVisualElementRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/IVisualNativeElementRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Libs/gtk-sharp/README.txt (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Libs/webkit-sharp/README.txt (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Libs/webkit-sharp/webkit-sharp.dll.config (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Packagers/LayoutElementPackager.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Packagers/PageElementPackager.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Packagers/VisualElementPackager.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Platform.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/PlatformConfigurationExtensions.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/PlatformEffect.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/PlatformRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Properties/AssemblyInfo.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/RendererFactory.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/AbstractPageRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/ActivityIndicatorRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/BoxViewRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/ButtonRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/CarouselPageRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/DatePickerRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/EditorRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/EntryRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/FlyoutPageRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/FrameRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/IPageControl.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/IToolbarTracker.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/ImageRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/LabelRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/LayoutRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/ListViewRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/NavigationPageRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/OpenGLViewRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/PageRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/PickerRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/ProgressBarRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/ScrollViewRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/SearchBarRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/SliderRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/StepperRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/SwitchRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/TabbedPageRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/TableViewRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/TimePickerRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Renderers/WebViewRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/Resources/hamburger.png (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/ResourcesProvider.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/ViewRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/VisualElementRenderer.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/VisualElementTracker.cs (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/app.config (100%) rename src/Compatibility/Core/src/{GTK => Gtk2}/webkit-sharp.dll.config (100%) diff --git a/src/Compatibility/Core/src/GTK/Animations/BaseAnimation.cs b/src/Compatibility/Core/src/Gtk2/Animations/BaseAnimation.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Animations/BaseAnimation.cs rename to src/Compatibility/Core/src/Gtk2/Animations/BaseAnimation.cs diff --git a/src/Compatibility/Core/src/GTK/Animations/FloatAnimation.cs b/src/Compatibility/Core/src/Gtk2/Animations/FloatAnimation.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Animations/FloatAnimation.cs rename to src/Compatibility/Core/src/Gtk2/Animations/FloatAnimation.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/CellBase.cs b/src/Compatibility/Core/src/Gtk2/Cells/CellBase.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/CellBase.cs rename to src/Compatibility/Core/src/Gtk2/Cells/CellBase.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/CellRenderer.cs b/src/Compatibility/Core/src/Gtk2/Cells/CellRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/CellRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Cells/CellRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/EntryCell.cs b/src/Compatibility/Core/src/Gtk2/Cells/EntryCell.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/EntryCell.cs rename to src/Compatibility/Core/src/Gtk2/Cells/EntryCell.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/EntryCellRenderer.cs b/src/Compatibility/Core/src/Gtk2/Cells/EntryCellRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/EntryCellRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Cells/EntryCellRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/ImageCell.cs b/src/Compatibility/Core/src/Gtk2/Cells/ImageCell.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/ImageCell.cs rename to src/Compatibility/Core/src/Gtk2/Cells/ImageCell.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/ImageCellRenderer.cs b/src/Compatibility/Core/src/Gtk2/Cells/ImageCellRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/ImageCellRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Cells/ImageCellRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/SwitchCell.cs b/src/Compatibility/Core/src/Gtk2/Cells/SwitchCell.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/SwitchCell.cs rename to src/Compatibility/Core/src/Gtk2/Cells/SwitchCell.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/SwitchCellRenderer.cs b/src/Compatibility/Core/src/Gtk2/Cells/SwitchCellRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/SwitchCellRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Cells/SwitchCellRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/TextCell.cs b/src/Compatibility/Core/src/Gtk2/Cells/TextCell.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/TextCell.cs rename to src/Compatibility/Core/src/Gtk2/Cells/TextCell.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/TextCellRenderer.cs b/src/Compatibility/Core/src/Gtk2/Cells/TextCellRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/TextCellRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Cells/TextCellRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/ViewCell.cs b/src/Compatibility/Core/src/Gtk2/Cells/ViewCell.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/ViewCell.cs rename to src/Compatibility/Core/src/Gtk2/Cells/ViewCell.cs diff --git a/src/Compatibility/Core/src/GTK/Cells/ViewCellRenderer.cs b/src/Compatibility/Core/src/Gtk2/Cells/ViewCellRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Cells/ViewCellRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Cells/ViewCellRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Compatibility.GTK.csproj b/src/Compatibility/Core/src/Gtk2/Compatibility.GTK.csproj similarity index 100% rename from src/Compatibility/Core/src/GTK/Compatibility.GTK.csproj rename to src/Compatibility/Core/src/Gtk2/Compatibility.GTK.csproj diff --git a/src/Compatibility/Core/src/GTK/Controls/ActivityIndicator.cs b/src/Compatibility/Core/src/Gtk2/Controls/ActivityIndicator.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/ActivityIndicator.cs rename to src/Compatibility/Core/src/Gtk2/Controls/ActivityIndicator.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/BoxView.cs b/src/Compatibility/Core/src/Gtk2/Controls/BoxView.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/BoxView.cs rename to src/Compatibility/Core/src/Gtk2/Controls/BoxView.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/Carousel.cs b/src/Compatibility/Core/src/Gtk2/Controls/Carousel.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/Carousel.cs rename to src/Compatibility/Core/src/Gtk2/Controls/Carousel.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/CustomComboBox.cs b/src/Compatibility/Core/src/Gtk2/Controls/CustomComboBox.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/CustomComboBox.cs rename to src/Compatibility/Core/src/Gtk2/Controls/CustomComboBox.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/CustomFrame.cs b/src/Compatibility/Core/src/Gtk2/Controls/CustomFrame.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/CustomFrame.cs rename to src/Compatibility/Core/src/Gtk2/Controls/CustomFrame.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/DatePicker.cs b/src/Compatibility/Core/src/Gtk2/Controls/DatePicker.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/DatePicker.cs rename to src/Compatibility/Core/src/Gtk2/Controls/DatePicker.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/EntryWrapper.cs b/src/Compatibility/Core/src/Gtk2/Controls/EntryWrapper.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/EntryWrapper.cs rename to src/Compatibility/Core/src/Gtk2/Controls/EntryWrapper.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/FlyoutPage.cs b/src/Compatibility/Core/src/Gtk2/Controls/FlyoutPage.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/FlyoutPage.cs rename to src/Compatibility/Core/src/Gtk2/Controls/FlyoutPage.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/GLWidget/GLWidget.cs b/src/Compatibility/Core/src/Gtk2/Controls/GLWidget/GLWidget.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/GLWidget/GLWidget.cs rename to src/Compatibility/Core/src/Gtk2/Controls/GLWidget/GLWidget.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/GLWidget/OSX/OSXWindowInfoInitializer.cs b/src/Compatibility/Core/src/Gtk2/Controls/GLWidget/OSX/OSXWindowInfoInitializer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/GLWidget/OSX/OSXWindowInfoInitializer.cs rename to src/Compatibility/Core/src/Gtk2/Controls/GLWidget/OSX/OSXWindowInfoInitializer.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/GLWidget/Win/WinWindowsInfoInitializer.cs b/src/Compatibility/Core/src/Gtk2/Controls/GLWidget/Win/WinWindowsInfoInitializer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/GLWidget/Win/WinWindowsInfoInitializer.cs rename to src/Compatibility/Core/src/Gtk2/Controls/GLWidget/Win/WinWindowsInfoInitializer.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/GLWidget/X11/XWindowInfoInitializer.cs b/src/Compatibility/Core/src/Gtk2/Controls/GLWidget/X11/XWindowInfoInitializer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/GLWidget/X11/XWindowInfoInitializer.cs rename to src/Compatibility/Core/src/Gtk2/Controls/GLWidget/X11/XWindowInfoInitializer.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/ImageButton.cs b/src/Compatibility/Core/src/Gtk2/Controls/ImageButton.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/ImageButton.cs rename to src/Compatibility/Core/src/Gtk2/Controls/ImageButton.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/ImageControl.cs b/src/Compatibility/Core/src/Gtk2/Controls/ImageControl.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/ImageControl.cs rename to src/Compatibility/Core/src/Gtk2/Controls/ImageControl.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/ListView.cs b/src/Compatibility/Core/src/Gtk2/Controls/ListView.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/ListView.cs rename to src/Compatibility/Core/src/Gtk2/Controls/ListView.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/NavigationChildPage.cs b/src/Compatibility/Core/src/Gtk2/Controls/NavigationChildPage.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/NavigationChildPage.cs rename to src/Compatibility/Core/src/Gtk2/Controls/NavigationChildPage.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/NotebookWrapper.cs b/src/Compatibility/Core/src/Gtk2/Controls/NotebookWrapper.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/NotebookWrapper.cs rename to src/Compatibility/Core/src/Gtk2/Controls/NotebookWrapper.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/OpenGLView.cs b/src/Compatibility/Core/src/Gtk2/Controls/OpenGLView.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/OpenGLView.cs rename to src/Compatibility/Core/src/Gtk2/Controls/OpenGLView.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/Page.cs b/src/Compatibility/Core/src/Gtk2/Controls/Page.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/Page.cs rename to src/Compatibility/Core/src/Gtk2/Controls/Page.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/PageContainer.cs b/src/Compatibility/Core/src/Gtk2/Controls/PageContainer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/PageContainer.cs rename to src/Compatibility/Core/src/Gtk2/Controls/PageContainer.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/ScrolledTextView.cs b/src/Compatibility/Core/src/Gtk2/Controls/ScrolledTextView.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/ScrolledTextView.cs rename to src/Compatibility/Core/src/Gtk2/Controls/ScrolledTextView.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/SearchEntry.cs b/src/Compatibility/Core/src/Gtk2/Controls/SearchEntry.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/SearchEntry.cs rename to src/Compatibility/Core/src/Gtk2/Controls/SearchEntry.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/TabbedPageHeader.cs b/src/Compatibility/Core/src/Gtk2/Controls/TabbedPageHeader.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/TabbedPageHeader.cs rename to src/Compatibility/Core/src/Gtk2/Controls/TabbedPageHeader.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/TableView.cs b/src/Compatibility/Core/src/Gtk2/Controls/TableView.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/TableView.cs rename to src/Compatibility/Core/src/Gtk2/Controls/TableView.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/TimePicker.cs b/src/Compatibility/Core/src/Gtk2/Controls/TimePicker.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/TimePicker.cs rename to src/Compatibility/Core/src/Gtk2/Controls/TimePicker.cs diff --git a/src/Compatibility/Core/src/GTK/Controls/WebView.cs b/src/Compatibility/Core/src/Gtk2/Controls/WebView.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Controls/WebView.cs rename to src/Compatibility/Core/src/Gtk2/Controls/WebView.cs diff --git a/src/Compatibility/Core/src/GTK/ElementChangedEventArgs.cs b/src/Compatibility/Core/src/Gtk2/ElementChangedEventArgs.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/ElementChangedEventArgs.cs rename to src/Compatibility/Core/src/Gtk2/ElementChangedEventArgs.cs diff --git a/src/Compatibility/Core/src/GTK/ExportCellAttribute.cs b/src/Compatibility/Core/src/Gtk2/ExportCellAttribute.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/ExportCellAttribute.cs rename to src/Compatibility/Core/src/Gtk2/ExportCellAttribute.cs diff --git a/src/Compatibility/Core/src/GTK/ExportImageSourceHandlerAttribute.cs b/src/Compatibility/Core/src/Gtk2/ExportImageSourceHandlerAttribute.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/ExportImageSourceHandlerAttribute.cs rename to src/Compatibility/Core/src/Gtk2/ExportImageSourceHandlerAttribute.cs diff --git a/src/Compatibility/Core/src/GTK/ExportRendererAttribute.cs b/src/Compatibility/Core/src/Gtk2/ExportRendererAttribute.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/ExportRendererAttribute.cs rename to src/Compatibility/Core/src/Gtk2/ExportRendererAttribute.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/AlignmentExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/AlignmentExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/AlignmentExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/AlignmentExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/ButtonContentLayoutExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/ButtonContentLayoutExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/ButtonContentLayoutExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/ButtonContentLayoutExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/ColorExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/ColorExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/ColorExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/ColorExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/GtkRectangleExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/GtkRectangleExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/GtkRectangleExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/GtkRectangleExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/ImageExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/ImageExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/ImageExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/ImageExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/LabelExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/LabelExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/LabelExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/LabelExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/PageExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/PageExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/PageExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/PageExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/VisualElementExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/VisualElementExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/VisualElementExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/VisualElementExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Extensions/WidgetExtensions.cs b/src/Compatibility/Core/src/Gtk2/Extensions/WidgetExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Extensions/WidgetExtensions.cs rename to src/Compatibility/Core/src/Gtk2/Extensions/WidgetExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/Forms.cs b/src/Compatibility/Core/src/Gtk2/Forms.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Forms.cs rename to src/Compatibility/Core/src/Gtk2/Forms.cs diff --git a/src/Compatibility/Core/src/GTK/FormsWindow.cs b/src/Compatibility/Core/src/Gtk2/FormsWindow.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/FormsWindow.cs rename to src/Compatibility/Core/src/Gtk2/FormsWindow.cs diff --git a/src/Compatibility/Core/src/GTK/GtkDeviceInfo.cs b/src/Compatibility/Core/src/Gtk2/GtkDeviceInfo.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkDeviceInfo.cs rename to src/Compatibility/Core/src/Gtk2/GtkDeviceInfo.cs diff --git a/src/Compatibility/Core/src/GTK/GtkExpressionSearch.cs b/src/Compatibility/Core/src/Gtk2/GtkExpressionSearch.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkExpressionSearch.cs rename to src/Compatibility/Core/src/Gtk2/GtkExpressionSearch.cs diff --git a/src/Compatibility/Core/src/GTK/GtkFormsContainer.cs b/src/Compatibility/Core/src/Gtk2/GtkFormsContainer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkFormsContainer.cs rename to src/Compatibility/Core/src/Gtk2/GtkFormsContainer.cs diff --git a/src/Compatibility/Core/src/GTK/GtkIsolatedStorageFile.cs b/src/Compatibility/Core/src/Gtk2/GtkIsolatedStorageFile.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkIsolatedStorageFile.cs rename to src/Compatibility/Core/src/Gtk2/GtkIsolatedStorageFile.cs diff --git a/src/Compatibility/Core/src/GTK/GtkOpenGL.cs b/src/Compatibility/Core/src/Gtk2/GtkOpenGL.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkOpenGL.cs rename to src/Compatibility/Core/src/Gtk2/GtkOpenGL.cs diff --git a/src/Compatibility/Core/src/GTK/GtkPlatformServices.cs b/src/Compatibility/Core/src/Gtk2/GtkPlatformServices.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkPlatformServices.cs rename to src/Compatibility/Core/src/Gtk2/GtkPlatformServices.cs diff --git a/src/Compatibility/Core/src/GTK/GtkSerializer.cs b/src/Compatibility/Core/src/Gtk2/GtkSerializer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkSerializer.cs rename to src/Compatibility/Core/src/Gtk2/GtkSerializer.cs diff --git a/src/Compatibility/Core/src/GTK/GtkSynchronizationContext.cs b/src/Compatibility/Core/src/Gtk2/GtkSynchronizationContext.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkSynchronizationContext.cs rename to src/Compatibility/Core/src/Gtk2/GtkSynchronizationContext.cs diff --git a/src/Compatibility/Core/src/GTK/GtkThemes.cs b/src/Compatibility/Core/src/Gtk2/GtkThemes.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkThemes.cs rename to src/Compatibility/Core/src/Gtk2/GtkThemes.cs diff --git a/src/Compatibility/Core/src/GTK/GtkTicker.cs b/src/Compatibility/Core/src/Gtk2/GtkTicker.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkTicker.cs rename to src/Compatibility/Core/src/Gtk2/GtkTicker.cs diff --git a/src/Compatibility/Core/src/GTK/GtkToolbarConstants.cs b/src/Compatibility/Core/src/Gtk2/GtkToolbarConstants.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkToolbarConstants.cs rename to src/Compatibility/Core/src/Gtk2/GtkToolbarConstants.cs diff --git a/src/Compatibility/Core/src/GTK/GtkToolbarTracker.cs b/src/Compatibility/Core/src/Gtk2/GtkToolbarTracker.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/GtkToolbarTracker.cs rename to src/Compatibility/Core/src/Gtk2/GtkToolbarTracker.cs diff --git a/src/Compatibility/Core/src/GTK/Helpers/DialogHelper.cs b/src/Compatibility/Core/src/Gtk2/Helpers/DialogHelper.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Helpers/DialogHelper.cs rename to src/Compatibility/Core/src/Gtk2/Helpers/DialogHelper.cs diff --git a/src/Compatibility/Core/src/GTK/Helpers/FontDescriptionHelper.cs b/src/Compatibility/Core/src/Gtk2/Helpers/FontDescriptionHelper.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Helpers/FontDescriptionHelper.cs rename to src/Compatibility/Core/src/Gtk2/Helpers/FontDescriptionHelper.cs diff --git a/src/Compatibility/Core/src/GTK/Helpers/GrabHelper.cs b/src/Compatibility/Core/src/Gtk2/Helpers/GrabHelper.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Helpers/GrabHelper.cs rename to src/Compatibility/Core/src/Gtk2/Helpers/GrabHelper.cs diff --git a/src/Compatibility/Core/src/GTK/Helpers/PlatformHelper.cs b/src/Compatibility/Core/src/Gtk2/Helpers/PlatformHelper.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Helpers/PlatformHelper.cs rename to src/Compatibility/Core/src/Gtk2/Helpers/PlatformHelper.cs diff --git a/src/Compatibility/Core/src/GTK/IDesiredSizeProvider.cs b/src/Compatibility/Core/src/Gtk2/IDesiredSizeProvider.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/IDesiredSizeProvider.cs rename to src/Compatibility/Core/src/Gtk2/IDesiredSizeProvider.cs diff --git a/src/Compatibility/Core/src/GTK/IVisualElementRenderer.cs b/src/Compatibility/Core/src/Gtk2/IVisualElementRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/IVisualElementRenderer.cs rename to src/Compatibility/Core/src/Gtk2/IVisualElementRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/IVisualNativeElementRenderer.cs b/src/Compatibility/Core/src/Gtk2/IVisualNativeElementRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/IVisualNativeElementRenderer.cs rename to src/Compatibility/Core/src/Gtk2/IVisualNativeElementRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Libs/gtk-sharp/README.txt b/src/Compatibility/Core/src/Gtk2/Libs/gtk-sharp/README.txt similarity index 100% rename from src/Compatibility/Core/src/GTK/Libs/gtk-sharp/README.txt rename to src/Compatibility/Core/src/Gtk2/Libs/gtk-sharp/README.txt diff --git a/src/Compatibility/Core/src/GTK/Libs/webkit-sharp/README.txt b/src/Compatibility/Core/src/Gtk2/Libs/webkit-sharp/README.txt similarity index 100% rename from src/Compatibility/Core/src/GTK/Libs/webkit-sharp/README.txt rename to src/Compatibility/Core/src/Gtk2/Libs/webkit-sharp/README.txt diff --git a/src/Compatibility/Core/src/GTK/Libs/webkit-sharp/webkit-sharp.dll.config b/src/Compatibility/Core/src/Gtk2/Libs/webkit-sharp/webkit-sharp.dll.config similarity index 100% rename from src/Compatibility/Core/src/GTK/Libs/webkit-sharp/webkit-sharp.dll.config rename to src/Compatibility/Core/src/Gtk2/Libs/webkit-sharp/webkit-sharp.dll.config diff --git a/src/Compatibility/Core/src/GTK/Packagers/LayoutElementPackager.cs b/src/Compatibility/Core/src/Gtk2/Packagers/LayoutElementPackager.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Packagers/LayoutElementPackager.cs rename to src/Compatibility/Core/src/Gtk2/Packagers/LayoutElementPackager.cs diff --git a/src/Compatibility/Core/src/GTK/Packagers/PageElementPackager.cs b/src/Compatibility/Core/src/Gtk2/Packagers/PageElementPackager.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Packagers/PageElementPackager.cs rename to src/Compatibility/Core/src/Gtk2/Packagers/PageElementPackager.cs diff --git a/src/Compatibility/Core/src/GTK/Packagers/VisualElementPackager.cs b/src/Compatibility/Core/src/Gtk2/Packagers/VisualElementPackager.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Packagers/VisualElementPackager.cs rename to src/Compatibility/Core/src/Gtk2/Packagers/VisualElementPackager.cs diff --git a/src/Compatibility/Core/src/GTK/Platform.cs b/src/Compatibility/Core/src/Gtk2/Platform.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Platform.cs rename to src/Compatibility/Core/src/Gtk2/Platform.cs diff --git a/src/Compatibility/Core/src/GTK/PlatformConfigurationExtensions.cs b/src/Compatibility/Core/src/Gtk2/PlatformConfigurationExtensions.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/PlatformConfigurationExtensions.cs rename to src/Compatibility/Core/src/Gtk2/PlatformConfigurationExtensions.cs diff --git a/src/Compatibility/Core/src/GTK/PlatformEffect.cs b/src/Compatibility/Core/src/Gtk2/PlatformEffect.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/PlatformEffect.cs rename to src/Compatibility/Core/src/Gtk2/PlatformEffect.cs diff --git a/src/Compatibility/Core/src/GTK/PlatformRenderer.cs b/src/Compatibility/Core/src/Gtk2/PlatformRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/PlatformRenderer.cs rename to src/Compatibility/Core/src/Gtk2/PlatformRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Properties/AssemblyInfo.cs b/src/Compatibility/Core/src/Gtk2/Properties/AssemblyInfo.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Properties/AssemblyInfo.cs rename to src/Compatibility/Core/src/Gtk2/Properties/AssemblyInfo.cs diff --git a/src/Compatibility/Core/src/GTK/RendererFactory.cs b/src/Compatibility/Core/src/Gtk2/RendererFactory.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/RendererFactory.cs rename to src/Compatibility/Core/src/Gtk2/RendererFactory.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/AbstractPageRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/AbstractPageRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/AbstractPageRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/AbstractPageRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/ActivityIndicatorRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/ActivityIndicatorRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/ActivityIndicatorRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/ActivityIndicatorRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/BoxViewRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/BoxViewRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/BoxViewRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/BoxViewRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/ButtonRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/ButtonRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/ButtonRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/ButtonRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/CarouselPageRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/CarouselPageRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/CarouselPageRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/CarouselPageRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/DatePickerRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/DatePickerRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/DatePickerRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/DatePickerRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/EditorRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/EditorRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/EditorRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/EditorRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/EntryRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/EntryRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/EntryRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/EntryRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/FlyoutPageRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/FlyoutPageRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/FlyoutPageRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/FlyoutPageRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/FrameRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/FrameRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/FrameRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/FrameRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/IPageControl.cs b/src/Compatibility/Core/src/Gtk2/Renderers/IPageControl.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/IPageControl.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/IPageControl.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/IToolbarTracker.cs b/src/Compatibility/Core/src/Gtk2/Renderers/IToolbarTracker.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/IToolbarTracker.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/IToolbarTracker.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/ImageRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/ImageRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/ImageRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/ImageRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/LabelRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/LabelRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/LabelRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/LabelRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/LayoutRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/LayoutRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/LayoutRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/LayoutRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/ListViewRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/ListViewRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/ListViewRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/ListViewRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/NavigationPageRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/NavigationPageRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/NavigationPageRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/NavigationPageRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/OpenGLViewRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/OpenGLViewRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/OpenGLViewRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/OpenGLViewRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/PageRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/PageRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/PageRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/PageRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/PickerRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/PickerRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/PickerRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/PickerRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/ProgressBarRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/ProgressBarRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/ProgressBarRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/ProgressBarRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/ScrollViewRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/ScrollViewRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/ScrollViewRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/ScrollViewRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/SearchBarRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/SearchBarRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/SearchBarRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/SearchBarRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/SliderRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/SliderRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/SliderRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/SliderRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/StepperRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/StepperRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/StepperRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/StepperRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/SwitchRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/SwitchRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/SwitchRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/SwitchRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/TabbedPageRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/TabbedPageRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/TabbedPageRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/TabbedPageRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/TableViewRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/TableViewRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/TableViewRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/TableViewRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/TimePickerRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/TimePickerRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/TimePickerRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/TimePickerRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Renderers/WebViewRenderer.cs b/src/Compatibility/Core/src/Gtk2/Renderers/WebViewRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/Renderers/WebViewRenderer.cs rename to src/Compatibility/Core/src/Gtk2/Renderers/WebViewRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/Resources/hamburger.png b/src/Compatibility/Core/src/Gtk2/Resources/hamburger.png similarity index 100% rename from src/Compatibility/Core/src/GTK/Resources/hamburger.png rename to src/Compatibility/Core/src/Gtk2/Resources/hamburger.png diff --git a/src/Compatibility/Core/src/GTK/ResourcesProvider.cs b/src/Compatibility/Core/src/Gtk2/ResourcesProvider.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/ResourcesProvider.cs rename to src/Compatibility/Core/src/Gtk2/ResourcesProvider.cs diff --git a/src/Compatibility/Core/src/GTK/ViewRenderer.cs b/src/Compatibility/Core/src/Gtk2/ViewRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/ViewRenderer.cs rename to src/Compatibility/Core/src/Gtk2/ViewRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/VisualElementRenderer.cs b/src/Compatibility/Core/src/Gtk2/VisualElementRenderer.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/VisualElementRenderer.cs rename to src/Compatibility/Core/src/Gtk2/VisualElementRenderer.cs diff --git a/src/Compatibility/Core/src/GTK/VisualElementTracker.cs b/src/Compatibility/Core/src/Gtk2/VisualElementTracker.cs similarity index 100% rename from src/Compatibility/Core/src/GTK/VisualElementTracker.cs rename to src/Compatibility/Core/src/Gtk2/VisualElementTracker.cs diff --git a/src/Compatibility/Core/src/GTK/app.config b/src/Compatibility/Core/src/Gtk2/app.config similarity index 100% rename from src/Compatibility/Core/src/GTK/app.config rename to src/Compatibility/Core/src/Gtk2/app.config diff --git a/src/Compatibility/Core/src/GTK/webkit-sharp.dll.config b/src/Compatibility/Core/src/Gtk2/webkit-sharp.dll.config similarity index 100% rename from src/Compatibility/Core/src/GTK/webkit-sharp.dll.config rename to src/Compatibility/Core/src/Gtk2/webkit-sharp.dll.config From 8da62fefced8bd881b00ee5efd4e691da876c134 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:47:22 +0200 Subject: [PATCH 018/425] Core.csproj Gtk : add Microsoft.Maui.Graphics.Gtk.dll (buid from https://github.com/dotnet/Microsoft.Maui.Graphics/commit/a46ffe17dae9cd9ec339eceac524541b0d801c24) --- .../Microsoft.Maui.Graphics.Gtk.deps.json | 206 ++++++++++++++++++ .../Microsoft.Maui.Graphics.Gtk.dll | Bin 0 -> 53760 bytes .../Microsoft.Maui.Graphics.dll | Bin 0 -> 158208 bytes .../ref/Microsoft.Maui.Graphics.Gtk.dll | Bin 0 -> 26112 bytes 4 files changed, 206 insertions(+) create mode 100644 src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json create mode 100644 src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll create mode 100644 src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.dll create mode 100644 src/Microsoft.Maui.Graphics.Gtk/ref/Microsoft.Maui.Graphics.Gtk.dll diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json new file mode 100644 index 000000000000..21cfb85906c2 --- /dev/null +++ b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json @@ -0,0 +1,206 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Microsoft.Maui.Graphics.Gtk/6.0.100": { + "dependencies": { + "GitInfo": "2.1.2", + "GtkSharp": "3.24.24.34", + "MSBuilder.GenerateAssemblyInfo": "0.2.2", + "Microsoft.Maui.Graphics": "0.0.1-alpha1", + "NETStandard.Library": "2.0.3" + }, + "runtime": { + "Microsoft.Maui.Graphics.Gtk.dll": {} + } + }, + "AtkSharp/3.24.24.34": { + "dependencies": { + "GLibSharp": "3.24.24.34" + }, + "runtime": { + "lib/netstandard2.0/AtkSharp.dll": { + "assemblyVersion": "3.24.24.34", + "fileVersion": "3.24.24.34" + } + } + }, + "CairoSharp/3.24.24.34": { + "runtime": { + "lib/netstandard2.0/CairoSharp.dll": { + "assemblyVersion": "3.24.24.34", + "fileVersion": "3.24.24.34" + } + } + }, + "GdkSharp/3.24.24.34": { + "dependencies": { + "CairoSharp": "3.24.24.34", + "GLibSharp": "3.24.24.34", + "GioSharp": "3.24.24.34", + "PangoSharp": "3.24.24.34" + }, + "runtime": { + "lib/netstandard2.0/GdkSharp.dll": { + "assemblyVersion": "3.24.24.34", + "fileVersion": "3.24.24.34" + } + } + }, + "GioSharp/3.24.24.34": { + "dependencies": { + "GLibSharp": "3.24.24.34" + }, + "runtime": { + "lib/netstandard2.0/GioSharp.dll": { + "assemblyVersion": "3.24.24.34", + "fileVersion": "3.24.24.34" + } + } + }, + "GitInfo/2.1.2": {}, + "GLibSharp/3.24.24.34": { + "runtime": { + "lib/netstandard2.0/GLibSharp.dll": { + "assemblyVersion": "3.24.24.34", + "fileVersion": "3.24.24.34" + } + } + }, + "GtkSharp/3.24.24.34": { + "dependencies": { + "AtkSharp": "3.24.24.34", + "CairoSharp": "3.24.24.34", + "GLibSharp": "3.24.24.34", + "GdkSharp": "3.24.24.34", + "GioSharp": "3.24.24.34", + "PangoSharp": "3.24.24.34" + }, + "runtime": { + "lib/netstandard2.0/GtkSharp.dll": { + "assemblyVersion": "3.24.24.34", + "fileVersion": "3.24.24.34" + } + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "MSBuilder.GenerateAssemblyInfo/0.2.2": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "PangoSharp/3.24.24.34": { + "dependencies": { + "CairoSharp": "3.24.24.34", + "GLibSharp": "3.24.24.34" + }, + "runtime": { + "lib/netstandard2.0/PangoSharp.dll": { + "assemblyVersion": "3.24.24.34", + "fileVersion": "3.24.24.34" + } + } + }, + "Microsoft.Maui.Graphics/0.0.1-alpha1": { + "runtime": { + "Microsoft.Maui.Graphics.dll": {} + } + } + } + }, + "libraries": { + "Microsoft.Maui.Graphics.Gtk/6.0.100": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "AtkSharp/3.24.24.34": { + "type": "package", + "serviceable": true, + "sha512": "sha512-CNfTGhGDxcnow5e/u0THtOJeNWaZNDeeFmzYTMdC1tdUkmAtTFDareTGesLx+Gfj75m3415AKJSC9wQ6VyacYQ==", + "path": "atksharp/3.24.24.34", + "hashPath": "atksharp.3.24.24.34.nupkg.sha512" + }, + "CairoSharp/3.24.24.34": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hr75uYPGFlmB3RvpL3/6ZJtb+UiKsrpkyjb5VGI+8y1/lkY405FMBhPZKlxFqoEH0iIZ9gAMPBqKzT1lSVaDqA==", + "path": "cairosharp/3.24.24.34", + "hashPath": "cairosharp.3.24.24.34.nupkg.sha512" + }, + "GdkSharp/3.24.24.34": { + "type": "package", + "serviceable": true, + "sha512": "sha512-COORB6Qd4yu6HWRbzVZXrkzr1T96Gy0wO7ckJfpYxWLbDUDnZVd/g2PICp9T05a0ZvLvkE++vsSjAWobwQeS0g==", + "path": "gdksharp/3.24.24.34", + "hashPath": "gdksharp.3.24.24.34.nupkg.sha512" + }, + "GioSharp/3.24.24.34": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Qyz8bhKjLMTWoxXu6cdNEtTLNUuw7Y1sPdXlyTfyWMP/JmsUE9smCsCC0kyQNSFW17flxdSoeDpG8l6zzJF0vQ==", + "path": "giosharp/3.24.24.34", + "hashPath": "giosharp.3.24.24.34.nupkg.sha512" + }, + "GitInfo/2.1.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1sO441DFuueysHa9gDWpql+bra1wL9KBHAM823dHUHuBTJjKwnv4Dpr+/+nnZ6cdY3mECtbWoMrYgeTiKwJ8Rg==", + "path": "gitinfo/2.1.2", + "hashPath": "gitinfo.2.1.2.nupkg.sha512" + }, + "GLibSharp/3.24.24.34": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PSA7YJbxpnpeltjekoUk93FI9HWUMc2NtkxNIaWzHz7BavkkZDFmx8EKTKtuBrqbZZmEhlv5472NwGdiycSfxw==", + "path": "glibsharp/3.24.24.34", + "hashPath": "glibsharp.3.24.24.34.nupkg.sha512" + }, + "GtkSharp/3.24.24.34": { + "type": "package", + "serviceable": true, + "sha512": "sha512-CVAz7ACMxW9xPhlrrg4Xe+v3jUnpN+emQl78aaXHtoiE7pf0tR8mP8mw0/eBHxMObrmg6DsLxbEFqE/7Yo4Uow==", + "path": "gtksharp/3.24.24.34", + "hashPath": "gtksharp.3.24.24.34.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-a/iSwnRZb+LHFk49hQOyThh/ZNC3vsbZsF65XwQIb863qF6msmhdQtxGXFL28Ob2NsCz/drEj28BJd/YPpLRBg==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "MSBuilder.GenerateAssemblyInfo/0.2.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ghF6V1yp/fHCNWqxv/0jeHFrbREoD+uR+cuKkayypjnJ2OSe5R8DYSMA9L4WLy0/ce0VwGdrl01cdp7d9oo2+Q==", + "path": "msbuilder.generateassemblyinfo/0.2.2", + "hashPath": "msbuilder.generateassemblyinfo.0.2.2.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-548M6mnBSJWxsIlkQHfbzoYxpiYFXZZSL00p4GHYv8PkiqFBnnT68mW5mGEsA/ch9fDO9GkPgkFQpWiXZN7mAQ==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "PangoSharp/3.24.24.34": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QpBEIiE29sxkewdW7l7rVRJR1p3SGoPauHrjm0A3yxpYxj+St5x45weHI8jquMJAZBUdVQuXYHSZDW1lQeJ+PQ==", + "path": "pangosharp/3.24.24.34", + "hashPath": "pangosharp.3.24.24.34.nupkg.sha512" + }, + "Microsoft.Maui.Graphics/0.0.1-alpha1": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll new file mode 100644 index 0000000000000000000000000000000000000000..2fe633183140b76b002d426e169b7c9b3024fca6 GIT binary patch literal 53760 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

! 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 literal 0 HcmV?d00001 From 5386b186e5cd6a5dbbfe2f64d023fa12999a412a Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:47:48 +0200 Subject: [PATCH 019/425] Core.csproj Gtk : remove Grahics-Linux-stubs (they are referenced now from Maui.Graphics.Gtk.dll) --- .../Linux/ColorExtensions.cs | 42 ------------------- .../Linux/GraphicsExtensions.cs | 13 ------ 2 files changed, 55 deletions(-) delete mode 100644 src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs delete mode 100644 src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs deleted file mode 100644 index 232110695215..000000000000 --- a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/ColorExtensions.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace Microsoft.Maui.Graphics.Native.Gtk -{ - - public static class ColorExtensions - { - - private static Gdk.RGBA ToNative_(this Color color) - { - var hex = color.ToHex(); - var nativeColor = new Gdk.RGBA(); - nativeColor.Parse(hex); - - return nativeColor; - } - - public static Gdk.RGBA ToGdkRgba(this Color color) - => color == default ? default : new() { Red = color.Red, Green = color.Green, Blue = color.Blue, Alpha = color.Alpha }; - - public static Gdk.Color ToGdkColor(this Gdk.RGBA color) - => new((byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255)); - - public static Color ToColor(this Gdk.Color color, float opacity = 255) - => new(color.Red, color.Green, color.Blue, opacity); - - public static Color ToColor(this Gdk.RGBA color) - => new((byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255), (byte)(color.Alpha * 255)); - - public static Cairo.Color ToCairoColor(this Color color) - => color == default ? default : new(color.Red, color.Green, color.Blue, color.Alpha); - - public static Cairo.Color ToCairoColor(this Gdk.RGBA color) - => new(color.Red, color.Green, color.Blue, color.Alpha); - - public static Gdk.Color ToGdkColor(this Color color) - => color == default ? default : new((byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255)); - - public static Color ToColor(this Gdk.Color color) - => new((float)color.Red / (float)ushort.MaxValue, (float)color.Green / (float)ushort.MaxValue, (float)color.Blue / (float)ushort.MaxValue); - - } - -} \ No newline at end of file diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs deleted file mode 100644 index 8efc474ab745..000000000000 --- a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/GraphicsExtensions.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Microsoft.Maui.Graphics.Native.Gtk -{ - - public static class GraphicsExtensions - { - - public static Rectangle ToRectangle(this Gdk.Rectangle it) - => new(it.X, it.Y, it.Width, it.Height); - public static Gdk.Rectangle ToNative(this Rectangle it) - => new Gdk.Rectangle((int)it.X, (int)it.Y, (int)it.Width, (int)it.Height); - } - -} \ No newline at end of file From 6160497458a513458af2d5379eaeb72b9a561cd9 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:51:15 +0200 Subject: [PATCH 020/425] Core.csproj Gtk : implement NavigationPageHandler, ImageHandler, FontRegistrar --- src/Core/src/Fonts/FontRegistrar.Linux.cs | 9 +++ .../src/Handlers/Image/ImageHandler.Linux.cs | 25 +++++++ .../src/Handlers/Page/PageHandler.Linux.cs | 62 +++++++++++++++++ src/Core/src/Platform/Linux/PageView.cs | 68 +++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 src/Core/src/Fonts/FontRegistrar.Linux.cs create mode 100644 src/Core/src/Handlers/Image/ImageHandler.Linux.cs create mode 100644 src/Core/src/Handlers/Page/PageHandler.Linux.cs create mode 100644 src/Core/src/Platform/Linux/PageView.cs diff --git a/src/Core/src/Fonts/FontRegistrar.Linux.cs b/src/Core/src/Fonts/FontRegistrar.Linux.cs new file mode 100644 index 000000000000..34135a35ebbb --- /dev/null +++ b/src/Core/src/Fonts/FontRegistrar.Linux.cs @@ -0,0 +1,9 @@ +#nullable enable + +namespace Microsoft.Maui +{ + public partial class FontRegistrar : IFontRegistrar + { + string? LoadNativeAppFont(string font, string filename, string? alias) => null; + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Image/ImageHandler.Linux.cs b/src/Core/src/Handlers/Image/ImageHandler.Linux.cs new file mode 100644 index 000000000000..f7860265706f --- /dev/null +++ b/src/Core/src/Handlers/Image/ImageHandler.Linux.cs @@ -0,0 +1,25 @@ +#nullable enable +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class ImageHandler : ViewHandler + { + + protected override Gtk.Image CreateNativeView() + { + var img = new Gtk.Image(); + + return img; + } + + [MissingMapper] + public static void MapAspect(ImageHandler handler, IImage image) { } + + [MissingMapper] + public static void MapIsAnimationPlaying(ImageHandler handler, IImage image) { } + + [MissingMapper] + public static void MapSource(ImageHandler handler, IImage image) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Page/PageHandler.Linux.cs b/src/Core/src/Handlers/Page/PageHandler.Linux.cs new file mode 100644 index 000000000000..b464cbc73c4e --- /dev/null +++ b/src/Core/src/Handlers/Page/PageHandler.Linux.cs @@ -0,0 +1,62 @@ +using System; +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + + public partial class PageHandler : ViewHandler + { + + public override void SetVirtualView(IView view) + { + base.SetVirtualView(view); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + NativeView.CrossPlatformMeasure = VirtualView.Measure; + NativeView.CrossPlatformArrange = VirtualView.Arrange; + + } + + void UpdateContent() + { + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + + if (VirtualView.Content != null) + NativeView.Content = VirtualView.Content.ToNative(MauiContext); + } + + protected override PageView CreateNativeView() + { + if (VirtualView == null) + { + throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a LayoutView"); + } + + var pw = new PageView + { + CrossPlatformMeasure = VirtualView.Measure, + CrossPlatformArrange = VirtualView.Arrange + }; + + return pw; + } + + public static void MapContent(PageHandler handler, IPage page) + { + handler.UpdateContent(); + } + + [MissingMapper] + public static void MapTitle(PageHandler handler, IPage page) + { } + + + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/PageView.cs b/src/Core/src/Platform/Linux/PageView.cs new file mode 100644 index 000000000000..0dba31949068 --- /dev/null +++ b/src/Core/src/Platform/Linux/PageView.cs @@ -0,0 +1,68 @@ +using System; +using Gtk; +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui +{ + + public class PageView : Gtk.Box + { + + public PageView() : base(Orientation.Horizontal, 0) { } + + internal Func? CrossPlatformMeasure { get; set; } + + internal Func? CrossPlatformArrange { get; set; } + + Widget? _content; + + public Widget? Content + { + get => _content; + set + { + if (_content != null && value != null) + { + this.ReplaceChild(_content, value); + + } + else if (value != null) + { + PackStart(value, true, true, 0); + } + + _content = value; + + } + } + + protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) + { + base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); + + if (Content == null) return; + + Content.GetPreferredHeightForWidth(width, out var childMinimumHeight, out var childNaturalHeight); + minimumHeight = Math.Max(Math.Max(minimumHeight, childMinimumHeight), hr); + naturalHeight = Math.Max(Math.Max(naturalHeight, childNaturalHeight), hr); + hr = 0; + + } + + int hr = 0; + + protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) + { + base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); + hr = Math.Max(hr, height); + + if (Content == null) return; + + Content.GetPreferredWidthForHeight(height, out var childMinimumWidth, out var childNaturalWidth); + minimumWidth = Math.Max(minimumWidth, childMinimumWidth); + naturalWidth = Math.Max(naturalWidth, childNaturalWidth); + } + + } + +} \ No newline at end of file From 2699eec0db5a97da487677c62b416e0ba2f3bfcb Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:52:11 +0200 Subject: [PATCH 021/425] Core.csproj Gtk : enhance handlers --- .../src/Fonts/EmbeddedFontLoader.Linux.cs | 4 +- src/Core/src/Fonts/FontManager.Linux.cs | 32 +-- .../Handlers/Button/ButtonHandler.Linux.cs | 2 +- .../DatePicker/DatePickerHandler.Linux.cs | 16 +- .../Handlers/Editor/EditorHandler.Linux.cs | 69 ++++-- .../src/Handlers/Entry/EntryHandler.Linux.cs | 27 ++- .../Handlers/Entry/EntryHandler.Windows.cs | 2 +- .../src/Handlers/Label/LabelHandler.Linux.cs | 95 ++++++-- .../Handlers/Layout/LayoutHandler.Linux.cs | 5 +- .../Handlers/Picker/PickerHandler.Linux.cs | 107 ++++++++- .../SearchBar/SearchBarHandler.Linux.cs | 67 ++++-- .../Handlers/Slider/SliderHandler.Linux.cs | 34 ++- .../Handlers/Stepper/StepperHandler.Linux.cs | 66 +++++- .../Handlers/Switch/SwitchHandler.Linux.cs | 4 +- .../TimePicker/TimePickerHandler.Linux.cs | 19 +- .../src/Handlers/View/ViewHandlerOfT.Linux.cs | 23 +- .../src/Platform/Linux/ActivationState.cs | 2 +- .../Platform/Linux/DatePickerExtensions.cs | 12 +- .../src/Platform/Linux/EntryExtensions.cs | 25 +- src/Core/src/Platform/Linux/FontExtensions.cs | 39 +++- src/Core/src/Platform/Linux/GtkExtensions.cs | 21 ++ .../src/Platform/Linux/HandlerExtensions.cs | 11 +- src/Core/src/Platform/Linux/IGtkContainer.cs | 9 + .../src/Platform/Linux/LabelExtensions.cs | 59 ++++- src/Core/src/Platform/Linux/LayoutView.cs | 217 ++++++------------ src/Core/src/Platform/Linux/MauiContext.cs | 2 +- src/Core/src/Platform/Linux/MauiDatePicker.cs | 32 ++- .../src/Platform/Linux/MauiGtkApplication.cs | 8 +- src/Core/src/Platform/Linux/MauiSearchBar.cs | 19 +- src/Core/src/Platform/Linux/MauiTimePicker.cs | 25 +- src/Core/src/Platform/Linux/MauiWindow.cs | 6 +- .../src/Platform/Linux/SliderExtensions.cs | 6 +- .../src/Platform/Linux/StepperExtensions.cs | 21 +- .../src/Platform/Linux/SwitchExtensions.cs | 4 +- .../src/Platform/Linux/TextInputExtensions.cs | 55 +++++ .../src/Platform/Linux/ThicknessExtensions.cs | 14 +- .../Platform/Linux/TimePickerExtensions.cs | 12 +- src/Core/src/Platform/Linux/ViewExtensions.cs | 33 ++- .../src/Platform/Linux/WidgetExtensions.cs | 193 +++++++++++++--- 39 files changed, 1005 insertions(+), 392 deletions(-) create mode 100644 src/Core/src/Platform/Linux/GtkExtensions.cs create mode 100644 src/Core/src/Platform/Linux/IGtkContainer.cs create mode 100644 src/Core/src/Platform/Linux/TextInputExtensions.cs diff --git a/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs b/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs index afedd344488d..2d893332b51a 100644 --- a/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs +++ b/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs @@ -2,9 +2,9 @@ namespace Microsoft.Maui { - public class EmbeddedFontLoader : IEmbeddedFontLoader + public partial class EmbeddedFontLoader { - public (bool success, string? filePath) LoadFont(EmbeddedFont font) + public string? LoadFont(EmbeddedFont font) { throw new NotImplementedException(); } diff --git a/src/Core/src/Fonts/FontManager.Linux.cs b/src/Core/src/Fonts/FontManager.Linux.cs index 90fcc114c67d..56fd8aaad36f 100644 --- a/src/Core/src/Fonts/FontManager.Linux.cs +++ b/src/Core/src/Fonts/FontManager.Linux.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.Logging; using Microsoft.Maui.Graphics; using Pango; @@ -67,7 +68,7 @@ public class FontManager : IFontManager Pango.Context SystemContext => _systemContext ??= Gdk.PangoHelper.ContextGet(); - public FontManager(IFontRegistrar fontRegistrar) + public FontManager(IFontRegistrar fontRegistrar, ILogger? logger = null) { _fontRegistrar = fontRegistrar; } @@ -83,38 +84,14 @@ public FontDescription DefaultFontFamily public double DefaultFontSize => _defaultFontSize ??= DefaultFontFamily?.GetSize() ?? 0; - public FontDescription GetFontFamily(Font font) => + public FontDescription GetFontFamily(Font font) => font == default ? SystemContext.FontDescription : font.ToFontDescription(); public double GetFontSize(Font font) { - if (font.UseNamedSize) - return GetFontSize(font.NamedSize); - return font.FontSize; } - public double GetFontSize(NamedSize namedSize) - { - // TODO: Hmm, maybe we need to revisit this, since we no longer support Windows Phone OR WinRT. - // These are values pulled from the mapped sizes on Windows Phone, WinRT has no equivalent sizes, only intents. - - return namedSize switch - { - NamedSize.Default => DefaultFontSize, - NamedSize.Micro => 15.667, - NamedSize.Small => 18.667, - NamedSize.Medium => 22.667, - NamedSize.Large => 32, - NamedSize.Body => 14, - NamedSize.Caption => 12, - NamedSize.Header => 46, - NamedSize.Subtitle => 20, - NamedSize.Title => 24, - _ => throw new ArgumentOutOfRangeException(nameof(namedSize)), - }; - } - private IEnumerable<(Pango.FontFamily family, Pango.FontDescription description)> GetAvailableFamilyFaces(Pango.FontFamily family) { @@ -136,10 +113,9 @@ private FontDescription[] GetAvailableFontStyles() if (fontFamilies != null) { styles.AddRange(fontFamilies.SelectMany(GetAvailableFamilyFaces).Select(font => font.description) - .OrderBy(d=>d.Family)); + .OrderBy(d => d.Family)); } - return styles.ToArray(); } diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs b/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs index 6200c923bc58..74d655c8999f 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs @@ -46,7 +46,7 @@ public static void MapFont(ButtonHandler handler, IButton button) public static void MapPadding(ButtonHandler handler, IButton button) { - handler.NativeView.WithMargin(button.Padding); + handler.NativeView.WithPadding(button.Padding); } void OnButtonPressEvent(object? o, ButtonPressEventArgs args) diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs index fae3509065ea..0a163c59b58e 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs @@ -8,10 +8,16 @@ protected override MauiDatePicker CreateNativeView() } [MissingMapper] - public static void MapFormat(DatePickerHandler handler, IDatePicker datePicker) { } + public static void MapFormat(DatePickerHandler handler, IDatePicker datePicker) + { + handler.NativeView?.UpdateFormat(datePicker); + } [MissingMapper] - public static void MapDate(DatePickerHandler handler, IDatePicker datePicker) { } + public static void MapDate(DatePickerHandler handler, IDatePicker datePicker) + { + handler.NativeView?.UpdateDate(datePicker); + } [MissingMapper] public static void MapMinimumDate(DatePickerHandler handler, IDatePicker datePicker) { } @@ -22,8 +28,10 @@ public static void MapMaximumDate(DatePickerHandler handler, IDatePicker datePic [MissingMapper] public static void MapCharacterSpacing(DatePickerHandler handler, IDatePicker datePicker) { } - [MissingMapper] - public static void MapFont(DatePickerHandler handler, IDatePicker datePicker) { } + public static void MapFont(DatePickerHandler handler, IDatePicker datePicker) + { + handler.MapFont(datePicker); + } [MissingMapper] public static void MapTextColor(DatePickerHandler handler, IDatePicker datePicker) { } diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs index 887823bae333..a0864b21a99d 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs @@ -1,4 +1,6 @@ -using Gtk; +using System; +using Gtk; +using Microsoft.Maui.Graphics; namespace Microsoft.Maui.Handlers { @@ -8,39 +10,59 @@ public partial class EditorHandler : ViewHandler protected override TextView CreateNativeView() { - return new(); + return new() { WrapMode = WrapMode.WordChar }; } - public static void MapText(EditorHandler handler, IEditor editor) + protected override void ConnectHandler(TextView nativeView) { - handler.NativeView?.UpdateText(editor); + nativeView.Buffer.Changed += OnNativeTextChanged; } - [MissingMapper] - public static void MapPlaceholder(EditorHandler handler, IEditor editor) { } + protected override void DisconnectHandler(TextView nativeView) + { + nativeView.Buffer.Changed -= OnNativeTextChanged; + } - [MissingMapper] - public static void MapPlaceholderColor(EditorHandler handler, IEditor editor) { } - [MissingMapper] - public static void MapCharacterSpacing(EditorHandler handler, IEditor editor) { } + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + var res = base.GetDesiredSize(widthConstraint, heightConstraint); - [MissingMapper] - public static void MapMaxLength(EditorHandler handler, IEditor editor) { } + if (res.Height == 0 && NativeView is { } nativeView) + { + res.Height = (int)Math.Round(nativeView.GetFontHeigth()); + } - [MissingMapper] - public static void MapIsTextPredictionEnabled(EditorHandler handler, IEditor editor) { } + return res; + } + + protected void OnNativeTextChanged(object? sender, EventArgs e) + { + if (NativeView is not { } nativeView || VirtualView is not { } virtualView) + return; + + if (sender != nativeView.Buffer) return; + + var text = nativeView.Buffer.Text; + + if (virtualView.Text != text) + virtualView.Text = text; + } + + public static void MapText(EditorHandler handler, IEditor editor) + { + handler.NativeView?.UpdateText(editor); + } public static void MapFont(EditorHandler handler, IEditor editor) { handler.MapFont(editor); - } public static void MapIsReadOnly(EditorHandler handler, IEditor editor) { if (handler.NativeView is { } nativeView) - nativeView.Editable = editor.IsReadOnly; + nativeView.Editable = !editor.IsReadOnly; } public static void MapTextColor(EditorHandler handler, IEditor editor) @@ -48,6 +70,21 @@ public static void MapTextColor(EditorHandler handler, IEditor editor) handler.NativeView?.UpdateTextColor(editor.TextColor); } + [MissingMapper] + public static void MapPlaceholder(EditorHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapPlaceholderColor(EditorHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapCharacterSpacing(EditorHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapMaxLength(EditorHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapIsTextPredictionEnabled(EditorHandler handler, IEditor editor) { } + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs b/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs index 8da64c166cd8..f018895fec6d 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs @@ -1,4 +1,5 @@ -using Gtk; +using System; +using Gtk; namespace Microsoft.Maui.Handlers { @@ -11,6 +12,24 @@ protected override Entry CreateNativeView() return new(); } + protected override void ConnectHandler(Entry nativeView) + { + nativeView.Changed += OnNativeViewChanged; + } + + protected override void DisconnectHandler(Entry nativeView) + { + nativeView.Changed -= OnNativeViewChanged; + } + + protected void OnNativeViewChanged(object? sender, EventArgs e) + { + if (sender != NativeView) + return; + + NativeView?.OnTextChanged(VirtualView); + } + public static void MapText(EntryHandler handler, IEntry entry) { handler.NativeView?.UpdateText(entry); @@ -44,14 +63,12 @@ public static void MapMaxLength(EntryHandler handler, IEntry entry) public static void MapPlaceholder(EntryHandler handler, IEntry entry) { - if (handler.NativeView is { } nativeView) - nativeView.PlaceholderText = entry.Placeholder; + handler.NativeView?.UpdatePlaceholder(entry); } public static void MapIsReadOnly(EntryHandler handler, IEntry entry) { - if (handler.NativeView is { } nativeView) - nativeView.IsEditable = entry.IsReadOnly; + handler.NativeView?.UpdateIsReadOnly(entry); } public static void MapFont(EntryHandler handler, IEntry entry) diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Windows.cs b/src/Core/src/Handlers/Entry/EntryHandler.Windows.cs index b93ee4b097be..afc851cb84c1 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Windows.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Windows.cs @@ -2,7 +2,7 @@ using Microsoft.UI.Xaml.Input; using Windows.System; -namespace Microsoft.Maui.Handlers +namespace Microsoft.Maui.Handlers { public partial class EntryHandler : ViewHandler { diff --git a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs index 5fcde7b6febb..6f564cc1732d 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs @@ -1,4 +1,9 @@ -using Gtk; +using System; +using System.Runtime.InteropServices.ComTypes; +using Gtk; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Native.Gtk; +using Pango; namespace Microsoft.Maui.Handlers { @@ -6,10 +11,67 @@ namespace Microsoft.Maui.Handlers public partial class LabelHandler : ViewHandler { + private static Microsoft.Maui.Graphics.Native.Gtk.TextLayout? _textLayout; + + public Microsoft.Maui.Graphics.Native.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Native.Gtk.TextLayout( + Microsoft.Maui.Graphics.Native.Gtk.NativeGraphicsService.Instance.SharedContext) { HeightForWidth = true }; + // https://developer.gnome.org/gtk3/stable/GtkLabel.html protected override Label CreateNativeView() { - return new Label(); + return new Label() + { + LineWrap = true, + Halign = Align.Fill, + Xalign = 0, + MaxWidthChars = 1 + }; + } + + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + if (NativeView is not { } nativeView) + return default; + + if (VirtualView is not { } virtualView) + return default; + + var (baseWidth, baseHeight) = base.GetDesiredSize(widthConstraint, heightConstraint); + int width = -1; + int height = 1; + + var widthConstrained = !double.IsPositiveInfinity(widthConstraint); + var heightConstrained = !double.IsPositiveInfinity(heightConstraint); + + // try use layout from Label: not working + // var SharedTextLayout = new Microsoft.Maui.Graphics.Native.Gtk.TextLayout(NativeGraphicsService.Instance.SharedContext); + // SharedTextLayout.SetLayout(nativeView.Layout); + // ... + + lock (SharedTextLayout) + { + SharedTextLayout.FontFamily = virtualView.Font.FontFamily; + SharedTextLayout.TextFlow = TextFlow.ClipBounds; + SharedTextLayout.PangoFontSize = virtualView.Font.FontSize.ScaledToPango(); + SharedTextLayout.HorizontalAlignment = virtualView.HorizontalTextAlignment.GetHorizontalAlignment(); + SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); + + SharedTextLayout.HeightForWidth = !heightConstrained; + var constraint = SharedTextLayout.HeightForWidth ? widthConstraint : heightConstraint; + (width, height) = SharedTextLayout.GetPixelSize(NativeView.Text, double.IsInfinity(constraint) ? -1 : constraint); + + } + + var inkRect = new Pango.Rectangle(); + var logicalRect = new Pango.Rectangle(); + nativeView.Layout.GetLineReadonly(0).GetExtents(ref inkRect, ref logicalRect); + var lineHeigh = logicalRect.Height.ScaledFromPango(); + + width += nativeView.MarginStart + nativeView.MarginEnd; + height += nativeView.MarginTop + nativeView.MarginBottom; + + return new Size(width, height); + } public static void MapText(LabelHandler handler, ILabel label) @@ -22,10 +84,6 @@ public static void MapTextColor(LabelHandler handler, ILabel label) handler.NativeView?.UpdateTextColor(label.TextColor); } - [MissingMapper] - public static void MapCharacterSpacing(LabelHandler handler, ILabel label) - { } - public static void MapFont(LabelHandler handler, ILabel label) { handler.MapFont(label); @@ -41,20 +99,31 @@ public static void MapLineBreakMode(LabelHandler handler, ILabel label) handler.NativeView?.UpdateLineBreakMode(label); } - [MissingMapper] - public static void MapTextDecorations(LabelHandler handler, ILabel label) { } - - [MissingMapper] - public static void MapMaxLines(LabelHandler handler, ILabel label) { } + public static void MapMaxLines(LabelHandler handler, ILabel label) + { + handler.NativeView?.UpdateMaxLines(label); + } public static void MapPadding(LabelHandler handler, ILabel label) { - handler.NativeView.WithMargin(label.Padding); + handler.NativeView.WithPadding(label.Padding); } [MissingMapper] - public static void MapLineHeight(LabelHandler handler, ILabel label) { } + public static void MapCharacterSpacing(LabelHandler handler, ILabel label) + { } + + [MissingMapper] + public static void MapTextDecorations(LabelHandler handler, ILabel label) + { } + + [MissingMapper] + public static void MapLineHeight(LabelHandler handler, ILabel label) + { + // there is no LineHeight for label in gtk3: + // https://gitlab.gnome.org/GNOME/gtk/-/issues/2379 + } } diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs index 149189ad1129..49d68053e9d8 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs @@ -33,6 +33,7 @@ public override void SetVirtualView(IView view) NativeView.CrossPlatformVirtualView = () => VirtualView; + NativeView.ClearChildren(); foreach (var child in VirtualView.Children) { if (child.ToNative(MauiContext) is { } nativeChild) @@ -68,11 +69,11 @@ public void Remove(IView child) NativeView.QueueAllocate(); } - public override void SetFrame(Rectangle rect) + public override void NativeArrange(Rectangle rect) { _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); - NativeView.SetFrame(rect); + NativeView.NativeArrange(rect); } } diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs b/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs index 691baaae118a..7376ca09a26d 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs @@ -1,27 +1,114 @@ -using Gtk; +using System; +using Gtk; namespace Microsoft.Maui.Handlers { + + // https://developer.gnome.org/gtk3/stable/GtkComboBox.html + public partial class PickerHandler : ViewHandler { + protected override ComboBox CreateNativeView() { - return new ComboBox(); + var model = new ListStore(typeof(string)); + var cell = new CellRendererText(); + + var cb = new ComboBox(model); + cb.PackStart(cell, false); + cb.SetAttributes(cell, "text", 0); + + return cb; } - [MissingMapper] - public static void MapTitle(PickerHandler handler, IPicker view) { } + public override void SetVirtualView(IView view) + { + base.SetVirtualView(view); - [MissingMapper] - public static void MapSelectedIndex(PickerHandler handler, IPicker view) { } + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + + SetValues(NativeView, VirtualView); + } + + protected override void ConnectHandler(ComboBox nativeView) + { + base.ConnectHandler(nativeView); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + + NativeView.Changed +=OnNativeViewChanged; + } + + void OnNativeViewChanged(object? sender, EventArgs args) + { + if (sender is ComboBox nativeView && VirtualView is {} virtualView) + { + virtualView.SelectedIndex = nativeView.Active; + } + } + + protected override void DisconnectHandler(ComboBox nativeView) + { + base.DisconnectHandler(nativeView); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + + NativeView.Changed -=OnNativeViewChanged; + } + + public static void SetValues(ComboBox nativeView, IPicker virtualView) + { + var list = new ItemDelegateList(virtualView); + if (nativeView.Model is not ListStore model) + return; + + model.Clear(); + + foreach (var text in list) + { + model.AppendValues(text); + } + + nativeView.Active = virtualView.SelectedIndex; + } + + public static void MapSelectedIndex(PickerHandler handler, IPicker view) + { + if (handler.NativeView is { } nativeView) + { + nativeView.Active = view.SelectedIndex; + } + } + + public static void MapReload(PickerHandler handler, IPicker picker) + { + var nativeView = handler.NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = picker ?? throw new InvalidOperationException($"{nameof(picker)} should have been set by base class."); + + SetValues(nativeView, picker); + + } + + public static void MapFont(PickerHandler handler, IPicker view) + { + handler.MapFont(view); + + } + [MissingMapper] public static void MapCharacterSpacing(PickerHandler handler, IPicker view) { } - + [MissingMapper] - public static void MapFont(PickerHandler handler, IPicker view) { } - + public static void MapTitle(PickerHandler handler, IPicker view) { } + [MissingMapper] public static void MapTextColor(PickerHandler handler, IPicker view) { } + + [MissingMapper] + public static void MapHorizontalTextAlignment(PickerHandler handler, IPicker view) { } + } -} + +} \ No newline at end of file diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs index 9cc6e966cc6c..a1902d03d54f 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs @@ -1,37 +1,72 @@ -namespace Microsoft.Maui.Handlers +using System; +using Gtk; + +namespace Microsoft.Maui.Handlers { - public partial class SearchBarHandler : ViewHandler + + public partial class SearchBarHandler : ViewHandler { + protected override MauiSearchBar CreateNativeView() { return new MauiSearchBar(); } - [MissingMapper] - public static void MapText(IViewHandler handler, ISearchBar searchBar) { } + protected override void ConnectHandler(MauiSearchBar nativeView) + { + nativeView.Entry.Changed += OnNativeViewChanged; + } - [MissingMapper] - public static void MapPlaceholder(IViewHandler handler, ISearchBar searchBar) { } + protected override void DisconnectHandler(MauiSearchBar nativeView) + { + nativeView.Entry.Changed -= OnNativeViewChanged; + } - [MissingMapper] - public static void MapHorizontalTextAlignment(IViewHandler handler, ISearchBar searchBar) { } + protected void OnNativeViewChanged(object? sender, EventArgs e) + { + if (sender != NativeView) + return; - [MissingMapper] - public static void MapFont(IViewHandler handler, ISearchBar searchBar) { } + NativeView?.Entry.OnTextChanged(VirtualView); + } + + public static void MapText(SearchBarHandler handler, ISearchBar searchBar) + { + handler.NativeView?.Entry.UpdateText(searchBar); + } + + public static void MapPlaceholder(SearchBarHandler handler, ISearchBar searchBar) + { + handler.NativeView?.Entry.UpdatePlaceholder(searchBar); + + } + + public static void MapIsReadOnly(SearchBarHandler handler, ISearchBar searchBar) + { + handler.NativeView?.Entry.UpdateIsReadOnly(searchBar); + + } + + public static void MapFont(SearchBarHandler handler, ISearchBar searchBar) + { + handler.MapFont(handler.NativeView?.Entry, searchBar); + } [MissingMapper] - public static void MapCharacterSpacing(IViewHandler handler, ISearchBar searchBar) { } + public static void MapHorizontalTextAlignment(SearchBarHandler handler, ISearchBar searchBar) { } [MissingMapper] - public static void MapTextColor(IViewHandler handler, ISearchBar searchBar) { } + public static void MapCharacterSpacing(SearchBarHandler handler, ISearchBar searchBar) { } [MissingMapper] - public static void MapIsTextPredictionEnabled(IViewHandler handler, ISearchBar searchBar) { } + public static void MapTextColor(SearchBarHandler handler, ISearchBar searchBar) { } [MissingMapper] - public static void MapMaxLength(IViewHandler handler, ISearchBar searchBar) { } + public static void MapIsTextPredictionEnabled(SearchBarHandler handler, ISearchBar searchBar) { } [MissingMapper] - public static void MapIsReadOnly(IViewHandler handler, ISearchBar searchBar) { } + public static void MapMaxLength(SearchBarHandler handler, ISearchBar searchBar) { } + } -} + +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs b/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs index 06f5121b3ec2..e2f77f2c4501 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs @@ -1,4 +1,5 @@ -using Gtk; +using System; +using Gtk; namespace Microsoft.Maui.Handlers { @@ -6,8 +7,35 @@ public partial class SliderHandler : ViewHandler { protected override Scale CreateNativeView() { - var adjustment = new Adjustment(0, 0, 1, 1, 1, 1); - return new Scale(Orientation.Horizontal, adjustment); + return new Scale(Orientation.Horizontal,0,1,.1); + } + + protected override void ConnectHandler(Scale nativeView) + { + base.ConnectHandler(nativeView); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + + nativeView.ValueChanged += OnNativeViewValueChanged; + } + + protected override void DisconnectHandler(Scale nativeView) + { + base.DisconnectHandler(nativeView); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + + nativeView.ValueChanged -= OnNativeViewValueChanged; + + } + + void OnNativeViewValueChanged(object? sender, EventArgs e) + { + if (sender is not Scale nativeView || VirtualView is not {} virtualView) + return; + + virtualView.Value = nativeView.Value; + } public static void MapMinimum(SliderHandler handler, ISlider slider) diff --git a/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs b/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs index 429cc09b7a1a..2e865180d247 100644 --- a/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs +++ b/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs @@ -1,25 +1,67 @@ -using Gtk; +using System; +using Gtk; namespace Microsoft.Maui.Handlers { - public partial class StepperHandler : ViewHandler + public partial class StepperHandler : ViewHandler { protected override SpinButton CreateNativeView() { - var adjustment = new Adjustment(0, 0, 1, 1, 1, 1); - return new SpinButton(adjustment, 1, 1); + // var adjustment = new Adjustment(0, 0, 1, 1, 1, 1); + // return new SpinButton(adjustment, 1, 1); + return new SpinButton(0, 1, .1); } - [MissingMapper] - public static void MapMinimum(IViewHandler handler, IStepper stepper) { } + protected override void ConnectHandler(SpinButton nativeView) + { + base.ConnectHandler(nativeView); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + + nativeView.ValueChanged += OnNativeViewValueChanged; + + } + + + protected override void DisconnectHandler(SpinButton nativeView) + { + base.DisconnectHandler(nativeView); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + + nativeView.ValueChanged += OnNativeViewValueChanged; + } + + void OnNativeViewValueChanged(object? sender, EventArgs e) + { + if (sender is not SpinButton nativeView || VirtualView is not { } virtualView) + return; + + virtualView.Value = nativeView.Value; + } - [MissingMapper] - public static void MapMaximum(IViewHandler handler, IStepper stepper) { } + public static void MapMinimum(StepperHandler handler, IStepper stepper) + { + handler.NativeView?.UpdateRange(stepper); + + } - [MissingMapper] - public static void MapIncrement(IViewHandler handler, IStepper stepper) { } + public static void MapMaximum(StepperHandler handler, IStepper stepper) + { + handler.NativeView?.UpdateRange(stepper); - [MissingMapper] - public static void MapValue(IViewHandler handler, IStepper stepper) { } + } + + public static void MapIncrement(StepperHandler handler, IStepper stepper) + { + handler.NativeView?.UpdateIncrement(stepper); + + } + + public static void MapValue(StepperHandler handler, IStepper stepper) + { + handler.NativeView?.UpdateValue(stepper); + + } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs index 88f9c6390c5b..c5a106a8c005 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs @@ -9,9 +9,9 @@ protected override Switch CreateNativeView() return new Switch(); } - public static void MapIsToggled(SwitchHandler handler, ISwitch view) + public static void MapIsOn(SwitchHandler handler, ISwitch view) { - handler.NativeView?.UpdateIsToggled(view); + handler.NativeView?.UpdateIsOn(view); } [MissingMapper] diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs index 4dd5dd8b50a5..f46269d6dc9b 100644 --- a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs @@ -6,18 +6,27 @@ protected override MauiTimePicker CreateNativeView() { return new MauiTimePicker(); } - + [MissingMapper] - public static void MapFormat(TimePickerHandler handler, ITimePicker view) { } + public static void MapFormat(TimePickerHandler handler, ITimePicker view) + { + handler.NativeView?.UpdateFormat(view); + } [MissingMapper] - public static void MapTime(TimePickerHandler handler, ITimePicker view) { } + public static void MapTime(TimePickerHandler handler, ITimePicker view) + { + handler.NativeView?.UpdateTime(view); + } [MissingMapper] public static void MapCharacterSpacing(TimePickerHandler handler, ITimePicker view) { } - [MissingMapper] - public static void MapFont(TimePickerHandler handler, ITimePicker view) { } + public static void MapFont(TimePickerHandler handler, ITimePicker view) + { + handler.MapFont(view); + + } [MissingMapper] public static void MapTextColor(TimePickerHandler handler, ITimePicker timePicker) { } diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs index 12cebf0cdf33..72be097ce2c6 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs @@ -13,22 +13,9 @@ public partial class ViewHandler : INativeViewHandler Gtk.Widget? INativeViewHandler.NativeView => (Gtk.Widget?)base.NativeView; - public override void SetFrame(Rectangle rect) + public override void NativeArrange(Rectangle rect) { - var nativeView = NativeView; - - if (nativeView == null) - return; - - if (rect.IsEmpty) - return; - - if (rect != nativeView.Allocation.ToRectangle()) - { - nativeView.SizeAllocate(rect.ToNative()); - nativeView.QueueResize(); - } - + NativeView?.Arrange(rect); } public override Size GetDesiredSize(double widthConstraint, double heightConstraint) @@ -47,8 +34,12 @@ protected void InvokeEvent(Action action) public void MapFont(ITextStyle textStyle) { - var nativeView = NativeView; + MapFont(NativeView, textStyle); + } + + public void MapFont(Gtk.Widget? nativeView, ITextStyle textStyle) + { if (nativeView == null) return; diff --git a/src/Core/src/Platform/Linux/ActivationState.cs b/src/Core/src/Platform/Linux/ActivationState.cs index 2356a2f1094d..6719e581c7ce 100644 --- a/src/Core/src/Platform/Linux/ActivationState.cs +++ b/src/Core/src/Platform/Linux/ActivationState.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Linux/DatePickerExtensions.cs b/src/Core/src/Platform/Linux/DatePickerExtensions.cs index b30a3ac2ef9d..e1b544ee9a26 100644 --- a/src/Core/src/Platform/Linux/DatePickerExtensions.cs +++ b/src/Core/src/Platform/Linux/DatePickerExtensions.cs @@ -2,6 +2,16 @@ { public static class DatePickerExtensions { - + public static void UpdateDate(this MauiDatePicker nativeDatePicker, IDatePicker datePicker) + { + nativeDatePicker.Date = datePicker.Date; + + } + + public static void UpdateFormat(this MauiDatePicker nativeDatePicker, IDatePicker datePicker) + { + nativeDatePicker.Format = datePicker.Format; + + } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/EntryExtensions.cs b/src/Core/src/Platform/Linux/EntryExtensions.cs index 84acdbf3c88c..701c1d76188f 100644 --- a/src/Core/src/Platform/Linux/EntryExtensions.cs +++ b/src/Core/src/Platform/Linux/EntryExtensions.cs @@ -1,28 +1,7 @@ -using Gtk; - -namespace Microsoft.Maui +namespace Microsoft.Maui { public static class EntryExtensions - { - - public static void UpdateText(this Entry nativeEntry, IEntry entry) - { - var text = entry.Text; - - if (nativeEntry.Text != text) - { - if (text != null) - nativeEntry.Text = text; - else - { - nativeEntry.Buffer.SetText(string.Empty, -1); - - } - } - - } - - } + { } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/FontExtensions.cs b/src/Core/src/Platform/Linux/FontExtensions.cs index 8ccb3b3aad41..63909684968a 100644 --- a/src/Core/src/Platform/Linux/FontExtensions.cs +++ b/src/Core/src/Platform/Linux/FontExtensions.cs @@ -28,19 +28,28 @@ public static Pango.FontFamily GetPangoFontFamily(this Widget it) => it.FontMap.Families.First(); // enum Pango.Style { Normal, Oblique, Italic } - public static Pango.Style ToFontStyle(this FontAttributes it) => it switch + public static Pango.Style ToFontStyle(this FontSlant it) => it switch { - FontAttributes.Bold => Pango.Style.Oblique, // ?? - FontAttributes.Italic => Pango.Style.Italic, + FontSlant.Oblique => Pango.Style.Oblique, // ?? + FontSlant.Italic => Pango.Style.Italic, _ => Pango.Style.Normal }; // enum Pango.Weight { Thin = 100, Ultralight = 200, Light = 300, Semilight = 350, Book = 380, Normal = 400, Medium = 500, Semibold = 600, Bold = 700, Ultrabold = 800, Heavy = 900, Ultraheavy = 1000,} - public static Pango.Weight ToFontWeight(this FontAttributes it) => it switch - { - FontAttributes.Bold => Pango.Weight.Bold, - _ => Pango.Weight.Normal - }; + public static Pango.Weight ToFontWeight(this FontWeight it) => + it switch + { + FontWeight.Bold => Pango.Weight.Bold, + FontWeight.Regular => Pango.Weight.Normal, + FontWeight.Thin => Pango.Weight.Thin, + FontWeight.Ultralight => Pango.Weight.Ultralight, + FontWeight.Light => Pango.Weight.Light, + FontWeight.Medium => Pango.Weight.Medium, + FontWeight.Semibold => Pango.Weight.Semibold, + FontWeight.Heavy => Pango.Weight.Heavy, + FontWeight.Black => Pango.Weight.Ultrabold, + _ => Pango.Weight.Normal + }; // enum Pango.Stretch { UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, Normal, SemiExpanded, Expanded, ExtraExpanded, UltraExpanded, } @@ -51,12 +60,22 @@ public static Pango.FontDescription ToFontDescription(this Font it) { Family = it.FontFamily, Size = (int)(it.FontSize * Pango.Scale.PangoScale), - Style = it.FontAttributes.ToFontStyle(), - Weight = it.FontAttributes.ToFontWeight(), + Style = it.FontSlant.ToFontStyle(), + Weight = it.Weight.ToFontWeight(), Stretch = it.ToFontStretch() }; + public static double GetFontHeigth(this Widget it, Pango.FontDescription? font = null) + { + font ??= it.GetPangoFontDescription(); + var metrics = it.PangoContext.GetMetrics(font, Pango.Language.Default); + var pangoUnits = (metrics.Ascent + metrics.Descent) / Pango.Scale.PangoScale; + + var resolution = it.Screen.Resolution; + var height = (pangoUnits * (resolution / 72.0)); + return height; + } } diff --git a/src/Core/src/Platform/Linux/GtkExtensions.cs b/src/Core/src/Platform/Linux/GtkExtensions.cs new file mode 100644 index 000000000000..04d8490b6164 --- /dev/null +++ b/src/Core/src/Platform/Linux/GtkExtensions.cs @@ -0,0 +1,21 @@ +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui +{ + + public static class GtkExtensions + { + + public static Size ToSize(this Gtk.Requisition it) => + new(it.Width, it.Height); + + public static Gtk.Requisition ToGtkRequisition(this Graphics.Size size) => + new() + { + Height = (int)size.Height, + Width = (int)size.Width + }; + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/HandlerExtensions.cs b/src/Core/src/Platform/Linux/HandlerExtensions.cs index 442b6b9002ab..3be6469c47a3 100644 --- a/src/Core/src/Platform/Linux/HandlerExtensions.cs +++ b/src/Core/src/Platform/Linux/HandlerExtensions.cs @@ -1,10 +1,12 @@ -using Gtk; +using Gtk; using System; namespace Microsoft.Maui { + public static class HandlerExtensions { + public static Widget ToNative(this IView view, IMauiContext context) { _ = view ?? throw new ArgumentNullException(nameof(view)); @@ -33,12 +35,5 @@ public static Widget ToNative(this IView view, IMauiContext context) return result; } - - public static Gtk.Requisition ToGtkRequisition(this Graphics.Size size) => - new() - { - Height = (int)size.Height, - Width = (int)size.Width - }; } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/IGtkContainer.cs b/src/Core/src/Platform/Linux/IGtkContainer.cs new file mode 100644 index 000000000000..5fb1be812c6e --- /dev/null +++ b/src/Core/src/Platform/Linux/IGtkContainer.cs @@ -0,0 +1,9 @@ +namespace Microsoft.Maui +{ + + public interface IGtkContainer + { + void ReplaceChild (Gtk.Widget oldWidget, Gtk.Widget newWidget); + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LabelExtensions.cs b/src/Core/src/Platform/Linux/LabelExtensions.cs index a84d3c6fd7ef..dca483ac94b2 100644 --- a/src/Core/src/Platform/Linux/LabelExtensions.cs +++ b/src/Core/src/Platform/Linux/LabelExtensions.cs @@ -1,5 +1,7 @@ using System; using Gtk; +using Pango; +using WrapMode = Pango.WrapMode; namespace Microsoft.Maui { @@ -12,6 +14,58 @@ public static void UpdateText(this Label nativeLabel, ILabel label) nativeLabel.Text = label.Text; } + public static void UpdateMaxLines(this Label nativeLabel, ILabel label) + { + nativeLabel.Lines = label.MaxLines; + } + + public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this LineBreakMode lineBreakMode) => + lineBreakMode switch + { + LineBreakMode.NoWrap => Graphics.Extras.LineBreakMode.None, + LineBreakMode.WordWrap => Graphics.Extras.LineBreakMode.WordWrap, + LineBreakMode.CharacterWrap => Graphics.Extras.LineBreakMode.CharacterWrap, + LineBreakMode.HeadTruncation => Graphics.Extras.LineBreakMode.HeadTruncation, + LineBreakMode.TailTruncation => Graphics.Extras.LineBreakMode.TailTruncation, + LineBreakMode.MiddleTruncation => Graphics.Extras.LineBreakMode.MiddleTruncation, + _ => throw new ArgumentOutOfRangeException() + }; + public static Maui.Graphics.HorizontalAlignment GetHorizontalAlignment(this TextAlignment alignment) => + alignment switch + { + + TextAlignment.Start => Graphics.HorizontalAlignment.Left, + TextAlignment.Center => Graphics.HorizontalAlignment.Center, + TextAlignment.End => Graphics.HorizontalAlignment.Right, + _ => throw new ArgumentOutOfRangeException(nameof(alignment), alignment, null) + }; + public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this Label nativeLabel) + { + var res = nativeLabel.Ellipsize switch + { + EllipsizeMode.None => Graphics.Extras.LineBreakMode.None, + EllipsizeMode.Start => Graphics.Extras.LineBreakMode.Start |Graphics.Extras.LineBreakMode.Elipsis, + EllipsizeMode.Middle => Graphics.Extras.LineBreakMode.Center |Graphics.Extras.LineBreakMode.Elipsis, + EllipsizeMode.End => Graphics.Extras.LineBreakMode.End |Graphics.Extras.LineBreakMode.Elipsis, + _ => throw new ArgumentOutOfRangeException() + }; + + var res1 = nativeLabel.LineWrapMode switch + { + WrapMode.Word => Graphics.Extras.LineBreakMode.Word, + WrapMode.Char => Graphics.Extras.LineBreakMode.Character, + WrapMode.WordChar => Graphics.Extras.LineBreakMode.Character | Graphics.Extras.LineBreakMode.Word, + _ => throw new ArgumentOutOfRangeException() + }; + + if (nativeLabel.LineWrap || nativeLabel.Wrap) + { + res |= res1; + } + + return res; + } + public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) { switch (label.LineBreakMode) @@ -35,6 +89,7 @@ public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) break; case LineBreakMode.HeadTruncation: nativeLabel.LineWrap = false; + nativeLabel.Wrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.Start; @@ -42,11 +97,13 @@ public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) case LineBreakMode.TailTruncation: nativeLabel.LineWrap = false; nativeLabel.LineWrapMode = Pango.WrapMode.Word; + nativeLabel.Wrap = true; nativeLabel.Ellipsize = Pango.EllipsizeMode.End; break; case LineBreakMode.MiddleTruncation: nativeLabel.LineWrap = false; + nativeLabel.Wrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.Middle; @@ -63,8 +120,6 @@ public static void UpdateTextAlignment(this Label nativeLabel, ILabel label) } - - } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LayoutView.cs b/src/Core/src/Platform/Linux/LayoutView.cs index 33235d0f2f39..4bfa35154d0d 100644 --- a/src/Core/src/Platform/Linux/LayoutView.cs +++ b/src/Core/src/Platform/Linux/LayoutView.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.Linq; using Gtk; +using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Layouts; using Rectangle = Microsoft.Maui.Graphics.Rectangle; using Size = Microsoft.Maui.Graphics.Size; @@ -11,19 +13,31 @@ namespace Microsoft.Maui // refactored from: https://github.com/mono/xwt/blob/501f6b529fca632655295169094f637627c74c47/Xwt.Gtk/Xwt.GtkBackend/BoxBackend.cs - public class LayoutView : Container + public class LayoutView : Container, IGtkContainer { -#if DEBUG - protected override bool OnDrawn(Cairo.Context cr) { + var bk = this.GetBackgroundColor(this.StateFlags); + + if (bk != null) + { + cr.Save(); + cr.SetSourceColor(bk.ToCairoColor()); + cr.Rectangle(0, 0, Allocation.Width, Allocation.Height); + + cr.Fill(); + cr.Restore(); + } + var r = base.OnDrawn(cr); +#if DEBUG cr.Save(); cr.SetSourceColor(Graphics.Colors.Red.ToCairoColor()); cr.Rectangle(0, 0, Allocation.Width, Allocation.Height); cr.Stroke(); + cr.Restore(); return r; @@ -80,7 +94,7 @@ Orientation GetOrientation() => var orientation = GetOrientation(); var focusChain = _children - // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) + // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) .Select(kvp => kvp.Value.Widget) .ToArray(); @@ -106,8 +120,20 @@ public bool SetAllocation(IView w, Rectangle rect) } + public void ClearChildren() + { + foreach (var c in Children) + { + Remove(c); + } + _children.Clear(); + } + public void Add(IView view, Widget gw) { + if (_children.ContainsKey(view)) + return; + _children.Add(view, new ChildAllocation { Widget = gw, @@ -146,19 +172,11 @@ protected void OnReallocate(Gdk.Rectangle allocation = default) allocation = new Gdk.Rectangle(0, 0, Allocation.Width, Allocation.Height); } - } - - protected Requisition OnGetRequisition(SizeConstraint widthConstraint, SizeConstraint heightConstraint) - { - if (VirtualView == null) - + if (allocation.Size != Allocation.Size) { - return Requisition.Zero; + VirtualView.Arrange(allocation.ToRectangle()); } - var size = GetSizeRequest(widthConstraint, heightConstraint); - - return size.ToGtkRequisition(); } protected override void OnSizeAllocated(Gdk.Rectangle allocation) @@ -190,12 +208,6 @@ protected override void ForAll(bool includeInternals, Callback callback) callback(c); } - public void QueueResizeIfRequired() - { - // since we have no SizeRequest event, we must always queue up for resize - QueueResize(); - } - protected override void OnUnrealized() { // force reallocation on next realization, since allocation may be lost @@ -229,67 +241,69 @@ protected override SizeRequestMode OnGetRequestMode() // return base.OnGetRequestMode(); } - protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight) + protected override void OnAdjustSizeAllocation(Orientation orientation, out int minimumSize, out int naturalSize, out int allocatedPos, out int allocatedSize) { - base.OnGetPreferredHeight(out minimumHeight, out naturalHeight); - // containers need initial width in heigt_for_width mode - // dirty fix: do not constrain width on first allocation - var forceWidth = SizeConstraint.Unconstrained; - - if (IsReallocating) - forceWidth = SizeConstraint.WithSize(Allocation.Width); + base.OnAdjustSizeAllocation(orientation, out minimumSize, out naturalSize, out allocatedPos, out allocatedSize); - var size = OnGetRequisition(forceWidth, SizeConstraint.Unconstrained); - - if (size.Height < HeightRequest) - minimumHeight = naturalHeight = HeightRequest; - else - minimumHeight = naturalHeight = size.Height; } - protected override void OnGetPreferredWidth(out int minimumWidth, out int naturalWidth) + public SizeRequest GetSizeRequest(double widthConstraint, double heightConstraint, SizeRequestMode mode) { - base.OnGetPreferredWidth(out minimumWidth, out naturalWidth); - // containers need initial height in width_for_height mode - // dirty fix: do not constrain height on first allocation - var forceHeight = SizeConstraint.Unconstrained; + var widthHandled = AllocatedWidth > 1; // && virtualView.DesiredSize.Width > 0; + var heightHandled = AllocatedHeight > 1; // && virtualView.DesiredSize.Height > 0; + var widthConstrained = !double.IsPositiveInfinity(widthConstraint); + var heightConstrained = !double.IsPositiveInfinity(heightConstraint); - if (IsReallocating) - forceHeight = SizeConstraint.WithSize(Allocation.Width); + if (!widthHandled || !heightHandled) + { + return new Size(widthConstraint, heightConstraint); + } - var size = OnGetRequisition(SizeConstraint.Unconstrained, forceHeight); + var virtualView = VirtualView; - if (size.Width < WidthRequest) - minimumWidth = naturalWidth = WidthRequest; - else - minimumWidth = naturalWidth = size.Width; - } + if (virtualView == null) + { + return Size.Zero; + } - protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) - { - base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); - var size = OnGetRequisition(SizeConstraint.WithSize(width), SizeConstraint.Unconstrained); + var withFactor = widthHandled && widthConstrained && widthConstraint > 1 ? widthConstraint / AllocatedWidth : 1; + var heigthFactor = heightHandled && heightConstrained && heightConstraint > 1 ? heightConstraint / AllocatedHeight : 1; + + var size1 = virtualView.Measure(widthConstraint, heightConstraint); - if (size.Height < HeightRequest) - minimumHeight = naturalHeight = HeightRequest; - else - minimumHeight = naturalHeight = size.Height; + var size2 = virtualView.Arrange(new(Point.Zero, size1)); + + foreach (var child in virtualView.Children) + { + SetAllocation(child, child.Frame); + } + + return new SizeRequest(size1, size2); } + int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; + protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) { base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); - var size = OnGetRequisition(SizeConstraint.Unconstrained, SizeConstraint.WithSize(height)); + var sizeRequest = GetSizeRequest(double.PositiveInfinity, height, SizeRequestMode.WidthForHeight); + + minimumWidth = Math.Max(WidthRequest, ToSize(sizeRequest.Minimum.Width)); + naturalWidth = Math.Max(WidthRequest, ToSize(sizeRequest.Request.Width)); + } + + protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) + { + base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); + var sizeRequest = GetSizeRequest(width, double.PositiveInfinity, SizeRequestMode.HeightForWidth); - if (size.Width < WidthRequest) - minimumWidth = naturalWidth = WidthRequest; - else - minimumWidth = naturalWidth = size.Width; + minimumHeight = Math.Max(HeightRequest, ToSize(sizeRequest.Minimum.Height)); + naturalHeight = Math.Max(HeightRequest, ToSize(sizeRequest.Request.Height)); } #region adoptions - public void SetFrame(Rectangle rect) + public void NativeArrange(Rectangle rect) { var nativeView = this; var virtualView = VirtualView; @@ -307,89 +321,8 @@ public void SetFrame(Rectangle rect) } } - public Size GetSizeRequest(SizeConstraint widthConstraint, SizeConstraint heightConstraint) - { - if (VirtualView == null) - { - return Size.Zero; - } - - VirtualView.InvalidateMeasure(); - - var size1 = VirtualView.Measure(widthConstraint.IsConstrained ? widthConstraint.AvailableSize : -1, heightConstraint.IsConstrained ? heightConstraint.AvailableSize : -1); - - var size = Size.Zero; - - foreach (var v in VirtualView.Children) - { - if (v.IsMeasureValid) - { - size.Width = Math.Max(size.Width, v.DesiredSize.Width + v.Frame.X); - size.Height = Math.Max(size.Height, v.DesiredSize.Height + v.Frame.Y); - } - - v.InvalidateArrange(); - v.Arrange(v.Frame); - SetAllocation(v, v.Frame); - - } - - var mesured = new Size(size.Width > 0 ? size.Width : widthConstraint.AvailableSize, size.Height > 0 ? size.Height : heightConstraint.AvailableSize); - VirtualView.InvalidateMeasure(); - VirtualView.InvalidateArrange(); - VirtualView.Arrange(new Rectangle(Graphics.Point.Zero, mesured)); - - return mesured; - - } - #endregion } - public struct SizeConstraint : IEquatable - { - - // The value '0' is used for Unconstrained, since that's the default value of SizeContraint - // Since a constraint of '0' is valid, we use NegativeInfinity as a marker for constraint=0. - double _value; - - public static readonly SizeConstraint Unconstrained = new(); - - public static implicit operator SizeConstraint(double size) => new() { AvailableSize = size }; - - public static SizeConstraint WithSize(double size) => new() { AvailableSize = size }; - - public double AvailableSize - { - get => double.IsNegativeInfinity(_value) ? 0 : _value; - set - { - _value = value <= 0 ? double.NegativeInfinity : value; - } - } - - public bool IsConstrained - { - get => _value != 0; - } - - public static bool operator ==(SizeConstraint s1, SizeConstraint s2) => (s1._value == s2._value); - - public static bool operator !=(SizeConstraint s1, SizeConstraint s2) => (s1._value != s2._value); - - public static SizeConstraint operator +(SizeConstraint c, double s) => !c.IsConstrained ? c : WithSize(c.AvailableSize + s); - - public static SizeConstraint operator -(SizeConstraint c, double s) => !c.IsConstrained ? c : WithSize(Math.Max(c.AvailableSize - s, 0)); - - public override bool Equals(object? ob) => (ob is SizeConstraint constraint) && this == constraint; - - public bool Equals(SizeConstraint other) => this == other; - - public override int GetHashCode() => _value.GetHashCode(); - - public override string ToString() => IsConstrained ? AvailableSize.ToString() : "Unconstrained"; - - } - } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiContext.cs b/src/Core/src/Platform/Linux/MauiContext.cs index 0126bd2ab8e2..e6549d784177 100644 --- a/src/Core/src/Platform/Linux/MauiContext.cs +++ b/src/Core/src/Platform/Linux/MauiContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.Maui diff --git a/src/Core/src/Platform/Linux/MauiDatePicker.cs b/src/Core/src/Platform/Linux/MauiDatePicker.cs index 1965fc51873d..30891da2dcc7 100644 --- a/src/Core/src/Platform/Linux/MauiDatePicker.cs +++ b/src/Core/src/Platform/Linux/MauiDatePicker.cs @@ -1,7 +1,35 @@ -namespace Microsoft.Maui +using System; +using System.Runtime.Serialization; + +namespace Microsoft.Maui { - public class MauiDatePicker : Gtk.Widget + public class MauiDatePicker : Gtk.Label { + + public MauiDatePicker() : base() + { + Format = string.Empty; + } + +#pragma warning disable 169 + // to simulate + // Tapping either of the DatePicker displays invokes the platform date picker + Gtk.Calendar? _calendar; +#pragma warning restore 169 + DateTime _time; + + public DateTime Date + { + get => _time; + set + { + _time = value; + Text = _time.ToString(); + } + } + + public string Format { get; set; } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiGtkApplication.cs b/src/Core/src/Platform/Linux/MauiGtkApplication.cs index 596b3653fe18..445b1b8007d4 100644 --- a/src/Core/src/Platform/Linux/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Linux/MauiGtkApplication.cs @@ -82,10 +82,11 @@ protected void OnWindowAdded(object o, WindowAddedArgs args) Widget CreateRootContainer(Widget nativePage) { - var b = new VBox + var b = new Box(Orientation.Vertical, 0) { Expand = true, }; + b.PackStart(nativePage, true, true, 0); return b; @@ -108,10 +109,9 @@ protected void StartupLauch(object sender, EventArgs args) var activationState = new ActivationState(mauiContext); var window = Application.CreateWindow(activationState); - window.MauiContext = mauiContext; - var content = (window.Page as IView) ?? window.Page.View; - var nativeContent = content.ToNative(window.MauiContext); + var content = window.View; + var nativeContent = content.ToNative(mauiContext); var canvas = TopContainerOverride?.Invoke(nativeContent) ?? CreateRootContainer(nativeContent); #if DEBUG diff --git a/src/Core/src/Platform/Linux/MauiSearchBar.cs b/src/Core/src/Platform/Linux/MauiSearchBar.cs index 8ecf34122676..dcdf8a1eb59d 100644 --- a/src/Core/src/Platform/Linux/MauiSearchBar.cs +++ b/src/Core/src/Platform/Linux/MauiSearchBar.cs @@ -1,7 +1,20 @@ -namespace Microsoft.Maui +using System; +using Gtk; + +namespace Microsoft.Maui { - public class MauiSearchBar : Gtk.Widget + + public class MauiSearchBar : Gtk.SearchBar { - + + public MauiSearchBar() : base() + { + Entry = new Entry(string.Empty); + ConnectEntry(Entry); + } + + public Gtk.Entry Entry { get; } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiTimePicker.cs b/src/Core/src/Platform/Linux/MauiTimePicker.cs index 14da53132282..1b208ae4e136 100644 --- a/src/Core/src/Platform/Linux/MauiTimePicker.cs +++ b/src/Core/src/Platform/Linux/MauiTimePicker.cs @@ -1,7 +1,28 @@ -namespace Microsoft.Maui +using System; + +namespace Microsoft.Maui { - public class MauiTimePicker : Gtk.Widget + public class MauiTimePicker : Gtk.Label { + public MauiTimePicker() : base() + { + Format = string.Empty; + } + + TimeSpan _time; + + public TimeSpan Time + { + get => _time; + set + { + _time = value; + Text = _time.ToString(); + } + } + + public string Format { get; set; } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/MauiWindow.cs b/src/Core/src/Platform/Linux/MauiWindow.cs index 9c335b0ad165..ce9e729b7602 100644 --- a/src/Core/src/Platform/Linux/MauiWindow.cs +++ b/src/Core/src/Platform/Linux/MauiWindow.cs @@ -27,11 +27,9 @@ public MauiWindow() : base(WindowType.Toplevel) var activationState = new ActivationState(mauiContext); var window = Application.CreateWindow(activationState); - window.MauiContext = mauiContext; + var content = window.View; - var content = (window.Page as IView) ?? window.Page.View; - - Add(content.ToNative(window.MauiContext)); + Add(content.ToNative(mauiContext)); Child.ShowAll(); } diff --git a/src/Core/src/Platform/Linux/SliderExtensions.cs b/src/Core/src/Platform/Linux/SliderExtensions.cs index fdbbba7502c9..4137d217345c 100644 --- a/src/Core/src/Platform/Linux/SliderExtensions.cs +++ b/src/Core/src/Platform/Linux/SliderExtensions.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui { public static class SliderExtensions { - public static void UpdateRange(this Scale nativeSlider, ISlider slider) + public static void UpdateRange(this Range nativeSlider, IRange slider) { var minimum = slider.Minimum; var maximum = slider.Maximum; @@ -12,9 +12,9 @@ public static void UpdateRange(this Scale nativeSlider, ISlider slider) nativeSlider.SetRange(minimum, maximum); } - public static void UpdateValue(this Scale nativeSlider, ISlider slider) + public static void UpdateValue(this Range nativeSlider, IRange slider) { - nativeSlider.Value = (float)slider.Value; + nativeSlider.Value = slider.Value; } } } diff --git a/src/Core/src/Platform/Linux/StepperExtensions.cs b/src/Core/src/Platform/Linux/StepperExtensions.cs index 00cd5c978e4f..5e647a93d269 100644 --- a/src/Core/src/Platform/Linux/StepperExtensions.cs +++ b/src/Core/src/Platform/Linux/StepperExtensions.cs @@ -1,7 +1,24 @@ -namespace Microsoft.Maui +using Gtk; + +namespace Microsoft.Maui { public static class StepperExtensions { - + public static void UpdateRange(this SpinButton nativeSlider, IRange slider) + { + var minimum = slider.Minimum; + var maximum = slider.Maximum; + + nativeSlider.SetRange(minimum, maximum); + } + + public static void UpdateValue(this SpinButton nativeSlider, IRange slider) + { + nativeSlider.Value = slider.Value; + } + public static void UpdateIncrement(this SpinButton nativeSlider, IRange slider) + { + nativeSlider.SetIncrements(slider.Value,1); + } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/SwitchExtensions.cs b/src/Core/src/Platform/Linux/SwitchExtensions.cs index f00ee1b401e3..a3f52a81e26c 100644 --- a/src/Core/src/Platform/Linux/SwitchExtensions.cs +++ b/src/Core/src/Platform/Linux/SwitchExtensions.cs @@ -4,9 +4,9 @@ namespace Microsoft.Maui { public static class SwitchExtensions { - public static void UpdateIsToggled(this Switch nativeSwitch, ISwitch virtualSwitch) + public static void UpdateIsOn(this Switch nativeSwitch, ISwitch virtualSwitch) { - nativeSwitch.Active = virtualSwitch.IsToggled; + nativeSwitch.Active = virtualSwitch.IsOn; } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/TextInputExtensions.cs b/src/Core/src/Platform/Linux/TextInputExtensions.cs new file mode 100644 index 000000000000..ce61a6d78287 --- /dev/null +++ b/src/Core/src/Platform/Linux/TextInputExtensions.cs @@ -0,0 +1,55 @@ +using Gtk; + +namespace Microsoft.Maui +{ + + public static class TextInputExtensions + { + + public static void UpdateText(this Entry nativeEntry, ITextInput entry) + { + var text = entry.Text; + + if (nativeEntry.Text != text) + { + if (!string.IsNullOrEmpty(text)) + nativeEntry.Text = text; + else + { + nativeEntry.Buffer.SetText(string.Empty, -1); + + } + } + + } + + public static void OnTextChanged(this Entry? nativeEntry, ITextInput? entry) + { + if (entry == null || nativeEntry == null) + return; + + ; + var text = nativeEntry.Text; + + if (entry.Text != text) + { + entry.Text = text; + } + + } + + public static void UpdatePlaceholder(this Entry nativeEntry, ITextInput entry) + { + nativeEntry.PlaceholderText = entry.Placeholder; + + } + + public static void UpdateIsReadOnly(this Entry nativeEntry, ITextInput entry) + { + nativeEntry.IsEditable = !entry.IsReadOnly; + + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ThicknessExtensions.cs b/src/Core/src/Platform/Linux/ThicknessExtensions.cs index 55691ea700ec..fcac226dc19c 100644 --- a/src/Core/src/Platform/Linux/ThicknessExtensions.cs +++ b/src/Core/src/Platform/Linux/ThicknessExtensions.cs @@ -12,24 +12,24 @@ public static Thickness ToThickness(this Border it) public static Border ToNative(this Thickness it) => new() { Left = (short)it.Left, Top = (short)it.Top, Right = (short)it.Right, Bottom = (short)it.Bottom }; - public static TWidget? WithMargin(this TWidget? it, Thickness margin) where TWidget : Widget + public static TWidget? WithPadding(this TWidget? it, Thickness padding) where TWidget : Widget { if (it == default) return it; // https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--margin-start - it.MarginStart = (int)margin.Left; - it.MarginTop = (int)margin.Top; - it.MarginEnd = (int)margin.Right; - it.MarginBottom = (int)margin.Bottom; + it.MarginStart = (int)padding.Left; + it.MarginTop = (int)padding.Top; + it.MarginEnd = (int)padding.Right; + it.MarginBottom = (int)padding.Bottom; return it; } - public static Thickness GetMargin(this TWidget? it) where TWidget : Widget => + public static Thickness GetPadding(this TWidget? it) where TWidget : Widget => it == default ? default : new Thickness(it.MarginStart, it.MarginTop, it.MarginEnd, it.MarginBottom); - public static Thickness GetPadding(this TWidget? it) where TWidget : Widget + public static Thickness GetPaddingThickness(this TWidget? it) where TWidget : Widget { return it?.StyleContext.GetPadding(StateFlags.Normal).ToThickness() ?? default; diff --git a/src/Core/src/Platform/Linux/TimePickerExtensions.cs b/src/Core/src/Platform/Linux/TimePickerExtensions.cs index 6675e9a30e92..37f28ba20c51 100644 --- a/src/Core/src/Platform/Linux/TimePickerExtensions.cs +++ b/src/Core/src/Platform/Linux/TimePickerExtensions.cs @@ -2,6 +2,16 @@ { public static class TimePickerExtensions { - + public static void UpdateTime(this MauiTimePicker nativeTimePicker, ITimePicker timePicker) + { + nativeTimePicker.Time = timePicker.Time; + + } + + public static void UpdateFormat(this MauiTimePicker nativeTimePicker, ITimePicker timePicker) + { + nativeTimePicker.Format = timePicker.Format; + + } } } diff --git a/src/Core/src/Platform/Linux/ViewExtensions.cs b/src/Core/src/Platform/Linux/ViewExtensions.cs index 84c69ecba158..4e7743420752 100644 --- a/src/Core/src/Platform/Linux/ViewExtensions.cs +++ b/src/Core/src/Platform/Linux/ViewExtensions.cs @@ -1,25 +1,44 @@ -using Gtk; +using System; +using Gtk; +using Microsoft.Maui.Graphics; namespace Microsoft.Maui { + public static class ViewExtensions { - public static void UpdateAutomationId(this Widget nativeView, IView view) - { - } + public static void UpdateAutomationId(this Widget nativeView, IView view) + { } - public static void UpdateBackgroundColor(this Widget nativeView, IView view) + [PortHandler("implement drawing of other paints than solidpaint")] + public static void UpdateBackground(this Widget nativeView, IView view) { - nativeView.SetBackgroundColor(view.BackgroundColor); + if (view.Background is SolidPaint solidPaint) + { + nativeView.SetBackgroundColor(solidPaint.Color); + } + else if (view.Background is Paint paint) + { + nativeView.SetBackgroundColor(paint.BackgroundColor); + } + else + { + ; + } } public static void UpdateIsEnabled(this Widget nativeView, IView view) => nativeView?.UpdateIsEnabled(view.IsEnabled); + public static void UpdateVisibility(this Widget nativeView, IView view) => + nativeView?.UpdateVisibility(view.Visibility); + public static void UpdateSemantics(this Widget nativeView, IView view) { - + } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/WidgetExtensions.cs b/src/Core/src/Platform/Linux/WidgetExtensions.cs index 155311c17484..8bed8cc49bfb 100644 --- a/src/Core/src/Platform/Linux/WidgetExtensions.cs +++ b/src/Core/src/Platform/Linux/WidgetExtensions.cs @@ -1,5 +1,7 @@ using System; using Gtk; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui { @@ -7,8 +9,26 @@ namespace Microsoft.Maui public static class WidgetExtensions { - public static void UpdateIsEnabled(this Widget native, bool isEnabled) => - native.Sensitive = isEnabled; + public static void UpdateIsEnabled(this Widget nativeView, bool isEnabled) => + nativeView.Sensitive = isEnabled; + + public static void UpdateVisibility(this Widget nativeView, Visibility visibility) + { + switch (visibility) + { + case Visibility.Hidden: + nativeView.Visible = false; + break; + case Visibility.Visible: + nativeView.Visible = true; + break; + case Visibility.Collapsed: + + break; + default: + throw new ArgumentOutOfRangeException(nameof(visibility), visibility, null); + } + } public static SizeRequest GetDesiredSize( this Widget? nativeView, @@ -18,71 +38,182 @@ public static SizeRequest GetDesiredSize( if (nativeView == null) return Graphics.Size.Zero; - nativeView.GetPreferredSize(out var minimumSize, out var req); + if (widthConstraint < 0 || heightConstraint < 0) + return Size.Zero; + + var widthConstrained = !double.IsPositiveInfinity(widthConstraint); + var heightConstrained = !double.IsPositiveInfinity(heightConstraint); - var desiredSize = new Gdk.Size( - req.Width > 0 ? req.Width : 0, - req.Height > 0 ? req.Height : 0); + if (nativeView.RequestMode == SizeRequestMode.HeightForWidth) + { + ; + } - var widthFits = widthConstraint >= desiredSize.Width; - var heightFits = heightConstraint >= desiredSize.Height; + if (nativeView.RequestMode == SizeRequestMode.WidthForHeight) + { + ; + } - if (widthFits && heightFits) // Enough space with given constraints + if (nativeView.RequestMode == SizeRequestMode.ConstantSize) { - return new SizeRequest(new Graphics.Size(desiredSize.Width, desiredSize.Height)); + ; } - if (!widthFits) + if (!widthConstrained && !heightConstrained) { - nativeView.SetSize((int)widthConstraint, -1); + // https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-get-preferred-size + nativeView.GetPreferredSize(out var minimumSize, out var req); - nativeView.GetPreferredSize(out minimumSize, out req); + return new SizeRequest(req.ToSize(), minimumSize.ToSize()); + } - desiredSize = new Gdk.Size( - req.Width > 0 ? req.Width : 0, - req.Height > 0 ? req.Height : 0); + int minimumHeight = 0; + int naturalHeight = 0; + int minimumWidth = 0; + int naturalWidth = 0; + + if (widthConstrained) + { + nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); + + if (!heightConstrained) + { + nativeView.GetPreferredWidthForHeight(Math.Max(minimumHeight, naturalHeight), out minimumWidth, out naturalWidth); + + } - heightFits = heightConstraint >= desiredSize.Height; } - var size = new Graphics.Size(desiredSize.Width, heightFits ? desiredSize.Height : (int)heightConstraint); + if (heightConstrained) + { + nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); - return new SizeRequest(size); + if (!widthConstrained) + { + nativeView.GetPreferredHeightForWidth(Math.Max(minimumWidth, naturalWidth), out minimumHeight, out naturalHeight); + } + } + + return new SizeRequest(new Size(naturalWidth, naturalHeight), new Size(minimumWidth, minimumHeight)); } - public static void SetSize(this Gtk.Widget self, double width, double height) + public static void Arrange(this Widget? nativeView, Rectangle rect) { - int calcWidth = (int)Math.Round(width); - int calcHeight = (int)Math.Round(height); + if (nativeView == null) + return; + + if (rect.IsEmpty) + return; - // Avoid negative values - if (calcWidth < -1) + if (rect != nativeView.Allocation.ToRectangle()) { - calcWidth = -1; + nativeView.SizeAllocate(rect.ToNative()); + nativeView.QueueResize(); } + } + + public static void InvalidateMeasure(this Widget nativeView, IView view) + { + nativeView.QueueAllocate(); + } + + static int Request(double viewSize) => viewSize >= 0 ? (int)viewSize : -1; - if (calcHeight < -1) + public static void UpdateWidth(this Widget nativeView, IView view) + { + var widthRequest = Request(view.Width); + + if (widthRequest != -1 && widthRequest != nativeView.WidthRequest && widthRequest != nativeView.AllocatedWidth) { - calcHeight = -1; + nativeView.WidthRequest = widthRequest; } - if (calcWidth != self.WidthRequest || calcHeight != self.HeightRequest) + } + + public static void UpdateHeight(this Widget nativeView, IView view) + { + var heightRequest = Request(view.Height); + + if (heightRequest != -1 && heightRequest != nativeView.HeightRequest && heightRequest != nativeView.AllocatedHeight) { - self.SetSizeRequest(calcWidth, calcHeight); + nativeView.HeightRequest = heightRequest; } + } - public static void UpdateFont(this Widget widget, ITextStyle textStyle, IFontManager fontManager) + public static void UpdateFont(this Widget nativeView, ITextStyle textStyle, IFontManager fontManager) { var font = textStyle.Font; var fontFamily = fontManager.GetFontFamily(font); #pragma warning disable 612 - widget.ModifyFont(fontFamily); + nativeView.ModifyFont(fontFamily); #pragma warning restore 612 } + + public static void ReplaceChild(this Gtk.Container cont, Gtk.Widget oldWidget, Gtk.Widget newWidget) + { + if (oldWidget.Parent != cont) + return; + + switch (cont) + { + case IGtkContainer container: + container.ReplaceChild(oldWidget, newWidget); + + break; + case Gtk.Notebook notebook: + { + Gtk.Notebook.NotebookChild nc = (Gtk.Notebook.NotebookChild)notebook[oldWidget]; + var detachable = nc.Detachable; + var pos = nc.Position; + var reorderable = nc.Reorderable; + var tabExpand = nc.TabExpand; + var tabFill = nc.TabFill; + var label = notebook.GetTabLabel(oldWidget); + notebook.Remove(oldWidget); + notebook.InsertPage(newWidget, label, pos); + + nc = (Gtk.Notebook.NotebookChild)notebook[newWidget]; + nc.Detachable = detachable; + nc.Reorderable = reorderable; + nc.TabExpand = tabExpand; + nc.TabFill = tabFill; + + break; + } + case Gtk.Paned paned: + { + var pc = (Gtk.Paned.PanedChild)paned[oldWidget]; + var resize = pc.Resize; + var shrink = pc.Shrink; + var pos = paned.Position; + + if (paned.Child1 == oldWidget) + { + paned.Remove(oldWidget); + paned.Pack1(newWidget, resize, shrink); + } + else + { + paned.Remove(oldWidget); + paned.Pack2(newWidget, resize, shrink); + } + + paned.Position = pos; + + break; + } + case Gtk.Bin bin: + bin.Remove(oldWidget); + bin.Child = newWidget; + + break; + } + } + } } \ No newline at end of file From f5fb7532ad5f7cdc6b36df9d5cfe69cc90ebd558 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:53:41 +0200 Subject: [PATCH 022/425] Controls.Core.csproj: implement NavigationPageHandler.Linux.cs --- .../NavigationPageHandler.Linux.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Linux.cs diff --git a/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Linux.cs b/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Linux.cs new file mode 100644 index 000000000000..efc846655b37 --- /dev/null +++ b/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Linux.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class NavigationPageHandler : + ViewHandler + { + protected override Gtk.Widget CreateNativeView() + { + throw new NotImplementedException(); + } + + [MissingMapper] + public static void MapPadding(NavigationPageHandler handler, NavigationPage view) { } + + [MissingMapper] + public static void MapBarTextColor(NavigationPageHandler handler, NavigationPage view) { } + + [MissingMapper] + public static void MapBarBackground(NavigationPageHandler handler, NavigationPage view) { } + + [MissingMapper] + public static void MapTitleIcon(NavigationPageHandler handler, NavigationPage view) { } + + [MissingMapper] + public static void MapTitleView(NavigationPageHandler handler, NavigationPage view) { } + } +} From a5f2134717678af7053cae637801f772c6053b55 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:54:41 +0200 Subject: [PATCH 023/425] Compatibility.Gtk.csproj: implement GtkScrollView.Linux.cs, GtkTicker.cs, GtkPlatformServices.cs & related stuff --- .../Core/src/Gtk/AppHostBuilderExtensions_.cs | 29 ++++ .../Core/src/Gtk/Compatibility.Gtk.csproj | 28 ++++ src/Compatibility/Core/src/Gtk/Forms.cs | 26 +++ .../Core/src/Gtk/GtkPlatformServices.cs | 122 ++++++++++++++ src/Compatibility/Core/src/Gtk/GtkTicker.cs | 27 ++++ .../ScrollView/GtkScrollView.Linux.cs | 54 +++++++ .../ScrollView/ScrollViewExtensions.Linux.cs | 41 +++++ .../ScrollView/ScrollViewHandler.Linux.cs | 153 ++++++++++++++++++ 8 files changed, 480 insertions(+) create mode 100644 src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs create mode 100644 src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj create mode 100644 src/Compatibility/Core/src/Gtk/Forms.cs create mode 100644 src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs create mode 100644 src/Compatibility/Core/src/Gtk/GtkTicker.cs create mode 100644 src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Linux.cs create mode 100644 src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Linux.cs create mode 100644 src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Linux.cs diff --git a/src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs b/src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs new file mode 100644 index 000000000000..cef0098786a5 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs @@ -0,0 +1,29 @@ +using Microsoft.Maui.Handlers.ScrollView; +using Microsoft.Maui.Hosting; + +namespace Microsoft.Maui.Controls.Compatibility +{ + + public static class AppHostBuilderExtensions_ + { + + public static IAppHostBuilder UseCompatibilityRenderers(this IAppHostBuilder builder) + { + + builder.ConfigureMauiHandlers(col => + { + col.AddHandler(); + }); + return builder; + } + + public static IAppHostBuilder UseFormsCompatibility(this IAppHostBuilder builder) + { + + return builder; + } + + + } + +} diff --git a/src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj b/src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj new file mode 100644 index 000000000000..ab4b528a72b4 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj @@ -0,0 +1,28 @@ + + + $(MauiLinuxTargets) + Microsoft.Maui + Gtk Compatibility Backend for Microsoft.Maui + Microsoft.Maui.Controls.Compatibility.Gtk + disable + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Compatibility/Core/src/Gtk/Forms.cs b/src/Compatibility/Core/src/Gtk/Forms.cs new file mode 100644 index 000000000000..961af49edcaf --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Forms.cs @@ -0,0 +1,26 @@ +using System; +using System.Reflection; + +namespace Microsoft.Maui.Controls.Compatibility +{ + + public static class Forms + { + + public static void Init(IActivationState state) + { + var gtkServices = new GtkPlatformServices(); + Device.PlatformServices = gtkServices; + } + + internal static void RegisterCompatRenderers( + Assembly[] assemblies, + Assembly defaultRendererAssembly, + Action viewRegistered) + { + ; + } + + } + +} diff --git a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs new file mode 100644 index 000000000000..a0ab1cf90cd2 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs @@ -0,0 +1,122 @@ +using System; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Gtk; +using Microsoft.Maui.Controls.Internals; +using Microsoft.Maui.Graphics; +using Action = System.Action; + +namespace Microsoft.Maui.Controls.Compatibility +{ + + public class GtkPlatformServices : IPlatformServices + { + + public bool IsInvokeRequired => Thread.CurrentThread.IsBackground; + + public void BeginInvokeOnMainThread(Action action) + { + MauiGtkApplication.Invoke(action); + } + + public Ticker CreateTicker() + { + return new GtkTicker(); + } + + public Assembly[] GetAssemblies() + { + return AppDomain.CurrentDomain.GetAssemblies(); + } + + public string GetHash(string input) + { + return Internals.Crc64.GetHash(input); + } + + string IPlatformServices.GetMD5Hash(string input) => GetHash(input); + + public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSizes) + { + switch (size) + { + case NamedSize.Default: + return 11; + case NamedSize.Micro: + case NamedSize.Caption: + return 12; + case NamedSize.Medium: + return 17; + case NamedSize.Large: + return 22; + case NamedSize.Small: + case NamedSize.Body: + return 14; + case NamedSize.Header: + return 46; + case NamedSize.Subtitle: + return 20; + case NamedSize.Title: + return 24; + default: + throw new ArgumentOutOfRangeException(nameof(size)); + } + } + + public Color GetNamedColor(string name) + { + throw new NotImplementedException(); + } + + public OSAppTheme RequestedTheme { get; set; } + +#pragma warning disable 1998 + public async Task GetStreamAsync(Uri uri, CancellationToken cancellationToken) +#pragma warning restore 1998 + { + throw new NotImplementedException(); + + } + + public IIsolatedStorageFile GetUserStoreForApplication() + { + throw new NotImplementedException(); + } + + public void OpenUriAction(Uri uri) + { + throw new NotImplementedException(); + } + + public void StartTimer(TimeSpan interval, Func callback) + { + GLib.Timeout.Add((uint)interval.TotalMilliseconds, () => + { + var result = callback(); + + return result; + }); + } + + public string RuntimePlatform => Device.GTK; + + public void QuitApplication() + { + ((GLib.Application)MauiGtkApplication.CurrentGtkApplication).Quit(); + } + + public SizeRequest GetNativeSize(VisualElement view, double widthConstraint, double heightConstraint) + { + if (view.Handler.NativeView is Widget w) + { + return view.Handler.GetDesiredSize(widthConstraint, heightConstraint); + } + + return new SizeRequest(new Size(widthConstraint, heightConstraint)); + } + + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/GtkTicker.cs b/src/Compatibility/Core/src/Gtk/GtkTicker.cs new file mode 100644 index 000000000000..10a3f56c950c --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/GtkTicker.cs @@ -0,0 +1,27 @@ + +using Microsoft.Maui.Controls.Internals; + +namespace Microsoft.Maui.Controls.Compatibility +{ + public class GtkTicker : Ticker + { + private uint _timerId; + + protected override void DisableTimer() + { + GLib.Source.Remove(_timerId); + } + + protected override void EnableTimer() + { + _timerId = GLib.Timeout.Add(15, new GLib.TimeoutHandler(OnSendSignals)); + } + + private bool OnSendSignals() + { + SendSignals(); + + return true; + } + } +} diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Linux.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Linux.cs new file mode 100644 index 000000000000..95e733e72ada --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Linux.cs @@ -0,0 +1,54 @@ +using System; +using Gtk; +using Microsoft.Maui.Controls; + +namespace Microsoft.Maui.Handlers.ScrollView +{ + + public class GtkScrollView : Gtk.ScrolledWindow + { + + public ScrollOrientation ScrollOrientation { get; set; } + + protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) + { + base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); + // Child.GetPreferredHeightForWidth(width, out var childMinimumHeight, out var childNaturalHeight); + // + // minimumHeight = Math.Max(minimumHeight, childMinimumHeight); + // naturalHeight = Math.Max(naturalHeight, childNaturalHeight); + var o = this.ToScrollOrientation(); + + // if (ScrollOrientation == ScrollOrientation.Vertical) + // { + // minimumHeight = childMinimumHeight; + // naturalHeight = childNaturalHeight; + // } + + } + + protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) + { + base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); + + + var o = this.ToScrollOrientation(); + + if (ScrollOrientation == ScrollOrientation.Vertical) + { + Child.GetPreferredWidthForHeight(height, out var childMinimumWidth, out var childNaturalWidth); + minimumWidth = Math.Max(minimumWidth, childMinimumWidth); + naturalWidth = Math.Max(naturalWidth, childNaturalWidth); + } + } + + protected override SizeRequestMode OnGetRequestMode() + { + var rm = base.OnGetRequestMode(); + + return rm; + } + + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Linux.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Linux.cs new file mode 100644 index 000000000000..961d48b5df14 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Linux.cs @@ -0,0 +1,41 @@ +using System; +using Gtk; +using Microsoft.Maui.Controls; + +namespace Microsoft.Maui.Handlers.ScrollView +{ + + public static class ScrollViewExtensions + { + + public static PolicyType ToNative(this ScrollBarVisibility it) => it switch + { + ScrollBarVisibility.Default => PolicyType.Automatic, + ScrollBarVisibility.Always => PolicyType.Always, + ScrollBarVisibility.Never => PolicyType.Never, + _ => throw new ArgumentOutOfRangeException(nameof(it), it, null) + }; + + public static ScrollOrientation ToScrollOrientation(this (PolicyType horizontal, PolicyType vertical) it) => + it.horizontal switch + { + PolicyType.Always when it.vertical == PolicyType.Never => ScrollOrientation.Horizontal, + PolicyType.Automatic when it.vertical == PolicyType.Never => ScrollOrientation.Horizontal, + PolicyType.Never when it.vertical == PolicyType.Always => ScrollOrientation.Vertical, + PolicyType.Never when it.vertical == PolicyType.Automatic => ScrollOrientation.Vertical, + PolicyType.Always when it.vertical == PolicyType.Always => ScrollOrientation.Both, + PolicyType.Automatic when it.vertical == PolicyType.Automatic => ScrollOrientation.Both, + + _ => ScrollOrientation.Neither + }; + + public static ScrollOrientation ToScrollOrientation(this Gtk.ScrolledWindow it) + { + it.GetPolicy(out var hscrollbarPolicy, out var vscrollbarPolicy); + + return ToScrollOrientation((hscrollbarPolicy, vscrollbarPolicy)); + } + + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Linux.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Linux.cs new file mode 100644 index 000000000000..2b98bc0f2bb6 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Linux.cs @@ -0,0 +1,153 @@ +using System; +using Gtk; +using Microsoft.Maui.Controls; +using NativeView = Gtk.Widget; + +namespace Microsoft.Maui.Handlers.ScrollView +{ + + // https://developer.gnome.org/gtk3/stable/GtkScrolledWindow.html + public class ScrollViewHandler : ViewHandler + { + + public static PropertyMapper ScrollViewMapper = new(ViewHandler.ViewMapper) + { + [nameof(Controls.ScrollView.ContentSize)] = MapContentSize, + [nameof(Controls.ScrollView.ScrollX)] = MapScrollX, + [nameof(Controls.ScrollView.ScrollY)] = MapScrollY, + [nameof(Controls.ScrollView.Orientation)] = MapOrientation, + [nameof(Controls.ScrollView.HorizontalScrollBarVisibility)] = MapHorizontalScrollBarVisibility, + [nameof(Controls.ScrollView.VerticalScrollBarVisibility)] = MapVerticalScrollBarVisibility, + + }; + + public static void MapContentSize(ScrollViewHandler handler, Controls.ScrollView view) + { + ; + } + + public static void MapScrollX(ScrollViewHandler handler, Controls.ScrollView view) + { + if (handler?.NativeView is not { } nativeView || !(nativeView.VScrollbar?.Visible ?? true)) + return; + + nativeView.Vadjustment.Value = view.ScrollX; + } + + public static void MapScrollY(ScrollViewHandler handler, Controls.ScrollView view) + { + if (handler?.NativeView is not { } nativeView || !(nativeView.HScrollbar?.Visible ?? true)) + return; + + nativeView.Hadjustment.Value = view.ScrollY; + + } + + public static void MapOrientation(ScrollViewHandler handler, Controls.ScrollView view) + { + if (handler?.NativeView is not { } nativeView) + return; + + switch (view.Orientation) + { + case ScrollOrientation.Both: + // nativeView.PropagateNaturalWidth = true; + // nativeView.PropagateNaturalHeight = true; + nativeView.SetPolicy(PolicyType.Always, PolicyType.Always); + nativeView.HScrollbar.Visible = true; + nativeView.VScrollbar.Visible = true; + + break; + case ScrollOrientation.Horizontal: + // nativeView.PropagateNaturalWidth = true; + // nativeView.PropagateNaturalHeight = false; + nativeView.SetPolicy(PolicyType.Always, PolicyType.Never); + nativeView.HScrollbar.Visible = true; + nativeView.VScrollbar.Visible = false; + + break; + case ScrollOrientation.Vertical: + // nativeView.PropagateNaturalHeight = true; + // nativeView.PropagateNaturalWidth = false; + nativeView.SetPolicy(PolicyType.Never, PolicyType.Always); + nativeView.HScrollbar.Visible = false; + nativeView.VScrollbar.Visible = true; + + break; + + case ScrollOrientation.Neither: + // nativeView.PropagateNaturalWidth = false; + // nativeView.PropagateNaturalHeight = false; + nativeView.SetPolicy(PolicyType.Never, PolicyType.Never); + nativeView.HScrollbar.Visible = false; + nativeView.VScrollbar.Visible = false; + + break; + default: + throw new ArgumentOutOfRangeException(); + } + + nativeView.ScrollOrientation = view.Orientation; + } + + public static void MapHorizontalScrollBarVisibility(ScrollViewHandler handler, Controls.ScrollView view) + { + if (handler?.NativeView is not { } nativeView) + return; + + nativeView.HscrollbarPolicy = view.HorizontalScrollBarVisibility.ToNative(); + + } + + public static void MapVerticalScrollBarVisibility(ScrollViewHandler handler, Controls.ScrollView view) + { + if (handler?.NativeView is not { } nativeView) + return; + + nativeView.VscrollbarPolicy = view.VerticalScrollBarVisibility.ToNative(); + + } + + public ScrollViewHandler() : base(ScrollViewMapper) + { } + + public ScrollViewHandler(PropertyMapper mapper = null) : base(mapper) { } + + protected override GtkScrollView CreateNativeView() + { + var s = new GtkScrollView(); + + s.SizeAllocated += (s, o) => + { + ; + }; + + s.ResizeChecked += (s, o) => + { + ; + }; + + return s; + } + + public override void SetVirtualView(IView view) + { + base.SetVirtualView(view); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + if (VirtualView.Content != null) + NativeView.Child = VirtualView.Content.ToNative(MauiContext); + } + + protected override void ConnectHandler(GtkScrollView nativeView) + { } + + protected override void DisconnectHandler(GtkScrollView nativeView) + { } + + } + +} \ No newline at end of file From f250f6303387ce695f3a301d86cbfc49d957a324 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:55:29 +0200 Subject: [PATCH 024/425] Controls.Core: add ShellHandler.Linux - stub --- .../Core/Handlers/Shell/ShellHandler.Linux.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/Controls/src/Core/Handlers/Shell/ShellHandler.Linux.cs diff --git a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Linux.cs b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Linux.cs new file mode 100644 index 000000000000..3aa9f50347c4 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Linux.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Controls.Platform; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class ShellHandler : ViewHandler + { + protected override Gtk.Widget CreateNativeView() + { + throw new NotImplementedException(); + } + } +} From cb66e0c87e22d48dc0f8ac680aa24187ac2e4377 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:56:33 +0200 Subject: [PATCH 025/425] Controls.Sample.Linux.csproj: enhance --- .../Controls.Sample.Linux.csproj | 13 +- .../samples/Controls.Sample.Linux/Program.cs | 23 +- .../SimpleSampleApp/BasePage.cs | 10 + .../SimpleSampleApp/ExamplePage.cs | 680 ++++++++++++++++++ .../SimpleSampleApp/ITextService.cs | 7 + .../SimpleSampleApp/MainPageViewModel.cs | 28 + .../SimpleSampleGtkApplication.cs | 42 ++ .../SimpleSampleApp/SimpleSampleMauiApp.cs | 39 + .../SimpleSampleApp/Startup.cs | 121 ++++ .../SimpleSampleApp/TextService.cs | 7 + .../SimpleSampleApp/ViewModelBase.cs | 32 + 11 files changed, 996 insertions(+), 6 deletions(-) create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/BasePage.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ITextService.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/MainPageViewModel.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleGtkApplication.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleMauiApp.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/Startup.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/TextService.cs create mode 100644 src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ViewModelBase.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj index 384d1fe2f947..0bc6fbe1e42d 100644 --- a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj +++ b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj @@ -2,8 +2,17 @@ WinExe - net5.0 + $(MauiLinuxTargets) false + Maui - + + + + + + + + + \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/Program.cs b/src/Controls/samples/Controls.Sample.Linux/Program.cs index 09827d83e086..76fad835eb63 100644 --- a/src/Controls/samples/Controls.Sample.Linux/Program.cs +++ b/src/Controls/samples/Controls.Sample.Linux/Program.cs @@ -1,9 +1,24 @@ using System; +using System.Threading.Tasks; +using GLib; +using Maui.SimpleSampleApp; +using Microsoft.Extensions.Hosting; +using Microsoft.Maui.Hosting; namespace Controls.Sample.Linux { - class Program - { - } -} + class Program + { + + static void Main(string[] args) + { + + var app = new SimpleSampleGtkApplication(); + app.Run(); + + } + + } + +} \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/BasePage.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/BasePage.cs new file mode 100644 index 000000000000..77cd3217342c --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/BasePage.cs @@ -0,0 +1,10 @@ +using Microsoft.Maui; +using Microsoft.Maui.Controls; + +namespace Maui.SimpleSampleApp +{ + public class BasePage : ContentPage, IPage + { + + } +} \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs new file mode 100644 index 000000000000..c6b8b0dd994b --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs @@ -0,0 +1,680 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Maui; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.LifecycleEvents; +using Debug = System.Diagnostics.Debug; + +namespace Maui.SimpleSampleApp +{ + + public class ExamplePage : BasePage + { + + readonly IServiceProvider _services; + readonly MainPageViewModel _viewModel; + + const string LoremIpsum = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " ; + const string LoremIpsum2 = + "Quisque ut dolor metus. Duis vel iaculis mauris, sit amet finibus mi. " + + "Etiam congue ornare risus, in facilisis libero tempor eget. " + + "Phasellus mattis mollis libero ut semper. In sit amet sapien odio. " + + "Sed interdum ullamcorper dui eu rutrum. Vestibulum non sagittis justo. " + + "Cras rutrum scelerisque elit, et porta est lobortis ac. " + + "Pellentesque eu ornare tortor. Sed bibendum a nisl at laoreet."; + + public ExamplePage(IServiceProvider services, MainPageViewModel viewModel) + { + _services = services; + BindingContext = _viewModel = viewModel; + + // SetupMauiLayoutLayouts(); + + // SetupMauiLayoutSimple(); + SetupMauiLayout(); + // SetupCompatibilityLayout(); + } + + void SetupMauiLayoutLayouts() + { + void Fill(Microsoft.Maui.Controls.Layout2.Layout l, string m, int count, Color bkCol) + { + var i = 0; + + while (i++ < count) + { + var label = new Label + { + Text = $"{m} {i}", + HorizontalTextAlignment = TextAlignment.Center, + BackgroundColor = bkCol, + Margin = new Thickness(i), + LineBreakMode = LineBreakMode.TailTruncation, + MaxLines = i + + }; + l.Add(label); + } + } + + var verticalStack1 = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.WhiteSmoke, + }; + var verticalStack2 = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.LightYellow, + }; + Fill(verticalStack2, nameof(verticalStack2), 4, Colors.Coral); + + var horizontalStack1 = new HorizontalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.NavajoWhite, + }; + Fill(horizontalStack1, nameof(horizontalStack1), 4, Colors.Aquamarine); + + verticalStack1.Add(verticalStack2); + verticalStack1.Add(horizontalStack1); + + var verticalStack3 = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.Lime, + }; + verticalStack3.Add(new Label + { + HorizontalTextAlignment = TextAlignment.Center, + BackgroundColor = Colors.Bisque, + Margin = new Thickness(2), + LineBreakMode = LineBreakMode.TailTruncation, + MaxLines = 2, + Text = LoremIpsum + }); + verticalStack1.Add(verticalStack3); + Content = verticalStack1; + + } + + void SetupMauiLayoutSimple() + { + var verticalStack = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.WhiteSmoke, + }; + + var button = new Button + { + Padding = new Thickness(10), + Text = "Change the label!", + BackgroundColor = Colors.Red, + TextColor = Colors.Yellow, + }; + + verticalStack.Add(button); + + var label = new Label + { + Text = "a label", + HorizontalTextAlignment = TextAlignment.Center, + + }; + + verticalStack.Add(label); + + const string ltext = "changed"; + + button.Clicked += (s, e) => + { + label.Text = label.Text == ltext ? $"{ltext} again" : ltext; + + if (s is Button sender) + { + label.TextColor = sender.BackgroundColor; + label.BackgroundColor = sender.TextColor; + } + }; + + var label1 = new Label + { + Text = "another label", + HorizontalTextAlignment = TextAlignment.End, + TextColor = Colors.Coral, + Margin = new Thickness(5), + Padding = new Thickness(2), + FontAttributes = FontAttributes.Italic, + TextDecorations = TextDecorations.Underline, + FontSize = 14 + }; + + verticalStack.Add(label1); + + var entry = new Entry { Placeholder = "write something" }; + + button.Clicked += (s, e) => + { + entry.Text = string.IsNullOrEmpty(entry.Text) ? "entry text" : null; + }; + + verticalStack.Add(entry); + + var activityIndicator = new ActivityIndicator { Color = Colors.Chartreuse }; + + button.Clicked += (s, e) => activityIndicator.IsRunning = !activityIndicator.IsRunning; + verticalStack.Add(activityIndicator); + + var editor = new Editor + { + Placeholder = "write something longer", + Margin = new Thickness(5), + }; + + button.Clicked += (s, e) => + { + editor.Text = string.IsNullOrEmpty(editor.Text) ? "editor text" : null; + }; + + verticalStack.Add(editor); + + Content = verticalStack; + } + + void SetupMauiLayout() + { + + + var verticalStack = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.AntiqueWhite + }; + + var horizontalStack = new HorizontalStackLayout() + { + Spacing = 2, + BackgroundColor = Colors.CornflowerBlue + }; + + verticalStack.Add(CreateSampleGrid()); + + verticalStack.Add(new Label + { + Text = " ", + Padding = new Thickness(10) + }); + + var label = new Label + { + Text = "End-aligned text", + BackgroundColor = Colors.Fuchsia, + HorizontalTextAlignment = TextAlignment.End + }; + + label.Margin = new Thickness(15, 10, 20, 15); + + SemanticProperties.SetHint(label, "Hint Text"); + SemanticProperties.SetDescription(label, "Description Text"); + + verticalStack.Add(label); + + verticalStack.Add(new Label + { + Text = "This should be BIG text!", + FontSize = 24, + HorizontalOptions = LayoutOptions.End + }); + + SemanticProperties.SetHeadingLevel((BindableObject)verticalStack.Children.Last(), SemanticHeadingLevel.Level1); + + verticalStack.Add(new Label + { + Text = "This should be BOLD text!", + FontAttributes = FontAttributes.Bold, + HorizontalOptions = LayoutOptions.Center + }); + + verticalStack.Add(new Label + { + Text = "This should be a CUSTOM font!", + FontFamily = "Dokdo" + }); + + verticalStack.Add(new Label + { + Text = "This should have padding", + Padding = new Thickness(40), + BackgroundColor = Colors.LightBlue + }); + + verticalStack.Add(new Label { Text = LoremIpsum }); + + verticalStack.Add(new Label + { + Text = LoremIpsum, + MaxLines = 2 + }); + + verticalStack.Add(new Label + { + Text = LoremIpsum, + LineBreakMode = LineBreakMode.TailTruncation + }); + + verticalStack.Add(new Label + { + Text = LoremIpsum, + MaxLines = 2, + LineBreakMode = LineBreakMode.TailTruncation, + WidthRequest = 200 + }); + + verticalStack.Add(new Label + { + Text = "This should have five times the line height! " + LoremIpsum, + LineHeight = 5, + MaxLines = 2 + }); + + SemanticProperties.SetHeadingLevel((BindableObject)verticalStack.Children.Last(), SemanticHeadingLevel.Level2); + + var visibleClearButtonEntry = new Entry() + { + ClearButtonVisibility = ClearButtonVisibility.WhileEditing, + Placeholder = "This Entry will show clear button if has input." + }; + + var hiddenClearButtonEntry = new Entry() + { + ClearButtonVisibility = ClearButtonVisibility.Never, + Placeholder = "This Entry will not..." + }; + + verticalStack.Add(visibleClearButtonEntry); + verticalStack.Add(hiddenClearButtonEntry); + + verticalStack.Add(new Editor { Placeholder = "This is an editor placeholder." }); + + var paddingButton = new Button + { + Padding = new Thickness(40), + Text = "This button has a padding!!", + BackgroundColor = Colors.Purple, + }; + + verticalStack.Add(paddingButton); + + var underlineLabel = new Label + { + Text = "underline", + TextDecorations = TextDecorations.Underline + }; + + verticalStack.Add(underlineLabel); + + verticalStack.Add(new ActivityIndicator()); + + verticalStack.Add(new ActivityIndicator + { + Color = Colors.Red, + IsRunning = true + }); + + var button = new Button() + { + Text = _viewModel.Text, + WidthRequest = 200 + }; + + // button.Clicked += async (sender, e) => + // { + // var events = _services.GetRequiredService(); + // events.InvokeEvents>("CustomEventName", action => action("VALUE")); + // + // // var location = await Geolocation.GetLocationAsync(new GeolocationRequest(GeolocationAccuracy.Lowest)); + // // Debug.WriteLine($"I tracked you down to {location.Latitude}, {location.Longitude}! You can't hide!"); + // }; + + var button2 = new Button() + { + TextColor = Colors.Green, + Text = "Hello I'm a button", + BackgroundColor = Colors.Purple, + Margin = new Thickness(12) + }; + + horizontalStack.Add(button); + horizontalStack.Add(button2); + + horizontalStack.Add(new Label + { + Text = "And these buttons are in a HorizontalStackLayout", + VerticalOptions = LayoutOptions.Center + }); + + verticalStack.Add(horizontalStack); + + verticalStack.Add(new Button { Text = "CharacterSpacing" }); + + verticalStack.Add(new Button + { + CharacterSpacing = 8, + Text = "CharacterSpacing" + }); + + var checkbox = new CheckBox(); + + checkbox.CheckedChanged += (sender, e) => + { + Debug.WriteLine($"Checked Changed to '{e.Value}'"); + }; + + verticalStack.Add(checkbox); + verticalStack.Add(new CheckBox { BackgroundColor = Colors.LightPink }); + + verticalStack.Add(new CheckBox + { + IsChecked = true, + Color = Colors.Aquamarine + }); + + verticalStack.Add(new Editor()); + verticalStack.Add(new Editor { Text = "Editor" }); + + verticalStack.Add(new Editor + { + Text = "Lorem ipsum dolor sit amet", + MaxLength = 10 + }); + + verticalStack.Add(new Editor + { + Text = "Predictive Text Off", + IsTextPredictionEnabled = false + }); + + verticalStack.Add(new Editor + { + Text = "Lorem ipsum dolor sit amet", + FontSize = 10, + FontFamily = "dokdo_regular" + }); + + verticalStack.Add(new Editor + { + Text = "ReadOnly Editor", + IsReadOnly = true + }); + + var entry = new Entry(); + + entry.TextChanged += (sender, e) => + { + Debug.WriteLine($"Text Changed from '{e.OldTextValue}' to '{e.NewTextValue}'"); + }; + + verticalStack.Add(entry); + + verticalStack.Add(new Entry + { + Text = "Entry", + TextColor = Colors.DarkRed, + FontFamily = "Dokdo", + MaxLength = -1 + }); + + verticalStack.Add(new Entry + { + IsPassword = true, + TextColor = Colors.Black, + Placeholder = "Pasword Entry" + }); + + verticalStack.Add(new Entry { IsTextPredictionEnabled = false }); + verticalStack.Add(new Entry { Placeholder = "This should be placeholder text" }); + + verticalStack.Add(new Entry + { + Text = "This should be read only property", + IsReadOnly = true + }); + + verticalStack.Add(new Entry + { + MaxLength = 5, + Placeholder = "MaxLength text" + }); + + verticalStack.Add(new Entry + { + Text = "This should be text with character spacing", + CharacterSpacing = 10 + }); + + verticalStack.Add(new Entry + { + Keyboard = Keyboard.Numeric, + Placeholder = "Numeric Entry" + }); + + verticalStack.Add(new Entry + { + Keyboard = Keyboard.Email, + Placeholder = "Email Entry" + }); + + verticalStack.Add(new ProgressBar { Progress = 0.5 }); + + verticalStack.Add(new ProgressBar + { + Progress = 0.5, + BackgroundColor = Colors.LightCoral + }); + + verticalStack.Add(new ProgressBar + { + Progress = 0.5, + ProgressColor = Colors.Purple + }); + + var searchBar = new SearchBar(); + searchBar.CharacterSpacing = 4; + searchBar.Text = "A search query"; + verticalStack.Add(searchBar); + + var placeholderSearchBar = new SearchBar(); + placeholderSearchBar.Placeholder = "Placeholder"; + verticalStack.Add(placeholderSearchBar); + + var monkeyList = new List + { + "Baboon", + "Capuchin Monkey", + "Blue Monkey", + "Squirrel Monkey", + "Golden Lion Tamarin", + "Howler Monkey", + "Japanese Macaque" + }; + + var picker = new Picker + { + Title = "Select a monkey", + FontFamily = "Dokdo" + }; + + picker.ItemsSource = monkeyList; + verticalStack.Add(picker); + + verticalStack.Add(new Slider()); + + verticalStack.Add(new Stepper()); + verticalStack.Add(new Stepper { BackgroundColor = Colors.IndianRed }); + + verticalStack.Add(new Stepper + { + Minimum = 0, + Maximum = 10, + Value = 5 + }); + + verticalStack.Add(new Switch()); + verticalStack.Add(new Switch() { OnColor = Colors.Green }); + verticalStack.Add(new Switch() { ThumbColor = Colors.Yellow }); + + verticalStack.Add(new Switch() + { + OnColor = Colors.Green, + ThumbColor = Colors.Yellow + }); + + verticalStack.Add(new DatePicker()); + verticalStack.Add(new DatePicker { CharacterSpacing = 6 }); + verticalStack.Add(new DatePicker { FontSize = 24 }); + + verticalStack.Add(new TimePicker()); + + verticalStack.Add(new TimePicker + { + Time = TimeSpan.FromHours(8), + CharacterSpacing = 6 + }); + + verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); + + Content = new ScrollView { Content = verticalStack }; + } + + void SetupCompatibilityLayout() + { + var verticalStack = new StackLayout() + { + Spacing = 5, + BackgroundColor = Colors.AntiqueWhite + }; + + var horizontalStack = new StackLayout() + { + Orientation = StackOrientation.Horizontal, + Spacing = 2, + BackgroundColor = Colors.CornflowerBlue + }; + + var label = new Label + { + Text = "This will disappear in ~5 seconds", + BackgroundColor = Colors.Fuchsia + }; + + label.Margin = new Thickness(15, 10, 20, 15); + + verticalStack.Add(label); + + var button = new Button() + { + Text = _viewModel.Text, + WidthRequest = 200 + }; + + var button2 = new Button() + { + TextColor = Colors.Green, + Text = "Hello I'm a button", + BackgroundColor = Colors.Purple, + Margin = new Thickness(12) + }; + + horizontalStack.Add(button); + horizontalStack.Add(button2); + horizontalStack.Add(new Label { Text = "And these buttons are in a HorizontalStackLayout" }); + + verticalStack.Add(horizontalStack); + verticalStack.Add(new Slider()); + verticalStack.Add(new Switch()); + verticalStack.Add(new Switch() { OnColor = Colors.Green }); + verticalStack.Add(new Switch() { ThumbColor = Colors.Yellow }); + + verticalStack.Add(new Switch() + { + OnColor = Colors.Green, + ThumbColor = Colors.Yellow + }); + + verticalStack.Add(new DatePicker()); + verticalStack.Add(new TimePicker()); + + verticalStack.Add(new Image() + { + Source = + new UriImageSource() { Uri = new System.Uri("dotnet_bot.png") } + }); + + Content = verticalStack; + } + + public IView View { get => (IView)Content; set => Content = (View)value; } + + IView CreateSampleGrid() + { + var layout = new Microsoft.Maui.Controls.Layout2.GridLayout() + { + ColumnSpacing = 5, + RowSpacing = 8 + }; + + layout.AddRowDefinition(new RowDefinition() { Height = new GridLength(40) }); + layout.AddRowDefinition(new RowDefinition() { Height = GridLength.Auto }); + + layout.AddColumnDefinition(new ColumnDefinition() { Width = new GridLength(100) }); + layout.AddColumnDefinition(new ColumnDefinition() { Width = new GridLength(100) }); + + var topLeft = new Label + { + Text = "Top Left", + BackgroundColor = Colors.LightBlue + }; + + layout.Add(topLeft); + + var bottomLeft = new Label + { + Text = "Bottom Left", + BackgroundColor = Colors.Lavender + }; + + layout.Add(bottomLeft); + layout.SetRow(bottomLeft, 1); + + var topRight = new Label + { + Text = "Top Right", + BackgroundColor = Colors.Orange + }; + + layout.Add(topRight); + layout.SetColumn(topRight, 1); + + var bottomRight = new Label + { + Text = "Bottom Right", + BackgroundColor = Colors.MediumPurple + }; + + layout.Add(bottomRight); + layout.SetRow(bottomRight, 1); + layout.SetColumn(bottomRight, 1); + + layout.BackgroundColor = Colors.Chartreuse; + + return layout; + } + + } + +} \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ITextService.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ITextService.cs new file mode 100644 index 000000000000..8fed504e65cf --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ITextService.cs @@ -0,0 +1,7 @@ +namespace Maui.SimpleSampleApp +{ + public interface ITextService + { + string GetText(); + } +} diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/MainPageViewModel.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/MainPageViewModel.cs new file mode 100644 index 000000000000..7d98eacf3233 --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/MainPageViewModel.cs @@ -0,0 +1,28 @@ +using System.Diagnostics; +using Microsoft.Extensions.Configuration; + +namespace Maui.SimpleSampleApp +{ + public class MainPageViewModel : ViewModelBase + { + readonly IConfiguration _configuration; + readonly ITextService _textService; + string _text; + + public MainPageViewModel(IConfiguration configuration, ITextService textService) + { + _configuration = configuration; + _textService = textService; + + Debug.WriteLine($"Value from config: {_configuration["MyKey"]}"); + + Text = _textService.GetText(); + } + + public string Text + { + get => _text; + set => SetProperty(ref _text, value); + } + } +} \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleGtkApplication.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleGtkApplication.cs new file mode 100644 index 000000000000..59968dc2753f --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleGtkApplication.cs @@ -0,0 +1,42 @@ +using Gtk; +using Microsoft.Maui; +using Microsoft.Maui.Graphics; + +namespace Maui.SimpleSampleApp +{ + + public class SimpleSampleGtkApplication : MauiGtkApplication + { + + public SimpleSampleGtkApplication() : base() + { + // TopContainerOverride = OnTopContainerOverride; + } + + Widget OnTopContainerOverride(Widget nativePage) + { + var b = new Box(Orientation.Vertical, 0) + { + Fill = true, + Expand = true, + Margin = 5, + + }; + + var txt = $"{typeof(Startup).Namespace} {nameof(TopContainerOverride)}"; + var t = new Label(txt); + t.SetBackgroundColor(Colors.White); + t.SetForegroundColor(Colors.Coral); + var but = new Button() { Label = "Gtk Test" }; + + b.PackStart(t, false, false, 0); + b.PackStart(but, false, false, 0); + + b.PackStart(nativePage, true, true, 0); + + return b; + } + + } + +} \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleMauiApp.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleMauiApp.cs new file mode 100644 index 000000000000..f16b84641545 --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleMauiApp.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Maui; + +namespace Maui.SimpleSampleApp +{ + + public class SimpleSampleMauiApp : IApplication + { + + public SimpleSampleMauiApp(IServiceProvider services, ITextService textService) + { + Services = services; + + Debug.WriteLine($"The injected text service had a message: '{textService.GetText()}'"); + } + + readonly List _windows = new(); + + public IReadOnlyList Windows => _windows.AsReadOnly(); + + public IServiceProvider Services { get; } + + public IWindow CreateWindow(IActivationState activationState) + { + Microsoft.Maui.Controls.Compatibility.Forms.Init(activationState); + + var window = Services.GetRequiredService(); + + _windows.Add(window); + + return window; + } + + } + +} \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/Startup.cs new file mode 100644 index 000000000000..ff6ae3459515 --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/Startup.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Gdk; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Maui; +using Microsoft.Maui.Controls.Compatibility; +using Microsoft.Maui.Hosting; +using Microsoft.Maui.LifecycleEvents; +using Window = Microsoft.Maui.Controls.Window; + +namespace Maui.SimpleSampleApp +{ + public class Startup : IStartup + { + public readonly static bool UseSemanticsPage = false; + public readonly static bool UseXamlPage = false; + public readonly static bool UseXamlApp = true; + + public void Configure(IAppHostBuilder appBuilder) + { + // if (UseXamlApp) + // { + // // Use all the Forms features + // appBuilder = appBuilder + // .UseFormsCompatibility() + // .UseMauiApp(); + // } + // else + { + // Use just the Forms renderers + appBuilder = appBuilder + .UseCompatibilityRenderers() + .UseMauiApp(); + } + + appBuilder + .ConfigureAppConfiguration(config => + { + config.AddInMemoryCollection(new Dictionary + { + {"MyKey", "Dictionary MyKey Value"}, + {":Title", "Dictionary_Title"}, + {"Position:Name", "Dictionary_Name" }, + {"Logging:LogLevel:Default", "Warning"} + }); + }) + .UseMauiServiceProviderFactory(true) + //.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory()) + .ConfigureServices(services => + { + services.AddSingleton(); + services.AddTransient(); + + // if (UseXamlPage) + // services.AddTransient(); + // else if (UseSemanticsPage) + // services.AddTransient(); + // else + services.AddTransient(); + + services.AddTransient(); + }) + .ConfigureFonts(fonts => + { + fonts.AddFont("Dokdo-Regular.ttf", "Dokdo"); + }) + // .ConfigureEssentials(essentials => + // { + // essentials + // .UseVersionTracking() + // .UseMapServiceToken("YOUR-KEY-HERE") + // .AddAppAction("test_action", "Test App Action") + // .AddAppAction("second_action", "Second App Action") + // .OnAppAction(appAction => + // { + // Debug.WriteLine($"You seem to have arrived from a special place: {appAction.Title} ({appAction.Id})"); + // }); + // }) + .ConfigureLifecycleEvents(events => + { + events.AddEvent>("CustomEventName", value => LogEvent("CustomEventName")); + + // Log everything in this one + events.AddWindows(windows => windows + .OnActivated((a, b) => LogEvent(nameof(LinuxLifecycle.OnApplicationActivated))) + .OnClosed((a, b) => LogEvent(nameof(LinuxLifecycle.OnHidden))) + .OnLaunched((a, b) => LogEvent(nameof(LinuxLifecycle.OnLaunched))) + .OnVisibilityChanged((a, b) => + { + LogEvent(nameof(LinuxLifecycle.OnVisibilityChanged)); + + if (b.Event.State == VisibilityState.Unobscured) + { + if (a.AllocatedWidth < 2) + a.WidthRequest = 200; + } + } + )); + + static bool LogEvent(string eventName, string type = null) + { + Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? "" : $" ({type})")}"); + return true; + } + }); + } + + // To use the Microsoft.Extensions.DependencyInjection ServiceCollection and not the MAUI one + class DIExtensionsServiceProviderFactory : IServiceProviderFactory + { + public ServiceCollection CreateBuilder(IServiceCollection services) + => new ServiceCollection { services }; + + public IServiceProvider CreateServiceProvider(ServiceCollection containerBuilder) + => containerBuilder.BuildServiceProvider(); + } + } +} diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/TextService.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/TextService.cs new file mode 100644 index 000000000000..1782eb4882cc --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/TextService.cs @@ -0,0 +1,7 @@ +namespace Maui.SimpleSampleApp +{ + public class TextService : ITextService + { + public string GetText() => "Hello From Forms"; + } +} diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ViewModelBase.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ViewModelBase.cs new file mode 100644 index 000000000000..1dea68650d0c --- /dev/null +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ViewModelBase.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace Maui.SimpleSampleApp +{ + public abstract class ViewModelBase : INotifyPropertyChanged + { + protected bool SetProperty(ref T backingStore, T value, + [CallerMemberName] string propertyName = "", + Action onChanged = null) + { + if (EqualityComparer.Default.Equals(backingStore, value)) + return false; + + backingStore = value; + onChanged?.Invoke(); + OnPropertyChanged(propertyName); + return true; + } + + #region INotifyPropertyChanged + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string propertyName = "") + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + #endregion + + } +} From 2c80fc10adaa84ef2ba9d97f7a11477a98fe9423 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:57:05 +0200 Subject: [PATCH 026/425] Controls.Sample.csproj: add Compatibility.Gtk.csproj --- src/Controls/samples/Controls.Sample/Controls.Sample.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Controls/samples/Controls.Sample/Controls.Sample.csproj b/src/Controls/samples/Controls.Sample/Controls.Sample.csproj index 9b4096475953..5617aca3ea57 100644 --- a/src/Controls/samples/Controls.Sample/Controls.Sample.csproj +++ b/src/Controls/samples/Controls.Sample/Controls.Sample.csproj @@ -39,4 +39,7 @@ + + + From 162a7360b2c0b766cc0f5f74db91e750cdd61fdf Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 21 May 2021 04:57:28 +0200 Subject: [PATCH 027/425] Microsoft.Maui.sln: add Compatibility.Gtk --- Microsoft.Maui.sln | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index 5a8b6eac0aef..e51a4efafd19 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -136,6 +136,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Compatibility.ControlGaller EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Linux", "src\Controls\samples\Controls.Sample.Linux\Controls.Sample.Linux.csproj", "{A7B49F6D-913A-4286-8E8B-76D5E5250891}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compatibility.Gtk", "src\Compatibility\Core\src\Gtk\Compatibility.Gtk.csproj", "{5841B0DF-D8D8-4640-96F8-B737670E0BF5}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Compatibility\ControlGallery\src\Issues.Shared\Compatibility.ControlGallery.Issues.Shared.projitems*{ae2513cb-4e5e-4e5c-8237-88954d4c9433}*SharedItemsImports = 13 @@ -1181,6 +1183,34 @@ Global {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x64.Build.0 = Release|Any CPU {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x86.ActiveCfg = Release|Any CPU {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x86.Build.0 = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM.ActiveCfg = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM.Build.0 = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM64.Build.0 = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhone.Build.0 = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x64.ActiveCfg = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x64.Build.0 = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x86.ActiveCfg = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x86.Build.0 = Debug|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|Any CPU.Build.0 = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM.ActiveCfg = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM.Build.0 = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM64.ActiveCfg = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM64.Build.0 = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhone.ActiveCfg = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhone.Build.0 = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x64.ActiveCfg = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x64.Build.0 = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x86.ActiveCfg = Release|Any CPU + {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1235,6 +1265,7 @@ Global {AE2513CB-4E5E-4E5C-8237-88954D4C9433} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} {B5F94CCB-5868-43BD-89B5-B66C97C3A741} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} {A7B49F6D-913A-4286-8E8B-76D5E5250891} = {806499EB-C2CC-4E85-BC19-613F3DE5E0C3} + {5841B0DF-D8D8-4640-96F8-B737670E0BF5} = {29AC50BF-B4FB-450B-9386-0C5AD4B84226} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {650AE971-2F29-46A8-822C-FB4FCDC6A9A0} From 9b102c328cc8d9babe2653a6398bf5c57f9bddba Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 21:20:22 +0200 Subject: [PATCH 028/425] rebase onto https://github.com/dotnet/maui/tree/d5764460e13a7794d949ec8d66ad9b8c24b8703a & sub changes --- .../CheckBox/CheckBoxHandler.Linux.cs | 3 +++ .../Handlers/Editor/EditorHandler.Linux.cs | 2 ++ .../GraphicsView/GraphicsViewHandler.Linux.cs | 11 ++++++++ .../Handlers/Picker/PickerHandler.Linux.cs | 4 +++ .../src/Handlers/View/ViewHandler.Linux.cs | 25 +++++++++++++++++++ src/Core/src/Platform/Linux/ViewExtensions.cs | 2 ++ 6 files changed, 47 insertions(+) create mode 100644 src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs create mode 100644 src/Core/src/Handlers/View/ViewHandler.Linux.cs diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs index 44ce4a32264e..3b7a8c5779fb 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs @@ -31,6 +31,9 @@ protected void OnToggledEvent(object? sender, EventArgs e) } + [MissingMapper] + public static void MapForeground(CheckBoxHandler handler, ICheckBox check) { } + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs index a0864b21a99d..d09bdb86c555 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs @@ -85,6 +85,8 @@ public static void MapMaxLength(EditorHandler handler, IEditor editor) { } [MissingMapper] public static void MapIsTextPredictionEnabled(EditorHandler handler, IEditor editor) { } + [MissingMapper] + public static void MapKeyboard(EditorHandler handler, IEditor editor) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs new file mode 100644 index 000000000000..458280d2b6d4 --- /dev/null +++ b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs @@ -0,0 +1,11 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class GraphicsViewHandler : ViewHandler + { + protected override Gtk.Widget CreateNativeView() => throw new NotImplementedException(); + + public static void MapDrawable(IViewHandler handler, IGraphicsView graphicsView) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs b/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs index 7376ca09a26d..113964316564 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs @@ -108,6 +108,10 @@ public static void MapTextColor(PickerHandler handler, IPicker view) { } [MissingMapper] public static void MapHorizontalTextAlignment(PickerHandler handler, IPicker view) { } + + [MissingMapper] + public static void MapTitleColor(PickerHandler handler, IPicker view) { } + } diff --git a/src/Core/src/Handlers/View/ViewHandler.Linux.cs b/src/Core/src/Handlers/View/ViewHandler.Linux.cs new file mode 100644 index 000000000000..ea0efbf85b42 --- /dev/null +++ b/src/Core/src/Handlers/View/ViewHandler.Linux.cs @@ -0,0 +1,25 @@ +namespace Microsoft.Maui.Handlers +{ + public partial class ViewHandler + { + public static void MapTranslationX(ViewHandler handler, IView view) { } + + public static void MapTranslationY(ViewHandler handler, IView view) { } + + public static void MapScale(ViewHandler handler, IView view) { } + + public static void MapScaleX(ViewHandler handler, IView view) { } + + public static void MapScaleY(ViewHandler handler, IView view) { } + + public static void MapRotation(ViewHandler handler, IView view) { } + + public static void MapRotationX(ViewHandler handler, IView view) { } + + public static void MapRotationY(ViewHandler handler, IView view) { } + + public static void MapAnchorX(ViewHandler handler, IView view) { } + + public static void MapAnchorY(ViewHandler handler, IView view) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ViewExtensions.cs b/src/Core/src/Platform/Linux/ViewExtensions.cs index 4e7743420752..67de054a6f78 100644 --- a/src/Core/src/Platform/Linux/ViewExtensions.cs +++ b/src/Core/src/Platform/Linux/ViewExtensions.cs @@ -38,6 +38,8 @@ public static void UpdateSemantics(this Widget nativeView, IView view) { } + + public static void UpdateOpacity(this Widget nativeView, IView view) { } } From 7a4da5de57a47116e162a36471aedb9a9f3f5b9e Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 21:37:29 +0200 Subject: [PATCH 029/425] Compatibility.csproj: merge Compatibility Gtk --- src/Compatibility/Core/src/Compatibility.csproj | 12 ++++++++++-- src/Compatibility/Core/src/Forms.cs | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Compatibility/Core/src/Compatibility.csproj b/src/Compatibility/Core/src/Compatibility.csproj index 01c6dd819f6d..2984cef87828 100644 --- a/src/Compatibility/Core/src/Compatibility.csproj +++ b/src/Compatibility/Core/src/Compatibility.csproj @@ -8,6 +8,10 @@ Android\ iOS\ WinUI\ + Gtk\ + + + $(DefineConstants);LINUX;GTK Microsoft.Maui.Controls.Compatibility @@ -56,9 +60,13 @@ - - + + + + + + diff --git a/src/Compatibility/Core/src/Forms.cs b/src/Compatibility/Core/src/Forms.cs index e3f0f9c8b3ef..ee560eafb5d4 100644 --- a/src/Compatibility/Core/src/Forms.cs +++ b/src/Compatibility/Core/src/Forms.cs @@ -1,4 +1,4 @@ -#if !(__ANDROID__ || __IOS__ || WINDOWS) +#if !(__ANDROID__ || __IOS__ || WINDOWS || GTK) using System; using System.Collections.Generic; using System.Text; From cf2d2594fd65acef44467dd566fe2001092169d1 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 21:57:27 +0200 Subject: [PATCH 030/425] Core.csproj Gtk : adjust LabelHandler.Linux.cs GetDesiredSize --- .../src/Handlers/Label/LabelHandler.Linux.cs | 57 ++++++++++++++----- .../src/Platform/Linux/LabelExtensions.cs | 33 ++++++++--- .../Linux/TextExtensions.cs | 40 +++++++++++++ 3 files changed, 109 insertions(+), 21 deletions(-) create mode 100644 src/Core/src/[Microsoft.Maui.Graphics]/Linux/TextExtensions.cs diff --git a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs index 6f564cc1732d..ae6a3ac92991 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Linux.cs @@ -36,17 +36,16 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra if (VirtualView is not { } virtualView) return default; - var (baseWidth, baseHeight) = base.GetDesiredSize(widthConstraint, heightConstraint); int width = -1; - int height = 1; + int height = -1; var widthConstrained = !double.IsPositiveInfinity(widthConstraint); var heightConstrained = !double.IsPositiveInfinity(heightConstraint); + var hMargin = nativeView.MarginStart + nativeView.MarginEnd; + var vMargin = nativeView.MarginTop + nativeView.MarginBottom; + // try use layout from Label: not working - // var SharedTextLayout = new Microsoft.Maui.Graphics.Native.Gtk.TextLayout(NativeGraphicsService.Instance.SharedContext); - // SharedTextLayout.SetLayout(nativeView.Layout); - // ... lock (SharedTextLayout) { @@ -57,18 +56,36 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); SharedTextLayout.HeightForWidth = !heightConstrained; - var constraint = SharedTextLayout.HeightForWidth ? widthConstraint : heightConstraint; - (width, height) = SharedTextLayout.GetPixelSize(NativeView.Text, double.IsInfinity(constraint) ? -1 : constraint); - } + var constraint = Math.Max(SharedTextLayout.HeightForWidth ? widthConstraint + virtualView.Margin.HorizontalThickness - hMargin : heightConstraint + virtualView.Margin.VerticalThickness - vMargin, + 1); + + var lh = 0; + var layout = SharedTextLayout.GetLayout(); + layout.Ellipsize = nativeView.Ellipsize; + layout.Spacing = nativeView.Layout.Spacing; - var inkRect = new Pango.Rectangle(); - var logicalRect = new Pango.Rectangle(); - nativeView.Layout.GetLineReadonly(0).GetExtents(ref inkRect, ref logicalRect); - var lineHeigh = logicalRect.Height.ScaledFromPango(); + if (!heightConstrained && nativeView.Lines > 0) + { + lh = (int)layout.GetLineHeigth(false) * nativeView.Lines; + layout.Height = lh; - width += nativeView.MarginStart + nativeView.MarginEnd; - height += nativeView.MarginTop + nativeView.MarginBottom; + } + else + { + layout.Height = -1; + } + + (width, height) = layout.GetPixelSize(NativeView.Text, double.IsInfinity(constraint) ? -1 : constraint, SharedTextLayout.HeightForWidth); + + if (!heightConstrained && nativeView.Lines > 0) + { + height = Math.Min((int)lh.ScaledFromPango(), height); + } + } + + width += hMargin; + height += vMargin; return new Size(width, height); @@ -123,6 +140,18 @@ public static void MapLineHeight(LabelHandler handler, ILabel label) { // there is no LineHeight for label in gtk3: // https://gitlab.gnome.org/GNOME/gtk/-/issues/2379 + + if (handler.NativeView is not { } nativeView) + return; + + if (handler.VirtualView is not { } virtualView) + return; + + if (label.LineHeight > 1) + // should be: https://developer.gnome.org/pango/1.46/pango-Layout-Objects.html#pango-layout-set-line-spacing + // see: https://github.com/GtkSharp/GtkSharp/issues/258 + nativeView.Layout.Spacing = (int)label.LineHeight.ScaledToPango(); + } } diff --git a/src/Core/src/Platform/Linux/LabelExtensions.cs b/src/Core/src/Platform/Linux/LabelExtensions.cs index dca483ac94b2..b3d137533ad9 100644 --- a/src/Core/src/Platform/Linux/LabelExtensions.cs +++ b/src/Core/src/Platform/Linux/LabelExtensions.cs @@ -17,6 +17,19 @@ public static void UpdateText(this Label nativeLabel, ILabel label) public static void UpdateMaxLines(this Label nativeLabel, ILabel label) { nativeLabel.Lines = label.MaxLines; + nativeLabel.AdjustMaxLines(); + + } + + public static void AdjustMaxLines(this Label nativeLabel) + { + if (nativeLabel.Lines > 0) + { + nativeLabel.LineWrap = true; + + if (nativeLabel.Ellipsize == EllipsizeMode.None) + nativeLabel.Ellipsize = EllipsizeMode.End; + } } public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this LineBreakMode lineBreakMode) => @@ -30,6 +43,7 @@ public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this LineBreakMode.MiddleTruncation => Graphics.Extras.LineBreakMode.MiddleTruncation, _ => throw new ArgumentOutOfRangeException() }; + public static Maui.Graphics.HorizontalAlignment GetHorizontalAlignment(this TextAlignment alignment) => alignment switch { @@ -39,14 +53,15 @@ public static Maui.Graphics.HorizontalAlignment GetHorizontalAlignment(this Text TextAlignment.End => Graphics.HorizontalAlignment.Right, _ => throw new ArgumentOutOfRangeException(nameof(alignment), alignment, null) }; + public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this Label nativeLabel) { var res = nativeLabel.Ellipsize switch { EllipsizeMode.None => Graphics.Extras.LineBreakMode.None, - EllipsizeMode.Start => Graphics.Extras.LineBreakMode.Start |Graphics.Extras.LineBreakMode.Elipsis, - EllipsizeMode.Middle => Graphics.Extras.LineBreakMode.Center |Graphics.Extras.LineBreakMode.Elipsis, - EllipsizeMode.End => Graphics.Extras.LineBreakMode.End |Graphics.Extras.LineBreakMode.Elipsis, + EllipsizeMode.Start => Graphics.Extras.LineBreakMode.Start | Graphics.Extras.LineBreakMode.Elipsis, + EllipsizeMode.Middle => Graphics.Extras.LineBreakMode.Center | Graphics.Extras.LineBreakMode.Elipsis, + EllipsizeMode.End => Graphics.Extras.LineBreakMode.End | Graphics.Extras.LineBreakMode.Elipsis, _ => throw new ArgumentOutOfRangeException() }; @@ -71,38 +86,41 @@ public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) switch (label.LineBreakMode) { case LineBreakMode.NoWrap: - nativeLabel.LineWrap = false; + nativeLabel.LineWrap = label.MaxLines > 0; nativeLabel.Ellipsize = Pango.EllipsizeMode.None; break; case LineBreakMode.WordWrap: nativeLabel.LineWrap = true; + nativeLabel.Wrap = true; + nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.None; break; case LineBreakMode.CharacterWrap: nativeLabel.LineWrap = true; + nativeLabel.Wrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Char; nativeLabel.Ellipsize = Pango.EllipsizeMode.None; break; case LineBreakMode.HeadTruncation: - nativeLabel.LineWrap = false; + nativeLabel.LineWrap = true; nativeLabel.Wrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.Start; break; case LineBreakMode.TailTruncation: - nativeLabel.LineWrap = false; + nativeLabel.LineWrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Wrap = true; nativeLabel.Ellipsize = Pango.EllipsizeMode.End; break; case LineBreakMode.MiddleTruncation: - nativeLabel.LineWrap = false; + nativeLabel.LineWrap = true; nativeLabel.Wrap = true; nativeLabel.LineWrapMode = Pango.WrapMode.Word; nativeLabel.Ellipsize = Pango.EllipsizeMode.Middle; @@ -111,6 +129,7 @@ public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) default: throw new ArgumentOutOfRangeException(); } + nativeLabel.AdjustMaxLines(); } public static void UpdateTextAlignment(this Label nativeLabel, ILabel label) diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/TextExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/TextExtensions.cs new file mode 100644 index 000000000000..0e37878d8427 --- /dev/null +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Linux/TextExtensions.cs @@ -0,0 +1,40 @@ +namespace Microsoft.Maui.Graphics.Native.Gtk +{ + + public static class TextExtensions + { + + public static double GetLineHeigth(this Pango.Layout layout, bool scaled = true) + { + var inkRect = new Pango.Rectangle(); + var logicalRect = new Pango.Rectangle(); + layout.GetLineReadonly(0).GetExtents(ref inkRect, ref logicalRect); + var lineHeigh = scaled ? logicalRect.Height.ScaledFromPango() : logicalRect.Height; + + return lineHeigh; + } + + public static (int width, int height) GetPixelSize(this Pango.Layout layout, string text, double desiredSize = -1d, bool heightForWidth = true) + { + + if (desiredSize > 0) + { + if (heightForWidth) + { + layout.Width = desiredSize.ScaledToPango(); + } + else + { + layout.Height = desiredSize.ScaledToPango(); + } + } + + layout.SetText(text); + layout.GetPixelSize(out var textWidth, out var textHeight); + + return (textWidth, textHeight); + } + + } + +} \ No newline at end of file From 74ccf682455ca129f0de91c7be1c0e26d9b3282e Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 21:59:27 +0200 Subject: [PATCH 031/425] Core.csproj Gtk : adjust LayoutView.cs --- .../Handlers/Layout/LayoutHandler.Linux.cs | 8 +- src/Core/src/Platform/Linux/LayoutView.cs | 134 +++++++----------- 2 files changed, 55 insertions(+), 87 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs index 49d68053e9d8..628637f0361a 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs @@ -34,6 +34,7 @@ public override void SetVirtualView(IView view) NativeView.CrossPlatformVirtualView = () => VirtualView; NativeView.ClearChildren(); + foreach (var child in VirtualView.Children) { if (child.ToNative(MauiContext) is { } nativeChild) @@ -69,13 +70,6 @@ public void Remove(IView child) NativeView.QueueAllocate(); } - public override void NativeArrange(Rectangle rect) - { - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); - - NativeView.NativeArrange(rect); - } - } } \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/LayoutView.cs b/src/Core/src/Platform/Linux/LayoutView.cs index 4bfa35154d0d..749c03c20675 100644 --- a/src/Core/src/Platform/Linux/LayoutView.cs +++ b/src/Core/src/Platform/Linux/LayoutView.cs @@ -49,15 +49,7 @@ protected override bool OnDrawn(Cairo.Context cr) public ILayout? VirtualView => CrossPlatformVirtualView?.Invoke(); public bool IsReallocating; - Dictionary _children = new(); - - struct ChildAllocation - { - - public Rectangle Rect; - public Widget Widget; - - } + Dictionary _children = new(); public LayoutView() { @@ -66,21 +58,14 @@ public LayoutView() public void ReplaceChild(Widget oldWidget, Widget newWidget) { - var view = _children.FirstOrDefault(kvp => kvp.Value.Widget == oldWidget).Key; - ChildAllocation r = default; - - if (view != null) - { - r = _children[view]; - } + var view = _children.FirstOrDefault(kvp => kvp.Value == oldWidget).Key; Remove(oldWidget); Add(newWidget); if (view != null) { - r.Widget = newWidget; - _children[view] = r; + _children[view] = newWidget; } } @@ -95,37 +80,19 @@ Orientation GetOrientation() => var focusChain = _children // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) - .Select(kvp => kvp.Value.Widget) + .Values .ToArray(); FocusChain = focusChain; } - public bool SetAllocation(IView w, Rectangle rect) - { - if (VirtualView == null) - { - return false; - } - - _children.TryGetValue(w, out ChildAllocation r); - - if (r.Rect == rect) return false; - - r.Rect = rect; - _children[w] = r; - UpdateFocusChain(); - - return true; - - } - public void ClearChildren() { foreach (var c in Children) { Remove(c); } + _children.Clear(); } @@ -134,11 +101,7 @@ public void Add(IView view, Widget gw) if (_children.ContainsKey(view)) return; - _children.Add(view, new ChildAllocation - { - Widget = gw, - Rect = new Rectangle(0, 0, 0, 0) - }); + _children[view] = gw; Add(gw); } @@ -151,7 +114,7 @@ protected override void OnAdded(Widget widget) protected override void OnRemoved(Widget widget) { - var view = _children.FirstOrDefault(kvp => kvp.Value.Widget == widget).Key; + var view = _children.FirstOrDefault(kvp => kvp.Value == widget).Key; if (view != null) _children.Remove(view); @@ -172,39 +135,67 @@ protected void OnReallocate(Gdk.Rectangle allocation = default) allocation = new Gdk.Rectangle(0, 0, Allocation.Width, Allocation.Height); } - if (allocation.Size != Allocation.Size) + var size = GetSizeRequest(allocation.Width, allocation.Height, SizeRequestMode.ConstantSize); + + if (size.Request.Width != allocation.Width || size.Request.Height != allocation.Height) { - VirtualView.Arrange(allocation.ToRectangle()); + ; } } + protected void AllocateChildren(Gdk.Rectangle allocation) + { + var virtualView = VirtualView; + + if (virtualView == null) + { + return; + } + + virtualView.Arrange(allocation.ToRectangle()); + + foreach (var cr in _children.ToArray()) + { + var w = cr.Value; + var v = cr.Key; + var r = v.Frame; + + if (r.IsEmpty) + continue; + + w.SizeAllocate(new Gdk.Rectangle(allocation.X + (int)r.X, allocation.Y + (int)r.Y, (int)r.Width, (int)r.Height)); + } + } + protected override void OnSizeAllocated(Gdk.Rectangle allocation) { base.OnSizeAllocated(allocation); + var virtualView = VirtualView; + + if (virtualView == null) + { + return; + } try { IsReallocating = true; OnReallocate(allocation); + AllocateChildren(allocation); } finally { IsReallocating = false; } - foreach (var cr in _children.ToArray()) - { - var r = cr.Value.Rect; - cr.Value.Widget.SizeAllocate(new Gdk.Rectangle(allocation.X + (int)r.X, allocation.Y + (int)r.Y, (int)r.Width, (int)r.Height)); - } } protected override void ForAll(bool includeInternals, Callback callback) { base.ForAll(includeInternals, callback); - foreach (var c in _children.Values.Select(v => v.Widget).ToArray()) + foreach (var c in _children.Values.ToArray()) callback(c); } @@ -233,20 +224,6 @@ protected override void OnRealized() base.OnRealized(); } - protected override SizeRequestMode OnGetRequestMode() - { - // dirty fix: unwrapped labels report fixed sizes, forcing parents to fixed mode - // -> report always width_for_height, since we don't support angles - return SizeRequestMode.WidthForHeight; - // return base.OnGetRequestMode(); - } - - protected override void OnAdjustSizeAllocation(Orientation orientation, out int minimumSize, out int naturalSize, out int allocatedPos, out int allocatedSize) - { - base.OnAdjustSizeAllocation(orientation, out minimumSize, out naturalSize, out allocatedPos, out allocatedSize); - - } - public SizeRequest GetSizeRequest(double widthConstraint, double heightConstraint, SizeRequestMode mode) { var widthHandled = AllocatedWidth > 1; // && virtualView.DesiredSize.Width > 0; @@ -254,11 +231,6 @@ public SizeRequest GetSizeRequest(double widthConstraint, double heightConstrain var widthConstrained = !double.IsPositiveInfinity(widthConstraint); var heightConstrained = !double.IsPositiveInfinity(heightConstraint); - if (!widthHandled || !heightHandled) - { - return new Size(widthConstraint, heightConstraint); - } - var virtualView = VirtualView; if (virtualView == null) @@ -269,16 +241,14 @@ public SizeRequest GetSizeRequest(double widthConstraint, double heightConstrain var withFactor = widthHandled && widthConstrained && widthConstraint > 1 ? widthConstraint / AllocatedWidth : 1; var heigthFactor = heightHandled && heightConstrained && heightConstraint > 1 ? heightConstraint / AllocatedHeight : 1; - var size1 = virtualView.Measure(widthConstraint, heightConstraint); - - var size2 = virtualView.Arrange(new(Point.Zero, size1)); - - foreach (var child in virtualView.Children) + if ((virtualView.Frame.Size.Width == widthConstraint || !widthConstrained) && (virtualView.Frame.Size.Height == heightConstraint || !heightConstrained)) { - SetAllocation(child, child.Frame); + return new Size(widthConstraint, heightConstraint); } - return new SizeRequest(size1, size2); + var size1 = virtualView.Measure(widthConstraint, heightConstraint); + + return new SizeRequest(size1, size1); } int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; @@ -286,7 +256,9 @@ public SizeRequest GetSizeRequest(double widthConstraint, double heightConstrain protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) { base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); - var sizeRequest = GetSizeRequest(double.PositiveInfinity, height, SizeRequestMode.WidthForHeight); + var constraint = IsReallocating && Allocation.Width > 1 ? Allocation.Width : double.PositiveInfinity; + var c1 = WidthRequest > 0 ? WidthRequest : 0; + var sizeRequest = GetSizeRequest(c1, height, SizeRequestMode.WidthForHeight); minimumWidth = Math.Max(WidthRequest, ToSize(sizeRequest.Minimum.Width)); naturalWidth = Math.Max(WidthRequest, ToSize(sizeRequest.Request.Width)); @@ -295,7 +267,9 @@ protected override void OnGetPreferredWidthForHeight(int height, out int minimum protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) { base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); - var sizeRequest = GetSizeRequest(width, double.PositiveInfinity, SizeRequestMode.HeightForWidth); + var constraint = IsReallocating && Allocation.Height > 1 ? Allocation.Height : double.PositiveInfinity; + var c1 = HeightRequest > 0 ? HeightRequest : 0; + var sizeRequest = GetSizeRequest(width, constraint, SizeRequestMode.HeightForWidth); minimumHeight = Math.Max(HeightRequest, ToSize(sizeRequest.Minimum.Height)); naturalHeight = Math.Max(HeightRequest, ToSize(sizeRequest.Request.Height)); From d112addbbae24f3bb15f5c862a6d8195e31a8243 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 22:00:00 +0200 Subject: [PATCH 032/425] Core.csproj Gtk : MauiSearchBar.cs use internal Entry --- src/Core/src/Platform/Linux/MauiSearchBar.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Linux/MauiSearchBar.cs b/src/Core/src/Platform/Linux/MauiSearchBar.cs index dcdf8a1eb59d..793721c13eff 100644 --- a/src/Core/src/Platform/Linux/MauiSearchBar.cs +++ b/src/Core/src/Platform/Linux/MauiSearchBar.cs @@ -10,7 +10,8 @@ public class MauiSearchBar : Gtk.SearchBar public MauiSearchBar() : base() { Entry = new Entry(string.Empty); - ConnectEntry(Entry); + Child = Entry; + SearchModeEnabled = true; } public Gtk.Entry Entry { get; } From f1780051764de55ff02d92fc3264367ea4e747a2 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 22:01:02 +0200 Subject: [PATCH 033/425] Core.csproj Gtk : ProgressBarHandler.Linux.cs: Progress is Fraction, not PulseStep --- .../src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs | 1 + src/Core/src/Platform/Linux/ProgressBarExtensions.cs | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs index 1e10fa7182b7..8d6f11382336 100644 --- a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs +++ b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs @@ -2,6 +2,7 @@ namespace Microsoft.Maui.Handlers { + // https://developer.gnome.org/gtk3/stable/GtkProgressBar.html public partial class ProgressBarHandler : ViewHandler { protected override ProgressBar CreateNativeView() diff --git a/src/Core/src/Platform/Linux/ProgressBarExtensions.cs b/src/Core/src/Platform/Linux/ProgressBarExtensions.cs index d24b594d09f8..5879b012c8a2 100644 --- a/src/Core/src/Platform/Linux/ProgressBarExtensions.cs +++ b/src/Core/src/Platform/Linux/ProgressBarExtensions.cs @@ -6,8 +6,9 @@ public static class ProgressBarExtensions { public static void UpdateProgress(this ProgressBar nativeProgressBar, IProgress progress) { - nativeProgressBar.PulseStep = progress.Progress; - nativeProgressBar.TooltipText = string.Format("{0}%", progress.Progress * 100); + // https://developer.gnome.org/gtk3/stable/GtkProgressBar.html#gtk-progress-bar-set-fraction + nativeProgressBar.Fraction = progress.Progress; + nativeProgressBar.TooltipText = $"{progress.Progress * 100}%"; } } } \ No newline at end of file From 21ae3b7b7724e63970f61ce4e7cdd78d410f3bc2 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 22:02:07 +0200 Subject: [PATCH 034/425] Core.csproj Gtk : StepperHandler.Linux.cs: SetIncrements with slider.Interval, not Slider.Value --- src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs | 4 +++- src/Core/src/Platform/Linux/StepperExtensions.cs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs b/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs index 2e865180d247..e8da92e597cc 100644 --- a/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs +++ b/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs @@ -3,13 +3,15 @@ namespace Microsoft.Maui.Handlers { + + // https://developer.gnome.org/gtk3/stable/GtkSpinButton.html public partial class StepperHandler : ViewHandler { protected override SpinButton CreateNativeView() { // var adjustment = new Adjustment(0, 0, 1, 1, 1, 1); // return new SpinButton(adjustment, 1, 1); - return new SpinButton(0, 1, .1); + return new SpinButton(0, 1, .1) { Numeric = true, ClimbRate = 0.1}; } protected override void ConnectHandler(SpinButton nativeView) diff --git a/src/Core/src/Platform/Linux/StepperExtensions.cs b/src/Core/src/Platform/Linux/StepperExtensions.cs index 5e647a93d269..a047556b7f6f 100644 --- a/src/Core/src/Platform/Linux/StepperExtensions.cs +++ b/src/Core/src/Platform/Linux/StepperExtensions.cs @@ -16,9 +16,9 @@ public static void UpdateValue(this SpinButton nativeSlider, IRange slider) { nativeSlider.Value = slider.Value; } - public static void UpdateIncrement(this SpinButton nativeSlider, IRange slider) + public static void UpdateIncrement(this SpinButton nativeSlider, IStepper slider) { - nativeSlider.SetIncrements(slider.Value,1); + nativeSlider.SetIncrements(slider.Interval,1); } } } \ No newline at end of file From 3570443ee14c40c7f69970976d53045e2a5adce5 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 22:12:34 +0200 Subject: [PATCH 035/425] Core.csproj Gtk : WidgetExtensions.cs Arrange QueueAllocate, not QueueResize --- src/Core/src/Platform/Linux/WidgetExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Linux/WidgetExtensions.cs b/src/Core/src/Platform/Linux/WidgetExtensions.cs index 8bed8cc49bfb..19c2d2d05d8b 100644 --- a/src/Core/src/Platform/Linux/WidgetExtensions.cs +++ b/src/Core/src/Platform/Linux/WidgetExtensions.cs @@ -109,7 +109,7 @@ public static void Arrange(this Widget? nativeView, Rectangle rect) if (rect != nativeView.Allocation.ToRectangle()) { nativeView.SizeAllocate(rect.ToNative()); - nativeView.QueueResize(); + nativeView.QueueAllocate(); } } From d36a1c25929c76586aef9b5e4e9d8c85d9a745fa Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 22:13:03 +0200 Subject: [PATCH 036/425] Core.csproj Gtk : ImageHandler.Linux.cs: add comment --- src/Core/src/Handlers/Image/ImageHandler.Linux.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Core/src/Handlers/Image/ImageHandler.Linux.cs b/src/Core/src/Handlers/Image/ImageHandler.Linux.cs index f7860265706f..cc7de3ea0c1c 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Linux.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Linux.cs @@ -3,6 +3,8 @@ namespace Microsoft.Maui.Handlers { + // https://developer.gnome.org/gtk3/stable/GtkImage.html + public partial class ImageHandler : ViewHandler { From ed0ff19c40f07198d42e5df0d1a4abb9d8a31eeb Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 22:14:25 +0200 Subject: [PATCH 037/425] Controls.Sample.Linux.csproj: LoremIpsum: use full text & adjust Image-Example --- .../Controls.Sample.Linux/Controls.Sample.Linux.csproj | 2 +- .../Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj index 0bc6fbe1e42d..22ae242b6449 100644 --- a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj +++ b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs index c6b8b0dd994b..2c4832a62fdb 100644 --- a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs @@ -18,8 +18,7 @@ public class ExamplePage : BasePage readonly MainPageViewModel _viewModel; const string LoremIpsum = - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " ; - const string LoremIpsum2 = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Quisque ut dolor metus. Duis vel iaculis mauris, sit amet finibus mi. " + "Etiam congue ornare risus, in facilisis libero tempor eget. " + "Phasellus mattis mollis libero ut semper. In sit amet sapien odio. " + @@ -611,8 +610,7 @@ void SetupCompatibilityLayout() verticalStack.Add(new Image() { - Source = - new UriImageSource() { Uri = new System.Uri("dotnet_bot.png") } + Source = "dotnet_bot.png" }); Content = verticalStack; From 5289eb99861bcf1527afb5ef79da2e187c13f05c Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 2 Jun 2021 22:14:44 +0200 Subject: [PATCH 038/425] Microsoft.Maui.sln: add Controls.Sample.Linux.csproj --- Microsoft.Maui.sln | 213 +++++++++++++++++++-------------------------- 1 file changed, 91 insertions(+), 122 deletions(-) diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index e51a4efafd19..e0c9c3daee9d 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -6,8 +6,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Controls", "Controls", "{9A EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Compatibility", "Compatibility", "{29AC50BF-B4FB-450B-9386-0C5AD4B84226}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Compatibility.Android", "src\Compatibility\Core\src\Android\Compatibility.Android.csproj", "{0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuspec", ".nuspec", "{7E12C50D-A570-4DF1-94E1-8599843FA87C}" ProjectSection(SolutionItems) = preProject eng\dogfood.ps1 = eng\dogfood.ps1 @@ -48,8 +46,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "src\Core\src\Core.c EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Compatibility.Android.FormsViewGroup", "src\Compatibility\Core\src\Android.FormsViewGroup\Compatibility.Android.FormsViewGroup.csproj", "{3B72465B-ACAE-43AE-9327-10F372FE5F80}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compatibility.iOS", "src\Compatibility\Core\src\iOS\Compatibility.iOS.csproj", "{271193C1-6E7C-429C-A36D-3F1BE5267231}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D5B986A3-7FC9-437E-8030-349AA4698DFD}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{75A2CD30-BB85-4CA6-AC95-86A8A538A690}" @@ -134,9 +130,11 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Compatibility.ControlGaller EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Compatibility.ControlGallery.Core", "src\Compatibility\ControlGallery\src\Core\Compatibility.ControlGallery.Core.csproj", "{B5F94CCB-5868-43BD-89B5-B66C97C3A741}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Linux", "src\Controls\samples\Controls.Sample.Linux\Controls.Sample.Linux.csproj", "{A7B49F6D-913A-4286-8E8B-76D5E5250891}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Compatibility", "src\Compatibility\Core\src\Compatibility.csproj", "{9FAA9654-80E6-4664-9702-47998A04E8FE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Controls.SourceGen", "src\Controls\src\SourceGen\Controls.SourceGen.csproj", "{061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compatibility.Gtk", "src\Compatibility\Core\src\Gtk\Compatibility.Gtk.csproj", "{5841B0DF-D8D8-4640-96F8-B737670E0BF5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Linux", "src\Controls\samples\Controls.Sample.Linux\Controls.Sample.Linux.csproj", "{54EA9355-4D00-4687-B270-D2A1C67B8D69}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution @@ -160,34 +158,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|ARM.ActiveCfg = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|ARM.Build.0 = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|ARM64.Build.0 = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|iPhone.Build.0 = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|x64.ActiveCfg = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|x64.Build.0 = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|x86.ActiveCfg = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Debug|x86.Build.0 = Debug|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|Any CPU.Build.0 = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|ARM.ActiveCfg = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|ARM.Build.0 = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|ARM64.ActiveCfg = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|ARM64.Build.0 = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|iPhone.ActiveCfg = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|iPhone.Build.0 = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|x64.ActiveCfg = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|x64.Build.0 = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|x86.ActiveCfg = Release|Any CPU - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A}.Release|x86.Build.0 = Release|Any CPU {57B8B73D-C3B5-4C42-869E-7B2F17D354AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {57B8B73D-C3B5-4C42-869E-7B2F17D354AC}.Debug|Any CPU.Build.0 = Debug|Any CPU {57B8B73D-C3B5-4C42-869E-7B2F17D354AC}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -272,34 +242,6 @@ Global {3B72465B-ACAE-43AE-9327-10F372FE5F80}.Release|x64.Build.0 = Release|Any CPU {3B72465B-ACAE-43AE-9327-10F372FE5F80}.Release|x86.ActiveCfg = Release|Any CPU {3B72465B-ACAE-43AE-9327-10F372FE5F80}.Release|x86.Build.0 = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|Any CPU.Build.0 = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|ARM.ActiveCfg = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|ARM.Build.0 = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|ARM64.Build.0 = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhone.Build.0 = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|x64.ActiveCfg = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|x64.Build.0 = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|x86.ActiveCfg = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|x86.Build.0 = Debug|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|Any CPU.ActiveCfg = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|Any CPU.Build.0 = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|ARM.ActiveCfg = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|ARM.Build.0 = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|ARM64.ActiveCfg = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|ARM64.Build.0 = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhone.ActiveCfg = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhone.Build.0 = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|x64.ActiveCfg = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|x64.Build.0 = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|x86.ActiveCfg = Release|Any CPU - {271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|x86.Build.0 = Release|Any CPU {00259593-A283-47A5-ACB7-9C3819B16364}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {00259593-A283-47A5-ACB7-9C3819B16364}.Debug|Any CPU.Build.0 = Debug|Any CPU {00259593-A283-47A5-ACB7-9C3819B16364}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -1155,62 +1097,90 @@ Global {B5F94CCB-5868-43BD-89B5-B66C97C3A741}.Release|x64.Build.0 = Release|Any CPU {B5F94CCB-5868-43BD-89B5-B66C97C3A741}.Release|x86.ActiveCfg = Release|Any CPU {B5F94CCB-5868-43BD-89B5-B66C97C3A741}.Release|x86.Build.0 = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM.ActiveCfg = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM.Build.0 = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|ARM64.Build.0 = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhone.Build.0 = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x64.ActiveCfg = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x64.Build.0 = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x86.ActiveCfg = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Debug|x86.Build.0 = Debug|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|Any CPU.Build.0 = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM.ActiveCfg = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM.Build.0 = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM64.ActiveCfg = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|ARM64.Build.0 = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhone.ActiveCfg = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhone.Build.0 = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x64.ActiveCfg = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x64.Build.0 = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x86.ActiveCfg = Release|Any CPU - {A7B49F6D-913A-4286-8E8B-76D5E5250891}.Release|x86.Build.0 = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM.ActiveCfg = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM.Build.0 = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|ARM64.Build.0 = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhone.Build.0 = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x64.ActiveCfg = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x64.Build.0 = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x86.ActiveCfg = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Debug|x86.Build.0 = Debug|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|Any CPU.Build.0 = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM.ActiveCfg = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM.Build.0 = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM64.ActiveCfg = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|ARM64.Build.0 = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhone.ActiveCfg = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhone.Build.0 = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x64.ActiveCfg = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x64.Build.0 = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x86.ActiveCfg = Release|Any CPU - {5841B0DF-D8D8-4640-96F8-B737670E0BF5}.Release|x86.Build.0 = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|ARM.ActiveCfg = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|ARM.Build.0 = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|ARM64.Build.0 = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|iPhone.Build.0 = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|x64.Build.0 = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Debug|x86.Build.0 = Debug|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|Any CPU.Build.0 = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|ARM.ActiveCfg = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|ARM.Build.0 = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|ARM64.ActiveCfg = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|ARM64.Build.0 = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|iPhone.ActiveCfg = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|iPhone.Build.0 = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|x64.ActiveCfg = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|x64.Build.0 = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|x86.ActiveCfg = Release|Any CPU + {9FAA9654-80E6-4664-9702-47998A04E8FE}.Release|x86.Build.0 = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|ARM.Build.0 = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|ARM64.Build.0 = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|iPhone.Build.0 = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|x64.ActiveCfg = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|x64.Build.0 = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|x86.ActiveCfg = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Debug|x86.Build.0 = Debug|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|Any CPU.Build.0 = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|ARM.ActiveCfg = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|ARM.Build.0 = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|ARM64.ActiveCfg = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|ARM64.Build.0 = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|iPhone.ActiveCfg = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|iPhone.Build.0 = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|x64.ActiveCfg = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|x64.Build.0 = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|x86.ActiveCfg = Release|Any CPU + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|x86.Build.0 = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM.ActiveCfg = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM.Build.0 = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM64.Build.0 = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhone.Build.0 = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x64.ActiveCfg = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x64.Build.0 = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x86.ActiveCfg = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x86.Build.0 = Debug|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|Any CPU.Build.0 = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM.ActiveCfg = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM.Build.0 = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM64.ActiveCfg = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM64.Build.0 = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhone.ActiveCfg = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhone.Build.0 = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x64.ActiveCfg = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x64.Build.0 = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x86.ActiveCfg = Release|Any CPU + {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1218,13 +1188,11 @@ Global GlobalSection(NestedProjects) = preSolution {9AD757F5-E57A-459D-A0A7-E0675E045B84} = {97FA536A-675D-41C7-A90E-97E2F79D1AE2} {29AC50BF-B4FB-450B-9386-0C5AD4B84226} = {97FA536A-675D-41C7-A90E-97E2F79D1AE2} - {0E16E70A-D6DD-4323-AD5D-363ABFF42D6A} = {29AC50BF-B4FB-450B-9386-0C5AD4B84226} {57B8B73D-C3B5-4C42-869E-7B2F17D354AC} = {D5B986A3-7FC9-437E-8030-349AA4698DFD} {423C21C8-84CB-4A3C-BEB9-1C23D752D90F} = {31721EFD-3238-462B-B501-41F3D2B50E92} {2ACC7FFA-238F-44FD-93CB-4D9B17D8C4BA} = {31721EFD-3238-462B-B501-41F3D2B50E92} {29913989-0F70-48D8-8EDE-B1DD217F21D1} = {423C21C8-84CB-4A3C-BEB9-1C23D752D90F} {3B72465B-ACAE-43AE-9327-10F372FE5F80} = {29AC50BF-B4FB-450B-9386-0C5AD4B84226} - {271193C1-6E7C-429C-A36D-3F1BE5267231} = {29AC50BF-B4FB-450B-9386-0C5AD4B84226} {D5B986A3-7FC9-437E-8030-349AA4698DFD} = {9AD757F5-E57A-459D-A0A7-E0675E045B84} {75A2CD30-BB85-4CA6-AC95-86A8A538A690} = {9AD757F5-E57A-459D-A0A7-E0675E045B84} {00259593-A283-47A5-ACB7-9C3819B16364} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} @@ -1264,8 +1232,9 @@ Global {D816B818-F58F-4738-93AE-924EFAB7A07F} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} {AE2513CB-4E5E-4E5C-8237-88954D4C9433} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} {B5F94CCB-5868-43BD-89B5-B66C97C3A741} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} - {A7B49F6D-913A-4286-8E8B-76D5E5250891} = {806499EB-C2CC-4E85-BC19-613F3DE5E0C3} - {5841B0DF-D8D8-4640-96F8-B737670E0BF5} = {29AC50BF-B4FB-450B-9386-0C5AD4B84226} + {9FAA9654-80E6-4664-9702-47998A04E8FE} = {29AC50BF-B4FB-450B-9386-0C5AD4B84226} + {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD} = {D5B986A3-7FC9-437E-8030-349AA4698DFD} + {54EA9355-4D00-4687-B270-D2A1C67B8D69} = {806499EB-C2CC-4E85-BC19-613F3DE5E0C3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {650AE971-2F29-46A8-822C-FB4FCDC6A9A0} From 578e85912ab72ab9fde1886127c22fd994d00bbc Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 7 Jun 2021 23:01:05 +0200 Subject: [PATCH 039/425] Core.csproj Gtk : adjust LayoutView.cs --- src/Core/src/Platform/Linux/LayoutView.cs | 92 +++++++++++-------- .../src/Platform/Linux/WidgetExtensions.cs | 8 +- 2 files changed, 62 insertions(+), 38 deletions(-) diff --git a/src/Core/src/Platform/Linux/LayoutView.cs b/src/Core/src/Platform/Linux/LayoutView.cs index 749c03c20675..b2caac18bda6 100644 --- a/src/Core/src/Platform/Linux/LayoutView.cs +++ b/src/Core/src/Platform/Linux/LayoutView.cs @@ -153,7 +153,8 @@ protected void AllocateChildren(Gdk.Rectangle allocation) return; } - virtualView.Arrange(allocation.ToRectangle()); + virtualView.InvalidateArrange(); + virtualView.Arrange(new Rectangle(allocation.X, allocation.Y, allocation.Width, allocation.Height)); foreach (var cr in _children.ToArray()) { @@ -164,7 +165,10 @@ protected void AllocateChildren(Gdk.Rectangle allocation) if (r.IsEmpty) continue; - w.SizeAllocate(new Gdk.Rectangle(allocation.X + (int)r.X, allocation.Y + (int)r.Y, (int)r.Width, (int)r.Height)); + var cAlloc = new Gdk.Rectangle(allocation.X + (int)r.X, allocation.Y + (int)r.Y, (int)r.Width, (int)r.Height); + + // if (cAlloc != w.Allocation) // it's allways needed to implicit arrange children: + w.SizeAllocate(cAlloc); } } @@ -241,11 +245,12 @@ public SizeRequest GetSizeRequest(double widthConstraint, double heightConstrain var withFactor = widthHandled && widthConstrained && widthConstraint > 1 ? widthConstraint / AllocatedWidth : 1; var heigthFactor = heightHandled && heightConstrained && heightConstraint > 1 ? heightConstraint / AllocatedHeight : 1; - if ((virtualView.Frame.Size.Width == widthConstraint || !widthConstrained) && (virtualView.Frame.Size.Height == heightConstraint || !heightConstrained)) - { - return new Size(widthConstraint, heightConstraint); - } + // if ((virtualView.Frame.Size.Width == widthConstraint ) && (virtualView.Frame.Size.Height == heightConstraint )) + // { + // return virtualView.Frame.Size; + // } + virtualView.InvalidateMeasure(); var size1 = virtualView.Measure(widthConstraint, heightConstraint); return new SizeRequest(size1, size1); @@ -253,49 +258,64 @@ public SizeRequest GetSizeRequest(double widthConstraint, double heightConstrain int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; - protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) + int? lastHeight; + int? lastWidth; + + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) { - base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); - var constraint = IsReallocating && Allocation.Width > 1 ? Allocation.Width : double.PositiveInfinity; - var c1 = WidthRequest > 0 ? WidthRequest : 0; - var sizeRequest = GetSizeRequest(c1, height, SizeRequestMode.WidthForHeight); + base.OnAdjustSizeRequest(orientation, out minimumSize, out naturalSize); + + if (orientation == Orientation.Vertical && minimumSize != lastHeight) + { + ; + } - minimumWidth = Math.Max(WidthRequest, ToSize(sizeRequest.Minimum.Width)); - naturalWidth = Math.Max(WidthRequest, ToSize(sizeRequest.Request.Width)); + if (orientation == Orientation.Horizontal && minimumSize != lastWidth) + { + ; + } } - protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) + protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight) { - base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); - var constraint = IsReallocating && Allocation.Height > 1 ? Allocation.Height : double.PositiveInfinity; - var c1 = HeightRequest > 0 ? HeightRequest : 0; - var sizeRequest = GetSizeRequest(width, constraint, SizeRequestMode.HeightForWidth); + SizeRequest size; - minimumHeight = Math.Max(HeightRequest, ToSize(sizeRequest.Minimum.Height)); - naturalHeight = Math.Max(HeightRequest, ToSize(sizeRequest.Request.Height)); - } + if (RequestMode == SizeRequestMode.HeightForWidth) + { + OnGetPreferredWidth(out var minimumWidth, out var naturalWidth); + lastWidth = lastWidth.HasValue ? Math.Min(minimumWidth, lastWidth.Value) : minimumWidth; + size = GetSizeRequest(minimumWidth, double.PositiveInfinity, SizeRequestMode.HeightForWidth); + } + else + { + size = GetSizeRequest(double.PositiveInfinity, 0, SizeRequestMode.WidthForHeight); + } - #region adoptions + minimumHeight = Math.Max(HeightRequest, ToSize(size.Minimum.Height)); + naturalHeight = Math.Max(HeightRequest, ToSize(size.Request.Height)); + lastHeight = lastHeight.HasValue ? Math.Min(minimumHeight, lastHeight.Value) : minimumHeight; + } - public void NativeArrange(Rectangle rect) + protected override void OnGetPreferredWidth(out int minimumWidth, out int naturalWidth) { - var nativeView = this; - var virtualView = VirtualView; + SizeRequest size; - if (nativeView == null || virtualView == null) - return; - - if (rect.Width < 0 || rect.Height < 0) - return; - - if (rect != virtualView.Frame) + if (RequestMode == SizeRequestMode.HeightForWidth) { - nativeView.SizeAllocate(rect.ToNative()); - nativeView.QueueResize(); + size = GetSizeRequest(0, double.PositiveInfinity, SizeRequestMode.HeightForWidth); } - } + else + { + GetPreferredHeight(out var minimumHeight, out var naturalHeight); + lastHeight = minimumHeight; + size = GetSizeRequest(0, minimumHeight, SizeRequestMode.WidthForHeight); + } + + minimumWidth = Math.Max(WidthRequest, ToSize(size.Minimum.Width)); + naturalWidth = Math.Max(WidthRequest, ToSize(size.Request.Width)); + lastWidth = lastWidth.HasValue ? Math.Min(minimumWidth, lastWidth.Value) : minimumWidth; - #endregion + } } diff --git a/src/Core/src/Platform/Linux/WidgetExtensions.cs b/src/Core/src/Platform/Linux/WidgetExtensions.cs index 19c2d2d05d8b..9064232335cb 100644 --- a/src/Core/src/Platform/Linux/WidgetExtensions.cs +++ b/src/Core/src/Platform/Linux/WidgetExtensions.cs @@ -18,12 +18,14 @@ public static void UpdateVisibility(this Widget nativeView, Visibility visibilit { case Visibility.Hidden: nativeView.Visible = false; + break; case Visibility.Visible: nativeView.Visible = true; + break; case Visibility.Collapsed: - + break; default: throw new ArgumentOutOfRangeException(nameof(visibility), visibility, null); @@ -40,7 +42,7 @@ public static SizeRequest GetDesiredSize( if (widthConstraint < 0 || heightConstraint < 0) return Size.Zero; - + var widthConstrained = !double.IsPositiveInfinity(widthConstraint); var heightConstrained = !double.IsPositiveInfinity(heightConstraint); @@ -127,6 +129,7 @@ public static void UpdateWidth(this Widget nativeView, IView view) if (widthRequest != -1 && widthRequest != nativeView.WidthRequest && widthRequest != nativeView.AllocatedWidth) { nativeView.WidthRequest = widthRequest; + nativeView.QueueResize(); } } @@ -138,6 +141,7 @@ public static void UpdateHeight(this Widget nativeView, IView view) if (heightRequest != -1 && heightRequest != nativeView.HeightRequest && heightRequest != nativeView.AllocatedHeight) { nativeView.HeightRequest = heightRequest; + nativeView.QueueResize(); } } From 39388e74844d366de52d2c77bdf89273a7b00b51 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 7 Jun 2021 23:01:36 +0200 Subject: [PATCH 040/425] Core.csproj Gtk : cleanup PageView.cs --- src/Core/src/Platform/Linux/PageView.cs | 27 ------------------------- 1 file changed, 27 deletions(-) diff --git a/src/Core/src/Platform/Linux/PageView.cs b/src/Core/src/Platform/Linux/PageView.cs index 0dba31949068..9e550ed1128f 100644 --- a/src/Core/src/Platform/Linux/PageView.cs +++ b/src/Core/src/Platform/Linux/PageView.cs @@ -36,33 +36,6 @@ public Widget? Content } } - protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) - { - base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); - - if (Content == null) return; - - Content.GetPreferredHeightForWidth(width, out var childMinimumHeight, out var childNaturalHeight); - minimumHeight = Math.Max(Math.Max(minimumHeight, childMinimumHeight), hr); - naturalHeight = Math.Max(Math.Max(naturalHeight, childNaturalHeight), hr); - hr = 0; - - } - - int hr = 0; - - protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) - { - base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); - hr = Math.Max(hr, height); - - if (Content == null) return; - - Content.GetPreferredWidthForHeight(height, out var childMinimumWidth, out var childNaturalWidth); - minimumWidth = Math.Max(minimumWidth, childMinimumWidth); - naturalWidth = Math.Max(naturalWidth, childNaturalWidth); - } - } } \ No newline at end of file From e6a5990e18ccc3169a587419fbce8f5d2ba4cd23 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 7 Jun 2021 23:17:45 +0200 Subject: [PATCH 041/425] Core.csproj Gtk : implement GraphicsViewHandler.Linux.cs --- .../GraphicsView/GraphicsViewHandler.Linux.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs index 458280d2b6d4..c115c23660f7 100644 --- a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs +++ b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs @@ -2,10 +2,20 @@ namespace Microsoft.Maui.Handlers { - public partial class GraphicsViewHandler : ViewHandler + + public partial class GraphicsViewHandler : ViewHandler { - protected override Gtk.Widget CreateNativeView() => throw new NotImplementedException(); - public static void MapDrawable(IViewHandler handler, IGraphicsView graphicsView) { } + protected override Microsoft.Maui.Graphics.Native.Gtk.GtkGraphicsView CreateNativeView() => new(); + + public static void MapDrawable(GraphicsViewHandler handler, IGraphicsView graphicsView) + { + if (handler.NativeView is { } nativeView) + { + nativeView.Drawable = graphicsView.Drawable; + } + } + } + } \ No newline at end of file From 88b9cde7b5a6c0242924f9479c891ab58154ad09 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 8 Jun 2021 01:12:23 +0200 Subject: [PATCH 042/425] Core.csproj Gtk : implement ImageSources, ImageHandler.Linux.cs --- .../src/Handlers/Image/ImageHandler.Linux.cs | 20 ++++- .../FileImageSourceService.Linux.cs | 46 ++++++++++ .../FontImageSourceService.Linux.cs | 70 +++++++++++++++ .../src/ImageSources/IImageSourceService.cs | 5 ++ .../src/ImageSources/ImageSourceService.cs | 5 ++ .../Linux/ImageSourceServiceResult.cs | 39 ++++++++ .../StreamImageSourceService.Linux.cs | 44 +++++++++ .../UriImageSourceService.Linux.cs | 47 ++++++++++ .../src/Platform/Linux/ImageViewExtensions.cs | 90 +++++++++++++++++++ 9 files changed, 363 insertions(+), 3 deletions(-) create mode 100644 src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Linux.cs create mode 100644 src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Linux.cs create mode 100644 src/Core/src/ImageSources/Linux/ImageSourceServiceResult.cs create mode 100644 src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Linux.cs create mode 100644 src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Linux.cs create mode 100644 src/Core/src/Platform/Linux/ImageViewExtensions.cs diff --git a/src/Core/src/Handlers/Image/ImageHandler.Linux.cs b/src/Core/src/Handlers/Image/ImageHandler.Linux.cs index cc7de3ea0c1c..26fbad690835 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Linux.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Linux.cs @@ -1,5 +1,6 @@ #nullable enable using System; +using System.Threading.Tasks; namespace Microsoft.Maui.Handlers { @@ -20,8 +21,21 @@ public static void MapAspect(ImageHandler handler, IImage image) { } [MissingMapper] public static void MapIsAnimationPlaying(ImageHandler handler, IImage image) { } - - [MissingMapper] - public static void MapSource(ImageHandler handler, IImage image) { } + + public static void MapSource(ImageHandler handler, IImage image) => + MapSourceAsync(handler, image).FireAndForget(handler); + + public static async Task MapSourceAsync(ImageHandler handler, IImage image) + { + if (handler.NativeView == null) + return; + + var token = handler._sourceManager.BeginLoad(); + + var provider = handler.GetRequiredService(); + var result = await handler.NativeView.UpdateSourceAsync(image, provider, token); + + handler._sourceManager.CompleteLoad(result); + } } } \ No newline at end of file diff --git a/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Linux.cs b/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Linux.cs new file mode 100644 index 000000000000..ac2e02a9d0b6 --- /dev/null +++ b/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Linux.cs @@ -0,0 +1,46 @@ +#nullable enable +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using NativeImage = Gdk.Pixbuf; + +namespace Microsoft.Maui +{ + public partial class FileImageSourceService + { + public override Task?> GetImageAsync(IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) => + GetImageAsync((IFileImageSource)imageSource, scale, cancellationToken); + + public Task?> GetImageAsync(IFileImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) + { + if (imageSource.IsEmpty) + return FromResult(null); + + var filename = imageSource.File; + + try + { + var image = File.Exists(filename) + ? new NativeImage(filename) + : NativeImage.LoadFromResource(filename); + + if (image == null) + throw new InvalidOperationException("Unable to load image file."); + + var result = new ImageSourceServiceResult(image, () => image.Dispose()); + + return FromResult(result); + } + catch (Exception ex) + { + Logger?.LogWarning(ex, "Unable to load image file '{File}'.", filename); + throw; + } + } + + static Task?> FromResult(IImageSourceServiceResult? result) => + Task.FromResult(result); + } +} \ No newline at end of file diff --git a/src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Linux.cs b/src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Linux.cs new file mode 100644 index 000000000000..f3d8b283427f --- /dev/null +++ b/src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Linux.cs @@ -0,0 +1,70 @@ +#nullable enable +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Maui.Graphics; +using NativeImage = Gdk.Pixbuf; + + +namespace Microsoft.Maui +{ + public partial class FontImageSourceService + { + public override Task?> GetImageAsync(IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) => + GetImageAsync((IFontImageSource)imageSource, scale, cancellationToken); + + public Task?> GetImageAsync(IFontImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) + { + if (imageSource.IsEmpty) + return FromResult(null); + + try + { + // TODO: use a cached way + var image = RenderImage(imageSource, scale); + + if (image == null) + throw new InvalidOperationException("Unable to generate font image."); + + var result = new ImageSourceServiceResult(image, true, () => image.Dispose()); + + return FromResult(result); + } + catch (Exception ex) + { + Logger?.LogWarning(ex, "Unable to generate font image '{Glyph}'.", imageSource.Glyph); + throw; + } + } + + static Task?> FromResult(IImageSourceServiceResult? result) => + Task.FromResult(result); + + internal NativeImage RenderImage(IFontImageSource imageSource, float scale) + { + throw new NotImplementedException(); + // var font = FontManager.GetFont(imageSource.Font); + // var color = (imageSource.Color ?? Colors.White).ToNative(); + // var glyph = (NSString)imageSource.Glyph; + // + // var attString = new NSAttributedString(glyph, font, color); + // var imagesize = glyph.GetSizeUsingAttributes(attString.GetUIKitAttributes(0, out _)); + // + // UIGraphics.BeginImageContextWithOptions(imagesize, false, scale); + // var ctx = new NSStringDrawingContext(); + // + // var boundingRect = attString.GetBoundingRect(imagesize, 0, ctx); + // attString.DrawString(new CGRect( + // imagesize.Width / 2 - boundingRect.Size.Width / 2, + // imagesize.Height / 2 - boundingRect.Size.Height / 2, + // imagesize.Width, + // imagesize.Height)); + // + // var image = UIGraphics.GetImageFromCurrentImageContext(); + // UIGraphics.EndImageContext(); + // + // return image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); + } + } +} \ No newline at end of file diff --git a/src/Core/src/ImageSources/IImageSourceService.cs b/src/Core/src/ImageSources/IImageSourceService.cs index f7632c81c905..4e9f72ca7a8c 100644 --- a/src/Core/src/ImageSources/IImageSourceService.cs +++ b/src/Core/src/ImageSources/IImageSourceService.cs @@ -16,6 +16,11 @@ public interface IImageSourceService IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default); +#elif LINUX + Task?> GetImageAsync( + IImageSource imageSource, + float scale = 1, + CancellationToken cancellationToken = default); #elif WINDOWS Task?> GetImageSourceAsync( IImageSource imageSource, diff --git a/src/Core/src/ImageSources/ImageSourceService.cs b/src/Core/src/ImageSources/ImageSourceService.cs index 5c1553b383f7..a0585c944f35 100644 --- a/src/Core/src/ImageSources/ImageSourceService.cs +++ b/src/Core/src/ImageSources/ImageSourceService.cs @@ -24,6 +24,11 @@ public ImageSourceService(ILogger? logger = null) IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default); +#elif LINUX + public abstract Task?> GetImageAsync( + IImageSource imageSource, + float scale = 1, + CancellationToken cancellationToken = default); #elif WINDOWS public abstract Task?> GetImageSourceAsync( IImageSource imageSource, diff --git a/src/Core/src/ImageSources/Linux/ImageSourceServiceResult.cs b/src/Core/src/ImageSources/Linux/ImageSourceServiceResult.cs new file mode 100644 index 000000000000..4a4a5796c297 --- /dev/null +++ b/src/Core/src/ImageSources/Linux/ImageSourceServiceResult.cs @@ -0,0 +1,39 @@ +#nullable enable +using System; +using NativeImage = Gdk.Pixbuf; +namespace Microsoft.Maui +{ + public class ImageSourceServiceResult : IImageSourceServiceResult + { + Action? _dispose; + + public ImageSourceServiceResult(NativeImage image, Action? dispose = null) + : this(image, false, dispose) + { + } + + public ImageSourceServiceResult(NativeImage image, bool resolutionDependent, Action? dispose = null) + { + Value = image; + IsResolutionDependent = resolutionDependent; + _dispose = dispose; + } + + public NativeImage Value { get; } + + public bool IsResolutionDependent { get; } + + public bool IsDisposed { get; private set; } + + public void Dispose() + { + if (IsDisposed) + return; + + IsDisposed = true; + + _dispose?.Invoke(); + _dispose = null; + } + } +} \ No newline at end of file diff --git a/src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Linux.cs b/src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Linux.cs new file mode 100644 index 000000000000..5be40b0b473b --- /dev/null +++ b/src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Linux.cs @@ -0,0 +1,44 @@ +#nullable enable +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using NativeImage = Gdk.Pixbuf; + + +namespace Microsoft.Maui +{ + public partial class StreamImageSourceService + { + public override Task?> GetImageAsync(IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) => + GetImageAsync((IStreamImageSource)imageSource, scale, cancellationToken); + + public async Task?> GetImageAsync(IStreamImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) + { + if (imageSource.IsEmpty) + return null; + + try + { + var stream = await imageSource.GetStreamAsync(cancellationToken).ConfigureAwait(false); + + if (stream == null) + throw new InvalidOperationException("Unable to load image stream."); + + var image = new NativeImage(stream); + + if (image == null) + throw new InvalidOperationException("Unable to decode image from stream."); + + var result = new ImageSourceServiceResult(image, () => image.Dispose()); + + return result; + } + catch (Exception ex) + { + Logger?.LogWarning(ex, "Unable to load image stream."); + throw; + } + } + } +} \ No newline at end of file diff --git a/src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Linux.cs b/src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Linux.cs new file mode 100644 index 000000000000..e4f06576336c --- /dev/null +++ b/src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Linux.cs @@ -0,0 +1,47 @@ +#nullable enable +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using NativeImage = Gdk.Pixbuf; + +namespace Microsoft.Maui +{ + public partial class UriImageSourceService + { + public override Task?> GetImageAsync(IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) => + GetImageAsync((IUriImageSource)imageSource, scale, cancellationToken); + + public async Task?> GetImageAsync(IUriImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) + { + if (imageSource.IsEmpty) + return null; + + try + { + // TODO: use a real caching library with the URI + if (imageSource is not IStreamImageSource streamImageSource) + return null; + + using var stream = await streamImageSource.GetStreamAsync(cancellationToken).ConfigureAwait(false); + + if (stream == null) + throw new InvalidOperationException($"Unable to load image stream from URI '{imageSource.Uri}'."); + + var image = new NativeImage(stream); + + if (image == null) + throw new InvalidOperationException($"Unable to decode image from URI '{imageSource.Uri}'."); + + var result = new ImageSourceServiceResult(image, () => image.Dispose()); + + return result; + } + catch (Exception ex) + { + Logger?.LogWarning(ex, "Unable to load image URI '{Uri}'.", imageSource.Uri); + throw; + } + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/ImageViewExtensions.cs b/src/Core/src/Platform/Linux/ImageViewExtensions.cs new file mode 100644 index 000000000000..de0b6206bfa0 --- /dev/null +++ b/src/Core/src/Platform/Linux/ImageViewExtensions.cs @@ -0,0 +1,90 @@ +#nullable enable +using System; +using System.Threading; +using System.Threading.Tasks; +using Gtk; + +namespace Microsoft.Maui +{ + public static class ImageViewExtensions + { + public static void Clear(this Gtk.Image imageView) + { + + } + + public static void UpdateAspect(this Gtk.Image imageView, IImage image) + { + } + + public static void UpdateIsAnimationPlaying(this Gtk.Image imageView, IImageSourcePart image) + { + if (image.IsAnimationPlaying) + { + ; + } + else + { + ; + } + } + + public static async Task?> UpdateSourceAsync(this Gtk.Image imageView, IImageSourcePart image, IImageSourceServiceProvider services, CancellationToken cancellationToken = default) + { + imageView.Clear(); + + image.UpdateIsLoading(false); + + var imageSource = image.Source; + if (imageSource == null) + return null; + + var events = image as IImageSourcePartEvents; + + events?.LoadingStarted(); + image.UpdateIsLoading(true); + + try + { + var service = services.GetRequiredImageSourceService(imageSource); + + var scale = imageView.ScaleFactor; + var result = await service.GetImageAsync(imageSource, (float)scale, cancellationToken); + var uiImage = result?.Value; + + var applied = !cancellationToken.IsCancellationRequested && imageSource == image.Source; + + // only set the image if we are still on the same one + if (applied) + { + imageView.Pixbuf = uiImage; + + imageView.UpdateIsAnimationPlaying(image); + } + + events?.LoadingCompleted(applied); + + return result; + } + catch (OperationCanceledException) + { + // no-op + events?.LoadingCompleted(false); + } + catch (Exception ex) + { + events?.LoadingFailed(ex); + } + finally + { + // only mark as finished if we are still working on the same image + if (imageSource == image.Source) + { + image.UpdateIsLoading(false); + } + } + + return null; + } + } +} \ No newline at end of file From 8dd87b4840b2def26850434d81f88c6b99427662 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 8 Jun 2021 01:13:15 +0200 Subject: [PATCH 043/425] Controls.Sample.Linux.csproj: add dotnet_bot.png --- .../Controls.Sample.Linux/Controls.Sample.Linux.csproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj index 22ae242b6449..0343c2aefaa5 100644 --- a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj +++ b/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj @@ -15,4 +15,10 @@ + + + dotnet_bot.png + Always + + \ No newline at end of file From 9d7d0eb8fa8473784a346647fa365ed77a67f3bf Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 8 Jun 2021 05:06:10 +0200 Subject: [PATCH 044/425] rename Linux -> Gtk --- ...osoft.Maui.Controls.MultiTargeting.targets | 10 ++++----- ...rollView.Linux.cs => GtkScrollView.Gtk.cs} | 0 ...s.Linux.cs => ScrollViewExtensions.Gtk.cs} | 0 ...dler.Linux.cs => ScrollViewHandler.Gtk.cs} | 0 ....Linux.cs => NavigationPageHandler.Gtk.cs} | 0 ...llHandler.Linux.cs => ShellHandler.Gtk.cs} | 0 ...der.Linux.cs => EmbeddedFontLoader.Gtk.cs} | 0 ...ontManager.Linux.cs => FontManager.Gtk.cs} | 0 ...egistrar.Linux.cs => FontRegistrar.Gtk.cs} | 0 ...ntManager.Linux.cs => IFontManager.Gtk.cs} | 0 ...nux.cs => ActivityIndicatorHandler.Gtk.cs} | 0 ...nHandler.Linux.cs => ButtonHandler.Gtk.cs} | 0 ...andler.Linux.cs => CheckBoxHandler.Gtk.cs} | 0 ...dler.Linux.cs => DatePickerHandler.Gtk.cs} | 0 ...rHandler.Linux.cs => EditorHandler.Gtk.cs} | 0 ...ryHandler.Linux.cs => EntryHandler.Gtk.cs} | 0 ...er.Linux.cs => GraphicsViewHandler.Gtk.cs} | 0 ...ewHandler.Linux.cs => IViewHandler.Gtk.cs} | 0 ...geHandler.Linux.cs => ImageHandler.Gtk.cs} | 0 ...elHandler.Linux.cs => LabelHandler.Gtk.cs} | 0 ...tHandler.Linux.cs => LayoutHandler.Gtk.cs} | 0 ...ageHandler.Linux.cs => PageHandler.Gtk.cs} | 0 ...rHandler.Linux.cs => PickerHandler.Gtk.cs} | 0 ...ler.Linux.cs => ProgressBarHandler.Gtk.cs} | 0 ...ndler.Linux.cs => SearchBarHandler.Gtk.cs} | 0 ...rHandler.Linux.cs => SliderHandler.Gtk.cs} | 0 ...Handler.Linux.cs => StepperHandler.Gtk.cs} | 0 ...hHandler.Linux.cs => SwitchHandler.Gtk.cs} | 0 ...dler.Linux.cs => TimePickerHandler.Gtk.cs} | 0 ...iewHandler.Linux.cs => ViewHandler.Gtk.cs} | 0 ...dlerOfT.Linux.cs => ViewHandlerOfT.Gtk.cs} | 0 ...Linux.cs => FileImageSourceService.Gtk.cs} | 0 ...Linux.cs => FontImageSourceService.Gtk.cs} | 0 .../ImageSourceServiceResult.cs | 0 ...nux.cs => StreamImageSourceService.Gtk.cs} | 0 ....Linux.cs => UriImageSourceService.Gtk.cs} | 0 .../{Linux => Gtk}/ILinuxLifecycleBuilder.cs | 0 .../{Linux => Gtk}/LinuxLifecycle.cs | 0 .../LinuxLifecycleBuilderExtensions.cs | 0 .../LinuxLifecycleExtensions.cs | 0 .../{Linux => Gtk}/ActivationState.cs | 0 .../ActivityIndicatorExtensions.cs | 0 .../src/Platform/Gtk/AlignmentExtensions.cs | 20 ++++++++++++++++++ .../{Linux => Gtk}/ButtonExtensions.cs | 0 .../{Linux => Gtk}/CheckBoxExtensions.cs | 0 src/Core/src/Platform/Gtk/ColorExtensions.cs | 21 +++++++++++++++++++ .../{Linux => Gtk}/DatePickerExtensions.cs | 0 .../{Linux => Gtk}/EditorExtensions.cs | 0 .../{Linux => Gtk}/EntryExtensions.cs | 0 .../Platform/{Linux => Gtk}/FontExtensions.cs | 0 .../Platform/{Linux => Gtk}/GtkExtensions.cs | 0 .../{Linux => Gtk}/HandlerExtensions.cs | 0 .../Platform/{Linux => Gtk}/IGtkContainer.cs | 0 .../{Linux => Gtk}/ImageViewExtensions.cs | 0 .../{Linux => Gtk}/LabelExtensions.cs | 0 .../LayoutAlignmentExtensions.cs | 0 .../src/Platform/{Linux => Gtk}/LayoutView.cs | 0 .../Platform/{Linux => Gtk}/MauiContext.cs | 0 .../Platform/{Linux => Gtk}/MauiDatePicker.cs | 0 .../{Linux => Gtk}/MauiGtkApplication.cs | 0 .../{Linux => Gtk}/MauiGtkMainWindow.cs | 0 .../Platform/{Linux => Gtk}/MauiSearchBar.cs | 0 .../Platform/{Linux => Gtk}/MauiTimePicker.cs | 0 .../src/Platform/{Linux => Gtk}/MauiWindow.cs | 0 .../src/Platform/{Linux => Gtk}/PageView.cs | 0 .../{Linux => Gtk}/PickerExtensions.cs | 0 .../{Linux => Gtk}/ProgressBarExtensions.cs | 0 .../{Linux => Gtk}/SearchBarExtensions.cs | 0 .../{Linux => Gtk}/SliderExtensions.cs | 0 .../{Linux => Gtk}/StepperExtensions.cs | 0 .../{Linux => Gtk}/SwitchExtensions.cs | 0 .../{Linux => Gtk}/TextAlignmentExtensions.cs | 0 .../{Linux => Gtk}/TextInputExtensions.cs | 0 .../{Linux => Gtk}/ThicknessExtensions.cs | 0 .../{Linux => Gtk}/TimePickerExtensions.cs | 0 .../Platform/{Linux => Gtk}/ViewExtensions.cs | 0 .../{Linux => Gtk}/WidgetColorExtensions.cs | 0 .../{Linux => Gtk}/WidgetExtensions.cs | 0 .../{Linux => Gtk}/Readme.md | 0 .../{Linux => Gtk}/TextExtensions.cs | 0 80 files changed, 46 insertions(+), 5 deletions(-) rename src/Compatibility/Core/src/Gtk/Handlers/ScrollView/{GtkScrollView.Linux.cs => GtkScrollView.Gtk.cs} (100%) rename src/Compatibility/Core/src/Gtk/Handlers/ScrollView/{ScrollViewExtensions.Linux.cs => ScrollViewExtensions.Gtk.cs} (100%) rename src/Compatibility/Core/src/Gtk/Handlers/ScrollView/{ScrollViewHandler.Linux.cs => ScrollViewHandler.Gtk.cs} (100%) rename src/Controls/src/Core/Handlers/NavigationPage/{NavigationPageHandler.Linux.cs => NavigationPageHandler.Gtk.cs} (100%) rename src/Controls/src/Core/Handlers/Shell/{ShellHandler.Linux.cs => ShellHandler.Gtk.cs} (100%) rename src/Core/src/Fonts/{EmbeddedFontLoader.Linux.cs => EmbeddedFontLoader.Gtk.cs} (100%) rename src/Core/src/Fonts/{FontManager.Linux.cs => FontManager.Gtk.cs} (100%) rename src/Core/src/Fonts/{FontRegistrar.Linux.cs => FontRegistrar.Gtk.cs} (100%) rename src/Core/src/Fonts/{IFontManager.Linux.cs => IFontManager.Gtk.cs} (100%) rename src/Core/src/Handlers/ActivityIndicator/{ActivityIndicatorHandler.Linux.cs => ActivityIndicatorHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Button/{ButtonHandler.Linux.cs => ButtonHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/CheckBox/{CheckBoxHandler.Linux.cs => CheckBoxHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/DatePicker/{DatePickerHandler.Linux.cs => DatePickerHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Editor/{EditorHandler.Linux.cs => EditorHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Entry/{EntryHandler.Linux.cs => EntryHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/GraphicsView/{GraphicsViewHandler.Linux.cs => GraphicsViewHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/{IViewHandler.Linux.cs => IViewHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Image/{ImageHandler.Linux.cs => ImageHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Label/{LabelHandler.Linux.cs => LabelHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Layout/{LayoutHandler.Linux.cs => LayoutHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Page/{PageHandler.Linux.cs => PageHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Picker/{PickerHandler.Linux.cs => PickerHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/ProgressBar/{ProgressBarHandler.Linux.cs => ProgressBarHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/SearchBar/{SearchBarHandler.Linux.cs => SearchBarHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Slider/{SliderHandler.Linux.cs => SliderHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Stepper/{StepperHandler.Linux.cs => StepperHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/Switch/{SwitchHandler.Linux.cs => SwitchHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/TimePicker/{TimePickerHandler.Linux.cs => TimePickerHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/View/{ViewHandler.Linux.cs => ViewHandler.Gtk.cs} (100%) rename src/Core/src/Handlers/View/{ViewHandlerOfT.Linux.cs => ViewHandlerOfT.Gtk.cs} (100%) rename src/Core/src/ImageSources/FileImageSourceService/{FileImageSourceService.Linux.cs => FileImageSourceService.Gtk.cs} (100%) rename src/Core/src/ImageSources/FontImageSourceService/{FontImageSourceService.Linux.cs => FontImageSourceService.Gtk.cs} (100%) rename src/Core/src/ImageSources/{Linux => Gtk}/ImageSourceServiceResult.cs (100%) rename src/Core/src/ImageSources/StreamImageSourceService/{StreamImageSourceService.Linux.cs => StreamImageSourceService.Gtk.cs} (100%) rename src/Core/src/ImageSources/UriImageSourceService/{UriImageSourceService.Linux.cs => UriImageSourceService.Gtk.cs} (100%) rename src/Core/src/LifecycleEvents/{Linux => Gtk}/ILinuxLifecycleBuilder.cs (100%) rename src/Core/src/LifecycleEvents/{Linux => Gtk}/LinuxLifecycle.cs (100%) rename src/Core/src/LifecycleEvents/{Linux => Gtk}/LinuxLifecycleBuilderExtensions.cs (100%) rename src/Core/src/LifecycleEvents/{Linux => Gtk}/LinuxLifecycleExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/ActivationState.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/ActivityIndicatorExtensions.cs (100%) create mode 100644 src/Core/src/Platform/Gtk/AlignmentExtensions.cs rename src/Core/src/Platform/{Linux => Gtk}/ButtonExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/CheckBoxExtensions.cs (100%) create mode 100644 src/Core/src/Platform/Gtk/ColorExtensions.cs rename src/Core/src/Platform/{Linux => Gtk}/DatePickerExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/EditorExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/EntryExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/FontExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/GtkExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/HandlerExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/IGtkContainer.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/ImageViewExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/LabelExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/LayoutAlignmentExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/LayoutView.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/MauiContext.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/MauiDatePicker.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/MauiGtkApplication.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/MauiGtkMainWindow.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/MauiSearchBar.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/MauiTimePicker.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/MauiWindow.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/PageView.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/PickerExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/ProgressBarExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/SearchBarExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/SliderExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/StepperExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/SwitchExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/TextAlignmentExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/TextInputExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/ThicknessExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/TimePickerExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/ViewExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/WidgetColorExtensions.cs (100%) rename src/Core/src/Platform/{Linux => Gtk}/WidgetExtensions.cs (100%) rename src/Core/src/[Microsoft.Maui.Graphics]/{Linux => Gtk}/Readme.md (100%) rename src/Core/src/[Microsoft.Maui.Graphics]/{Linux => Gtk}/TextExtensions.cs (100%) diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index 56e4ee167d40..ead5a627f199 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -46,11 +46,11 @@ - - - - - + + + + + diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Linux.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs similarity index 100% rename from src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Linux.cs rename to src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Linux.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Gtk.cs similarity index 100% rename from src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Linux.cs rename to src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Gtk.cs diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Linux.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs similarity index 100% rename from src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Linux.cs rename to src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs diff --git a/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Linux.cs b/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs similarity index 100% rename from src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Linux.cs rename to src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs diff --git a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Linux.cs b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs similarity index 100% rename from src/Controls/src/Core/Handlers/Shell/ShellHandler.Linux.cs rename to src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs diff --git a/src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs b/src/Core/src/Fonts/EmbeddedFontLoader.Gtk.cs similarity index 100% rename from src/Core/src/Fonts/EmbeddedFontLoader.Linux.cs rename to src/Core/src/Fonts/EmbeddedFontLoader.Gtk.cs diff --git a/src/Core/src/Fonts/FontManager.Linux.cs b/src/Core/src/Fonts/FontManager.Gtk.cs similarity index 100% rename from src/Core/src/Fonts/FontManager.Linux.cs rename to src/Core/src/Fonts/FontManager.Gtk.cs diff --git a/src/Core/src/Fonts/FontRegistrar.Linux.cs b/src/Core/src/Fonts/FontRegistrar.Gtk.cs similarity index 100% rename from src/Core/src/Fonts/FontRegistrar.Linux.cs rename to src/Core/src/Fonts/FontRegistrar.Gtk.cs diff --git a/src/Core/src/Fonts/IFontManager.Linux.cs b/src/Core/src/Fonts/IFontManager.Gtk.cs similarity index 100% rename from src/Core/src/Fonts/IFontManager.Linux.cs rename to src/Core/src/Fonts/IFontManager.Gtk.cs diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Linux.cs rename to src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Linux.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Button/ButtonHandler.Linux.cs rename to src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/CheckBox/CheckBoxHandler.Linux.cs rename to src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/DatePicker/DatePickerHandler.Linux.cs rename to src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Linux.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Editor/EditorHandler.Linux.cs rename to src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Linux.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Entry/EntryHandler.Linux.cs rename to src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Linux.cs rename to src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs diff --git a/src/Core/src/Handlers/IViewHandler.Linux.cs b/src/Core/src/Handlers/IViewHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/IViewHandler.Linux.cs rename to src/Core/src/Handlers/IViewHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Image/ImageHandler.Linux.cs b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Image/ImageHandler.Linux.cs rename to src/Core/src/Handlers/Image/ImageHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Label/LabelHandler.Linux.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Label/LabelHandler.Linux.cs rename to src/Core/src/Handlers/Label/LabelHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Layout/LayoutHandler.Linux.cs rename to src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Page/PageHandler.Linux.cs b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Page/PageHandler.Linux.cs rename to src/Core/src/Handlers/Page/PageHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Linux.cs b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Picker/PickerHandler.Linux.cs rename to src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs diff --git a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Linux.cs rename to src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/SearchBar/SearchBarHandler.Linux.cs rename to src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Linux.cs b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Slider/SliderHandler.Linux.cs rename to src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs b/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Stepper/StepperHandler.Linux.cs rename to src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/Switch/SwitchHandler.Linux.cs rename to src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/TimePicker/TimePickerHandler.Linux.cs rename to src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs diff --git a/src/Core/src/Handlers/View/ViewHandler.Linux.cs b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/View/ViewHandler.Linux.cs rename to src/Core/src/Handlers/View/ViewHandler.Gtk.cs diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs similarity index 100% rename from src/Core/src/Handlers/View/ViewHandlerOfT.Linux.cs rename to src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs diff --git a/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Linux.cs b/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs similarity index 100% rename from src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Linux.cs rename to src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs diff --git a/src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Linux.cs b/src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Gtk.cs similarity index 100% rename from src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Linux.cs rename to src/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Gtk.cs diff --git a/src/Core/src/ImageSources/Linux/ImageSourceServiceResult.cs b/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs similarity index 100% rename from src/Core/src/ImageSources/Linux/ImageSourceServiceResult.cs rename to src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs diff --git a/src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Linux.cs b/src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Gtk.cs similarity index 100% rename from src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Linux.cs rename to src/Core/src/ImageSources/StreamImageSourceService/StreamImageSourceService.Gtk.cs diff --git a/src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Linux.cs b/src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Gtk.cs similarity index 100% rename from src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Linux.cs rename to src/Core/src/ImageSources/UriImageSourceService/UriImageSourceService.Gtk.cs diff --git a/src/Core/src/LifecycleEvents/Linux/ILinuxLifecycleBuilder.cs b/src/Core/src/LifecycleEvents/Gtk/ILinuxLifecycleBuilder.cs similarity index 100% rename from src/Core/src/LifecycleEvents/Linux/ILinuxLifecycleBuilder.cs rename to src/Core/src/LifecycleEvents/Gtk/ILinuxLifecycleBuilder.cs diff --git a/src/Core/src/LifecycleEvents/Linux/LinuxLifecycle.cs b/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycle.cs similarity index 100% rename from src/Core/src/LifecycleEvents/Linux/LinuxLifecycle.cs rename to src/Core/src/LifecycleEvents/Gtk/LinuxLifecycle.cs diff --git a/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleBuilderExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleBuilderExtensions.cs similarity index 100% rename from src/Core/src/LifecycleEvents/Linux/LinuxLifecycleBuilderExtensions.cs rename to src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleBuilderExtensions.cs diff --git a/src/Core/src/LifecycleEvents/Linux/LinuxLifecycleExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleExtensions.cs similarity index 100% rename from src/Core/src/LifecycleEvents/Linux/LinuxLifecycleExtensions.cs rename to src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleExtensions.cs diff --git a/src/Core/src/Platform/Linux/ActivationState.cs b/src/Core/src/Platform/Gtk/ActivationState.cs similarity index 100% rename from src/Core/src/Platform/Linux/ActivationState.cs rename to src/Core/src/Platform/Gtk/ActivationState.cs diff --git a/src/Core/src/Platform/Linux/ActivityIndicatorExtensions.cs b/src/Core/src/Platform/Gtk/ActivityIndicatorExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/ActivityIndicatorExtensions.cs rename to src/Core/src/Platform/Gtk/ActivityIndicatorExtensions.cs diff --git a/src/Core/src/Platform/Gtk/AlignmentExtensions.cs b/src/Core/src/Platform/Gtk/AlignmentExtensions.cs new file mode 100644 index 000000000000..b14d2d8dadcf --- /dev/null +++ b/src/Core/src/Platform/Gtk/AlignmentExtensions.cs @@ -0,0 +1,20 @@ +using Gtk; + +namespace Microsoft.Maui +{ + public static class AlignmentExtensions + { + public static Align ToNative(this TextAlignment alignment) + { + switch (alignment) + { + case TextAlignment.Start: + return Align.Start; + case TextAlignment.End: + return Align.End; + default: + return Align.Center; + } + } + } +} diff --git a/src/Core/src/Platform/Linux/ButtonExtensions.cs b/src/Core/src/Platform/Gtk/ButtonExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/ButtonExtensions.cs rename to src/Core/src/Platform/Gtk/ButtonExtensions.cs diff --git a/src/Core/src/Platform/Linux/CheckBoxExtensions.cs b/src/Core/src/Platform/Gtk/CheckBoxExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/CheckBoxExtensions.cs rename to src/Core/src/Platform/Gtk/CheckBoxExtensions.cs diff --git a/src/Core/src/Platform/Gtk/ColorExtensions.cs b/src/Core/src/Platform/Gtk/ColorExtensions.cs new file mode 100644 index 000000000000..b04a9fbe995f --- /dev/null +++ b/src/Core/src/Platform/Gtk/ColorExtensions.cs @@ -0,0 +1,21 @@ +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui +{ + public static class ColorExtensions + { + public static Gdk.RGBA ToNative(this Color color) + { + string hex = color.ToHex(); + Gdk.RGBA nativeColor = new Gdk.RGBA(); + nativeColor.Parse(hex); + + return nativeColor; + } + + public static Color ToColor(this Gdk.Color color, float opacity = 255) + { + return new Color(color.Red, color.Green, color.Blue, opacity); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Linux/DatePickerExtensions.cs b/src/Core/src/Platform/Gtk/DatePickerExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/DatePickerExtensions.cs rename to src/Core/src/Platform/Gtk/DatePickerExtensions.cs diff --git a/src/Core/src/Platform/Linux/EditorExtensions.cs b/src/Core/src/Platform/Gtk/EditorExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/EditorExtensions.cs rename to src/Core/src/Platform/Gtk/EditorExtensions.cs diff --git a/src/Core/src/Platform/Linux/EntryExtensions.cs b/src/Core/src/Platform/Gtk/EntryExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/EntryExtensions.cs rename to src/Core/src/Platform/Gtk/EntryExtensions.cs diff --git a/src/Core/src/Platform/Linux/FontExtensions.cs b/src/Core/src/Platform/Gtk/FontExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/FontExtensions.cs rename to src/Core/src/Platform/Gtk/FontExtensions.cs diff --git a/src/Core/src/Platform/Linux/GtkExtensions.cs b/src/Core/src/Platform/Gtk/GtkExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/GtkExtensions.cs rename to src/Core/src/Platform/Gtk/GtkExtensions.cs diff --git a/src/Core/src/Platform/Linux/HandlerExtensions.cs b/src/Core/src/Platform/Gtk/HandlerExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/HandlerExtensions.cs rename to src/Core/src/Platform/Gtk/HandlerExtensions.cs diff --git a/src/Core/src/Platform/Linux/IGtkContainer.cs b/src/Core/src/Platform/Gtk/IGtkContainer.cs similarity index 100% rename from src/Core/src/Platform/Linux/IGtkContainer.cs rename to src/Core/src/Platform/Gtk/IGtkContainer.cs diff --git a/src/Core/src/Platform/Linux/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/ImageViewExtensions.cs rename to src/Core/src/Platform/Gtk/ImageViewExtensions.cs diff --git a/src/Core/src/Platform/Linux/LabelExtensions.cs b/src/Core/src/Platform/Gtk/LabelExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/LabelExtensions.cs rename to src/Core/src/Platform/Gtk/LabelExtensions.cs diff --git a/src/Core/src/Platform/Linux/LayoutAlignmentExtensions.cs b/src/Core/src/Platform/Gtk/LayoutAlignmentExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/LayoutAlignmentExtensions.cs rename to src/Core/src/Platform/Gtk/LayoutAlignmentExtensions.cs diff --git a/src/Core/src/Platform/Linux/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs similarity index 100% rename from src/Core/src/Platform/Linux/LayoutView.cs rename to src/Core/src/Platform/Gtk/LayoutView.cs diff --git a/src/Core/src/Platform/Linux/MauiContext.cs b/src/Core/src/Platform/Gtk/MauiContext.cs similarity index 100% rename from src/Core/src/Platform/Linux/MauiContext.cs rename to src/Core/src/Platform/Gtk/MauiContext.cs diff --git a/src/Core/src/Platform/Linux/MauiDatePicker.cs b/src/Core/src/Platform/Gtk/MauiDatePicker.cs similarity index 100% rename from src/Core/src/Platform/Linux/MauiDatePicker.cs rename to src/Core/src/Platform/Gtk/MauiDatePicker.cs diff --git a/src/Core/src/Platform/Linux/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs similarity index 100% rename from src/Core/src/Platform/Linux/MauiGtkApplication.cs rename to src/Core/src/Platform/Gtk/MauiGtkApplication.cs diff --git a/src/Core/src/Platform/Linux/MauiGtkMainWindow.cs b/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs similarity index 100% rename from src/Core/src/Platform/Linux/MauiGtkMainWindow.cs rename to src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs diff --git a/src/Core/src/Platform/Linux/MauiSearchBar.cs b/src/Core/src/Platform/Gtk/MauiSearchBar.cs similarity index 100% rename from src/Core/src/Platform/Linux/MauiSearchBar.cs rename to src/Core/src/Platform/Gtk/MauiSearchBar.cs diff --git a/src/Core/src/Platform/Linux/MauiTimePicker.cs b/src/Core/src/Platform/Gtk/MauiTimePicker.cs similarity index 100% rename from src/Core/src/Platform/Linux/MauiTimePicker.cs rename to src/Core/src/Platform/Gtk/MauiTimePicker.cs diff --git a/src/Core/src/Platform/Linux/MauiWindow.cs b/src/Core/src/Platform/Gtk/MauiWindow.cs similarity index 100% rename from src/Core/src/Platform/Linux/MauiWindow.cs rename to src/Core/src/Platform/Gtk/MauiWindow.cs diff --git a/src/Core/src/Platform/Linux/PageView.cs b/src/Core/src/Platform/Gtk/PageView.cs similarity index 100% rename from src/Core/src/Platform/Linux/PageView.cs rename to src/Core/src/Platform/Gtk/PageView.cs diff --git a/src/Core/src/Platform/Linux/PickerExtensions.cs b/src/Core/src/Platform/Gtk/PickerExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/PickerExtensions.cs rename to src/Core/src/Platform/Gtk/PickerExtensions.cs diff --git a/src/Core/src/Platform/Linux/ProgressBarExtensions.cs b/src/Core/src/Platform/Gtk/ProgressBarExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/ProgressBarExtensions.cs rename to src/Core/src/Platform/Gtk/ProgressBarExtensions.cs diff --git a/src/Core/src/Platform/Linux/SearchBarExtensions.cs b/src/Core/src/Platform/Gtk/SearchBarExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/SearchBarExtensions.cs rename to src/Core/src/Platform/Gtk/SearchBarExtensions.cs diff --git a/src/Core/src/Platform/Linux/SliderExtensions.cs b/src/Core/src/Platform/Gtk/SliderExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/SliderExtensions.cs rename to src/Core/src/Platform/Gtk/SliderExtensions.cs diff --git a/src/Core/src/Platform/Linux/StepperExtensions.cs b/src/Core/src/Platform/Gtk/StepperExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/StepperExtensions.cs rename to src/Core/src/Platform/Gtk/StepperExtensions.cs diff --git a/src/Core/src/Platform/Linux/SwitchExtensions.cs b/src/Core/src/Platform/Gtk/SwitchExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/SwitchExtensions.cs rename to src/Core/src/Platform/Gtk/SwitchExtensions.cs diff --git a/src/Core/src/Platform/Linux/TextAlignmentExtensions.cs b/src/Core/src/Platform/Gtk/TextAlignmentExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/TextAlignmentExtensions.cs rename to src/Core/src/Platform/Gtk/TextAlignmentExtensions.cs diff --git a/src/Core/src/Platform/Linux/TextInputExtensions.cs b/src/Core/src/Platform/Gtk/TextInputExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/TextInputExtensions.cs rename to src/Core/src/Platform/Gtk/TextInputExtensions.cs diff --git a/src/Core/src/Platform/Linux/ThicknessExtensions.cs b/src/Core/src/Platform/Gtk/ThicknessExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/ThicknessExtensions.cs rename to src/Core/src/Platform/Gtk/ThicknessExtensions.cs diff --git a/src/Core/src/Platform/Linux/TimePickerExtensions.cs b/src/Core/src/Platform/Gtk/TimePickerExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/TimePickerExtensions.cs rename to src/Core/src/Platform/Gtk/TimePickerExtensions.cs diff --git a/src/Core/src/Platform/Linux/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/ViewExtensions.cs rename to src/Core/src/Platform/Gtk/ViewExtensions.cs diff --git a/src/Core/src/Platform/Linux/WidgetColorExtensions.cs b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/WidgetColorExtensions.cs rename to src/Core/src/Platform/Gtk/WidgetColorExtensions.cs diff --git a/src/Core/src/Platform/Linux/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs similarity index 100% rename from src/Core/src/Platform/Linux/WidgetExtensions.cs rename to src/Core/src/Platform/Gtk/WidgetExtensions.cs diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/Readme.md b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/Readme.md similarity index 100% rename from src/Core/src/[Microsoft.Maui.Graphics]/Linux/Readme.md rename to src/Core/src/[Microsoft.Maui.Graphics]/Gtk/Readme.md diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Linux/TextExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs similarity index 100% rename from src/Core/src/[Microsoft.Maui.Graphics]/Linux/TextExtensions.cs rename to src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs From b8b761fcfc8ec3c736d817095c44d2323dd5e791 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 8 Jun 2021 05:08:24 +0200 Subject: [PATCH 045/425] rename Linux -> Gtk --- Microsoft.Maui.sln | 60 +++++++++---------- .../Controls.Sample.Gtk.csproj} | 0 .../Program.cs | 0 .../SimpleSampleApp/BasePage.cs | 0 .../SimpleSampleApp/ExamplePage.cs | 0 .../SimpleSampleApp/ITextService.cs | 0 .../SimpleSampleApp/MainPageViewModel.cs | 0 .../SimpleSampleGtkApplication.cs | 0 .../SimpleSampleApp/SimpleSampleMauiApp.cs | 0 .../SimpleSampleApp/Startup.cs | 0 .../SimpleSampleApp/TextService.cs | 0 .../SimpleSampleApp/ViewModelBase.cs | 0 12 files changed, 30 insertions(+), 30 deletions(-) rename src/Controls/samples/{Controls.Sample.Linux/Controls.Sample.Linux.csproj => Controls.Sample.Gtk/Controls.Sample.Gtk.csproj} (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/Program.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/BasePage.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/ExamplePage.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/ITextService.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/MainPageViewModel.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/SimpleSampleGtkApplication.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/SimpleSampleMauiApp.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/Startup.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/TextService.cs (100%) rename src/Controls/samples/{Controls.Sample.Linux => Controls.Sample.Gtk}/SimpleSampleApp/ViewModelBase.cs (100%) diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index e0c9c3daee9d..f85ded7ffbb1 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -134,7 +134,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Compatibility", "src\Compat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Controls.SourceGen", "src\Controls\src\SourceGen\Controls.SourceGen.csproj", "{061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Linux", "src\Controls\samples\Controls.Sample.Linux\Controls.Sample.Linux.csproj", "{54EA9355-4D00-4687-B270-D2A1C67B8D69}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Gtk", "src\Controls\samples\Controls.Sample.Gtk\Controls.Sample.Gtk.csproj", "{976A1257-F99A-4F23-9106-681C7395F392}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution @@ -1153,34 +1153,34 @@ Global {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|x64.Build.0 = Release|Any CPU {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|x86.ActiveCfg = Release|Any CPU {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD}.Release|x86.Build.0 = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|Any CPU.Build.0 = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM.ActiveCfg = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM.Build.0 = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|ARM64.Build.0 = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhone.Build.0 = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x64.ActiveCfg = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x64.Build.0 = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x86.ActiveCfg = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Debug|x86.Build.0 = Debug|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|Any CPU.ActiveCfg = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|Any CPU.Build.0 = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM.ActiveCfg = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM.Build.0 = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM64.ActiveCfg = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|ARM64.Build.0 = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhone.ActiveCfg = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhone.Build.0 = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x64.ActiveCfg = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x64.Build.0 = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x86.ActiveCfg = Release|Any CPU - {54EA9355-4D00-4687-B270-D2A1C67B8D69}.Release|x86.Build.0 = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|Any CPU.Build.0 = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|ARM.ActiveCfg = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|ARM.Build.0 = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|ARM64.Build.0 = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|iPhone.Build.0 = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|x64.ActiveCfg = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|x64.Build.0 = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|x86.ActiveCfg = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Debug|x86.Build.0 = Debug|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|Any CPU.ActiveCfg = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|Any CPU.Build.0 = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|ARM.ActiveCfg = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|ARM.Build.0 = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|ARM64.ActiveCfg = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|ARM64.Build.0 = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|iPhone.ActiveCfg = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|iPhone.Build.0 = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|x64.ActiveCfg = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|x64.Build.0 = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|x86.ActiveCfg = Release|Any CPU + {976A1257-F99A-4F23-9106-681C7395F392}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1234,7 +1234,7 @@ Global {B5F94CCB-5868-43BD-89B5-B66C97C3A741} = {75A2CD30-BB85-4CA6-AC95-86A8A538A690} {9FAA9654-80E6-4664-9702-47998A04E8FE} = {29AC50BF-B4FB-450B-9386-0C5AD4B84226} {061EC251-FB7A-43B2-A6AD-065D2CCEF1BD} = {D5B986A3-7FC9-437E-8030-349AA4698DFD} - {54EA9355-4D00-4687-B270-D2A1C67B8D69} = {806499EB-C2CC-4E85-BC19-613F3DE5E0C3} + {976A1257-F99A-4F23-9106-681C7395F392} = {806499EB-C2CC-4E85-BC19-613F3DE5E0C3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {650AE971-2F29-46A8-822C-FB4FCDC6A9A0} diff --git a/src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/Controls.Sample.Linux.csproj rename to src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj diff --git a/src/Controls/samples/Controls.Sample.Linux/Program.cs b/src/Controls/samples/Controls.Sample.Gtk/Program.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/Program.cs rename to src/Controls/samples/Controls.Sample.Gtk/Program.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/BasePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/BasePage.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/BasePage.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/BasePage.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ExamplePage.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ITextService.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ITextService.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ITextService.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ITextService.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/MainPageViewModel.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/MainPageViewModel.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/MainPageViewModel.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/MainPageViewModel.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleGtkApplication.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleGtkApplication.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleMauiApp.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/SimpleSampleMauiApp.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/Startup.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/TextService.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/TextService.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/TextService.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/TextService.cs diff --git a/src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ViewModelBase.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ViewModelBase.cs similarity index 100% rename from src/Controls/samples/Controls.Sample.Linux/SimpleSampleApp/ViewModelBase.cs rename to src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ViewModelBase.cs From 0ccff5561ba351cb001c7f7f643788f5e1955484 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 8 Jun 2021 05:10:57 +0200 Subject: [PATCH 046/425] Core.csproj Gtk : rename LinuxLifecycle -> GtkLifecycle --- .../Gtk/{LinuxLifecycle.cs => GtkLifecycle.cs} | 2 +- .../Gtk/GtkLifecycleBuilderExtensions.cs | 10 ++++++++++ ...ifecycleExtensions.cs => GtkLifecycleExtensions.cs} | 10 +++++----- .../src/LifecycleEvents/Gtk/IGtkLifecycleBuilder.cs | 6 ++++++ .../src/LifecycleEvents/Gtk/ILinuxLifecycleBuilder.cs | 6 ------ .../Gtk/LinuxLifecycleBuilderExtensions.cs | 10 ---------- src/Core/src/Platform/Gtk/MauiGtkApplication.cs | 10 +++++----- src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs | 10 +++++----- 8 files changed, 32 insertions(+), 32 deletions(-) rename src/Core/src/LifecycleEvents/Gtk/{LinuxLifecycle.cs => GtkLifecycle.cs} (96%) create mode 100644 src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs rename src/Core/src/LifecycleEvents/Gtk/{LinuxLifecycleExtensions.cs => GtkLifecycleExtensions.cs} (51%) create mode 100644 src/Core/src/LifecycleEvents/Gtk/IGtkLifecycleBuilder.cs delete mode 100644 src/Core/src/LifecycleEvents/Gtk/ILinuxLifecycleBuilder.cs delete mode 100644 src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleBuilderExtensions.cs diff --git a/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycle.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs similarity index 96% rename from src/Core/src/LifecycleEvents/Gtk/LinuxLifecycle.cs rename to src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs index a55555901995..dbc361df194e 100644 --- a/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycle.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.LifecycleEvents { - public static class LinuxLifecycle + public static class GtkLifecycle { public delegate void OnStartup(Gtk.Application application, EventArgs args); diff --git a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs new file mode 100644 index 000000000000..3388c42d151c --- /dev/null +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs @@ -0,0 +1,10 @@ +namespace Microsoft.Maui.LifecycleEvents +{ + public static class GtkLifecycleBuilderExtensions + { + public static IGtkLifecycleBuilder OnActivated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnShown del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnClosed(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnHidden del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnLaunched(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnStartup del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnVisibilityChanged(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnVisibilityChanged del) => lifecycle.OnEvent(del); + } +} \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleExtensions.cs similarity index 51% rename from src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleExtensions.cs rename to src/Core/src/LifecycleEvents/Gtk/GtkLifecycleExtensions.cs index ea0eff8a2a64..91236754e1cf 100644 --- a/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleExtensions.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleExtensions.cs @@ -2,18 +2,18 @@ namespace Microsoft.Maui.LifecycleEvents { - public static class LinuxLifecycleExtensions + public static class GtkLifecycleExtensions { - public static ILifecycleBuilder AddWindows(this ILifecycleBuilder builder, Action configureDelegate) + public static ILifecycleBuilder AddGtk(this ILifecycleBuilder builder, Action configureDelegate) { - var windows = new LifecycleBuilder(builder); + var lifecycleBuilder = new LifecycleBuilder(builder); - configureDelegate?.Invoke(windows); + configureDelegate?.Invoke(lifecycleBuilder); return builder; } - class LifecycleBuilder : ILinuxLifecycleBuilder + class LifecycleBuilder : IGtkLifecycleBuilder { readonly ILifecycleBuilder _builder; diff --git a/src/Core/src/LifecycleEvents/Gtk/IGtkLifecycleBuilder.cs b/src/Core/src/LifecycleEvents/Gtk/IGtkLifecycleBuilder.cs new file mode 100644 index 000000000000..056daf475a36 --- /dev/null +++ b/src/Core/src/LifecycleEvents/Gtk/IGtkLifecycleBuilder.cs @@ -0,0 +1,6 @@ +namespace Microsoft.Maui.LifecycleEvents +{ + public interface IGtkLifecycleBuilder : ILifecycleBuilder + { + } +} \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Gtk/ILinuxLifecycleBuilder.cs b/src/Core/src/LifecycleEvents/Gtk/ILinuxLifecycleBuilder.cs deleted file mode 100644 index dfb1afc4cbf1..000000000000 --- a/src/Core/src/LifecycleEvents/Gtk/ILinuxLifecycleBuilder.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Microsoft.Maui.LifecycleEvents -{ - public interface ILinuxLifecycleBuilder : ILifecycleBuilder - { - } -} \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleBuilderExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleBuilderExtensions.cs deleted file mode 100644 index a774662985f8..000000000000 --- a/src/Core/src/LifecycleEvents/Gtk/LinuxLifecycleBuilderExtensions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Microsoft.Maui.LifecycleEvents -{ - public static class LinuxLifecycleBuilderExtensions - { - public static ILinuxLifecycleBuilder OnActivated(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnShown del) => lifecycle.OnEvent(del); - public static ILinuxLifecycleBuilder OnClosed(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnHidden del) => lifecycle.OnEvent(del); - public static ILinuxLifecycleBuilder OnLaunched(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnStartup del) => lifecycle.OnEvent(del); - public static ILinuxLifecycleBuilder OnVisibilityChanged(this ILinuxLifecycleBuilder lifecycle, LinuxLifecycle.OnVisibilityChanged del) => lifecycle.OnEvent(del); - } -} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index 445b1b8007d4..40a4cd4fa166 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -38,24 +38,24 @@ protected void OnStartup(object sender, EventArgs args) StartupMainWindow(); - Services.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + Services.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } protected void OnOpened(object o, GLib.OpenedArgs args) { - Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } protected void OnActivated(object sender, EventArgs args) { StartupLauch(sender, args); - Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } protected void OnShutdown(object sender, EventArgs args) { - Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); MauiGtkApplication.DispatchPendingEvents(); @@ -123,7 +123,7 @@ protected void StartupLauch(object sender, EventArgs args) MainWindow.Present(); - Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } void StartupMainWindow() diff --git a/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs b/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs index 6bdf6958893a..a0e834f00e69 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs @@ -22,7 +22,7 @@ public MauiGtkMainWindow() : base(WindowType.Toplevel) void OnDeleteEvent(object o, DeleteEventArgs args) { - MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); if (MauiGtkApplication.Current.MainWindow == o) { @@ -35,22 +35,22 @@ void OnDeleteEvent(object o, DeleteEventArgs args) void OnVisibilityNotifyEvent(object o, VisibilityNotifyEventArgs args) { - MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); } void OnHidden(object? sender, EventArgs args) { - MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); } void OnShown(object? sender, EventArgs args) { - MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); } void OnWindowStateEvent(object o, WindowStateEventArgs args) { - MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); } } From ca46fc1368fd4cfdeb641fd34837fae9cc7d8a71 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:23:53 +0200 Subject: [PATCH 047/425] build/DefineConstants: rename Linux -> Gtk --- .nuspec/Microsoft.Maui.Controls.MultiTargeting.targets | 2 +- Directory.Build.props | 6 +++--- src/Compatibility/Core/src/Compatibility.csproj | 2 +- src/Core/src/Handlers/View/ViewHandler.cs | 2 +- src/Core/src/Handlers/View/ViewHandlerOfT.cs | 4 ++-- src/Core/src/ImageSources/IImageSourceService.cs | 2 +- src/Core/src/ImageSources/ImageSourceService.cs | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index ead5a627f199..1a282e79f54f 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -1,6 +1,6 @@ - + $(DefineConstants);LINUX;GTK diff --git a/Directory.Build.props b/Directory.Build.props index cc3d44d8350e..fba6424360ea 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,9 +12,9 @@ net6.0-android - net5 - $(MauiLinuxTargets) - netstandard2.0;netstandard2.1;MonoAndroid10.0 + net5 + $(MauiGtkTargets) + netstandard2.0;netstandard2.1 $(NonNet6EssentialsPlatforms);uap10.0.16299; false diff --git a/src/Compatibility/Core/src/Compatibility.csproj b/src/Compatibility/Core/src/Compatibility.csproj index 2984cef87828..85ed09250364 100644 --- a/src/Compatibility/Core/src/Compatibility.csproj +++ b/src/Compatibility/Core/src/Compatibility.csproj @@ -10,7 +10,7 @@ WinUI\ Gtk\ - + $(DefineConstants);LINUX;GTK diff --git a/src/Core/src/Handlers/View/ViewHandler.cs b/src/Core/src/Handlers/View/ViewHandler.cs index 6c72e351fea0..4e5ffa49a35e 100644 --- a/src/Core/src/Handlers/View/ViewHandler.cs +++ b/src/Core/src/Handlers/View/ViewHandler.cs @@ -5,7 +5,7 @@ using NativeView = UIKit.UIView; #elif MONOANDROID using NativeView = Android.Views.View; -#elif LINUX +#elif GTK using NativeView = Gtk.Widget; #elif WINDOWS using NativeView = Microsoft.UI.Xaml.FrameworkElement; diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.cs index e0da5836758e..cbeea6339994 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.cs @@ -5,7 +5,7 @@ using NativeView = UIKit.UIView; #elif MONOANDROID using NativeView = Android.Views.View; -#elif LINUX +#elif GTK using NativeView = Gtk.Widget; #elif WINDOWS using NativeView = Microsoft.UI.Xaml.FrameworkElement; @@ -18,7 +18,7 @@ namespace Microsoft.Maui.Handlers public abstract partial class ViewHandler : ViewHandler, IViewHandler where TVirtualView : class, IView -#if !NETSTANDARD || IOS || ANDROID || LINUX || WINDOWS +#if !NETSTANDARD || IOS || ANDROID || GTK || WINDOWS where TNativeView : NativeView #else where TNativeView : class diff --git a/src/Core/src/ImageSources/IImageSourceService.cs b/src/Core/src/ImageSources/IImageSourceService.cs index 4e9f72ca7a8c..71e731c504bd 100644 --- a/src/Core/src/ImageSources/IImageSourceService.cs +++ b/src/Core/src/ImageSources/IImageSourceService.cs @@ -16,7 +16,7 @@ public interface IImageSourceService IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default); -#elif LINUX +#elif GTK Task?> GetImageAsync( IImageSource imageSource, float scale = 1, diff --git a/src/Core/src/ImageSources/ImageSourceService.cs b/src/Core/src/ImageSources/ImageSourceService.cs index a0585c944f35..1ae1bb4f22b6 100644 --- a/src/Core/src/ImageSources/ImageSourceService.cs +++ b/src/Core/src/ImageSources/ImageSourceService.cs @@ -24,7 +24,7 @@ public ImageSourceService(ILogger? logger = null) IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default); -#elif LINUX +#elif GTK public abstract Task?> GetImageAsync( IImageSource imageSource, float scale = 1, From 720ef8ef02652245e76bec90214cf35f92af4276 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:25:23 +0200 Subject: [PATCH 048/425] Compatibility.csproj Gtk ScrollViewHandler.Gtk.cs: avoid assigning child twice & cleanup GtkScrollView.Gtk.cs --- .../Handlers/ScrollView/GtkScrollView.Gtk.cs | 38 ------------------- .../ScrollView/ScrollViewHandler.Gtk.cs | 13 ++++++- 2 files changed, 11 insertions(+), 40 deletions(-) diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs index 95e733e72ada..06fccf81a0d1 100644 --- a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs +++ b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs @@ -10,44 +10,6 @@ public class GtkScrollView : Gtk.ScrolledWindow public ScrollOrientation ScrollOrientation { get; set; } - protected override void OnGetPreferredHeightForWidth(int width, out int minimumHeight, out int naturalHeight) - { - base.OnGetPreferredHeightForWidth(width, out minimumHeight, out naturalHeight); - // Child.GetPreferredHeightForWidth(width, out var childMinimumHeight, out var childNaturalHeight); - // - // minimumHeight = Math.Max(minimumHeight, childMinimumHeight); - // naturalHeight = Math.Max(naturalHeight, childNaturalHeight); - var o = this.ToScrollOrientation(); - - // if (ScrollOrientation == ScrollOrientation.Vertical) - // { - // minimumHeight = childMinimumHeight; - // naturalHeight = childNaturalHeight; - // } - - } - - protected override void OnGetPreferredWidthForHeight(int height, out int minimumWidth, out int naturalWidth) - { - base.OnGetPreferredWidthForHeight(height, out minimumWidth, out naturalWidth); - - - var o = this.ToScrollOrientation(); - - if (ScrollOrientation == ScrollOrientation.Vertical) - { - Child.GetPreferredWidthForHeight(height, out var childMinimumWidth, out var childNaturalWidth); - minimumWidth = Math.Max(minimumWidth, childMinimumWidth); - naturalWidth = Math.Max(naturalWidth, childNaturalWidth); - } - } - - protected override SizeRequestMode OnGetRequestMode() - { - var rm = base.OnGetRequestMode(); - - return rm; - } } diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 2b98bc0f2bb6..49848a5b3e9e 100644 --- a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -138,8 +138,17 @@ public override void SetVirtualView(IView view) _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - if (VirtualView.Content != null) - NativeView.Child = VirtualView.Content.ToNative(MauiContext); + var nativeContent = VirtualView.Content.ToNative(MauiContext); + var child = NativeView.Child; + + // check if nativeContent is set as child of Viewport: + if (child is Gtk.Viewport vp && vp != nativeContent) + { + child = vp.Child; + } + + if (child != nativeContent) + NativeView.Child = nativeContent; } protected override void ConnectHandler(GtkScrollView nativeView) From e75e791c524da363f3b287afa580f479b03264fa Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:25:47 +0200 Subject: [PATCH 049/425] Compatibility.csproj Gtk RendererToHandlerShim.cs: add GTK --- src/Compatibility/Core/src/RendererToHandlerShim.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Compatibility/Core/src/RendererToHandlerShim.cs b/src/Compatibility/Core/src/RendererToHandlerShim.cs index 3dc2c9af1d31..635c8fab1379 100644 --- a/src/Compatibility/Core/src/RendererToHandlerShim.cs +++ b/src/Compatibility/Core/src/RendererToHandlerShim.cs @@ -13,6 +13,9 @@ #elif NETSTANDARD using NativeView = System.Object; using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; +#elif GTK +using NativeView = Gtk.Widget; +using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; #elif WINDOWS using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; using NativeView = Microsoft.UI.Xaml.FrameworkElement; From 6d5e6f6d5c673dcbff975842a50eaa1c4a96f21c Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:26:56 +0200 Subject: [PATCH 050/425] Controls.Sample.Gtk.csproj: add GraphicsView & track api changes & maximize mainwindow on start --- .../Controls.Sample.Gtk.csproj | 3 +- .../samples/Controls.Sample.Gtk/Program.cs | 2 +- .../SimpleSampleApp/ExamplePage.cs | 55 ++++++++++++++---- .../SimpleSampleApp/Startup.cs | 58 ++++++++++--------- 4 files changed, 77 insertions(+), 41 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj index 0343c2aefaa5..282f80367842 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj +++ b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj @@ -2,7 +2,7 @@ WinExe - $(MauiLinuxTargets) + $(MauiGtkTargets) false Maui @@ -14,6 +14,7 @@ + diff --git a/src/Controls/samples/Controls.Sample.Gtk/Program.cs b/src/Controls/samples/Controls.Sample.Gtk/Program.cs index 76fad835eb63..ca0b1178d186 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Program.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/Program.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Maui.Hosting; -namespace Controls.Sample.Linux +namespace Controls.Sample.Gtk { class Program diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 2c4832a62fdb..91d4cbdbc16a 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -25,14 +25,14 @@ public class ExamplePage : BasePage "Sed interdum ullamcorper dui eu rutrum. Vestibulum non sagittis justo. " + "Cras rutrum scelerisque elit, et porta est lobortis ac. " + "Pellentesque eu ornare tortor. Sed bibendum a nisl at laoreet."; - + public ExamplePage(IServiceProvider services, MainPageViewModel viewModel) { _services = services; BindingContext = _viewModel = viewModel; - + // SetupMauiLayoutLayouts(); - + // SetupMauiLayoutSimple(); SetupMauiLayout(); // SetupCompatibilityLayout(); @@ -54,8 +54,8 @@ void Fill(Microsoft.Maui.Controls.Layout2.Layout l, string m, int count, Color b Margin = new Thickness(i), LineBreakMode = LineBreakMode.TailTruncation, MaxLines = i - }; + l.Add(label); } } @@ -65,20 +65,23 @@ void Fill(Microsoft.Maui.Controls.Layout2.Layout l, string m, int count, Color b Spacing = 5, BackgroundColor = Colors.WhiteSmoke, }; + var verticalStack2 = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.LightYellow, }; + Fill(verticalStack2, nameof(verticalStack2), 4, Colors.Coral); - + var horizontalStack1 = new HorizontalStackLayout() { Spacing = 5, BackgroundColor = Colors.NavajoWhite, }; + Fill(horizontalStack1, nameof(horizontalStack1), 4, Colors.Aquamarine); - + verticalStack1.Add(verticalStack2); verticalStack1.Add(horizontalStack1); @@ -87,6 +90,7 @@ void Fill(Microsoft.Maui.Controls.Layout2.Layout l, string m, int count, Color b Spacing = 5, BackgroundColor = Colors.Lime, }; + verticalStack3.Add(new Label { HorizontalTextAlignment = TextAlignment.Center, @@ -94,8 +98,9 @@ void Fill(Microsoft.Maui.Controls.Layout2.Layout l, string m, int count, Color b Margin = new Thickness(2), LineBreakMode = LineBreakMode.TailTruncation, MaxLines = 2, - Text = LoremIpsum + Text = LoremIpsum }); + verticalStack1.Add(verticalStack3); Content = verticalStack1; @@ -188,7 +193,6 @@ void SetupMauiLayoutSimple() void SetupMauiLayout() { - var verticalStack = new VerticalStackLayout() { Spacing = 5, @@ -533,6 +537,13 @@ void SetupMauiLayout() ThumbColor = Colors.Yellow }); + verticalStack.Add(new GraphicsView + { + Drawable = new TestDrawable(), + HeightRequest = 50, + WidthRequest = 200 + }); + verticalStack.Add(new DatePicker()); verticalStack.Add(new DatePicker { CharacterSpacing = 6 }); verticalStack.Add(new DatePicker { FontSize = 24 }); @@ -605,13 +616,17 @@ void SetupCompatibilityLayout() ThumbColor = Colors.Yellow }); + verticalStack.Add(new GraphicsView + { + Drawable = new TestDrawable(), + HeightRequest = 50, + WidthRequest = 200 + }); + verticalStack.Add(new DatePicker()); verticalStack.Add(new TimePicker()); - verticalStack.Add(new Image() - { - Source = "dotnet_bot.png" - }); + verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); Content = verticalStack; } @@ -675,4 +690,20 @@ IView CreateSampleGrid() } + class TestDrawable : IDrawable + { + + public void Draw(ICanvas canvas, RectangleF dirtyRect) + { + canvas.SaveState(); + canvas.FillColor = Colors.Red; + canvas.FillRoundedRectangle(0, 0, 200, 50, 10); + canvas.FontColor = Colors.Yellow; + canvas.FontSize = 10; + canvas.DrawString("Drawable", 100, 10, HorizontalAlignment.Center); + canvas.RestoreState(); + } + + } + } \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs index ff6ae3459515..9699b36c28f5 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs @@ -7,14 +7,17 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Maui; using Microsoft.Maui.Controls.Compatibility; +using Microsoft.Maui.Controls.Hosting; using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; using Window = Microsoft.Maui.Controls.Window; namespace Maui.SimpleSampleApp { + public class Startup : IStartup { + public readonly static bool UseSemanticsPage = false; public readonly static bool UseXamlPage = false; public readonly static bool UseXamlApp = true; @@ -32,24 +35,24 @@ public void Configure(IAppHostBuilder appBuilder) { // Use just the Forms renderers appBuilder = appBuilder - .UseCompatibilityRenderers() - .UseMauiApp(); + .UseCompatibilityRenderers() + .UseMauiApp(); } appBuilder - .ConfigureAppConfiguration(config => + .ConfigureAppConfiguration(config => { config.AddInMemoryCollection(new Dictionary { - {"MyKey", "Dictionary MyKey Value"}, - {":Title", "Dictionary_Title"}, - {"Position:Name", "Dictionary_Name" }, - {"Logging:LogLevel:Default", "Warning"} + { "MyKey", "Dictionary MyKey Value" }, + { ":Title", "Dictionary_Title" }, + { "Position:Name", "Dictionary_Name" }, + { "Logging:LogLevel:Default", "Warning" } }); }) - .UseMauiServiceProviderFactory(true) + .UseMauiServiceProviderFactory(true) //.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory()) - .ConfigureServices(services => + .ConfigureServices(services => { services.AddSingleton(); services.AddTransient(); @@ -59,11 +62,11 @@ public void Configure(IAppHostBuilder appBuilder) // else if (UseSemanticsPage) // services.AddTransient(); // else - services.AddTransient(); + services.AddTransient(); services.AddTransient(); }) - .ConfigureFonts(fonts => + .ConfigureFonts(fonts => { fonts.AddFont("Dokdo-Regular.ttf", "Dokdo"); }) @@ -79,30 +82,27 @@ public void Configure(IAppHostBuilder appBuilder) // Debug.WriteLine($"You seem to have arrived from a special place: {appAction.Title} ({appAction.Id})"); // }); // }) - .ConfigureLifecycleEvents(events => + .ConfigureLifecycleEvents(events => { events.AddEvent>("CustomEventName", value => LogEvent("CustomEventName")); // Log everything in this one - events.AddWindows(windows => windows - .OnActivated((a, b) => LogEvent(nameof(LinuxLifecycle.OnApplicationActivated))) - .OnClosed((a, b) => LogEvent(nameof(LinuxLifecycle.OnHidden))) - .OnLaunched((a, b) => LogEvent(nameof(LinuxLifecycle.OnLaunched))) - .OnVisibilityChanged((a, b) => + events.AddGtk(windows => windows + .OnActivated((a, b) => LogEvent(nameof(GtkLifecycle.OnApplicationActivated))) + .OnClosed((a, b) => LogEvent(nameof(GtkLifecycle.OnHidden))) + .OnLaunched((a, b) => LogEvent(nameof(GtkLifecycle.OnLaunched))) + .OnVisibilityChanged((a, b) => LogEvent(nameof(GtkLifecycle.OnVisibilityChanged))) + .OnShown((a, b) => { - LogEvent(nameof(LinuxLifecycle.OnVisibilityChanged)); - - if (b.Event.State == VisibilityState.Unobscured) - { - if (a.AllocatedWidth < 2) - a.WidthRequest = 200; - } - } - )); + LogEvent(nameof(GtkLifecycle.OnShown)); + a.Maximize(); + }) + ); static bool LogEvent(string eventName, string type = null) { Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? "" : $" ({type})")}"); + return true; } }); @@ -111,11 +111,15 @@ static bool LogEvent(string eventName, string type = null) // To use the Microsoft.Extensions.DependencyInjection ServiceCollection and not the MAUI one class DIExtensionsServiceProviderFactory : IServiceProviderFactory { + public ServiceCollection CreateBuilder(IServiceCollection services) => new ServiceCollection { services }; public IServiceProvider CreateServiceProvider(ServiceCollection containerBuilder) => containerBuilder.BuildServiceProvider(); + } + } -} + +} \ No newline at end of file From d5aa725d9f5e6e37909fec8f6a38e2cb738cc6a8 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:27:25 +0200 Subject: [PATCH 051/425] Controls.Sample.csproj: remove Compatibility.Gtk.csproj --- src/Controls/samples/Controls.Sample/Controls.Sample.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Controls/samples/Controls.Sample/Controls.Sample.csproj b/src/Controls/samples/Controls.Sample/Controls.Sample.csproj index a3bfd9e6dd2c..1378114d528e 100644 --- a/src/Controls/samples/Controls.Sample/Controls.Sample.csproj +++ b/src/Controls/samples/Controls.Sample/Controls.Sample.csproj @@ -33,7 +33,4 @@ - - - From cd1107b7ccf24e07e163ae4f2f76d561db55a940 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:28:49 +0200 Subject: [PATCH 052/425] Core.csproj Gtk : adjust LabelHandler.Gtk.cs GetDesiredSize --- .../src/Handlers/Label/LabelHandler.Gtk.cs | 32 +++++++++++-------- .../Gtk/TextExtensions.cs | 18 ++++++++--- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index ae6a3ac92991..696ac27b735a 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -49,36 +49,42 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra lock (SharedTextLayout) { - SharedTextLayout.FontFamily = virtualView.Font.FontFamily; + SharedTextLayout.FontDescription = nativeView.GetPangoFontDescription(); + SharedTextLayout.TextFlow = TextFlow.ClipBounds; - SharedTextLayout.PangoFontSize = virtualView.Font.FontSize.ScaledToPango(); SharedTextLayout.HorizontalAlignment = virtualView.HorizontalTextAlignment.GetHorizontalAlignment(); SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); - SharedTextLayout.HeightForWidth = !heightConstrained; + var heightForWidth = !heightConstrained; - var constraint = Math.Max(SharedTextLayout.HeightForWidth ? widthConstraint + virtualView.Margin.HorizontalThickness - hMargin : heightConstraint + virtualView.Margin.VerticalThickness - vMargin, + var constraint = Math.Max(heightForWidth ? widthConstraint - hMargin : heightConstraint - vMargin, 1); - var lh = 0; + var lh = 0d; var layout = SharedTextLayout.GetLayout(); + layout.Height = -1; + layout.Width = -1; layout.Ellipsize = nativeView.Ellipsize; layout.Spacing = nativeView.Layout.Spacing; + layout.SetText(nativeView.Text); - if (!heightConstrained && nativeView.Lines > 0) + if (!heightConstrained) { - lh = (int)layout.GetLineHeigth(false) * nativeView.Lines; - layout.Height = lh; - + if (nativeView.Lines > 0) + { + lh = layout.GetLineHeigth(nativeView.Lines, false); + layout.Height = (int)lh; + } } - else + + if (!heightForWidth && heightConstrained && widthConstrained) { - layout.Height = -1; + layout.Width = Math.Max((widthConstraint - hMargin).ScaledToPango(), -1); } - (width, height) = layout.GetPixelSize(NativeView.Text, double.IsInfinity(constraint) ? -1 : constraint, SharedTextLayout.HeightForWidth); + (width, height) = layout.GetPixelSize(nativeView.Text, constraint, heightForWidth); - if (!heightConstrained && nativeView.Lines > 0) + if (lh > 0) { height = Math.Min((int)lh.ScaledFromPango(), height); } diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs index 0e37878d8427..163ebf883bde 100644 --- a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs @@ -1,22 +1,29 @@ +using System; + namespace Microsoft.Maui.Graphics.Native.Gtk { public static class TextExtensions { - public static double GetLineHeigth(this Pango.Layout layout, bool scaled = true) + public static double GetLineHeigth(this Pango.Layout layout, int numLines, bool scaled = true) { var inkRect = new Pango.Rectangle(); var logicalRect = new Pango.Rectangle(); + var numLines1 = numLines > 0 ? Math.Min(numLines, layout.LineCount) : layout.LineCount; + var lineHeigh = 0d; + + var metrics = layout.Context.GetMetrics(layout.FontDescription, Pango.Language.Default); + var baseline = metrics.Ascent / (double)(metrics.Ascent + metrics.Descent); layout.GetLineReadonly(0).GetExtents(ref inkRect, ref logicalRect); - var lineHeigh = scaled ? logicalRect.Height.ScaledFromPango() : logicalRect.Height; + lineHeigh += (scaled ? logicalRect.Height.ScaledFromPango() : logicalRect.Height); - return lineHeigh; + return lineHeigh * baseline + (lineHeigh * numLines - 1); } public static (int width, int height) GetPixelSize(this Pango.Layout layout, string text, double desiredSize = -1d, bool heightForWidth = true) { - + desiredSize = double.IsInfinity(desiredSize) ? -1 : desiredSize; if (desiredSize > 0) { if (heightForWidth) @@ -35,6 +42,9 @@ public static (int width, int height) GetPixelSize(this Pango.Layout layout, str return (textWidth, textHeight); } + public static double ScaledFromPango(this double it) + => Math.Ceiling(it / Pango.Scale.PangoScale); + } } \ No newline at end of file From 468d7cb30b5524035fec1918dca0470237c95057 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:30:37 +0200 Subject: [PATCH 053/425] Core.csproj Gtk : LayoutHandler.Gtk.cs / LayoutView.cs: enhance --- .../src/Handlers/Layout/LayoutHandler.Gtk.cs | 5 + src/Core/src/Platform/Gtk/LayoutView.cs | 201 +++++++++--------- 2 files changed, 106 insertions(+), 100 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 628637f0361a..f381ac0b3ea6 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -70,6 +70,11 @@ public void Remove(IView child) NativeView.QueueAllocate(); } + public override void NativeArrange(Rectangle rect) + { + NativeView?.Arrange(rect); + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index b2caac18bda6..ada55b271455 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -2,9 +2,7 @@ using System.Collections.Generic; using System.Linq; using Gtk; -using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; -using Microsoft.Maui.Layouts; using Rectangle = Microsoft.Maui.Graphics.Rectangle; using Size = Microsoft.Maui.Graphics.Size; @@ -48,7 +46,16 @@ protected override bool OnDrawn(Cairo.Context cr) public ILayout? VirtualView => CrossPlatformVirtualView?.Invoke(); - public bool IsReallocating; + protected bool IsReallocating; + + protected Size? MeasuredArrange { get; set; } + + protected Size? MesuredAllocation { get; set; } + + public bool RestrictToMesuredAllocation { get; set; } + + public bool RestrictToMeasuredArrange { get; set; } + Dictionary _children = new(); public LayoutView() @@ -86,6 +93,14 @@ Orientation GetOrientation() => FocusChain = focusChain; } + protected override void ForAll(bool includeInternals, Callback callback) + { + base.ForAll(includeInternals, callback); + + foreach (var c in _children.Values.ToArray()) + callback(c); + } + public void ClearChildren() { foreach (var c in Children) @@ -123,38 +138,8 @@ protected override void OnRemoved(Widget widget) QueueResize(); } - protected void OnReallocate(Gdk.Rectangle allocation = default) - { - if (VirtualView == null) - { - return; - } - - if (allocation == default) - { - allocation = new Gdk.Rectangle(0, 0, Allocation.Width, Allocation.Height); - } - - var size = GetSizeRequest(allocation.Width, allocation.Height, SizeRequestMode.ConstantSize); - - if (size.Request.Width != allocation.Width || size.Request.Height != allocation.Height) - { - ; - } - - } - - protected void AllocateChildren(Gdk.Rectangle allocation) + protected void AllocateChildren(Rectangle allocation) { - var virtualView = VirtualView; - - if (virtualView == null) - { - return; - } - - virtualView.InvalidateArrange(); - virtualView.Arrange(new Rectangle(allocation.X, allocation.Y, allocation.Width, allocation.Height)); foreach (var cr in _children.ToArray()) { @@ -165,28 +150,43 @@ protected void AllocateChildren(Gdk.Rectangle allocation) if (r.IsEmpty) continue; - var cAlloc = new Gdk.Rectangle(allocation.X + (int)r.X, allocation.Y + (int)r.Y, (int)r.Width, (int)r.Height); + var cAlloc = new Gdk.Rectangle((int)(allocation.X + r.X), (int)(allocation.Y + r.Y), (int)r.Width, (int)r.Height); // if (cAlloc != w.Allocation) // it's allways needed to implicit arrange children: w.SizeAllocate(cAlloc); } } + protected void ArrangeAllocation(Rectangle allocation) + { + if (VirtualView is not { } virtualView) + return; + + virtualView.InvalidateArrange(); + virtualView.Arrange(allocation); + + } + protected override void OnSizeAllocated(Gdk.Rectangle allocation) { base.OnSizeAllocated(allocation); - var virtualView = VirtualView; - if (virtualView == null) - { + if (VirtualView is not { }) return; - } try { IsReallocating = true; - OnReallocate(allocation); - AllocateChildren(allocation); + + MesuredAllocation = MeasuredArrange ?? Measure(allocation.Width, allocation.Height, SizeRequestMode.ConstantSize); + + var mAllocation = allocation.ToRectangle(); + + if (RestrictToMesuredAllocation) + mAllocation.Size = MesuredAllocation.Value; + + ArrangeAllocation(mAllocation); + AllocateChildren(mAllocation); } finally { @@ -195,14 +195,6 @@ protected override void OnSizeAllocated(Gdk.Rectangle allocation) } - protected override void ForAll(bool includeInternals, Callback callback) - { - base.ForAll(includeInternals, callback); - - foreach (var c in _children.Values.ToArray()) - callback(c); - } - protected override void OnUnrealized() { // force reallocation on next realization, since allocation may be lost @@ -217,7 +209,7 @@ protected override void OnRealized() { try { - OnReallocate(); + MesuredAllocation ??= Measure(Allocation.Width, Allocation.Height, SizeRequestMode.ConstantSize); } catch { @@ -228,93 +220,102 @@ protected override void OnRealized() base.OnRealized(); } - public SizeRequest GetSizeRequest(double widthConstraint, double heightConstraint, SizeRequestMode mode) - { - var widthHandled = AllocatedWidth > 1; // && virtualView.DesiredSize.Width > 0; - var heightHandled = AllocatedHeight > 1; // && virtualView.DesiredSize.Height > 0; - var widthConstrained = !double.IsPositiveInfinity(widthConstraint); - var heightConstrained = !double.IsPositiveInfinity(heightConstraint); + int sr = 0; - var virtualView = VirtualView; + public SizeRequest Measure(double widthConstraint, double heightConstraint, SizeRequestMode mode) + { - if (virtualView == null) - { + if (VirtualView is not { } virtualView) return Size.Zero; - } - - var withFactor = widthHandled && widthConstrained && widthConstraint > 1 ? widthConstraint / AllocatedWidth : 1; - var heigthFactor = heightHandled && heightConstrained && heightConstraint > 1 ? heightConstraint / AllocatedHeight : 1; - - // if ((virtualView.Frame.Size.Width == widthConstraint ) && (virtualView.Frame.Size.Height == heightConstraint )) - // { - // return virtualView.Frame.Size; - // } virtualView.InvalidateMeasure(); var size1 = virtualView.Measure(widthConstraint, heightConstraint); + sr++; return new SizeRequest(size1, size1); } int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; - int? lastHeight; - int? lastWidth; - - protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) + protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight) { - base.OnAdjustSizeRequest(orientation, out minimumSize, out naturalSize); + SizeRequest size; - if (orientation == Orientation.Vertical && minimumSize != lastHeight) + if (MeasuredArrange.HasValue) + size = MeasuredArrange.Value; + else { - ; - } - if (orientation == Orientation.Horizontal && minimumSize != lastWidth) - { - ; + if (RequestMode == SizeRequestMode.HeightForWidth) + { + OnGetPreferredWidth(out var minimumWidth, out var naturalWidth); + size = Measure(minimumWidth, double.PositiveInfinity, SizeRequestMode.HeightForWidth); + } + else + { + size = Measure(double.PositiveInfinity, 0, SizeRequestMode.WidthForHeight); + } } + + minimumHeight = Math.Max(HeightRequest, ToSize(size.Minimum.Height)); + naturalHeight = Math.Max(HeightRequest, ToSize(size.Request.Height)); } - protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight) + protected override void OnGetPreferredWidth(out int minimumWidth, out int naturalWidth) { SizeRequest size; - if (RequestMode == SizeRequestMode.HeightForWidth) - { - OnGetPreferredWidth(out var minimumWidth, out var naturalWidth); - lastWidth = lastWidth.HasValue ? Math.Min(minimumWidth, lastWidth.Value) : minimumWidth; - size = GetSizeRequest(minimumWidth, double.PositiveInfinity, SizeRequestMode.HeightForWidth); - } + if (MeasuredArrange.HasValue) + size = MeasuredArrange.Value; else { - size = GetSizeRequest(double.PositiveInfinity, 0, SizeRequestMode.WidthForHeight); + + if (RequestMode == SizeRequestMode.HeightForWidth) + { + size = Measure(0, double.PositiveInfinity, SizeRequestMode.HeightForWidth); + } + else + { + GetPreferredHeight(out var minimumHeight, out var naturalHeight); + size = Measure(0, minimumHeight, SizeRequestMode.WidthForHeight); + } } - minimumHeight = Math.Max(HeightRequest, ToSize(size.Minimum.Height)); - naturalHeight = Math.Max(HeightRequest, ToSize(size.Request.Height)); - lastHeight = lastHeight.HasValue ? Math.Min(minimumHeight, lastHeight.Value) : minimumHeight; + minimumWidth = Math.Max(WidthRequest, ToSize(size.Minimum.Width)); + naturalWidth = Math.Max(WidthRequest, ToSize(size.Request.Width)); + } - protected override void OnGetPreferredWidth(out int minimumWidth, out int naturalWidth) + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) { - SizeRequest size; + base.OnAdjustSizeRequest(orientation, out minimumSize, out naturalSize); + + if (!MeasuredArrange.HasValue) + return; - if (RequestMode == SizeRequestMode.HeightForWidth) + if (orientation == Orientation.Horizontal) { - size = GetSizeRequest(0, double.PositiveInfinity, SizeRequestMode.HeightForWidth); + minimumSize = (int)MeasuredArrange.Value.Width; } else { - GetPreferredHeight(out var minimumHeight, out var naturalHeight); - lastHeight = minimumHeight; - size = GetSizeRequest(0, minimumHeight, SizeRequestMode.WidthForHeight); + minimumSize = (int)MeasuredArrange.Value.Height; } - minimumWidth = Math.Max(WidthRequest, ToSize(size.Minimum.Width)); - naturalWidth = Math.Max(WidthRequest, ToSize(size.Request.Width)); - lastWidth = lastWidth.HasValue ? Math.Min(minimumWidth, lastWidth.Value) : minimumWidth; + } + public void Arrange(Rectangle rect) + { + + if (rect.IsEmpty) + return; + + if (rect != Allocation.ToRectangle()) + { + MeasuredArrange = Measure(rect.Width, rect.Height, SizeRequestMode.ConstantSize); + SizeAllocate(new Rectangle(rect.Location, RestrictToMeasuredArrange ? MeasuredArrange.Value : rect.Size).ToNative()); + QueueAllocate(); + } } } From a9966cd75d79037c2e9d226fc909fda1fcf46b5a Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:31:29 +0200 Subject: [PATCH 054/425] Core.csproj Gtk : EntryHandler.Gtk.cs: implement MapCursorPosition / MapSelectionLength --- .../src/Handlers/Entry/EntryHandler.Gtk.cs | 80 +++++++++++++++++- .../src/Platform/Gtk/TextInputExtensions.cs | 83 ++++++++++++++++++- 2 files changed, 160 insertions(+), 3 deletions(-) diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index f018895fec6d..fb34dadd25b6 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -4,6 +4,8 @@ namespace Microsoft.Maui.Handlers { + // https://developer.gnome.org/gtk3/stable/GtkEntry.html + public partial class EntryHandler : ViewHandler { @@ -15,11 +17,76 @@ protected override Entry CreateNativeView() protected override void ConnectHandler(Entry nativeView) { nativeView.Changed += OnNativeViewChanged; + nativeView.MotionNotifyEvent += OnNativeViewMotionNotified; + nativeView.MoveCursor += OnNativeViewCursorMoved; + nativeView.ButtonPressEvent += OnNativeViewOnButtonPressed; + nativeView.ButtonReleaseEvent += OnNativeViewOnButtonReleased; } protected override void DisconnectHandler(Entry nativeView) { nativeView.Changed -= OnNativeViewChanged; + nativeView.MotionNotifyEvent -= OnNativeViewMotionNotified; + nativeView.MoveCursor -= OnNativeViewCursorMoved; + nativeView.ButtonPressEvent -= OnNativeViewOnButtonPressed; + nativeView.ButtonReleaseEvent -= OnNativeViewOnButtonReleased; + } + + (int start, int end) _selectionCache; + bool _isMouseSelection; + + void HandleSelectionChanged() + { + if (NativeView is not { } nativeView || VirtualView is not { } virtualView) + return; + + var actual = nativeView.GetSelection(); + + if (actual != _selectionCache) + { + virtualView.OnSelectionLengthChanged(actual); + _selectionCache = actual; + } + } + + void OnNativeViewCursorMoved(object sender, MoveCursorArgs args) + { + if (sender != NativeView) + return; + + NativeView.OnCursorPositionChanged(VirtualView); + HandleSelectionChanged(); + } + + void OnNativeViewMotionNotified(object sender, MotionNotifyEventArgs args) + { + if (sender != NativeView) + return; + + if (_isMouseSelection) + HandleSelectionChanged(); + + } + + void OnNativeViewOnButtonPressed(object sender, Gtk.ButtonPressEventArgs args) + { + if (sender != NativeView) + return; + + if (args.Event.Button == 1) + { + HandleSelectionChanged(); + _isMouseSelection = true; + } + } + + void OnNativeViewOnButtonReleased(object o, Gtk.ButtonReleaseEventArgs args) + { + if (args.Event.Button == 1) + { + HandleSelectionChanged(); + _isMouseSelection = false; + } } protected void OnNativeViewChanged(object? sender, EventArgs e) @@ -27,7 +94,8 @@ protected void OnNativeViewChanged(object? sender, EventArgs e) if (sender != NativeView) return; - NativeView?.OnTextChanged(VirtualView); + if (NativeView?.OnTextChanged(VirtualView) ?? false) + HandleSelectionChanged(); } public static void MapText(EntryHandler handler, IEntry entry) @@ -76,6 +144,16 @@ public static void MapFont(EntryHandler handler, IEntry entry) handler.MapFont(entry); } + public static void MapCursorPosition(EntryHandler handler, IEntry entry) + { + handler.NativeView?.UpdateCursorPosition(entry); + } + + public static void MapSelectionLength(EntryHandler handler, IEntry entry) + { + handler.NativeView?.UpdateSelectionLength(entry); + } + [MissingMapper] public static void MapReturnType(EntryHandler handler, IEntry entry) { } diff --git a/src/Core/src/Platform/Gtk/TextInputExtensions.cs b/src/Core/src/Platform/Gtk/TextInputExtensions.cs index ce61a6d78287..2a0e32789c05 100644 --- a/src/Core/src/Platform/Gtk/TextInputExtensions.cs +++ b/src/Core/src/Platform/Gtk/TextInputExtensions.cs @@ -23,10 +23,10 @@ public static void UpdateText(this Entry nativeEntry, ITextInput entry) } - public static void OnTextChanged(this Entry? nativeEntry, ITextInput? entry) + public static bool OnTextChanged(this Entry? nativeEntry, ITextInput? entry) { if (entry == null || nativeEntry == null) - return; + return false; ; var text = nativeEntry.Text; @@ -34,8 +34,12 @@ public static void OnTextChanged(this Entry? nativeEntry, ITextInput? entry) if (entry.Text != text) { entry.Text = text; + + return true; } + return false; + } public static void UpdatePlaceholder(this Entry nativeEntry, ITextInput entry) @@ -47,6 +51,81 @@ public static void UpdatePlaceholder(this Entry nativeEntry, ITextInput entry) public static void UpdateIsReadOnly(this Entry nativeEntry, ITextInput entry) { nativeEntry.IsEditable = !entry.IsReadOnly; + } + + public static void UpdateCursorPosition(this Gtk.Entry nativeEntry, IEntry entry) + { + if (string.IsNullOrEmpty(nativeEntry.Text)) + return; + + if (nativeEntry.Position != entry.CursorPosition) + nativeEntry.Position = entry.CursorPosition; + } + + public static void UpdateSelectionLength(this Gtk.Entry nativeEntry, IEntry entry) + { + if (string.IsNullOrEmpty(nativeEntry.Text)) + return; + + nativeEntry.GetSelectionBounds(out var start, out var end); + + var length = end - start; + + if (length != entry.SelectionLength) + { + nativeEntry.SelectRegion(start, entry.SelectionLength); + } + } + + public static void OnCursorPositionChanged(this Entry? nativeEntry, IEntry? entry) + { + if (entry == null || nativeEntry == null) + return; + + ; + var position = nativeEntry.Position; + + if (entry.CursorPosition != position) + { + entry.CursorPosition = position; + } + + } + + public static (int start, int end) GetSelection(this Entry? nativeEntry) + { + if (nativeEntry == null) + return default; + + nativeEntry.GetSelectionBounds(out var start, out var end); + + return (start, end); + } + + public static void OnSelectionLengthChanged(this IEntry? entry, (int start, int end) selection) + { + if (entry == null) + return; + + var (start, end) = selection; + + var length = end - start; + + if (entry.SelectionLength != length) + { + entry.SelectionLength = length; + } + + // TODO: should cursorposition updated? seems that Maui.Entry.CursorPostition == SelectionStart + + } + + public static void OnSelectionLengthChanged(this Entry? nativeEntry, IEntry? entry) + { + if (entry == null || nativeEntry == null) + return; + + entry.OnSelectionLengthChanged(nativeEntry.GetSelection()); } From c860c3903a4ea282d6c2a1b344daf2781283c3f2 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:32:16 +0200 Subject: [PATCH 055/425] Core.csproj Gtk : refactor ImageHandler.Gtk.cs (prepare for change) --- .../src/Handlers/Image/ImageHandler.Gtk.cs | 13 ++++++------ src/Core/src/Platform/Gtk/ImageView.cs | 21 +++++++++++++++++++ .../src/Platform/Gtk/ImageViewExtensions.cs | 10 ++++----- 3 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 src/Core/src/Platform/Gtk/ImageView.cs diff --git a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs index 26fbad690835..dca6222c2410 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs @@ -4,21 +4,20 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkImage.html - - public partial class ImageHandler : ViewHandler + + public partial class ImageHandler : ViewHandler { - protected override Gtk.Image CreateNativeView() + protected override ImageView CreateNativeView() { - var img = new Gtk.Image(); + var img = new ImageView(); return img; } [MissingMapper] public static void MapAspect(ImageHandler handler, IImage image) { } - + [MissingMapper] public static void MapIsAnimationPlaying(ImageHandler handler, IImage image) { } @@ -37,5 +36,7 @@ public static async Task MapSourceAsync(ImageHandler handler, IImage image) handler._sourceManager.CompleteLoad(result); } + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ImageView.cs b/src/Core/src/Platform/Gtk/ImageView.cs new file mode 100644 index 000000000000..61a56c1ca02e --- /dev/null +++ b/src/Core/src/Platform/Gtk/ImageView.cs @@ -0,0 +1,21 @@ +namespace Microsoft.Maui +{ + + // https://developer.gnome.org/gtk3/stable/GtkImage.html + + // GtkImage has nothing like Aspect; maybe an ownerdrawn class is needed + // could be: https://developer.gnome.org/gtk3/stable/GtkDrawingArea.html + // or Microsoft.Maui.Graphics.Native.Gtk.GtkGraphicsView + + public class ImageView : Gtk.Image + { + + public Gdk.Pixbuf? Image + { + get => Pixbuf; + set => Pixbuf = value; + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs index de0b6206bfa0..6c66b8e6362e 100644 --- a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs @@ -8,16 +8,16 @@ namespace Microsoft.Maui { public static class ImageViewExtensions { - public static void Clear(this Gtk.Image imageView) + public static void Clear(this ImageView imageView) { } - public static void UpdateAspect(this Gtk.Image imageView, IImage image) + public static void UpdateAspect(this ImageView imageView, IImage image) { } - public static void UpdateIsAnimationPlaying(this Gtk.Image imageView, IImageSourcePart image) + public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSourcePart image) { if (image.IsAnimationPlaying) { @@ -29,7 +29,7 @@ public static void UpdateIsAnimationPlaying(this Gtk.Image imageView, IImageSour } } - public static async Task?> UpdateSourceAsync(this Gtk.Image imageView, IImageSourcePart image, IImageSourceServiceProvider services, CancellationToken cancellationToken = default) + public static async Task?> UpdateSourceAsync(this ImageView imageView, IImageSourcePart image, IImageSourceServiceProvider services, CancellationToken cancellationToken = default) { imageView.Clear(); @@ -57,7 +57,7 @@ public static void UpdateIsAnimationPlaying(this Gtk.Image imageView, IImageSour // only set the image if we are still on the same one if (applied) { - imageView.Pixbuf = uiImage; + imageView.Image = uiImage; imageView.UpdateIsAnimationPlaying(image); } From c8d21d8f5721e73e54670454cfde8c7e25562bd7 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:33:36 +0200 Subject: [PATCH 056/425] Core.csproj Gtk : SearchBarHandler.Gtk.cs: implement MapHorizontalTextAlignment / MapTextColor / MapMaxLength & track api changes --- .../SearchBar/SearchBarHandler.Gtk.cs | 26 ++++++++++++++----- src/Core/src/Platform/Gtk/MauiSearchBar.cs | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs index a1902d03d54f..730c8faa1799 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs @@ -52,20 +52,32 @@ public static void MapFont(SearchBarHandler handler, ISearchBar searchBar) handler.MapFont(handler.NativeView?.Entry, searchBar); } - [MissingMapper] - public static void MapHorizontalTextAlignment(SearchBarHandler handler, ISearchBar searchBar) { } + public static void MapHorizontalTextAlignment(SearchBarHandler handler, ISearchBar searchBar) + { + if (handler.NativeView?.Entry is { } nativeView) + nativeView.Alignment = searchBar.HorizontalTextAlignment.ToXyAlign(); + } - [MissingMapper] - public static void MapCharacterSpacing(SearchBarHandler handler, ISearchBar searchBar) { } + public static void MapTextColor(SearchBarHandler handler, ISearchBar searchBar) + { + handler.NativeView?.Entry?.UpdateTextColor(searchBar.TextColor); + + } + + public static void MapMaxLength(SearchBarHandler handler, ISearchBar searchBar) + { + if (handler.NativeView?.Entry is { } nativeView) + nativeView.MaxLength = searchBar.MaxLength; + } [MissingMapper] - public static void MapTextColor(SearchBarHandler handler, ISearchBar searchBar) { } + public static void MapCharacterSpacing(SearchBarHandler handler, ISearchBar searchBar) { } [MissingMapper] public static void MapIsTextPredictionEnabled(SearchBarHandler handler, ISearchBar searchBar) { } - + [MissingMapper] - public static void MapMaxLength(SearchBarHandler handler, ISearchBar searchBar) { } + public static void MapCancelButtonColor(IViewHandler handler, ISearchBar searchBar) { } } diff --git a/src/Core/src/Platform/Gtk/MauiSearchBar.cs b/src/Core/src/Platform/Gtk/MauiSearchBar.cs index 793721c13eff..84ddf9a1829b 100644 --- a/src/Core/src/Platform/Gtk/MauiSearchBar.cs +++ b/src/Core/src/Platform/Gtk/MauiSearchBar.cs @@ -9,7 +9,7 @@ public class MauiSearchBar : Gtk.SearchBar public MauiSearchBar() : base() { - Entry = new Entry(string.Empty); + Entry = new (string.Empty); Child = Entry; SearchModeEnabled = true; } From d7b0cd4bf88dea979065415f06899803467a8d83 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:34:09 +0200 Subject: [PATCH 057/425] Core.csproj Gtk : minor changes (comment, whitespace) --- src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs | 2 ++ src/Core/src/Platform/Gtk/HandlerExtensions.cs | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index d09bdb86c555..7b355ed2ed43 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -5,6 +5,8 @@ namespace Microsoft.Maui.Handlers { + // https://developer.gnome.org/gtk3/stable/GtkTextView.html + public partial class EditorHandler : ViewHandler { diff --git a/src/Core/src/Platform/Gtk/HandlerExtensions.cs b/src/Core/src/Platform/Gtk/HandlerExtensions.cs index 3be6469c47a3..9aae68a715bc 100644 --- a/src/Core/src/Platform/Gtk/HandlerExtensions.cs +++ b/src/Core/src/Platform/Gtk/HandlerExtensions.cs @@ -1,4 +1,4 @@ -using Gtk; +using Gtk; using System; namespace Microsoft.Maui @@ -35,5 +35,7 @@ public static Widget ToNative(this IView view, IMauiContext context) return result; } + } + } \ No newline at end of file From 6f031c6752be731af847d82652fc6171d135d94a Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 9 Jun 2021 03:34:36 +0200 Subject: [PATCH 058/425] Core.csproj Gtk : GtkLifecycleBuilderExtensions.cs: introduce OnShown --- .../src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs index 3388c42d151c..078ff39e74cb 100644 --- a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs @@ -6,5 +6,6 @@ public static class GtkLifecycleBuilderExtensions public static IGtkLifecycleBuilder OnClosed(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnHidden del) => lifecycle.OnEvent(del); public static IGtkLifecycleBuilder OnLaunched(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnStartup del) => lifecycle.OnEvent(del); public static IGtkLifecycleBuilder OnVisibilityChanged(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnVisibilityChanged del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnShown(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnShown del) => lifecycle.OnEvent(del); } } \ No newline at end of file From a3af510b0e45c88183fd32b5be4a43aed95cf081 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 02:47:42 +0200 Subject: [PATCH 059/425] Core.csproj Gtk : implement ShapeViewHandler --- .../ShapeView/ShapeViewHandler.Gtk.cs | 57 +++++++++++++++++++ src/Core/src/Platform/Gtk/MauiShapeView.cs | 11 ++++ .../src/Platform/Gtk/ShapeViewExtensions.cs | 19 +++++++ 3 files changed, 87 insertions(+) create mode 100644 src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/MauiShapeView.cs create mode 100644 src/Core/src/Platform/Gtk/ShapeViewExtensions.cs diff --git a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs new file mode 100644 index 000000000000..5eaba1a919c2 --- /dev/null +++ b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs @@ -0,0 +1,57 @@ +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui.Handlers +{ + public partial class ShapeViewHandler : ViewHandler + { + protected override MauiShapeView CreateNativeView() + { + return new MauiShapeView(); + } + + public static void MapShape(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.UpdateShape(shapeView); + } + + public static void MapAspect(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + + public static void MapFill(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + + public static void MapStroke(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + + public static void MapStrokeThickness(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + + public static void MapStrokeDashPattern(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + + public static void MapStrokeLineCap(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + + public static void MapStrokeLineJoin(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + + public static void MapStrokeMiterLimit(ShapeViewHandler handler, IShapeView shapeView) + { + handler.NativeView?.InvalidateShape(shapeView); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/MauiShapeView.cs b/src/Core/src/Platform/Gtk/MauiShapeView.cs new file mode 100644 index 000000000000..6d95a936e465 --- /dev/null +++ b/src/Core/src/Platform/Gtk/MauiShapeView.cs @@ -0,0 +1,11 @@ +using Microsoft.Maui.Graphics.Native.Gtk; + +namespace Microsoft.Maui +{ + public class MauiShapeView : GtkGraphicsView + { + public MauiShapeView() + { + } + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs b/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs new file mode 100644 index 000000000000..deb5f5c93159 --- /dev/null +++ b/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs @@ -0,0 +1,19 @@ +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui +{ + + public static class ShapeViewExtensions + { + public static void UpdateShape(this MauiShapeView nativeView, IShapeView shapeView) + { + nativeView.Drawable = new ShapeDrawable(shapeView); + } + + public static void InvalidateShape(this MauiShapeView nativeView, IShapeView shapeView) + { + nativeView.QueueDraw(); + } + } + +} \ No newline at end of file From 020f53ee1cbf5b0e091f0fc6fe55dbf0fc73eaaf Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:00:08 +0200 Subject: [PATCH 060/425] Core.csproj Gtk : WidgetColorExtensions.cs: use Gtk.Css instead of obsolete OverrideColor & introduce GtkCssExtensions.cs --- src/Core/src/Platform/Gtk/GtkCssExtensions.cs | 50 ++++++++++++++++ .../src/Platform/Gtk/WidgetColorExtensions.cs | 59 +++++++++++++++---- 2 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 src/Core/src/Platform/Gtk/GtkCssExtensions.cs diff --git a/src/Core/src/Platform/Gtk/GtkCssExtensions.cs b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs new file mode 100644 index 000000000000..9b81ec8b10ac --- /dev/null +++ b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs @@ -0,0 +1,50 @@ +using System; +using Gtk; +using Microsoft.Maui.Graphics.Native.Gtk; +using Pango; + +namespace Microsoft.Maui +{ + + public static class GtkCssExtensions + { + + public static string CssMainNode(this Gtk.Widget nativeView) + { + var mainNode = string.Empty; + + switch (nativeView) + { + case ProgressBar: + + case ComboBox box: + + default: + mainNode = nativeView.StyleContext.Path.ToString().Split(':')[0]; + + break; + } + + return mainNode; + } + + public static string CssImage(this Gdk.Pixbuf nativeImage) + { + var puf = nativeImage.SaveToBuffer(Graphics.ImageFormat.Png.ToImageExtension()); + + return $"url('data:image/png;base64,{Convert.ToBase64String(puf)}')"; + } + + public static void SetStyleImage(this Gtk.Widget widget, string cssImage, string mainNode, string attr, string? subNode = null) + { + using var p = new Gtk.CssProvider(); + + subNode = subNode != null ? $" > {subNode} " : subNode; + + p.LoadFromData($"{mainNode}{subNode}{{{attr}:{cssImage}}}"); + widget.StyleContext.AddProvider(p, Gtk.StyleProviderPriority.User); + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs index c993ac3c1534..68de89854b76 100644 --- a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs @@ -1,5 +1,6 @@ using System; using Gtk; +using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui @@ -23,9 +24,9 @@ public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateType stat public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateFlags state, Graphics.Color color) { -#pragma warning disable 612 - widget.OverrideBackgroundColor(state, color.ToGdkRgba()); -#pragma warning restore 612 + var nativeColor = color.ToGdkRgba(); + + widget.SetColor(nativeColor, "background-color"); } public static Graphics.Color GetBackgroundColor(this Gtk.Widget widget) @@ -60,32 +61,68 @@ public static Graphics.Color GetForegroundColor(this Gtk.Widget widget, Gtk.Stat return widget.StyleContext.GetColor(state).ToColor(); } - public static void SetForegroundColor(this Gtk.Widget widget, Gtk.StateType state, Graphics.Color color) + public static void SetForegroundColor(this Gtk.Widget widget, Gtk.StateType state, Graphics.Color? color) { widget.SetForegroundColor(state.ToStateFlag(), color); } - public static void SetForegroundColor(this Gtk.Widget widget, Gtk.StateFlags state, Graphics.Color color) + public static void SetStyleColor(this Gtk.Widget widget, Color? color, string mainNode, string attr, string? subNode = null) { if (color == null) return; -#pragma warning disable 612 - widget.OverrideColor(state, color.ToGdkRgba()); -#pragma warning restore 612 + + widget.SetStyleColor(color.ToGdkRgba(), mainNode, attr, subNode); + } + + public static void SetStyleColor(this Gtk.Widget widget, Gdk.RGBA color, string mainNode, string attr, string? subNode = null) + { + using var p = new Gtk.CssProvider(); + + subNode = subNode != null ? $" > {subNode} " : subNode; + + p.LoadFromData($"{mainNode}{subNode}{{{attr}:{color.ToString()}}}"); + widget.StyleContext.AddProvider(p, Gtk.StyleProviderPriority.User); + } + + public static void SetColor(this Gtk.Widget widget, Color? color, string attr, string? subNode = null) + { + if (color == null) + return; + + widget.SetColor(color.ToGdkRgba(), attr, subNode); + } + + public static void SetColor(this Gtk.Widget widget, Gdk.RGBA color, string attr, string? subNode = null) + { + var mainNode = widget.CssMainNode(); + widget.SetStyleColor(color, mainNode, attr, subNode); + } + + public static void SetForegroundColor(this Gtk.Widget widget, Gtk.StateFlags state, Color? color) + { + if (color == null) + return; + + var nativeColor = color.ToGdkRgba(); + + if (nativeColor.Equals(widget.StyleContext.GetColor(state))) + return; + + widget.SetColor(nativeColor, "color"); } - public static void SetForegroundColor(this Gtk.Widget widget, Graphics.Color color) + public static void SetForegroundColor(this Gtk.Widget widget, Color? color) { widget.SetForegroundColor(Gtk.StateType.Normal, color); } - public static void UpdateTextColor(this Gtk.Widget widget, Graphics.Color textColor) + public static void UpdateTextColor(this Gtk.Widget widget, Graphics.Color? textColor) { if (textColor == null) return; widget.SetForegroundColor(textColor); - widget.SetForegroundColor(Gtk.StateFlags.Prelight, textColor); + // widget.SetForegroundColor(Gtk.StateFlags.Prelight, textColor); } public static Gtk.StateFlags ToStateFlag(this Gtk.StateType state) From 6bccd583dc946cea4c95ead2934fba10d52564ad Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:00:55 +0200 Subject: [PATCH 061/425] Core.csproj: ShapeDrawable.cs: DrawStrokePath canvas.RestoreState, not canvas.SaveState --- src/Core/src/Graphics/ShapeDrawable.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Graphics/ShapeDrawable.cs b/src/Core/src/Graphics/ShapeDrawable.cs index 42663d0dc4b3..17c0dc9402a8 100644 --- a/src/Core/src/Graphics/ShapeDrawable.cs +++ b/src/Core/src/Graphics/ShapeDrawable.cs @@ -68,7 +68,7 @@ void DrawStrokePath(ICanvas canvas, RectangleF dirtyRect, PathF path) canvas.DrawPath(path); - canvas.SaveState(); + canvas.RestoreState(); } void DrawFillPath(ICanvas canvas, RectangleF dirtyRect, PathF path) From ac60374292b2a4e8f3368b99d336a1d5807fa9a8 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:03:57 +0200 Subject: [PATCH 062/425] Core.csproj Gtk : PickerHandler.Gtk.cs: implement MapTextColor & MapHorizontalTextAlignment --- .../src/Handlers/Picker/PickerHandler.Gtk.cs | 35 +++++++++-------- src/Core/src/Platform/Gtk/CellExtensions.cs | 28 +++++++++++++ src/Core/src/Platform/Gtk/PickerExtensions.cs | 39 ++++++++++++++++++- 3 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 src/Core/src/Platform/Gtk/CellExtensions.cs diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs index 113964316564..709b0b6e0d47 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers { // https://developer.gnome.org/gtk3/stable/GtkComboBox.html - + public partial class PickerHandler : ViewHandler { @@ -34,15 +34,15 @@ public override void SetVirtualView(IView view) protected override void ConnectHandler(ComboBox nativeView) { base.ConnectHandler(nativeView); - + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); - NativeView.Changed +=OnNativeViewChanged; + NativeView.Changed += OnNativeViewChanged; } void OnNativeViewChanged(object? sender, EventArgs args) { - if (sender is ComboBox nativeView && VirtualView is {} virtualView) + if (sender is ComboBox nativeView && VirtualView is { } virtualView) { virtualView.SelectedIndex = nativeView.Active; } @@ -51,10 +51,10 @@ void OnNativeViewChanged(object? sender, EventArgs args) protected override void DisconnectHandler(ComboBox nativeView) { base.DisconnectHandler(nativeView); - + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); - NativeView.Changed -=OnNativeViewChanged; + NativeView.Changed -= OnNativeViewChanged; } public static void SetValues(ComboBox nativeView, IPicker virtualView) @@ -81,7 +81,7 @@ public static void MapSelectedIndex(PickerHandler handler, IPicker view) nativeView.Active = view.SelectedIndex; } } - + public static void MapReload(PickerHandler handler, IPicker picker) { var nativeView = handler.NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); @@ -96,22 +96,25 @@ public static void MapFont(PickerHandler handler, IPicker view) handler.MapFont(view); } - + [MissingMapper] public static void MapCharacterSpacing(PickerHandler handler, IPicker view) { } - + [MissingMapper] public static void MapTitle(PickerHandler handler, IPicker view) { } - - [MissingMapper] - public static void MapTextColor(PickerHandler handler, IPicker view) { } - [MissingMapper] - public static void MapHorizontalTextAlignment(PickerHandler handler, IPicker view) { } - + public static void MapTextColor(PickerHandler handler, IPicker view) + { + handler.NativeView.UpdateTextColor(view?.TextColor); + } + + public static void MapHorizontalTextAlignment(PickerHandler handler, IPicker view) + { + handler.NativeView.UpdateHorizontalTextAlignment(view.HorizontalTextAlignment); + } + [MissingMapper] public static void MapTitleColor(PickerHandler handler, IPicker view) { } - } diff --git a/src/Core/src/Platform/Gtk/CellExtensions.cs b/src/Core/src/Platform/Gtk/CellExtensions.cs new file mode 100644 index 000000000000..bb9cdba0ba7f --- /dev/null +++ b/src/Core/src/Platform/Gtk/CellExtensions.cs @@ -0,0 +1,28 @@ +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Native.Gtk; + +namespace Microsoft.Maui +{ + + public static class CellExtensions + { + + public static void SetForeground(this Gtk.CellRendererText? cell, Color? color) + { + if (cell == null || color == null) + return; + + cell.ForegroundRgba = color.ToGdkRgba(); + } + + public static void SetBackground(this Gtk.CellRendererText? cell, Color? color) + { + if (cell == null || color == null) + return; + + cell.BackgroundRgba = color.ToGdkRgba(); + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/PickerExtensions.cs b/src/Core/src/Platform/Gtk/PickerExtensions.cs index ac9ffced380c..c5a6592f51b2 100644 --- a/src/Core/src/Platform/Gtk/PickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/PickerExtensions.cs @@ -1,7 +1,42 @@ -namespace Microsoft.Maui +using System.Linq; +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui { + public static class PickerExtensions { - + + public static Gtk.CellRendererText? GetCellRendererText(this Gtk.ComboBox? nativeView) => + nativeView?.Cells.FirstOrDefault() is Gtk.CellRendererText cell ? cell : null; + + public static void UpdateTextColor(this Gtk.ComboBox? nativeView, Color? color) + { + if (nativeView == null || color == null) + return; + + if (nativeView.HasEntry) + nativeView.SetColor(color, "color", "box.linked > entry.combo"); + + nativeView.GetCellRendererText().SetForeground(color); + } + + public static void UpdateHorizontalTextAlignment(this Gtk.ComboBox? nativeView, TextAlignment? alignment) + { + if (nativeView == null || alignment == null) + return; + + var nativeAlign = alignment.Value.ToXyAlign(); + + if (nativeView.HasEntry) + { + nativeView.Entry.Xalign = nativeAlign; + } + + if (nativeView.GetCellRendererText() is { } cell) + cell.Xalign = nativeAlign; + } + } + } \ No newline at end of file From 7a7f3370b3ef89b1f0c1dab224eda4d4607e419e Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:04:58 +0200 Subject: [PATCH 063/425] Core.csproj Gtk : ViewExtensions.cs: make use of Gtk.Css --- src/Core/src/Platform/Gtk/ViewExtensions.cs | 67 ++++++++++++++++++--- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 67de054a6f78..84be92ce306a 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -1,6 +1,7 @@ using System; using Gtk; using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui { @@ -14,20 +15,68 @@ public static void UpdateAutomationId(this Widget nativeView, IView view) [PortHandler("implement drawing of other paints than solidpaint")] public static void UpdateBackground(this Widget nativeView, IView view) { + var color = view.Background?.BackgroundColor; + if (view.Background is SolidPaint solidPaint) { - nativeView.SetBackgroundColor(solidPaint.Color); + color = solidPaint.Color; } - else if (view.Background is Paint paint) + + if (color == null) + return; + + switch (nativeView) { - nativeView.SetBackgroundColor(paint.BackgroundColor); + case ProgressBar: + nativeView.SetColor(color, "background-color", "trough > progress"); + + break; + case ComboBox box: + // no effect: box.SetColor(bkColor, "border-color"); + box.GetCellRendererText().SetBackground(color); + + break; + default: + nativeView.SetBackgroundColor(color); + + break; } - else + + } + + public static void UpdateForeground(this Widget nativeView, Paint? paint) + { + var color = paint?.ForegroundColor; + + if (paint is SolidPaint solidPaint) { - ; + color = solidPaint.Color; } - } + if (color == null) + return; + + switch (nativeView) + { + case ProgressBar: + nativeView.SetColor(color, "color", "trough > progress"); + + break; + case CheckButton: + // no effect as check is an icon + nativeView.SetColor(color, "color", "check"); + break; + case ComboBox box: + box.GetCellRendererText().SetForeground(color); + + break; + default: + nativeView.SetForegroundColor(color); + + break; + } + + } public static void UpdateIsEnabled(this Widget nativeView, IView view) => nativeView?.UpdateIsEnabled(view.IsEnabled); @@ -35,10 +84,8 @@ public static void UpdateVisibility(this Widget nativeView, IView view) => nativeView?.UpdateVisibility(view.Visibility); public static void UpdateSemantics(this Widget nativeView, IView view) - { - - } - + { } + public static void UpdateOpacity(this Widget nativeView, IView view) { } } From fa91603c26729a43b6eedc923334932e121801f6 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:07:12 +0200 Subject: [PATCH 064/425] Core.csproj Gtk : LayoutView.cs OnDrawn: avoid obsolete GetBackgroundColor; use RenderBackground instead --- src/Core/src/Platform/Gtk/LayoutView.cs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index ada55b271455..fa6f78e107ea 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -16,17 +16,8 @@ public class LayoutView : Container, IGtkContainer protected override bool OnDrawn(Cairo.Context cr) { - var bk = this.GetBackgroundColor(this.StateFlags); - - if (bk != null) - { - cr.Save(); - cr.SetSourceColor(bk.ToCairoColor()); - cr.Rectangle(0, 0, Allocation.Width, Allocation.Height); - - cr.Fill(); - cr.Restore(); - } + var stc = this.StyleContext; + stc.RenderBackground(cr, 0, 0, Allocation.Width, Allocation.Height); var r = base.OnDrawn(cr); #if DEBUG From da44611922ed938eeebff370086fa0d177ceb541 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:07:35 +0200 Subject: [PATCH 065/425] Core.csproj Gtk : ImageViewExtensions.cs: refactor --- .../src/Platform/Gtk/ImageViewExtensions.cs | 75 +++++++++++++++---- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs index 6c66b8e6362e..97fdd534076a 100644 --- a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs @@ -6,16 +6,15 @@ namespace Microsoft.Maui { + public static class ImageViewExtensions { + public static void Clear(this ImageView imageView) - { - - } + { } public static void UpdateAspect(this ImageView imageView, IImage image) - { - } + { } public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSourcePart image) { @@ -33,33 +32,42 @@ public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSour { imageView.Clear(); + return await UpdateImageSourceAsync(image, (float)imageView.ScaleFactor, services, p => + { + imageView.Image = p; + imageView.UpdateIsAnimationPlaying(image); + }, cancellationToken); + + } + + public static async Task?> UpdateImageSourceAsync(this IImageSourcePart? image, float scale, IImageSourceServiceProvider provider, Action onResult, CancellationToken cancellationToken = default) + { + if (image == null) + return null; + image.UpdateIsLoading(false); var imageSource = image.Source; + if (imageSource == null) return null; var events = image as IImageSourcePartEvents; - events?.LoadingStarted(); image.UpdateIsLoading(true); try { - var service = services.GetRequiredImageSourceService(imageSource); - - var scale = imageView.ScaleFactor; - var result = await service.GetImageAsync(imageSource, (float)scale, cancellationToken); - var uiImage = result?.Value; - + var service = provider.GetRequiredImageSourceService(imageSource); + var result = await service.GetImageAsync(imageSource, scale, cancellationToken); + var pixbuf = result?.Value; var applied = !cancellationToken.IsCancellationRequested && imageSource == image.Source; // only set the image if we are still on the same one if (applied) { - imageView.Image = uiImage; + onResult(pixbuf); - imageView.UpdateIsAnimationPlaying(image); } events?.LoadingCompleted(applied); @@ -74,6 +82,7 @@ public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSour catch (Exception ex) { events?.LoadingFailed(ex); + } finally { @@ -85,6 +94,44 @@ public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSour } return null; + + } + + public static async Task?> UpdateImageSourceAsync(this IImageSource? imageSource, float scale, IImageSourceServiceProvider provider, Action onResult, CancellationToken cancellationToken = default) + { + + if (imageSource == null) + return null; + + try + { + var service = provider.GetRequiredImageSourceService(imageSource); + var result = await service.GetImageAsync(imageSource, scale, cancellationToken); + var pixbuf = result?.Value; + var applied = !cancellationToken.IsCancellationRequested; + + if (applied) + { + onResult(pixbuf); + + } + + return result; + } + catch (OperationCanceledException) + { + // no-op + } + catch (Exception) + { + // no-op + + } + + return null; + } + } + } \ No newline at end of file From 26f67c55fc9b2d724b0389693e7bf26c74d934f5 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:09:18 +0200 Subject: [PATCH 066/425] Core.csproj Gtk : CheckBoxHandler.Gtk.cs, EntryHandler.Gtk.cs, SliderHandler.Gtk.cs, SwitchHandler.Gtk.cs: try implement some missing Mappers with no success --- src/Core/src/Fonts/EmbeddedFontLoader.Gtk.cs | 9 +++ .../Handlers/CheckBox/CheckBoxHandler.Gtk.cs | 8 ++- .../src/Handlers/Entry/EntryHandler.Gtk.cs | 36 +++++++++++- .../src/Handlers/Slider/SliderHandler.Gtk.cs | 55 ++++++++++++++++--- .../src/Handlers/Switch/SwitchHandler.Gtk.cs | 13 ++++- 5 files changed, 109 insertions(+), 12 deletions(-) diff --git a/src/Core/src/Fonts/EmbeddedFontLoader.Gtk.cs b/src/Core/src/Fonts/EmbeddedFontLoader.Gtk.cs index 2d893332b51a..b6eee0c86689 100644 --- a/src/Core/src/Fonts/EmbeddedFontLoader.Gtk.cs +++ b/src/Core/src/Fonts/EmbeddedFontLoader.Gtk.cs @@ -6,7 +6,16 @@ public partial class EmbeddedFontLoader { public string? LoadFont(EmbeddedFont font) { + // gtk has no methods to load fonts + // see: http://mces.blogspot.com/2015/05/how-to-use-custom-application-fonts.html + throw new NotImplementedException(); + + // freetype is needed. look at: + // https://github.com/Robmaister/SharpFont + + + } } } diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs index 3b7a8c5779fb..d3547c1e128f 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs @@ -4,6 +4,8 @@ namespace Microsoft.Maui.Handlers { + // https://developer.gnome.org/gtk3/stable/GtkCheckButton.html + public partial class CheckBoxHandler : ViewHandler { @@ -31,8 +33,10 @@ protected void OnToggledEvent(object? sender, EventArgs e) } - [MissingMapper] - public static void MapForeground(CheckBoxHandler handler, ICheckBox check) { } + public static void MapForeground(CheckBoxHandler handler, ICheckBox check) + { + handler.NativeView?.UpdateForeground(check.Foreground); + } } diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index fb34dadd25b6..bc37379f7c87 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -164,7 +164,41 @@ public static void MapClearButtonVisibility(EntryHandler handler, IEntry entry) public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) { } [MissingMapper] - public static void MapKeyboard(EntryHandler handler, IEntry entry) { } + public static void MapKeyboard(EntryHandler handler, IEntry entry) + { + if (handler.NativeView is not { } nativeView) + return; + + // https://developer.gnome.org/gtk3/stable/GtkEntry.html#gtk-entry-set-input-purpose + // seems not to work + switch (entry.Keyboard) + { + case EmailKeyboard: + nativeView.InputPurpose = InputPurpose.Email; + + break; + case NumericKeyboard: + nativeView.InputPurpose = InputPurpose.Number; + + break; + case TelephoneKeyboard: + nativeView.InputPurpose = InputPurpose.Phone; + + break; + case TextKeyboard: + nativeView.InputPurpose = InputPurpose.FreeForm; + + break; + case UrlKeyboard: + nativeView.InputPurpose = InputPurpose.Url; + + break; + default: + nativeView.InputPurpose = nativeView.InputPurpose; + + break; + } + } } diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs index e2f77f2c4501..1abd50c0b14b 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs @@ -3,17 +3,21 @@ namespace Microsoft.Maui.Handlers { + + // https://developer.gnome.org/gtk3/stable/GtkScale.html + public partial class SliderHandler : ViewHandler { + protected override Scale CreateNativeView() { - return new Scale(Orientation.Horizontal,0,1,.1); + return new Scale(Orientation.Horizontal, 0, 1, .1); } protected override void ConnectHandler(Scale nativeView) { base.ConnectHandler(nativeView); - + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); nativeView.ValueChanged += OnNativeViewValueChanged; @@ -22,7 +26,7 @@ protected override void ConnectHandler(Scale nativeView) protected override void DisconnectHandler(Scale nativeView) { base.DisconnectHandler(nativeView); - + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); nativeView.ValueChanged -= OnNativeViewValueChanged; @@ -31,11 +35,11 @@ protected override void DisconnectHandler(Scale nativeView) void OnNativeViewValueChanged(object? sender, EventArgs e) { - if (sender is not Scale nativeView || VirtualView is not {} virtualView) + if (sender is not Scale nativeView || VirtualView is not { } virtualView) return; - + virtualView.Value = nativeView.Value; - + } public static void MapMinimum(SliderHandler handler, ISlider slider) @@ -59,7 +63,42 @@ public static void MapMinimumTrackColor(SliderHandler handler, ISlider slider) { [MissingMapper] public static void MapMaximumTrackColor(SliderHandler handler, ISlider slider) { } + public static void MapThumbColor(SliderHandler handler, ISlider slider) + { + if (handler.NativeView is not { } nativeView) + return; + + // this don't work cause slider is an icon + nativeView.SetColor(slider.ThumbColor, "color", "contents > trough > slider"); + + } + [MissingMapper] - public static void MapThumbColor(SliderHandler handler, ISlider slider) { } + public static void MapThumbImageSource(SliderHandler handler, ISlider slider) + { + if (handler.NativeView is not { } nativeView) + return; + + var img = slider.ThumbImageSource; + + if (img == null) + return; + + var provider = handler.GetRequiredService(); + + img.UpdateImageSourceAsync(1, provider, p => + { + if (p == null) + return; + + var css = p.CssImage(); + // not working: + nativeView.SetStyleImage(css, nativeView.CssMainNode(), "background-image", "contents > trough > slider"); + + }) + .FireAndForget(handler); + } + } -} + +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs index c5a106a8c005..a4c867d2e781 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs @@ -2,8 +2,12 @@ namespace Microsoft.Maui.Handlers { + + // https://developer.gnome.org/gtk3/stable/GtkSwitch.html + public partial class SwitchHandler : ViewHandler { + // protected override Switch CreateNativeView() { return new Switch(); @@ -18,6 +22,13 @@ public static void MapIsOn(SwitchHandler handler, ISwitch view) public static void MapTrackColor(SwitchHandler handler, ISwitch view) { } [MissingMapper] - public static void MapThumbColor(SwitchHandler handler, ISwitch view) { } + public static void MapThumbColor(SwitchHandler handler, ISwitch view) + { + if (handler.NativeView is not { } nativeView) + return; + + // this don't work cause slider is an icon + nativeView.SetColor(view.ThumbColor, "color", "slider"); + } } } From 75093c69f6601b1e65a9da7d579f503ff116abc3 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:10:59 +0200 Subject: [PATCH 067/425] Compatibility.csproj Gtk GtkPlatformServices.cs: implement GetStreamAsync --- src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs index a0ab1cf90cd2..5ffe5ad43850 100644 --- a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs +++ b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs @@ -72,11 +72,16 @@ public Color GetNamedColor(string name) public OSAppTheme RequestedTheme { get; set; } -#pragma warning disable 1998 public async Task GetStreamAsync(Uri uri, CancellationToken cancellationToken) -#pragma warning restore 1998 + { - throw new NotImplementedException(); + using var client = new System.Net.Http.HttpClient(); + + // Do not remove this await otherwise the client will dispose before + // the stream even starts + var result = await StreamWrapper.GetStreamAsync(uri, cancellationToken, client).ConfigureAwait(false); + + return result; } From 4937b84630372e02c4a6d71af82a4671d5f21fdd Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:11:41 +0200 Subject: [PATCH 068/425] Compatibility.csproj Gtk implement NativeBindingservice.cs & NativeValueConverterService.cs --- .../Gtk/Extensions/NativeBindingExtensions.cs | 34 ++++++++++++++++ .../Core/src/Gtk/NativeBindingservice.cs | 39 +++++++++++++++++++ .../src/Gtk/NativeValueConverterService.cs | 20 ++++++++++ 3 files changed, 93 insertions(+) create mode 100644 src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs create mode 100644 src/Compatibility/Core/src/Gtk/NativeBindingservice.cs create mode 100644 src/Compatibility/Core/src/Gtk/NativeValueConverterService.cs diff --git a/src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs b/src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs new file mode 100644 index 000000000000..e3eb7043f037 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using Microsoft.Maui.Controls.Internals; + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + public static class NativeBindingExtensions + { + public static void SetBinding(this global::Gtk.Widget view, string propertyName, BindingBase binding, string updateSourceEventName = null) + { + NativeBindingHelpers.SetBinding(view, propertyName, binding, updateSourceEventName); + } + + public static void SetBinding(this global::Gtk.Widget view, BindableProperty targetProperty, BindingBase binding) + { + NativeBindingHelpers.SetBinding(view, targetProperty, binding); + } + + public static void SetValue(this global::Gtk.Widget target, BindableProperty targetProperty, object value) + { + NativeBindingHelpers.SetValue(target, targetProperty, value); + } + + public static void SetBindingContext(this global::Gtk.Widget target, object bindingContext, Func> getChildren = null) + { + NativeBindingHelpers.SetBindingContext(target, bindingContext, getChildren); + } + + internal static void TransferBindablePropertiesToWrapper(this global::Gtk.Widget target, View wrapper) + { + NativeBindingHelpers.TransferBindablePropertiesToWrapper(target, wrapper); + } + } +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/NativeBindingservice.cs b/src/Compatibility/Core/src/Gtk/NativeBindingservice.cs new file mode 100644 index 000000000000..074de90ca780 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/NativeBindingservice.cs @@ -0,0 +1,39 @@ +using System; +using Microsoft.Maui.Controls.Xaml.Internals; + +[assembly: Microsoft.Maui.Controls.Dependency(typeof(Microsoft.Maui.Controls.Compatibility.Platform.Gtk.NativeBindingService))] + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + class NativeBindingService : INativeBindingService + { + public bool TrySetBinding(object target, string propertyName, BindingBase binding) + { + var view = target as global::Gtk.Widget; + if (view == null) + return false; + if (target.GetType().GetProperty(propertyName)?.GetMethod == null) + return false; + view.SetBinding(propertyName, binding); + return true; + } + + public bool TrySetBinding(object target, BindableProperty property, BindingBase binding) + { + var view = target as global::Gtk.Widget; + if (view == null) + return false; + view.SetBinding(property, binding); + return true; + } + + public bool TrySetValue(object target, BindableProperty property, object value) + { + var view = target as global::Gtk.Widget; + if (view == null) + return false; + view.SetValue(property, value); + return true; + } + } +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/NativeValueConverterService.cs b/src/Compatibility/Core/src/Gtk/NativeValueConverterService.cs new file mode 100644 index 000000000000..201d1b40b418 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/NativeValueConverterService.cs @@ -0,0 +1,20 @@ +using System; +using Microsoft.Maui.Controls.Xaml.Internals; + +[assembly: Microsoft.Maui.Controls.Dependency(typeof(Microsoft.Maui.Controls.Compatibility.Platform.Gtk.NativeValueConverterService))] +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + class NativeValueConverterService : INativeValueConverterService + { + public bool ConvertTo(object value, Type toType, out object nativeValue) + { + nativeValue = null; + if (typeof(global::Gtk.Widget).IsInstanceOfType(value) && toType.IsAssignableFrom(typeof(View))) + { + nativeValue = ((global::Gtk.Widget)value); + return true; + } + return false; + } + } +} \ No newline at end of file From 00e82d93c023e72ae44426ade5b6d54cca4678fd Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:12:52 +0200 Subject: [PATCH 069/425] Compatibility.csproj Gtk merge AppHostBuilderExtensions_.cs into AppHostBuilderExtensions.cs & cleanup code --- .../Core/src/AppHostBuilderExtensions.cs | 11 ++++++- .../Core/src/Gtk/AppHostBuilderExtensions_.cs | 29 ------------------- src/Compatibility/Core/src/Gtk/Forms.cs | 10 +------ 3 files changed, 11 insertions(+), 39 deletions(-) delete mode 100644 src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs index 561a6c777a6f..2562b641e334 100644 --- a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs @@ -27,6 +27,9 @@ using TabbedPageRenderer = Microsoft.Maui.Controls.Compatibility.Platform.iOS.TabbedRenderer; using FlyoutPageRenderer = Microsoft.Maui.Controls.Compatibility.Platform.iOS.PhoneFlyoutPageRenderer; using RadioButtonRenderer = Microsoft.Maui.Controls.Compatibility.Platform.iOS.Platform.DefaultRenderer; +#elif GTK +using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; +using ScrollViewHandler = Microsoft.Maui.Handlers.ScrollView.ScrollViewHandler; #endif using Microsoft.Maui.Hosting; @@ -235,6 +238,12 @@ static IAppHostBuilder SetupDefaults(this IAppHostBuilder builder) #if __IOS__ || MACCATALYST Internals.Registrar.RegisterEffect("Xamarin", "ShadowEffect", typeof(ShadowEffect)); +#endif +#if GTK + handlers.AddHandler(); + DependencyService.Register(); + DependencyService.Register(); + #endif }) .ConfigureServices(); @@ -247,7 +256,7 @@ class MauiCompatBuilder : IMauiServiceBuilder { public void Configure(HostBuilderContext context, IServiceProvider services) { -#if __ANDROID__ || __IOS__ || WINDOWS || MACCATALYST +#if __ANDROID__ || __IOS__ || WINDOWS || MACCATALYST || GTK CompatServiceProvider.SetServiceProvider(services); #endif } diff --git a/src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs b/src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs deleted file mode 100644 index cef0098786a5..000000000000 --- a/src/Compatibility/Core/src/Gtk/AppHostBuilderExtensions_.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.Maui.Handlers.ScrollView; -using Microsoft.Maui.Hosting; - -namespace Microsoft.Maui.Controls.Compatibility -{ - - public static class AppHostBuilderExtensions_ - { - - public static IAppHostBuilder UseCompatibilityRenderers(this IAppHostBuilder builder) - { - - builder.ConfigureMauiHandlers(col => - { - col.AddHandler(); - }); - return builder; - } - - public static IAppHostBuilder UseFormsCompatibility(this IAppHostBuilder builder) - { - - return builder; - } - - - } - -} diff --git a/src/Compatibility/Core/src/Gtk/Forms.cs b/src/Compatibility/Core/src/Gtk/Forms.cs index 961af49edcaf..f93e067d829e 100644 --- a/src/Compatibility/Core/src/Gtk/Forms.cs +++ b/src/Compatibility/Core/src/Gtk/Forms.cs @@ -13,14 +13,6 @@ public static void Init(IActivationState state) Device.PlatformServices = gtkServices; } - internal static void RegisterCompatRenderers( - Assembly[] assemblies, - Assembly defaultRendererAssembly, - Action viewRegistered) - { - ; - } - } -} +} \ No newline at end of file From 7b75ddb4dbe248f36fbeeb2ad69a20152ff4e3ef Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:14:12 +0200 Subject: [PATCH 070/425] Core.csproj Gtk : remove ColorExtensions.cs --- src/Core/src/Platform/Gtk/ColorExtensions.cs | 21 -------------------- 1 file changed, 21 deletions(-) delete mode 100644 src/Core/src/Platform/Gtk/ColorExtensions.cs diff --git a/src/Core/src/Platform/Gtk/ColorExtensions.cs b/src/Core/src/Platform/Gtk/ColorExtensions.cs deleted file mode 100644 index b04a9fbe995f..000000000000 --- a/src/Core/src/Platform/Gtk/ColorExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Microsoft.Maui.Graphics; - -namespace Microsoft.Maui -{ - public static class ColorExtensions - { - public static Gdk.RGBA ToNative(this Color color) - { - string hex = color.ToHex(); - Gdk.RGBA nativeColor = new Gdk.RGBA(); - nativeColor.Parse(hex); - - return nativeColor; - } - - public static Color ToColor(this Gdk.Color color, float opacity = 255) - { - return new Color(color.Red, color.Green, color.Blue, opacity); - } - } -} \ No newline at end of file From c6a3022bbb4a7a37456fe753bf2c60628a122e9b Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:15:13 +0200 Subject: [PATCH 071/425] Controls.Sample.Gtk.csproj: enhance & track api changes --- .../SimpleSampleApp/ExamplePage.cs | 45 ++++++++++++++++--- .../SimpleSampleApp/Startup.cs | 1 - 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 91d4cbdbc16a..8053ea6f03ca 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Maui; using Microsoft.Maui.Controls; +using Microsoft.Maui.Controls.Shapes; using Microsoft.Maui.Graphics; -using Microsoft.Maui.LifecycleEvents; using Debug = System.Diagnostics.Debug; namespace Maui.SimpleSampleApp @@ -509,13 +508,20 @@ void SetupMauiLayout() var picker = new Picker { Title = "Select a monkey", - FontFamily = "Dokdo" + FontFamily = "Dokdo", + TextColor = Colors.Chartreuse, + BackgroundColor = Colors.Yellow, + HorizontalTextAlignment = TextAlignment.Center }; picker.ItemsSource = monkeyList; verticalStack.Add(picker); - verticalStack.Add(new Slider()); + verticalStack.Add(new Slider + { + ThumbColor = Colors.Aqua, + ThumbImageSource = "dotnet_bot.png" + }); verticalStack.Add(new Stepper()); verticalStack.Add(new Stepper { BackgroundColor = Colors.IndianRed }); @@ -556,6 +562,8 @@ void SetupMauiLayout() CharacterSpacing = 6 }); + verticalStack.Add(CreateShapes()); + verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); Content = new ScrollView { Content = verticalStack }; @@ -667,7 +675,8 @@ IView CreateSampleGrid() var topRight = new Label { Text = "Top Right", - BackgroundColor = Colors.Orange + BackgroundColor = Colors.Orange, + TextColor = Colors.Chocolate }; layout.Add(topRight); @@ -688,6 +697,32 @@ IView CreateSampleGrid() return layout; } + IView CreateShapes() + { + var ellipse = new Ellipse { Fill = new SolidColorBrush(Colors.Red), Stroke = new SolidColorBrush(Colors.Blue), StrokeThickness = 4, HeightRequest = 120, WidthRequest = 200 }; + + var line = new Line { X1 = 0, Y1 = 0, X2 = 80, Y2 = 90, Fill = new SolidColorBrush(Colors.Red), Stroke = new SolidColorBrush(Colors.Green), StrokeThickness = 4, StrokeDashArray = new double[] { 2, 2 }, HeightRequest = 200, WidthRequest = 200 }; + var pathData = (Microsoft.Maui.Controls.Shapes.Geometry)new PathGeometryConverter().ConvertFromInvariantString("M15.999996,0L31.999999,13.000001 15.999996,26.199999 0,13.000001z"); + var path = new Microsoft.Maui.Controls.Shapes.Path { Data = pathData, Fill = new SolidColorBrush(Colors.Pink), Stroke = new SolidColorBrush(Colors.Red), StrokeThickness = 1, HeightRequest = 100, WidthRequest = 100 }; + + var polyline = new Polyline { Points = new[] { new Point(10, 10), new Point(100, 50), new Point(50, 90) }, Stroke = new SolidColorBrush(Colors.Black), StrokeThickness = 2, StrokeDashArray = new double[] { 1, 1, 1, 1 }, HeightRequest = 100, WidthRequest = 100 }; + + var polygon = new Polygon { Points = new[] { new Point(10, 10), new Point(100, 50), new Point(50, 90) }, Fill = new SolidColorBrush(Colors.LightBlue), Stroke = new SolidColorBrush(Colors.Black), StrokeThickness = 2, StrokeDashArray = new double[] { 2, 2 }, HeightRequest = 100, WidthRequest = 100 }; + + var rectangle = new Microsoft.Maui.Controls.Shapes.Rectangle { RadiusX = 12, RadiusY = 6, Fill = new LinearGradientBrush(new Microsoft.Maui.Controls.GradientStopCollection { new (Colors.Green, 0), new (Colors.Blue, 1) }, new Point(0, 0), new Point(1, 0)), Stroke = new SolidColorBrush(Colors.Purple), StrokeThickness = 8, StrokeDashArray = new float[] { 2, 2 }, HeightRequest = 120, WidthRequest = 200 }; + + var verticalStack = new VerticalStackLayout + { + ellipse, + line, + path, + polyline, + polygon, + rectangle + }; + + return verticalStack; + } } class TestDrawable : IDrawable diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs index 9699b36c28f5..db3911e72d98 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs @@ -35,7 +35,6 @@ public void Configure(IAppHostBuilder appBuilder) { // Use just the Forms renderers appBuilder = appBuilder - .UseCompatibilityRenderers() .UseMauiApp(); } From 1bec8526a0764813130264fedf7ca1f5a5e21efc Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 03:15:47 +0200 Subject: [PATCH 072/425] build: Microsoft.Maui.Controls.MultiTargeting.targets & Compatibility.csproj: refine DefineConstants --- .nuspec/Microsoft.Maui.Controls.MultiTargeting.targets | 2 +- src/Compatibility/Core/src/Compatibility.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index caa40e933451..1d890a9be632 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -1,6 +1,6 @@ - + $(DefineConstants);LINUX;GTK diff --git a/src/Compatibility/Core/src/Compatibility.csproj b/src/Compatibility/Core/src/Compatibility.csproj index ec12fd099553..3400dd99983f 100644 --- a/src/Compatibility/Core/src/Compatibility.csproj +++ b/src/Compatibility/Core/src/Compatibility.csproj @@ -10,7 +10,7 @@ WinUI\ Gtk\ - + $(DefineConstants);LINUX;GTK @@ -62,7 +62,7 @@ - + From 5015a134f6d444980d1d71af0c6fd27388da903c Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 16:42:08 +0200 Subject: [PATCH 073/425] Core.csproj Gtk : implement Background - GradientPaint --- .../src/Handlers/Slider/SliderHandler.Gtk.cs | 4 +- src/Core/src/Platform/Gtk/GtkCssExtensions.cs | 56 +++++++++++++++++-- src/Core/src/Platform/Gtk/ViewExtensions.cs | 35 ++++++++---- .../src/Platform/Gtk/WidgetColorExtensions.cs | 2 +- 4 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs index 1abd50c0b14b..59b2b28ced14 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers { // https://developer.gnome.org/gtk3/stable/GtkScale.html - + public partial class SliderHandler : ViewHandler { @@ -93,7 +93,7 @@ public static void MapThumbImageSource(SliderHandler handler, ISlider slider) var css = p.CssImage(); // not working: - nativeView.SetStyleImage(css, nativeView.CssMainNode(), "background-image", "contents > trough > slider"); + nativeView.SetStyleImage(css, "background-image", "contents > trough > slider"); }) .FireAndForget(handler); diff --git a/src/Core/src/Platform/Gtk/GtkCssExtensions.cs b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs index 9b81ec8b10ac..aaab470c5e96 100644 --- a/src/Core/src/Platform/Gtk/GtkCssExtensions.cs +++ b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs @@ -1,5 +1,6 @@ using System; -using Gtk; +using System.Linq; +using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; using Pango; @@ -15,9 +16,9 @@ public static string CssMainNode(this Gtk.Widget nativeView) switch (nativeView) { - case ProgressBar: + case Gtk.ProgressBar: - case ComboBox box: + case Gtk.ComboBox box: default: mainNode = nativeView.StyleContext.Path.ToString().Split(':')[0]; @@ -30,12 +31,52 @@ public static string CssMainNode(this Gtk.Widget nativeView) public static string CssImage(this Gdk.Pixbuf nativeImage) { - var puf = nativeImage.SaveToBuffer(Graphics.ImageFormat.Png.ToImageExtension()); + var puf = nativeImage.SaveToBuffer(ImageFormat.Png.ToImageExtension()); return $"url('data:image/png;base64,{Convert.ToBase64String(puf)}')"; } - - public static void SetStyleImage(this Gtk.Widget widget, string cssImage, string mainNode, string attr, string? subNode = null) + + [PortHandler("implement drawing of other paints than GradientPaint")] + public static string? CssImage(this Paint? paint) + { + if (paint.IsNullOrEmpty()) + return null; + + string Stops(GradientStop[] sorted) + { + var max = sorted[^1].Offset; + max = 100 / (max == 0 ? 1 : max); + var stops = string.Join(",", sorted.Select(s => $"{s.Color.ToGdkRgba().ToString()} {s.Offset * max}%")); + + return stops; + } + + switch (paint) + { + case LinearGradientPaint lg: + { + var stops = Stops(lg.GetSortedStops()); + var css = $"linear-gradient( to right, {stops})"; + + return css; + } + case RadialGradientPaint rg: + { + var stops = Stops(rg.GetSortedStops()); + var css = $"radial-gradient({stops})"; + + return css; + } + + default: + break; + } + + return null; + + } + + public static void SetStyleImageNode(this Gtk.Widget widget, string cssImage, string mainNode, string attr, string? subNode = null) { using var p = new Gtk.CssProvider(); @@ -45,6 +86,9 @@ public static void SetStyleImage(this Gtk.Widget widget, string cssImage, string widget.StyleContext.AddProvider(p, Gtk.StyleProviderPriority.User); } + public static void SetStyleImage(this Gtk.Widget widget, string cssImage, string attr, string? subNode = null) + => widget.SetStyleImageNode(cssImage, widget.CssMainNode(), attr, subNode); + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 84be92ce306a..158e01db0afb 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -12,17 +12,18 @@ public static class ViewExtensions public static void UpdateAutomationId(this Widget nativeView, IView view) { } - [PortHandler("implement drawing of other paints than solidpaint")] public static void UpdateBackground(this Widget nativeView, IView view) { var color = view.Background?.BackgroundColor; - if (view.Background is SolidPaint solidPaint) + if (view.Background is { } paint) { - color = solidPaint.Color; + color = paint.ToColor(); } - if (color == null) + var css = view.Background.CssImage(); + + if (color == null && css == null) return; switch (nativeView) @@ -37,21 +38,29 @@ public static void UpdateBackground(this Widget nativeView, IView view) break; default: - nativeView.SetBackgroundColor(color); + if (css != null) + { + nativeView.SetStyleImage(css, "background-image"); + } + else + { + nativeView.SetBackgroundColor(color); + } break; } } - + public static void UpdateForeground(this Widget nativeView, Paint? paint) { - var color = paint?.ForegroundColor; + if (paint == null) + return; - if (paint is SolidPaint solidPaint) - { - color = solidPaint.Color; - } + var color = paint.ForegroundColor; + + if (paint.ToColor() is { } cp) + color = cp; if (color == null) return; @@ -65,9 +74,10 @@ public static void UpdateForeground(this Widget nativeView, Paint? paint) case CheckButton: // no effect as check is an icon nativeView.SetColor(color, "color", "check"); + break; case ComboBox box: - box.GetCellRendererText().SetForeground(color); + box.GetCellRendererText().SetForeground(color); break; default: @@ -77,6 +87,7 @@ public static void UpdateForeground(this Widget nativeView, Paint? paint) } } + public static void UpdateIsEnabled(this Widget nativeView, IView view) => nativeView?.UpdateIsEnabled(view.IsEnabled); diff --git a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs index 68de89854b76..0651d649779b 100644 --- a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs @@ -9,7 +9,7 @@ namespace Microsoft.Maui public static class WidgetColorExtensions { - public static void SetBackgroundColor(this Gtk.Widget widget, Graphics.Color color) + public static void SetBackgroundColor(this Gtk.Widget widget, Graphics.Color? color) { if (color == null) return; From c5dc4df56130e892fb874df4f5f9b9f7375bd21b Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 17 Jun 2021 16:42:37 +0200 Subject: [PATCH 074/425] Controls.Sample.Gtk.csproj: changes to test gradient-paint --- .../SimpleSampleApp/ExamplePage.cs | 88 +++++++++++++++++-- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 8053ea6f03ca..69074bb73207 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -6,6 +6,7 @@ using Microsoft.Maui.Controls.Shapes; using Microsoft.Maui.Graphics; using Debug = System.Diagnostics.Debug; +using GradientStop = Microsoft.Maui.Graphics.GradientStop; namespace Maui.SimpleSampleApp { @@ -320,6 +321,17 @@ void SetupMauiLayout() verticalStack.Add(underlineLabel); + var labelG = new Label + { + Text = "this has gradient", + Background = new RadialGradientBrush(new GradientStopCollection + { + new (Colors.Aqua, 0), + new (Colors.Green, 10), + }) + }; + verticalStack.Add(labelG); + verticalStack.Add(new ActivityIndicator()); verticalStack.Add(new ActivityIndicator @@ -519,7 +531,7 @@ void SetupMauiLayout() verticalStack.Add(new Slider { - ThumbColor = Colors.Aqua, + ThumbColor = Colors.Aqua, ThumbImageSource = "dotnet_bot.png" }); @@ -594,6 +606,7 @@ void SetupCompatibilityLayout() verticalStack.Add(label); + var button = new Button() { Text = _viewModel.Text, @@ -699,17 +712,77 @@ IView CreateSampleGrid() IView CreateShapes() { - var ellipse = new Ellipse { Fill = new SolidColorBrush(Colors.Red), Stroke = new SolidColorBrush(Colors.Blue), StrokeThickness = 4, HeightRequest = 120, WidthRequest = 200 }; + var ellipse = new Ellipse + { + Fill = new SolidColorBrush(Colors.Red), + Stroke = new SolidColorBrush(Colors.Blue), + StrokeThickness = 4, + HeightRequest = 120, + WidthRequest = 200 + }; + + var line = new Line + { + X1 = 0, + Y1 = 0, + X2 = 80, + Y2 = 90, + Fill = new SolidColorBrush(Colors.Red), + Stroke = new SolidColorBrush(Colors.Green), + StrokeThickness = 4, + StrokeDashArray = new double[] { 2, 2 }, + HeightRequest = 200, + WidthRequest = 200 + }; - var line = new Line { X1 = 0, Y1 = 0, X2 = 80, Y2 = 90, Fill = new SolidColorBrush(Colors.Red), Stroke = new SolidColorBrush(Colors.Green), StrokeThickness = 4, StrokeDashArray = new double[] { 2, 2 }, HeightRequest = 200, WidthRequest = 200 }; var pathData = (Microsoft.Maui.Controls.Shapes.Geometry)new PathGeometryConverter().ConvertFromInvariantString("M15.999996,0L31.999999,13.000001 15.999996,26.199999 0,13.000001z"); - var path = new Microsoft.Maui.Controls.Shapes.Path { Data = pathData, Fill = new SolidColorBrush(Colors.Pink), Stroke = new SolidColorBrush(Colors.Red), StrokeThickness = 1, HeightRequest = 100, WidthRequest = 100 }; - var polyline = new Polyline { Points = new[] { new Point(10, 10), new Point(100, 50), new Point(50, 90) }, Stroke = new SolidColorBrush(Colors.Black), StrokeThickness = 2, StrokeDashArray = new double[] { 1, 1, 1, 1 }, HeightRequest = 100, WidthRequest = 100 }; + var path = new Microsoft.Maui.Controls.Shapes.Path + { + Data = pathData, + Fill = new SolidColorBrush(Colors.Pink), + Stroke = new SolidColorBrush(Colors.Red), + StrokeThickness = 1, + HeightRequest = 100, + WidthRequest = 100 + }; - var polygon = new Polygon { Points = new[] { new Point(10, 10), new Point(100, 50), new Point(50, 90) }, Fill = new SolidColorBrush(Colors.LightBlue), Stroke = new SolidColorBrush(Colors.Black), StrokeThickness = 2, StrokeDashArray = new double[] { 2, 2 }, HeightRequest = 100, WidthRequest = 100 }; + var polyline = new Polyline + { + Points = new[] { new Point(10, 10), new Point(100, 50), new Point(50, 90) }, + Stroke = new SolidColorBrush(Colors.Black), + StrokeThickness = 2, + StrokeDashArray = new double[] { 1, 1, 1, 1 }, + HeightRequest = 100, + WidthRequest = 100 + }; - var rectangle = new Microsoft.Maui.Controls.Shapes.Rectangle { RadiusX = 12, RadiusY = 6, Fill = new LinearGradientBrush(new Microsoft.Maui.Controls.GradientStopCollection { new (Colors.Green, 0), new (Colors.Blue, 1) }, new Point(0, 0), new Point(1, 0)), Stroke = new SolidColorBrush(Colors.Purple), StrokeThickness = 8, StrokeDashArray = new float[] { 2, 2 }, HeightRequest = 120, WidthRequest = 200 }; + var polygon = new Polygon + { + Points = new[] { new Point(10, 10), new Point(100, 50), new Point(50, 90) }, + Fill = new SolidColorBrush(Colors.LightBlue), + Stroke = new SolidColorBrush(Colors.Black), + StrokeThickness = 2, + StrokeDashArray = new double[] { 2, 2 }, + HeightRequest = 100, + WidthRequest = 100 + }; + + var rectangle = new Microsoft.Maui.Controls.Shapes.Rectangle + { + RadiusX = 12, + RadiusY = 6, + Fill = new LinearGradientBrush(new Microsoft.Maui.Controls.GradientStopCollection + { + new(Colors.Green, 0), + new(Colors.Blue, 1) + }, new Point(0, 0), new Point(1, 0)), + Stroke = new SolidColorBrush(Colors.Purple), + StrokeThickness = 8, + StrokeDashArray = new float[] { 2, 2 }, + HeightRequest = 120, + WidthRequest = 200 + }; var verticalStack = new VerticalStackLayout { @@ -723,6 +796,7 @@ IView CreateShapes() return verticalStack; } + } class TestDrawable : IDrawable From 121fa6b2457c270ec6ce9ae596411ab9779addc8 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:33:44 +0200 Subject: [PATCH 075/425] build: switch to GtkSharp-Dev & use GtkSharp 3.24.24.64 --- .../Microsoft.Maui.Controls.MultiTargeting.targets | 11 +++++------ NuGet.config | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index f577b62532d8..e6e5218ec170 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -54,17 +54,16 @@ - - - - - + + + + Platform\Windows\ @@ -123,7 +122,7 @@ - + $(SolutionDir)\src\Microsoft.Maui.Graphics.Gtk\Microsoft.Maui.Graphics.Gtk.dll diff --git a/NuGet.config b/NuGet.config index 2d3138310461..adfe00cab5c6 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,7 +7,7 @@ - + From a9ca7039932271719ec19e2c83f9847428b07bbf Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:36:45 +0200 Subject: [PATCH 076/425] Microsoft.Maui.Graphics.Gtk: update --- .../Microsoft.Maui.Graphics.Gtk.deps.json | 18 ++++++++++++++++++ .../Microsoft.Maui.Graphics.Gtk.dll | Bin 53760 -> 53248 bytes .../Microsoft.Maui.Graphics.dll | Bin 158208 -> 162816 bytes .../ref/Microsoft.Maui.Graphics.Gtk.dll | Bin 26112 -> 26112 bytes 4 files changed, 18 insertions(+) diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json index 21cfb85906c2..cf0f489f5326 100644 --- a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json +++ b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json @@ -107,7 +107,18 @@ } } }, + "System.Numerics.Vectors/4.5.0": { + "runtime": { + "lib/netstandard2.0/System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.4.0", + "fileVersion": "4.6.26515.6" + } + } + }, "Microsoft.Maui.Graphics/0.0.1-alpha1": { + "dependencies": { + "System.Numerics.Vectors": "4.5.0" + }, "runtime": { "Microsoft.Maui.Graphics.dll": {} } @@ -197,6 +208,13 @@ "path": "pangosharp/3.24.24.34", "hashPath": "pangosharp.3.24.24.34.nupkg.sha512" }, + "System.Numerics.Vectors/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", + "path": "system.numerics.vectors/4.5.0", + "hashPath": "system.numerics.vectors.4.5.0.nupkg.sha512" + }, "Microsoft.Maui.Graphics/0.0.1-alpha1": { "type": "project", "serviceable": false, diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll index 2fe633183140b76b002d426e169b7c9b3024fca6..39ee10047af5e0374809be04cee7b764e0616f40 100644 GIT binary patch literal 53248 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 NP3)y#U;qC&@IS9Jx>^7L literal 53760 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

! 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

    2N)jP2h#*agkQYP< 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 literal 26112 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 From 409c3decb75142f17b49bb7d7da047721eb50617 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:47:56 +0200 Subject: [PATCH 077/425] Core.csproj Gtk : MauiContext: track api changes --- src/Core/src/Platform/Gtk/MauiContext.cs | 27 ------------------------ src/Core/src/Platform/IMauiContext.cs | 2 ++ src/Core/src/Platform/MauiContext.Gtk.cs | 12 +++++++++++ 3 files changed, 14 insertions(+), 27 deletions(-) delete mode 100644 src/Core/src/Platform/Gtk/MauiContext.cs create mode 100644 src/Core/src/Platform/MauiContext.Gtk.cs diff --git a/src/Core/src/Platform/Gtk/MauiContext.cs b/src/Core/src/Platform/Gtk/MauiContext.cs deleted file mode 100644 index e6549d784177..000000000000 --- a/src/Core/src/Platform/Gtk/MauiContext.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; - -namespace Microsoft.Maui -{ - public class MauiContext : IMauiContext - { - readonly IServiceProvider? _services; - readonly IMauiHandlersServiceProvider? _mauiHandlersServiceProvider; - - public MauiContext() - { - } - - public MauiContext(IServiceProvider services) - { - _services = services ?? throw new ArgumentNullException(nameof(services)); - _mauiHandlersServiceProvider = Services.GetRequiredService(); - } - - public IServiceProvider Services => - _services ?? throw new InvalidOperationException($"No service provider was specified during construction."); - - public IMauiHandlersServiceProvider Handlers => - _mauiHandlersServiceProvider ?? throw new InvalidOperationException($"No service provider was specified during construction."); - } -} \ No newline at end of file diff --git a/src/Core/src/Platform/IMauiContext.cs b/src/Core/src/Platform/IMauiContext.cs index f8c6c86234d7..9446161c2c00 100644 --- a/src/Core/src/Platform/IMauiContext.cs +++ b/src/Core/src/Platform/IMauiContext.cs @@ -15,6 +15,8 @@ public interface IMauiContext UIKit.UIWindow? Window { get; } #elif WINDOWS UI.Xaml.Window? Window { get; } +#elif GTK + Gtk.Window? Window { get;} #endif } diff --git a/src/Core/src/Platform/MauiContext.Gtk.cs b/src/Core/src/Platform/MauiContext.Gtk.cs new file mode 100644 index 000000000000..66a7f4680588 --- /dev/null +++ b/src/Core/src/Platform/MauiContext.Gtk.cs @@ -0,0 +1,12 @@ +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.Maui +{ + public partial class MauiContext : IMauiContext + { + + public Gtk.Window? Window { get; private set; } + + } +} \ No newline at end of file From 0614e58162e39ef44106eaa8c958398374330e9e Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:49:06 +0200 Subject: [PATCH 078/425] Core.csproj Gtk : introduce NativeTicker.Gtk.cs (stub) --- src/Core/src/Animations/NativeTicker.Gtk.cs | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/Core/src/Animations/NativeTicker.Gtk.cs diff --git a/src/Core/src/Animations/NativeTicker.Gtk.cs b/src/Core/src/Animations/NativeTicker.Gtk.cs new file mode 100644 index 000000000000..6c7a3c750c5d --- /dev/null +++ b/src/Core/src/Animations/NativeTicker.Gtk.cs @@ -0,0 +1,6 @@ +namespace Microsoft.Maui.Animations +{ + public class NativeTicker : Ticker + { + } +} \ No newline at end of file From 354446e02aed02adab3ec70feeffca60013ecb8c Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:51:32 +0200 Subject: [PATCH 079/425] Core.csproj Gtk : enhance GtkLifecycle.cs & MauiGtkApplication.cs:Make the non-generic apps the main type (#1517) --- .../src/LifecycleEvents/Gtk/GtkLifecycle.cs | 19 +++- .../Gtk/GtkLifecycleBuilderExtensions.cs | 15 ++- .../Gtk/GtkLifecycleExtensions.cs | 2 +- .../src/Platform/Gtk/MauiGtkApplication.cs | 100 ++++++++++-------- 4 files changed, 87 insertions(+), 49 deletions(-) diff --git a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs index dbc361df194e..3eaac589400b 100644 --- a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs @@ -4,12 +4,26 @@ namespace Microsoft.Maui.LifecycleEvents { + public class ActivationEventArgs : EventArgs + { + + public ActivationEventArgs(ActivationState state) : base() + { + ActivationState = state; + } + + public ActivationState ActivationState { get; } + + } + public static class GtkLifecycle { public delegate void OnStartup(Gtk.Application application, EventArgs args); - public delegate void OnLaunched(Gtk.Application application, EventArgs args); + public delegate void OnLaunching(MauiGtkApplication application, ActivationEventArgs args); + + public delegate void OnLaunched(Gtk.Application application, ActivationEventArgs args); public delegate void OnOpened(Gtk.Application application, OpenedArgs args); @@ -26,6 +40,9 @@ public static class GtkLifecycle public delegate void OnStateChanged(Gtk.Window window, Gtk.WindowStateEventArgs args); public delegate void OnDelete(Gtk.Window window, Gtk.DeleteEventArgs args); + + internal delegate void OnMauiContextCreated(IMauiContext mauiContext); + } diff --git a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs index 078ff39e74cb..9c0a56d57a0f 100644 --- a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs @@ -1,11 +1,24 @@ namespace Microsoft.Maui.LifecycleEvents { + public static class GtkLifecycleBuilderExtensions { + public static IGtkLifecycleBuilder OnActivated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnShown del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnClosed(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnHidden del) => lifecycle.OnEvent(del); - public static IGtkLifecycleBuilder OnLaunched(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnStartup del) => lifecycle.OnEvent(del); + + public static IGtkLifecycleBuilder OnLaunching(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnLaunching del) => lifecycle.OnEvent(del); + + public static IGtkLifecycleBuilder OnLaunched(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnLaunched del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnVisibilityChanged(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnVisibilityChanged del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnShown(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnShown del) => lifecycle.OnEvent(del); + + internal static IGtkLifecycleBuilder OnMauiContextCreated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnMauiContextCreated del) => lifecycle.OnEvent(del); + + } + } \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleExtensions.cs index 91236754e1cf..942755923f1d 100644 --- a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleExtensions.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleExtensions.cs @@ -22,7 +22,7 @@ public LifecycleBuilder(ILifecycleBuilder builder) _builder = builder; } - public void AddEvent(string eventName, Delegate action) => + public void AddEvent(string eventName, TDelegate action) where TDelegate : Delegate => _builder.AddEvent(eventName, action); } } diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index 40a4cd4fa166..f15ccc313dff 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -15,6 +15,46 @@ public class MauiGtkApplication : MauiGtkApplication where TStartup : IStartup, new() { + protected override IStartup OnCreateStartup() => new TStartup(); + + // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid + // TODO: find a better algo for id + public override string ApplicationId => $"{typeof(TStartup).Namespace}.{typeof(TStartup).Name}.{Name}".PadRight(255, ' ').Substring(0, 255).Trim(); + + } + + public abstract class MauiGtkApplication + { + + public abstract string ApplicationId { get; } + + ///

    + /// overrides creation of rootcontainer + /// rootcontainer is MainWindow 's + /// paramter is Maui's Mainwindows as Gtk.Widget + /// + public Func TopContainerOverride { get; set; } = null!; + + string? _name; + + // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid + public string? Name + { + get => _name ??= $"A{Guid.NewGuid()}"; + set { _name = value; } + } + + // https://developer.gnome.org/gtk3/stable/GtkApplication.html + public static Gtk.Application CurrentGtkApplication { get; internal set; } = null!; + + public static MauiGtkApplication Current { get; internal set; } = null!; + + public MauiGtkMainWindow MainWindow { get; protected set; } = null!; + + public IServiceProvider Services { get; protected set; } = null!; + + public IApplication Application { get; protected set; } = null!; + public void Run() { Launch(new EventArgs()); @@ -36,7 +76,7 @@ protected void RegisterLifecycleEvents(Gtk.Application app) protected void OnStartup(object sender, EventArgs args) { - StartupMainWindow(); + CreateMainWindow(); Services.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } @@ -57,7 +97,7 @@ protected void OnShutdown(object sender, EventArgs args) { Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); - MauiGtkApplication.DispatchPendingEvents(); + DispatchPendingEvents(); } @@ -76,10 +116,6 @@ protected void OnWindowAdded(object o, WindowAddedArgs args) // future use: to have notifications at cross platform Window level } - // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid - // TODO: find a better algo for id - public string ApplicationId => $"{typeof(TStartup).Namespace}.{typeof(TStartup).Name}.{base.Name}".PadRight(255, ' ').Substring(0, 255).Trim(); - Widget CreateRootContainer(Widget nativePage) { var b = new Box(Orientation.Vertical, 0) @@ -92,9 +128,11 @@ Widget CreateRootContainer(Widget nativePage) return b; } + protected abstract IStartup OnCreateStartup(); + protected void StartupLauch(object sender, EventArgs args) { - var startup = new TStartup(); + var startup = OnCreateStartup(); var host = startup .CreateAppHostBuilder() @@ -103,14 +141,19 @@ protected void StartupLauch(object sender, EventArgs args) .Build(); Services = host.Services; - Application = Services.GetRequiredService(); var mauiContext = new MauiContext(Services); + Services.InvokeLifecycleEvents(del => del(mauiContext)); var activationState = new ActivationState(mauiContext); + + Services.InvokeLifecycleEvents(del => del(this, new ActivationEventArgs(activationState))); + + Application = Services.GetRequiredService(); + var window = Application.CreateWindow(activationState); - var content = window.View; + var content = window.Content; var nativeContent = content.ToNative(mauiContext); var canvas = TopContainerOverride?.Invoke(nativeContent) ?? CreateRootContainer(nativeContent); @@ -123,10 +166,10 @@ protected void StartupLauch(object sender, EventArgs args) MainWindow.Present(); - Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, new ActivationEventArgs(activationState))); } - void StartupMainWindow() + void CreateMainWindow() { MainWindow = new MauiGtkMainWindow(); CurrentGtkApplication.AddWindow(MainWindow); @@ -154,41 +197,6 @@ protected void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollectio //future use: there will be a need of GtkNativeServices, eg. for WebView } - } - - public abstract class MauiGtkApplication - { - - /// - /// overrides creation of rootcontainer - /// rootcontainer is MainWindow 's - /// paramter is Maui's Mainwindows as Gtk.Widget - /// - public Func TopContainerOverride { get; set; } = null!; - - protected MauiGtkApplication() - { } - - string? _name; - - // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid - public string? Name - { - get => _name ??= $"A{Guid.NewGuid()}"; - set { _name = value; } - } - - // https://developer.gnome.org/gtk3/stable/GtkApplication.html - public static Gtk.Application CurrentGtkApplication { get; internal set; } = null!; - - public static MauiGtkApplication Current { get; internal set; } = null!; - - public MauiGtkMainWindow MainWindow { get; protected set; } = null!; - - public IServiceProvider Services { get; protected set; } = null!; - - public IApplication Application { get; protected set; } = null!; - public static void DispatchPendingEvents() { // The loop is limited to 1000 iterations as a workaround for an issue that some users From 900307c60ebdf61ec991736fd2081abdd8426e3a Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:52:10 +0200 Subject: [PATCH 080/425] Core.csproj Gtk : MauiWindow.cs: track api changes & mark as obsolete --- src/Core/src/Platform/Gtk/MauiWindow.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Gtk/MauiWindow.cs b/src/Core/src/Platform/Gtk/MauiWindow.cs index ce9e729b7602..a727cd9004be 100644 --- a/src/Core/src/Platform/Gtk/MauiWindow.cs +++ b/src/Core/src/Platform/Gtk/MauiWindow.cs @@ -7,6 +7,8 @@ namespace Microsoft.Maui { + + [Obsolete("use MauiGtkApplication")] public class MauiWindow : Window where TStartup : IStartup, new() { @@ -27,7 +29,7 @@ public MauiWindow() : base(WindowType.Toplevel) var activationState = new ActivationState(mauiContext); var window = Application.CreateWindow(activationState); - var content = window.View; + var content = window.Content; Add(content.ToNative(mauiContext)); Child.ShowAll(); From 15ad3e110adce330e99fffd140fdc55831a613f0 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:56:56 +0200 Subject: [PATCH 081/425] Core.csproj Gtk : FileImageSourceService.Gtk.cs, ImageSourceServiceResult.cs: introduce loading from Resource --- .../FileImageSourceService.Gtk.cs | 52 +++++++++++++++++-- .../Gtk/ImageSourceServiceResult.cs | 10 +++- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs b/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs index ac2e02a9d0b6..25587fad73fe 100644 --- a/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs +++ b/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs @@ -1,6 +1,8 @@ #nullable enable using System; +using System.ComponentModel.DataAnnotations; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; @@ -8,8 +10,10 @@ namespace Microsoft.Maui { + public partial class FileImageSourceService { + public override Task?> GetImageAsync(IImageSource imageSource, float scale = 1, CancellationToken cancellationToken = default) => GetImageAsync((IFileImageSource)imageSource, scale, cancellationToken); @@ -20,27 +24,67 @@ public partial class FileImageSourceService var filename = imageSource.File; + NativeImage? TryLoadFile(string file) + { + if (File.Exists(file)) + return new NativeImage(filename); + + return null; + } + + NativeImage? TryLoadResource(string file) + { + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + var names = assembly.GetManifestResourceNames(); + var res = names.FirstOrDefault(r => r.EndsWith($".{file}")); + + if (res != null) + { + return new(assembly, res); + } + } + + return default; + + } + try { - var image = File.Exists(filename) - ? new NativeImage(filename) - : NativeImage.LoadFromResource(filename); + var imageDirectory = Configuration?.GetImageDirectory(); + var image = TryLoadFile(filename); + + if (image == null && imageDirectory != null) + { + image = TryLoadFile(Path.Combine(imageDirectory, filename)); + } + + var isResource = false; + + if (image == null) + { + image = TryLoadResource(filename); + isResource = true; + } if (image == null) throw new InvalidOperationException("Unable to load image file."); - var result = new ImageSourceServiceResult(image, () => image.Dispose()); + var result = new ImageSourceServiceResult(image, () => image.Dispose()) { IsResource = isResource }; return FromResult(result); } catch (Exception ex) { Logger?.LogWarning(ex, "Unable to load image file '{File}'.", filename); + throw; } } static Task?> FromResult(IImageSourceServiceResult? result) => Task.FromResult(result); + } + } \ No newline at end of file diff --git a/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs b/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs index 4a4a5796c297..44cd64e4bd38 100644 --- a/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs +++ b/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs @@ -1,16 +1,18 @@ #nullable enable using System; using NativeImage = Gdk.Pixbuf; + namespace Microsoft.Maui { + public class ImageSourceServiceResult : IImageSourceServiceResult { + Action? _dispose; public ImageSourceServiceResult(NativeImage image, Action? dispose = null) : this(image, false, dispose) - { - } + { } public ImageSourceServiceResult(NativeImage image, bool resolutionDependent, Action? dispose = null) { @@ -25,6 +27,8 @@ public ImageSourceServiceResult(NativeImage image, bool resolutionDependent, Act public bool IsDisposed { get; private set; } + public bool IsResource { get; set; } + public void Dispose() { if (IsDisposed) @@ -35,5 +39,7 @@ public void Dispose() _dispose?.Invoke(); _dispose = null; } + } + } \ No newline at end of file From 9cc00eb8a9cb9d3fb0e66624d23b8254db739e00 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 20:59:10 +0200 Subject: [PATCH 082/425] Core.csproj Gtk : ImageViewExtensions.cs: add temporary file support --- .../src/Platform/Gtk/ImageViewExtensions.cs | 15 ++++++++- src/Core/src/Platform/Gtk/TempFile.cs | 31 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/Core/src/Platform/Gtk/TempFile.cs diff --git a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs index 97fdd534076a..8026c2d86a38 100644 --- a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs @@ -2,7 +2,8 @@ using System; using System.Threading; using System.Threading.Tasks; -using Gtk; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui { @@ -132,6 +133,18 @@ public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSour } + public static TempFile? TempFileFor(this Gdk.Pixbuf? p, ImageFormat format = ImageFormat.Png) + { + if (p == null) + return default; + + var tmpfile = new TempFile(); + + p.Save(tmpfile, format.ToImageExtension()); + + return tmpfile; + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/TempFile.cs b/src/Core/src/Platform/Gtk/TempFile.cs new file mode 100644 index 000000000000..e6b110ae091f --- /dev/null +++ b/src/Core/src/Platform/Gtk/TempFile.cs @@ -0,0 +1,31 @@ +using System; +using System.IO; + +namespace Microsoft.Maui +{ + + public class TempFile : IDisposable + { + + public TempFile() + { + Name = Path.GetTempFileName(); + } + + public string Name { get; } + + public static implicit operator string(TempFile d) => d.Name; + + public override string ToString() => Name; + + public void Dispose() + { + var fi = new FileInfo(Name); + + if (fi.Exists) + fi.Delete(); + } + + } + +} \ No newline at end of file From 7afb7e560431a31e4da9b4657d3717b4fadd3d7d Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:01:03 +0200 Subject: [PATCH 083/425] Core.csproj Gtk : GtkCssExtensions.cs: adjust naming / fix image loading / add Gtk.StateFlags - support --- src/Core/src/Platform/Gtk/GtkCssExtensions.cs | 85 ++++++++++--------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/src/Core/src/Platform/Gtk/GtkCssExtensions.cs b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs index aaab470c5e96..1ecc00e5b154 100644 --- a/src/Core/src/Platform/Gtk/GtkCssExtensions.cs +++ b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs @@ -1,8 +1,8 @@ using System; -using System.Linq; +using System.Runtime.CompilerServices; +using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; -using Pango; namespace Microsoft.Maui { @@ -29,65 +29,68 @@ public static string CssMainNode(this Gtk.Widget nativeView) return mainNode; } - public static string CssImage(this Gdk.Pixbuf nativeImage) + /// + /// seems that CssParser doesn't support base64: + /// https://github.com/GNOME/gtk/blob/gtk-3-22/gtk/gtkcssparser.c + /// _gtk_css_parser_read_url + /// + static string CssImage(this Gdk.Pixbuf nativeImage) { var puf = nativeImage.SaveToBuffer(ImageFormat.Png.ToImageExtension()); return $"url('data:image/png;base64,{Convert.ToBase64String(puf)}')"; } - [PortHandler("implement drawing of other paints than GradientPaint")] - public static string? CssImage(this Paint? paint) + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public static void Realize(Gtk.CssProvider p) { - if (paint.IsNullOrEmpty()) - return null; + var l = p.ToString().Length; - string Stops(GradientStop[] sorted) + if (l != 0) { - var max = sorted[^1].Offset; - max = 100 / (max == 0 ? 1 : max); - var stops = string.Join(",", sorted.Select(s => $"{s.Color.ToGdkRgba().ToString()} {s.Offset * max}%")); - - return stops; + // ReSharper disable once EmptyStatement + ; } - - switch (paint) - { - case LinearGradientPaint lg: - { - var stops = Stops(lg.GetSortedStops()); - var css = $"linear-gradient( to right, {stops})"; - - return css; - } - case RadialGradientPaint rg: - { - var stops = Stops(rg.GetSortedStops()); - var css = $"radial-gradient({stops})"; - - return css; - } - - default: - break; - } - - return null; - } - public static void SetStyleImageNode(this Gtk.Widget widget, string cssImage, string mainNode, string attr, string? subNode = null) + public static void SetStyleValueNode(this Gtk.Widget widget, string value, string mainNode, string attr, string? subNode = null) { + if (string.IsNullOrEmpty(value)) + return; + using var p = new Gtk.CssProvider(); subNode = subNode != null ? $" > {subNode} " : subNode; - p.LoadFromData($"{mainNode}{subNode}{{{attr}:{cssImage}}}"); + p.LoadFromData($"{mainNode}{subNode}{{{attr}:{value}}}"); widget.StyleContext.AddProvider(p, Gtk.StyleProviderPriority.User); + + if (value.StartsWith("url")) + Realize(p); } - public static void SetStyleImage(this Gtk.Widget widget, string cssImage, string attr, string? subNode = null) - => widget.SetStyleImageNode(cssImage, widget.CssMainNode(), attr, subNode); + public static void SetStyleValue(this Gtk.Widget widget, string value, string attr, string? subNode = null) + => widget.SetStyleValueNode(value, widget.CssMainNode(), attr, subNode); + + public static string? CssState(this Gtk.StateFlags it) => + it switch + { + StateFlags.Normal => null, + StateFlags.Active => "active", + StateFlags.Prelight => "hover", + StateFlags.Selected => "selected", + StateFlags.Insensitive => "disabled", + StateFlags.Inconsistent => "inconsistent", + StateFlags.Focused => "focused", + StateFlags.Backdrop => "backdrop", + StateFlags.DirLtr => "dir(ltr)", + StateFlags.DirRtl => "dir(rtl)", + StateFlags.Link => "link", + StateFlags.Visited => "visited", + StateFlags.Checked => "checked", + StateFlags.DropActive => "drop(active)", + _ => throw new ArgumentOutOfRangeException(nameof(it), it, null) + }; } From ae0c7e86f7a4325d0d4429235fe21474a52954a8 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:01:35 +0200 Subject: [PATCH 084/425] Core.csproj Gtk : HandlerExtensions.cs: track api changes --- src/Core/src/Platform/Gtk/HandlerExtensions.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Core/src/Platform/Gtk/HandlerExtensions.cs b/src/Core/src/Platform/Gtk/HandlerExtensions.cs index 9aae68a715bc..477cd7bc6d11 100644 --- a/src/Core/src/Platform/Gtk/HandlerExtensions.cs +++ b/src/Core/src/Platform/Gtk/HandlerExtensions.cs @@ -15,16 +15,14 @@ public static Widget ToNative(this IView view, IMauiContext context) var handler = view.Handler; if (handler == null) - { - handler = context.Handlers.GetHandler(view.GetType()); + handler = context.Handlers.GetHandler(view.GetType()) as IViewHandler; - if (handler == null) - throw new Exception($"Handler not found for view {view}"); + if (handler == null) + throw new Exception($"Handler not found for view {view}"); - handler.SetMauiContext(context); + handler.SetMauiContext(context); - view.Handler = handler; - } + view.Handler = handler; handler.SetVirtualView(view); From c7814541ad227d0e4bbfc6e9e6407218e20fe90e Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:17:33 +0200 Subject: [PATCH 085/425] Core.csproj Gtk : ViewExtensions UpdateBackground: support all types of Paint --- src/Core/src/Graphics/PaintExtensions.Gtk.cs | 91 ++++++++++++++++++++ src/Core/src/Platform/Gtk/ViewExtensions.cs | 22 ++++- 2 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 src/Core/src/Graphics/PaintExtensions.Gtk.cs diff --git a/src/Core/src/Graphics/PaintExtensions.Gtk.cs b/src/Core/src/Graphics/PaintExtensions.Gtk.cs new file mode 100644 index 000000000000..b9fbd1f77c23 --- /dev/null +++ b/src/Core/src/Graphics/PaintExtensions.Gtk.cs @@ -0,0 +1,91 @@ +using System.Linq; +using Microsoft.Maui.Graphics.Native.Gtk; + +namespace Microsoft.Maui.Graphics +{ + + public static partial class PaintExtensions + { + + /// + /// supports and + /// + public static Gdk.Pixbuf? ToPixbuf(this Paint? paint, out bool owned) + { + owned = false; + + if (paint.IsNullOrEmpty()) + return null; + + switch (paint) + { + case ImagePaint { Image: GtkImage image } imagePaint: + { + var pixbuf = image.NativeImage; + + return pixbuf; + } + + case PatternPaint patternPaint: + { + + var pixbuf = patternPaint.GetPatternBitmap(1); + owned = true; + + // todo: create a cairo.pattern & store it in pixbuf + return pixbuf; + + } + + } + + return null; + } + + /// + /// supports and + /// + public static string? ToCss(this Paint? paint) + { + if (paint.IsNullOrEmpty()) + return null; + + string Stops(GradientStop[] sorted) + { +#if NET48 + var max = sorted[sorted.Length-1].Offset; +#else + var max = sorted[^1].Offset; +#endif + max = 100 / (max == 0 ? 1 : max); + var stops = string.Join(",", sorted.Select(s => $"{s.Color.ToGdkRgba().ToString()} {s.Offset * max}%")); + + return stops; + } + + switch (paint) + { + case LinearGradientPaint lg: + { + var stops = Stops(lg.GetSortedStops()); + var css = $"linear-gradient( to right, {stops})"; + + return css; + } + case RadialGradientPaint rg: + { + var stops = Stops(rg.GetSortedStops()); + var css = $"radial-gradient({stops})"; + + return css; + } + + } + + return null; + + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 158e01db0afb..7d2692f59a7c 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -21,7 +21,20 @@ public static void UpdateBackground(this Widget nativeView, IView view) color = paint.ToColor(); } - var css = view.Background.CssImage(); + var css = view.Background.ToCss(); + + + var disposePixbuf = false; + var pixbuf = css == null ? view.Background?.ToPixbuf(out disposePixbuf) : default; + + // create a temporary file + var tempFile = pixbuf?.TempFileFor(); + + if (tempFile != null) + { + // use the tempfile as url in css + css = $"url('{tempFile}')"; + } if (color == null && css == null) return; @@ -40,7 +53,7 @@ public static void UpdateBackground(this Widget nativeView, IView view) default: if (css != null) { - nativeView.SetStyleImage(css, "background-image"); + nativeView.SetStyleValue(css, "background-image"); } else { @@ -50,6 +63,11 @@ public static void UpdateBackground(this Widget nativeView, IView view) break; } + // Gtk.CssProvider translates the file of url() into Base64, so the file can safely deleted: + tempFile?.Dispose(); + + if (disposePixbuf) + pixbuf?.Dispose(); } public static void UpdateForeground(this Widget nativeView, Paint? paint) From 8f43ba6ef909024dbdb4830edf4973c5ec6a738f Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:21:52 +0200 Subject: [PATCH 086/425] Core.csproj Gtk : WidgetColorExtensions.cs: track CssExtension-changes & support Gtk.StateFlags in SetBackgroundColor & remove using of Gdk.Color --- .../src/Platform/Gtk/WidgetColorExtensions.cs | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs index 0651d649779b..cef2cef4aab3 100644 --- a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs @@ -14,19 +14,27 @@ public static void SetBackgroundColor(this Gtk.Widget widget, Graphics.Color? co if (color == null) return; - widget.SetBackgroundColor(Gtk.StateType.Normal, color); + widget.SetBackgroundColor(Gtk.StateFlags.Normal, color); } - public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateType state, Graphics.Color color) + public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateType state, Graphics.Color? color) { + if (color == null) + return; + widget.SetBackgroundColor(state.ToStateFlag(), color); } - public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateFlags state, Graphics.Color color) + public static void SetBackgroundColor(this Gtk.Widget widget, Gtk.StateFlags state, Graphics.Color? color) { - var nativeColor = color.ToGdkRgba(); + if (color == null) + return; + + var cssFlags = state.CssState(); + var mainNode = widget.CssMainNode(); + if (cssFlags != null) mainNode = $"{mainNode}:{cssFlags}"; + widget.SetStyleColor(color, mainNode, "background-color"); - widget.SetColor(nativeColor, "background-color"); } public static Graphics.Color GetBackgroundColor(this Gtk.Widget widget) @@ -76,12 +84,7 @@ public static void SetStyleColor(this Gtk.Widget widget, Color? color, string ma public static void SetStyleColor(this Gtk.Widget widget, Gdk.RGBA color, string mainNode, string attr, string? subNode = null) { - using var p = new Gtk.CssProvider(); - - subNode = subNode != null ? $" > {subNode} " : subNode; - - p.LoadFromData($"{mainNode}{subNode}{{{attr}:{color.ToString()}}}"); - widget.StyleContext.AddProvider(p, Gtk.StyleProviderPriority.User); + widget.SetStyleValueNode(color.ToString(), mainNode, attr, subNode); } public static void SetColor(this Gtk.Widget widget, Color? color, string attr, string? subNode = null) @@ -138,7 +141,7 @@ public static Gtk.StateFlags ToStateFlag(this Gtk.StateType state) case Gtk.StateType.Focused: return Gtk.StateFlags.Active; case Gtk.StateType.Inconsistent: - return Gtk.StateFlags.Normal; + return Gtk.StateFlags.Inconsistent; case Gtk.StateType.Selected: return Gtk.StateFlags.Selected; } @@ -146,7 +149,7 @@ public static Gtk.StateFlags ToStateFlag(this Gtk.StateType state) return Gtk.StateFlags.Normal; } - public static Gdk.Color ColorFor(this Gtk.StyleContext ctx, string postfix, Gtk.StateType state) + public static Color ColorFor(this Gtk.StyleContext ctx, string postfix, Gtk.StateType state) { var prefix = string.Empty; // see: https://developer.gnome.org/gtk3/stable/gtk-migrating-GtkStyleContext-css.html @@ -180,27 +183,27 @@ public static Gdk.Color ColorFor(this Gtk.StyleContext ctx, string postfix, Gtk. if (ctx.LookupColor($"{prefix}{postfix}_color", out var col)) { - return col.ToGdkColor(); + return col.ToColor(); } ctx.LookupColor("base_color", out col); - return col.ToGdkColor(); + return col.ToColor(); } - public static Gdk.Color Background(this Gtk.Style it, Gtk.StateType state) + public static Color Background(this Gtk.Style it, Gtk.StateType state) { return it.Context.ColorFor("bg", state); } - public static Gdk.Color Foreground(this Gtk.Style it, Gtk.StateType state) + public static Color Foreground(this Gtk.Style it, Gtk.StateType state) { return it.Context.ColorFor("fg", state); } - public static Gdk.Color Base(this Gtk.Style it, Gtk.StateType state) + public static Color Base(this Gtk.Style it, Gtk.StateType state) { return it.Context.ColorFor("", state); } From 57835a1c4f1bab54eaadcee7475b1764f539fc56 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:22:48 +0200 Subject: [PATCH 087/425] Core.csproj Gtk : implement WindowHandler.Gtk.cs --- .../src/Handlers/Window/WindowHandler.Gtk.cs | 23 +++++++++++++++++++ src/Core/src/Handlers/Window/WindowHandler.cs | 2 ++ src/Core/src/Platform/Gtk/WindowExtensions.cs | 10 ++++++++ 3 files changed, 35 insertions(+) create mode 100644 src/Core/src/Handlers/Window/WindowHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/WindowExtensions.cs diff --git a/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs new file mode 100644 index 000000000000..fa47f1ea02c5 --- /dev/null +++ b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs @@ -0,0 +1,23 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + + public partial class WindowHandler : ElementHandler + { + + public static void MapTitle(WindowHandler handler, IWindow window) => + handler.NativeView.UpdateTitle(window); + + public static void MapContent(WindowHandler handler, IWindow window) + { + _ = handler.MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + var nativeContent = window.Content.ToNative(handler.MauiContext); + + handler.NativeView.Child = nativeContent; + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Window/WindowHandler.cs b/src/Core/src/Handlers/Window/WindowHandler.cs index 68bc5149b83e..3e313c990c71 100644 --- a/src/Core/src/Handlers/Window/WindowHandler.cs +++ b/src/Core/src/Handlers/Window/WindowHandler.cs @@ -5,6 +5,8 @@ using NativeView = Android.App.Activity; #elif WINDOWS using NativeView = Microsoft.UI.Xaml.Window; +#elif GTK +using NativeView = Gtk.Window; #endif namespace Microsoft.Maui.Handlers diff --git a/src/Core/src/Platform/Gtk/WindowExtensions.cs b/src/Core/src/Platform/Gtk/WindowExtensions.cs new file mode 100644 index 000000000000..ba9642d6a94e --- /dev/null +++ b/src/Core/src/Platform/Gtk/WindowExtensions.cs @@ -0,0 +1,10 @@ +namespace Microsoft.Maui +{ + + public static class WindowExtensions + { + public static void UpdateTitle(this Gtk.Window nativeWindow, IWindow window) => + nativeWindow.Title = window.Title; + } + +} \ No newline at end of file From 9c3d5e4e713ecf36ec6ecfea85797521c5bfb3f6 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:26:12 +0200 Subject: [PATCH 088/425] Core.csproj Gtk: ViewExtensions.cs: implement UpdateSemantics/UpdateOpacity --- src/Core/src/Platform/Gtk/ViewExtensions.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 7d2692f59a7c..43e85039e217 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -113,9 +113,18 @@ public static void UpdateVisibility(this Widget nativeView, IView view) => nativeView?.UpdateVisibility(view.Visibility); public static void UpdateSemantics(this Widget nativeView, IView view) - { } + { + if (view.Semantics is not { } semantics) + return; + + nativeView.TooltipText = semantics.Hint; + } + + public static void UpdateOpacity(this Widget nativeView, IView view) + { + nativeView.Opacity = view.Opacity; + } - public static void UpdateOpacity(this Widget nativeView, IView view) { } } From 64341fa9ff8416102871f8006654929ab04de946 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:28:03 +0200 Subject: [PATCH 089/425] Core.csproj Gtk : ViewExtensions.cs: implement UpdateClip (stub) --- src/Core/src/Platform/Gtk/ViewExtensions.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 43e85039e217..fe9766761d26 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -125,7 +125,13 @@ public static void UpdateOpacity(this Widget nativeView, IView view) nativeView.Opacity = view.Opacity; } + public static void UpdateClip(this WrapperView nativeView, IView view) + { + nativeView.Clip = view.Clip; + } + public static void UpdateClip(this Widget nativeView, IView view) + { } } } \ No newline at end of file From 92ac19ec3c1e22e06d6cb7fb4f2be2e2d61e2ff3 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:48:30 +0200 Subject: [PATCH 090/425] Core.csproj Gtk : TextExtensions.cs: add support for LineHeight / TextDecorations / CharacterSpacing --- .../Gtk/TextExtensions.cs | 122 +++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs index 163ebf883bde..114994b6b1a2 100644 --- a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Microsoft.Maui.Graphics.Native.Gtk { @@ -17,13 +18,20 @@ public static double GetLineHeigth(this Pango.Layout layout, int numLines, bool var baseline = metrics.Ascent / (double)(metrics.Ascent + metrics.Descent); layout.GetLineReadonly(0).GetExtents(ref inkRect, ref logicalRect); lineHeigh += (scaled ? logicalRect.Height.ScaledFromPango() : logicalRect.Height); + var fact = 1f; - return lineHeigh * baseline + (lineHeigh * numLines - 1); + if (layout.LineSpacing > 0) + { + fact = layout.LineSpacing; + } + + return lineHeigh * baseline + lineHeigh + (lineHeigh * fact * (numLines - 1)); } public static (int width, int height) GetPixelSize(this Pango.Layout layout, string text, double desiredSize = -1d, bool heightForWidth = true) { desiredSize = double.IsInfinity(desiredSize) ? -1 : desiredSize; + if (desiredSize > 0) { if (heightForWidth) @@ -45,6 +53,118 @@ public static (int width, int height) GetPixelSize(this Pango.Layout layout, str public static double ScaledFromPango(this double it) => Math.Ceiling(it / Pango.Scale.PangoScale); + public static Pango.AttrList? AddAttrFor(this Pango.AttrList? l, TextDecorations it) + { + if (l == null) + return l; + + if (it.HasFlag(TextDecorations.Underline)) + { + + l.Insert(new Pango.AttrUnderline(Pango.Underline.Single)); + } + + if (it.HasFlag(TextDecorations.Strikethrough)) + { + l.Insert(new Pango.AttrStrikethrough(true)); + + } + + return l; + } + + public static Pango.AttrList? AddAttrFor(this Pango.AttrList? list, int spacing) + { + if (spacing <= 1.ScaledToPango()) + return list; + + list?.Insert(new Pango.AttrLetterSpacing(spacing)); + + return list; + } + + public static Pango.AttrList? AttrListFor(this Pango.AttrList? list, TextDecorations decorations, double letterspacing) + { + var spacing = letterspacing.ScaledToPango(); + + if (decorations == TextDecorations.None && letterspacing <= 1) + return null; + + var l = new Pango.AttrList(); + + if (decorations != TextDecorations.None) + l.AddAttrFor(decorations); + + if (letterspacing > 1) + l.AddAttrFor(spacing); + + return l; + + } + + /// + /// Use this only if there are no other attributes to set + /// + /// + /// + /// + public static Pango.AttrList? AttrListFor(this Pango.AttrList? list, double letterspacing) + { + var spacing = letterspacing.ScaledToPango(); + + if (letterspacing <= 1) + return list; + + var l = new Pango.AttrList(); + + l.AddAttrFor(spacing); + + return l; + + } + + static Dictionary? _attrLists; + + [Obsolete("not working with spacing")] + static Pango.AttrList? DefaultAttrListFor(this TextDecorations decorations) + { + _attrLists ??= new(); + + if (TextDecorations.None == decorations) + { + return null; + } + + if (_attrLists.TryGetValue(decorations, out var l)) + return l; + + l = new Pango.AttrList(); + + l.AddAttrFor(decorations); + + _attrLists[decorations] = l; + + return l; + } + + [Obsolete("not working together with letterspacing")] + static Pango.AttrList? AttrListFor(this Pango.AttrList? list, TextDecorations decorations) + { + + // something wrong with Filter; iterater is null then + var l = list?.Filter(f => f.Type != Pango.AttrType.Underline || f.Type != Pango.AttrType.Strikethrough); + + if (decorations == TextDecorations.None) + return list; + + list ??= new Pango.AttrList(); + + list.AddAttrFor(decorations); + + return list; + + } + } } \ No newline at end of file From 0eab0eff01dd06ea0ca582981c1e20cb98c604bc Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:50:20 +0200 Subject: [PATCH 091/425] Core.csproj Gtk : EntryHandler.Gtk.cs: implement MapIsPassword / MapCharacterSpacing; add MapVerticalTextAlignment (missingmapper) --- .../src/Handlers/Entry/EntryHandler.Gtk.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index bc37379f7c87..01e41564d5c1 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -1,5 +1,6 @@ using System; using Gtk; +using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui.Handlers { @@ -110,8 +111,10 @@ public static void MapTextColor(EntryHandler handler, IEntry entry) public static void MapIsPassword(EntryHandler handler, IEntry entry) { - if (handler.NativeView != null && entry.IsPassword) - handler.NativeView.InputPurpose = InputPurpose.Password; + if (handler.NativeView is { } nativeView) + { + nativeView.Visibility = !entry.IsPassword; + } } public static void MapHorizontalTextAlignment(EntryHandler handler, IEntry entry) @@ -120,6 +123,10 @@ public static void MapHorizontalTextAlignment(EntryHandler handler, IEntry entry nativeView.Alignment = entry.HorizontalTextAlignment.ToXyAlign(); } + [MissingMapper] + public static void MapVerticalTextAlignment(EntryHandler handler, IEntry entry) + { } + [MissingMapper] public static void MapIsTextPredictionEnabled(EntryHandler handler, IEntry entry) { } @@ -160,8 +167,13 @@ public static void MapReturnType(EntryHandler handler, IEntry entry) { } [MissingMapper] public static void MapClearButtonVisibility(EntryHandler handler, IEntry entry) { } - [MissingMapper] - public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) { } + public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) + { + if (handler.NativeView is not { } nativeView) + return; + + nativeView.Attributes = nativeView.Attributes.AttrListFor(entry.CharacterSpacing); + } [MissingMapper] public static void MapKeyboard(EntryHandler handler, IEntry entry) From dd2a3471bb6ab8afbf9bd258037c0f69a2f8ab5d Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:53:54 +0200 Subject: [PATCH 092/425] Core.csproj Gtk : LabelHandler.Gtk.cs: implement MapVerticalTextAlignment / MapCharacterSpacing / MapLineHeight & introduce Platform/Gtk/LabelView with LineHeight-Property --- .../src/Handlers/Label/LabelHandler.Gtk.cs | 70 ++++++++++++++----- src/Core/src/Platform/Gtk/LabelExtensions.cs | 18 ++++- src/Core/src/Platform/Gtk/LabelView.cs | 22 ++++++ 3 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 src/Core/src/Platform/Gtk/LabelView.cs diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index 696ac27b735a..4623095d0b5e 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -1,14 +1,12 @@ using System; -using System.Runtime.InteropServices.ComTypes; using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; -using Pango; namespace Microsoft.Maui.Handlers { - public partial class LabelHandler : ViewHandler + public partial class LabelHandler : ViewHandler { private static Microsoft.Maui.Graphics.Native.Gtk.TextLayout? _textLayout; @@ -17,14 +15,13 @@ public partial class LabelHandler : ViewHandler Microsoft.Maui.Graphics.Native.Gtk.NativeGraphicsService.Instance.SharedContext) { HeightForWidth = true }; // https://developer.gnome.org/gtk3/stable/GtkLabel.html - protected override Label CreateNativeView() + protected override LabelView CreateNativeView() { - return new Label() + return new() { LineWrap = true, Halign = Align.Fill, Xalign = 0, - MaxWidthChars = 1 }; } @@ -53,6 +50,8 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra SharedTextLayout.TextFlow = TextFlow.ClipBounds; SharedTextLayout.HorizontalAlignment = virtualView.HorizontalTextAlignment.GetHorizontalAlignment(); + SharedTextLayout.VerticalAlignment = virtualView.VerticalTextAlignment.GetVerticalAlignment(); + SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); var heightForWidth = !heightConstrained; @@ -66,6 +65,16 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra layout.Width = -1; layout.Ellipsize = nativeView.Ellipsize; layout.Spacing = nativeView.Layout.Spacing; + + layout.Attributes = nativeView.Attributes; + + if (virtualView.LineHeight > 1) + layout.LineSpacing = (float)virtualView.LineHeight; + else + { + layout.LineSpacing = 0; + } + layout.SetText(nativeView.Text); if (!heightConstrained) @@ -88,6 +97,9 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra { height = Math.Min((int)lh.ScaledFromPango(), height); } + + layout.Attributes = null; + } width += hMargin; @@ -114,7 +126,12 @@ public static void MapFont(LabelHandler handler, ILabel label) public static void MapHorizontalTextAlignment(LabelHandler handler, ILabel label) { - handler.NativeView?.UpdateTextAlignment(label); + handler.NativeView?.UpdateHorizontalTextAlignment(label); + } + + public static void MapVerticalTextAlignment(LabelHandler handler, ILabel label) + { + handler.NativeView?.UpdateVerticalTextAlignment(label); } public static void MapLineBreakMode(LabelHandler handler, ILabel label) @@ -133,20 +150,24 @@ public static void MapPadding(LabelHandler handler, ILabel label) } - [MissingMapper] public static void MapCharacterSpacing(LabelHandler handler, ILabel label) - { } + { + if (handler.NativeView is not { } nativeView) + return; + + nativeView.Attributes = nativeView.Attributes.AttrListFor(label.TextDecorations, label.CharacterSpacing); + } - [MissingMapper] public static void MapTextDecorations(LabelHandler handler, ILabel label) - { } + { + if (handler.NativeView is not { } nativeView) + return; + + nativeView.Attributes = nativeView.Attributes.AttrListFor(label.TextDecorations, label.CharacterSpacing); + } - [MissingMapper] public static void MapLineHeight(LabelHandler handler, ILabel label) { - // there is no LineHeight for label in gtk3: - // https://gitlab.gnome.org/GNOME/gtk/-/issues/2379 - if (handler.NativeView is not { } nativeView) return; @@ -154,9 +175,22 @@ public static void MapLineHeight(LabelHandler handler, ILabel label) return; if (label.LineHeight > 1) - // should be: https://developer.gnome.org/pango/1.46/pango-Layout-Objects.html#pango-layout-set-line-spacing - // see: https://github.com/GtkSharp/GtkSharp/issues/258 - nativeView.Layout.Spacing = (int)label.LineHeight.ScaledToPango(); + { + // there is no LineHeight for label in gtk3: + // https://gitlab.gnome.org/GNOME/gtk/-/issues/2379 + + // try to set it over css: not working: exception thrown: 'line-height' is not a valid property name + // nativeView.SetStyleValue($"{(int)label.LineHeight}","line-height"); + + // try to set it over https://developer.gnome.org/pango/1.46/pango-Layout-Objects.html#pango-layout-set-line-spacing + + // no effect: https://developer.gnome.org/gtk3/stable/GtkLabel.html#gtk-label-get-layout + // The label is free to recreate its layout at any time, so it should be considered read-only + // nativeView.Layout.LineSpacing = (float)label.LineHeight; + + // so we use LabelView, this sets it before OnDrawn: + nativeView.LineHeight = (float)label.LineHeight; + } } diff --git a/src/Core/src/Platform/Gtk/LabelExtensions.cs b/src/Core/src/Platform/Gtk/LabelExtensions.cs index b3d137533ad9..eb833df52862 100644 --- a/src/Core/src/Platform/Gtk/LabelExtensions.cs +++ b/src/Core/src/Platform/Gtk/LabelExtensions.cs @@ -54,6 +54,16 @@ public static Maui.Graphics.HorizontalAlignment GetHorizontalAlignment(this Text _ => throw new ArgumentOutOfRangeException(nameof(alignment), alignment, null) }; + public static Maui.Graphics.VerticalAlignment GetVerticalAlignment(this TextAlignment alignment) => + alignment switch + { + + TextAlignment.Start => Graphics.VerticalAlignment.Top, + TextAlignment.Center => Graphics.VerticalAlignment.Center, + TextAlignment.End => Graphics.VerticalAlignment.Bottom, + _ => throw new ArgumentOutOfRangeException(nameof(alignment), alignment, null) + }; + public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this Label nativeLabel) { var res = nativeLabel.Ellipsize switch @@ -129,16 +139,22 @@ public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) default: throw new ArgumentOutOfRangeException(); } + nativeLabel.AdjustMaxLines(); } - public static void UpdateTextAlignment(this Label nativeLabel, ILabel label) + public static void UpdateHorizontalTextAlignment(this Label nativeLabel, ILabel label) { nativeLabel.Justify = label.HorizontalTextAlignment.ToJustification(); nativeLabel.Xalign = label.HorizontalTextAlignment.ToXyAlign(); } + public static void UpdateVerticalTextAlignment(this Label nativeLabel, ILabel label) + { + nativeLabel.Yalign = label.VerticalTextAlignment.ToXyAlign(); + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs new file mode 100644 index 000000000000..4bd856a029a7 --- /dev/null +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -0,0 +1,22 @@ +using Cairo; +using Gtk; + +namespace Microsoft.Maui.Handlers +{ + + public class LabelView : Label + { + + public float LineHeight { get; set; } + + protected override bool OnDrawn(Context cr) + { + if (LineHeight > 1) + Layout.LineSpacing = LineHeight; + + return base.OnDrawn(cr); + } + + } + +} \ No newline at end of file From d4089ba432f70655ce94b6e16830b2db5cdb45ac Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:55:51 +0200 Subject: [PATCH 093/425] Core.csproj Gtk : SliderHandler.Gtk.cs: enhance MapThumbImageSource by using temporary css - url() & ajdust MapThumbColor --- .../src/Handlers/Slider/SliderHandler.Gtk.cs | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs index 59b2b28ced14..7fe20490d1de 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using Gtk; namespace Microsoft.Maui.Handlers @@ -68,14 +69,23 @@ public static void MapThumbColor(SliderHandler handler, ISlider slider) if (handler.NativeView is not { } nativeView) return; - // this don't work cause slider is an icon - nativeView.SetColor(slider.ThumbColor, "color", "contents > trough > slider"); + nativeView.SetColor(slider.ThumbColor, "background-color", "contents > trough > slider"); } - [MissingMapper] + static void SetImage(Widget w, string? image) + { + if (string.IsNullOrEmpty(image)) + return; + + w.SetStyleValue($"url('{image}')", "background-image", "contents > trough > slider"); + // nativeView.SetStyleImage("center","background-position", "contents > trough > slider"); + w.SetStyleValue("contain", "background-size", "contents > trough > slider"); + } + public static void MapThumbImageSource(SliderHandler handler, ISlider slider) { + if (handler.NativeView is not { } nativeView) return; @@ -84,16 +94,22 @@ public static void MapThumbImageSource(SliderHandler handler, ISlider slider) if (img == null) return; + if (img is IFileImageSource fis && File.Exists(fis.File)) + { + SetImage(nativeView, fis.File); + + return; + } + var provider = handler.GetRequiredService(); img.UpdateImageSourceAsync(1, provider, p => { - if (p == null) - return; - var css = p.CssImage(); - // not working: - nativeView.SetStyleImage(css, "background-image", "contents > trough > slider"); + // var css = p.CssImage(); //not working, so workaround is saving a tmp file: + using var tmpfile = p?.TempFileFor(); + + SetImage(nativeView, tmpfile?.Name); }) .FireAndForget(handler); From 8ee29982cff97614daad1ccb8512656c8986d773 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:57:25 +0200 Subject: [PATCH 094/425] Controls.Core: add Gtk-stubs for AlertManager / GestureManager / ModalNavigationManager --- .../AlertManager/AlertMananger.Gtk.cs | 19 ++++++++++++++++ .../GestureManager/GestureManager.Gtk.cs | 17 ++++++++++++++ .../ModalNavigationManager.Gtk.cs | 22 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/Controls/src/Core/Platform/AlertManager/AlertMananger.Gtk.cs create mode 100644 src/Controls/src/Core/Platform/GestureManager/GestureManager.Gtk.cs create mode 100644 src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs diff --git a/src/Controls/src/Core/Platform/AlertManager/AlertMananger.Gtk.cs b/src/Controls/src/Core/Platform/AlertManager/AlertMananger.Gtk.cs new file mode 100644 index 000000000000..f8a05d4f5e47 --- /dev/null +++ b/src/Controls/src/Core/Platform/AlertManager/AlertMananger.Gtk.cs @@ -0,0 +1,19 @@ +using System; + +namespace Microsoft.Maui.Controls.Platform +{ + internal partial class AlertManager + { + + [MissingMapper] + internal static void Subscribe(Window window) + { + } + + [MissingMapper] + internal static void Unsubscribe(Window window) + { + + } + } +} diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Gtk.cs b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Gtk.cs new file mode 100644 index 000000000000..6275ef1b866d --- /dev/null +++ b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Gtk.cs @@ -0,0 +1,17 @@ +#nullable enable + +using System; + +namespace Microsoft.Maui.Controls.Platform +{ + class GestureManager : IDisposable + { + public GestureManager(IViewHandler handler) + { + } + + public void Dispose() + { + } + } +} diff --git a/src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs b/src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs new file mode 100644 index 000000000000..c8893d0583f8 --- /dev/null +++ b/src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs @@ -0,0 +1,22 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Controls.Platform +{ + internal partial class ModalNavigationManager + { + public Task PopModalAsync(bool animated) + { + throw new NotImplementedException(); + } + + public Task PushModalAsync(Page modal, bool animated) + { + throw new NotImplementedException(); + } + } +} From 02bc3910e8634eb69c6c18f420dc4a57aae3df73 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:58:56 +0200 Subject: [PATCH 095/425] Controls.Core: enhance NavigationPageHandler (stub) --- .../NavigationPageHandler.Gtk.cs | 78 +++++++++++++++++-- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs b/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs index efc846655b37..9616a1a36943 100644 --- a/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs @@ -1,16 +1,75 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Text; +using Gtk; +using Microsoft.Maui.Controls.Internals; using Microsoft.Maui.Handlers; namespace Microsoft.Maui.Controls.Handlers { + public partial class NavigationPageHandler : - ViewHandler + ViewHandler { - protected override Gtk.Widget CreateNativeView() + + protected override GtkNavigationPage CreateNativeView() + { + return new(); + } + + protected override void ConnectHandler(GtkNavigationPage nativeView) + { + base.ConnectHandler(nativeView); + + var virtualView = VirtualView; + virtualView.PushRequested += OnPushRequested; + virtualView.PopRequested += OnPopRequested; + virtualView.PopToRootRequested += OnPopToRootRequested; + virtualView.InternalChildren.CollectionChanged += OnChildrenChanged; + + SetPage(virtualView.CurrentPage); + } + + protected override void DisconnectHandler(GtkNavigationPage nativeView) + { + base.DisconnectHandler(nativeView); + + var virtualView = VirtualView; + virtualView.PushRequested -= OnPushRequested; + virtualView.PopRequested -= OnPopRequested; + virtualView.PopToRootRequested -= OnPopToRootRequested; + virtualView.InternalChildren.CollectionChanged -= OnChildrenChanged; + } + + void SetPage(Page page) + { + if (MauiContext == null) + return; + + if (page.ToNative(MauiContext) is { } nativePage) + NativeView.PackStart(nativePage, true, true, 0); + } + + void OnChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e) { - throw new NotImplementedException(); + ; + } + + void OnPopToRootRequested(object? sender, NavigationRequestedEventArgs e) + { + ; + } + + void OnPopRequested(object? sender, NavigationRequestedEventArgs e) + { + ; + } + + void OnPushRequested(object? sender, NavigationRequestedEventArgs e) + { + ; } [MissingMapper] @@ -27,5 +86,14 @@ public static void MapTitleIcon(NavigationPageHandler handler, NavigationPage vi [MissingMapper] public static void MapTitleView(NavigationPageHandler handler, NavigationPage view) { } + + } + + public class GtkNavigationPage : Gtk.Box + { + + public GtkNavigationPage() : base(Orientation.Horizontal, 0) { } + } -} + +} \ No newline at end of file From 72cc47bd837dbcd52598b4dd5b563b4799fbc981 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 21:59:44 +0200 Subject: [PATCH 096/425] Controls.Core: PlatformEffect.cs: add GTK - NativeView --- src/Controls/src/Core/Platform/PlatformEffect.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Controls/src/Core/Platform/PlatformEffect.cs b/src/Controls/src/Core/Platform/PlatformEffect.cs index a087edf1c827..a9ca492dd347 100644 --- a/src/Controls/src/Core/Platform/PlatformEffect.cs +++ b/src/Controls/src/Core/Platform/PlatformEffect.cs @@ -5,6 +5,8 @@ using NativeView = Android.Views.View; #elif WINDOWS using NativeView = Microsoft.UI.Xaml.FrameworkElement; +#elif GTK +using NativeView = Gtk.Widget; #elif NETSTANDARD using NativeView = System.Object; #endif From 47348b6969395ed4af7c6e495a2434e3c2f9d6c3 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 22:00:55 +0200 Subject: [PATCH 097/425] Compatibility.Core Gtk: introduce Deserializer / ResourcesProvider --- .../Core/src/Gtk/Deserializer.cs | 97 +++++++++++++++++++ .../Core/src/Gtk/ResourcesProvider.cs | 52 ++++++++++ 2 files changed, 149 insertions(+) create mode 100644 src/Compatibility/Core/src/Gtk/Deserializer.cs create mode 100644 src/Compatibility/Core/src/Gtk/ResourcesProvider.cs diff --git a/src/Compatibility/Core/src/Gtk/Deserializer.cs b/src/Compatibility/Core/src/Gtk/Deserializer.cs new file mode 100644 index 000000000000..0843804f9c07 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Deserializer.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO.IsolatedStorage; +using System.Runtime.Serialization; +using System.Threading.Tasks; +using System.Xml; +using Microsoft.Maui.Controls.Internals; + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + internal class Deserializer : IDeserializer + { + const string PropertyStoreFile = "PropertyStore.forms"; + + public Task> DeserializePropertiesAsync() + { + // Deserialize property dictionary to local storage + // Make sure to use Internal + return Task.Run(() => + { + using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) + { + if (!store.FileExists(PropertyStoreFile)) + return null; + + using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)) + using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max)) + { + if (stream.Length == 0) + return null; + + try + { + var dcs = new DataContractSerializer(typeof(Dictionary)); + return (IDictionary)dcs.ReadObject(reader); + } + catch (Exception e) + { + Debug.WriteLine("Could not deserialize properties: " + e.Message); + Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while reading Application properties: {e}"); + } + } + + } + + return null; + }); + } + + public Task SerializePropertiesAsync(IDictionary properties) + { + properties = new Dictionary(properties); + // Serialize property dictionary to local storage + // Make sure to use Internal + return Task.Run(() => + { + using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) + { + // No need to write 0 properties if no file exists + if (properties.Count == 0 && !store.FileExists(PropertyStoreFile)) + { + return; + } + using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile + ".tmp", System.IO.FileMode.OpenOrCreate)) + using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(stream)) + { + try + { + var dcs = new DataContractSerializer(typeof(Dictionary)); + dcs.WriteObject(writer, properties); + writer.Flush(); + } + catch (Exception e) + { + Debug.WriteLine("Could not serialize properties: " + e.Message); + Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while writing Application properties: {e}"); + return; + } + } + + try + { + if (store.FileExists(PropertyStoreFile)) + store.DeleteFile(PropertyStoreFile); + store.MoveFile(PropertyStoreFile + ".tmp", PropertyStoreFile); + } + catch (Exception e) + { + Debug.WriteLine("Could not move new serialized property file over old: " + e.Message); + Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while writing Application properties: {e}"); + } + } + }); + } + } +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs b/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs new file mode 100644 index 000000000000..d9c53d2c154b --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs @@ -0,0 +1,52 @@ +using Microsoft.Maui.Controls.Internals; +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + internal class ResourcesProvider : ISystemResourcesProvider + { + private const string TitleStyleKey = "HeaderLabelStyle"; + private const string SubtitleStyleKey = "SubheaderLabelStyle"; + private const string BodyStyleKey = "BodyLabelStyle"; + private const string CaptionStyleKey = "CaptionLabelStyle"; + private const string ListItemDetailTextStyleKey = "BodyLabelStyle"; + private const string ListItemTextStyleKey = "BaseLabelStyle"; + + public IResourceDictionary GetSystemResources() + { + return new ResourceDictionary + { + [Device.Styles.TitleStyleKey] = GetStyle(TitleStyleKey), + [Device.Styles.SubtitleStyleKey] = GetStyle(SubtitleStyleKey), + [Device.Styles.BodyStyleKey] = GetStyle(BodyStyleKey), + [Device.Styles.CaptionStyleKey] = GetStyle(CaptionStyleKey), + [Device.Styles.ListItemDetailTextStyleKey] = GetStyle(ListItemDetailTextStyleKey), + [Device.Styles.ListItemTextStyleKey] = GetStyle(ListItemTextStyleKey) + }; + } + + private Style GetStyle(string nativeKey) + { + var result = new Style(typeof(Label)); + + switch (nativeKey) + { + case TitleStyleKey: + result.Setters.Add(new Setter { Property = Label.FontSizeProperty, Value = 24 }); + break; + case SubtitleStyleKey: + result.Setters.Add(new Setter { Property = Label.FontSizeProperty, Value = 20 }); + break; + case BodyStyleKey: + result.Setters.Add(new Setter { Property = Label.TextColorProperty, Value = Colors.Blue }); + break; + case CaptionStyleKey: + break; + case ListItemTextStyleKey: + break; + } + + return result; + } + } +} From 2175a04243d352019cc76e733e6934cb304737a3 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 22:01:12 +0200 Subject: [PATCH 098/425] Compatibility.Core Gtk: remove GtkTicker.cs --- .../Core/src/Gtk/GtkPlatformServices.cs | 6 ----- src/Compatibility/Core/src/Gtk/GtkTicker.cs | 27 ------------------- 2 files changed, 33 deletions(-) delete mode 100644 src/Compatibility/Core/src/Gtk/GtkTicker.cs diff --git a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs index 5ffe5ad43850..ec470c924e16 100644 --- a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs +++ b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs @@ -20,12 +20,6 @@ public void BeginInvokeOnMainThread(Action action) { MauiGtkApplication.Invoke(action); } - - public Ticker CreateTicker() - { - return new GtkTicker(); - } - public Assembly[] GetAssemblies() { return AppDomain.CurrentDomain.GetAssemblies(); diff --git a/src/Compatibility/Core/src/Gtk/GtkTicker.cs b/src/Compatibility/Core/src/Gtk/GtkTicker.cs deleted file mode 100644 index 10a3f56c950c..000000000000 --- a/src/Compatibility/Core/src/Gtk/GtkTicker.cs +++ /dev/null @@ -1,27 +0,0 @@ - -using Microsoft.Maui.Controls.Internals; - -namespace Microsoft.Maui.Controls.Compatibility -{ - public class GtkTicker : Ticker - { - private uint _timerId; - - protected override void DisableTimer() - { - GLib.Source.Remove(_timerId); - } - - protected override void EnableTimer() - { - _timerId = GLib.Timeout.Add(15, new GLib.TimeoutHandler(OnSendSignals)); - } - - private bool OnSendSignals() - { - SendSignals(); - - return true; - } - } -} From 7391076ffa83d563e8171ae68927cf10f542a11a Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 22:02:14 +0200 Subject: [PATCH 099/425] Compatibility.Core AppHostBuilderExtensions: implement Gtk-Handling --- .../Core/src/AppHostBuilderExtensions.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs index f0c64b4dc5fd..a45265390061 100644 --- a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs @@ -36,6 +36,12 @@ using FlyoutPageRenderer = Microsoft.Maui.Controls.Compatibility.Platform.iOS.PhoneFlyoutPageRenderer; using RadioButtonRenderer = Microsoft.Maui.Controls.Compatibility.Platform.iOS.Platform.DefaultRenderer; using DefaultRenderer = Microsoft.Maui.Controls.Compatibility.Platform.iOS.Platform.DefaultRenderer; +#elif GTK +using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; +using Microsoft.Maui.Controls.Handlers; +using ScrollViewHandler = Microsoft.Maui.Handlers.ScrollView.ScrollViewHandler; + #endif namespace Microsoft.Maui.Controls.Hosting @@ -139,6 +145,15 @@ static IAppHostBuilder SetupDefaults(this IAppHostBuilder builder) var state = new ActivationState(mauiContext); Forms.Init(state); })); +#elif GTK + + events.AddGtk(gtk => gtk + .OnMauiContextCreated((mauiContext) => + { + var state = new ActivationState(mauiContext); + Forms.Init(state); + } + )); #endif }); @@ -232,7 +247,16 @@ static IAppHostBuilder SetupDefaults(this IAppHostBuilder builder) Internals.Registrar.RegisterEffect("Xamarin", "ShadowEffect", typeof(ShadowEffect)); #endif #if GTK + DependencyService.Register(); + DependencyService.Register(); + DependencyService.Register(); + DependencyService.Register(); + DependencyService.Register(); + DependencyService.Register(); + handlers.AddHandler(); + handlers.AddHandler(); + DependencyService.Register(); DependencyService.Register(); @@ -282,6 +306,8 @@ public void ConfigureServices(HostBuilderContext context, IServiceCollection ser #elif WINDOWS // TODO: Implement GetPathBounds in Microsoft.Maui.Graphics //services.AddSingleton(W2DGraphicsService.Instance); +#elif GTK + services.AddSingleton(NativeGraphicsService.Instance); #endif } From 2ec5e91f74d55937f45ebebdd8121edc04fab51f Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 22:03:24 +0200 Subject: [PATCH 100/425] Compatibility.csproj: add reference to Microsoft.Maui.Graphics.Gtk --- src/Compatibility/Core/src/Compatibility.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Compatibility/Core/src/Compatibility.csproj b/src/Compatibility/Core/src/Compatibility.csproj index fa615417ca0f..af5f8f3b3547 100644 --- a/src/Compatibility/Core/src/Compatibility.csproj +++ b/src/Compatibility/Core/src/Compatibility.csproj @@ -64,9 +64,12 @@ + + $(SolutionDir)\src\Microsoft.Maui.Graphics.Gtk\Microsoft.Maui.Graphics.Gtk.dll + - + From 8dc75bb5612e459bf2ded67664214d49609cc5ab Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 22:03:54 +0200 Subject: [PATCH 101/425] Compatibility.Core Gtk2: track upstream changes (ElementChangedEventArgs removed) --- .../Core/src/Gtk2/ElementChangedEventArgs.cs | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/Compatibility/Core/src/Gtk2/ElementChangedEventArgs.cs diff --git a/src/Compatibility/Core/src/Gtk2/ElementChangedEventArgs.cs b/src/Compatibility/Core/src/Gtk2/ElementChangedEventArgs.cs deleted file mode 100644 index 08c305384b8a..000000000000 --- a/src/Compatibility/Core/src/Gtk2/ElementChangedEventArgs.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace Microsoft.Maui.Controls.Compatibility.Platform.GTK -{ - public class ElementChangedEventArgs : EventArgs where TElement : Element - { - public ElementChangedEventArgs(TElement oldElement, TElement newElement) - { - OldElement = oldElement; - NewElement = newElement; - } - - public TElement NewElement { get; private set; } - - public TElement OldElement { get; private set; } - } - - public class VisualElementChangedEventArgs : ElementChangedEventArgs - { - public VisualElementChangedEventArgs(VisualElement oldElement, VisualElement newElement) - : base(oldElement, newElement) - { - - } - } -} From 1811b976416eb7e3adf73b5203399ecd0d248412 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 22:05:30 +0200 Subject: [PATCH 102/425] Controls.Sample.csproj: Gtk: add FocusPlatformEffect and other Gtk-specific stuff --- .../BordelessEntry/BordelessEntryHandler.cs | 5 ++ .../Extensions/EssentialsExtensions.cs | 7 ++- .../Pages/Core/EffectsPage.xaml.cs | 49 +++++++++++++++++++ .../samples/Controls.Sample/Startup.cs | 2 + 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs b/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs index 2bf7a1074640..df6aba1bb4bf 100644 --- a/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs +++ b/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs @@ -34,6 +34,11 @@ public static void MapBorder(BordelessEntryHandler handler, BordelessEntry borde public static void MapBorder(BordelessEntryHandler handler, BordelessEntry borderlessEntry) { + } +#elif GTK + public static void MapBorder(BordelessEntryHandler handler, BordelessEntry borderlessEntry) + { + } #endif } diff --git a/src/Controls/samples/Controls.Sample/Extensions/EssentialsExtensions.cs b/src/Controls/samples/Controls.Sample/Extensions/EssentialsExtensions.cs index 0a3fd4ad913c..6d46ef6680e0 100644 --- a/src/Controls/samples/Controls.Sample/Extensions/EssentialsExtensions.cs +++ b/src/Controls/samples/Controls.Sample/Extensions/EssentialsExtensions.cs @@ -137,7 +137,12 @@ public async void Configure(HostBuilderContext context, IServiceProvider service .CreateLogger()? .LogError(ex, "App Actions are not supported on this platform."); } - + catch (NotImplementedException ex) + { + services.GetService()? + .CreateLogger()? + .LogError(ex, "App Actions are not implemented on this platform."); + } if (_trackVersions) VersionTracking.Track(); } diff --git a/src/Controls/samples/Controls.Sample/Pages/Core/EffectsPage.xaml.cs b/src/Controls/samples/Controls.Sample/Pages/Core/EffectsPage.xaml.cs index 3f3320b967db..979a3e5541cd 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Core/EffectsPage.xaml.cs +++ b/src/Controls/samples/Controls.Sample/Pages/Core/EffectsPage.xaml.cs @@ -135,5 +135,54 @@ protected override void OnElementPropertyChanged(PropertyChangedEventArgs args) } } } + +#elif GTK + public class FocusPlatformEffect : PlatformEffect + { + + Microsoft.Maui.Graphics.Color originalBackgroundColor; + Microsoft.Maui.Graphics.Color backgroundColor; + + protected override void OnAttached() + { + try + { + originalBackgroundColor = Control.GetBackgroundColor(); + backgroundColor = Microsoft.Maui.Graphics.Colors.LightGreen; + Control.SetBackgroundColor(Gtk.StateFlags.Focused, backgroundColor); + } + catch (Exception ex) + { + Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message); + } + } + + protected override void OnDetached() + { } + + protected override void OnElementPropertyChanged(PropertyChangedEventArgs args) + { + base.OnElementPropertyChanged(args); + + try + { + if (args.PropertyName == "IsFocused") + { + if (Control.GetBackgroundColor() == backgroundColor) + { + Control.SetBackgroundColor(originalBackgroundColor); + } + else + { + Control.SetBackgroundColor(backgroundColor); + } + } + } + catch (Exception ex) + { + Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message); + } + } + } #endif } \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample/Startup.cs b/src/Controls/samples/Controls.Sample/Startup.cs index c7f61cb4dc86..cbe759927909 100644 --- a/src/Controls/samples/Controls.Sample/Startup.cs +++ b/src/Controls/samples/Controls.Sample/Startup.cs @@ -132,6 +132,7 @@ public void Configure(IAppHostBuilder appBuilder) }) .ConfigureEssentials(essentials => { +#if ! GTK essentials .UseVersionTracking() .UseMapServiceToken("YOUR-KEY-HERE") @@ -141,6 +142,7 @@ public void Configure(IAppHostBuilder appBuilder) { Debug.WriteLine($"You seem to have arrived from a special place: {appAction.Title} ({appAction.Id})"); }); +#endif }) .ConfigureLifecycleEvents(events => { From 8cd25ba699a9f285729e338326ae47c855721e15 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 22:06:42 +0200 Subject: [PATCH 103/425] Controls.Sample.Gtk.csproj: enhance to test implemented features & track api changes --- .../Controls.Sample.Gtk.csproj | 3 + .../samples/Controls.Sample.Gtk/Program.cs | 12 ++- .../SimpleSampleApp/ExamplePage.cs | 82 ++++++++++++++---- .../Controls.Sample.Gtk/rainbow_heart.png | Bin 0 -> 1799 bytes 4 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 src/Controls/samples/Controls.Sample.Gtk/rainbow_heart.png diff --git a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj index 282f80367842..f48f06a9ef49 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj +++ b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj @@ -22,4 +22,7 @@ Always + + + \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Gtk/Program.cs b/src/Controls/samples/Controls.Sample.Gtk/Program.cs index ca0b1178d186..b3b804bbdec6 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Program.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/Program.cs @@ -1,8 +1,11 @@ -using System; +#define UseSimpleSample + +using System; using System.Threading.Tasks; using GLib; using Maui.SimpleSampleApp; using Microsoft.Extensions.Hosting; +using Microsoft.Maui; using Microsoft.Maui.Hosting; namespace Controls.Sample.Gtk @@ -14,7 +17,12 @@ class Program static void Main(string[] args) { - var app = new SimpleSampleGtkApplication(); + var app = +#if UseSimpleSample + new SimpleSampleGtkApplication(); +#else + new MauiGtkApplication(); +#endif app.Run(); } diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 69074bb73207..3a656c4ec14c 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -1,12 +1,13 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using Microsoft.Maui; using Microsoft.Maui.Controls; using Microsoft.Maui.Controls.Shapes; using Microsoft.Maui.Graphics; using Debug = System.Diagnostics.Debug; -using GradientStop = Microsoft.Maui.Graphics.GradientStop; +using IImage = Microsoft.Maui.Graphics.IImage; namespace Maui.SimpleSampleApp { @@ -128,7 +129,7 @@ void SetupMauiLayoutSimple() { Text = "a label", HorizontalTextAlignment = TextAlignment.Center, - + VerticalTextAlignment = TextAlignment.Center }; verticalStack.Add(label); @@ -315,23 +316,44 @@ void SetupMauiLayout() var underlineLabel = new Label { - Text = "underline", - TextDecorations = TextDecorations.Underline + Text = (TextDecorations.Underline | TextDecorations.Strikethrough).ToString(), + TextDecorations = TextDecorations.Underline | TextDecorations.Strikethrough }; verticalStack.Add(underlineLabel); + IImage image = default; + + using (var stream = File.OpenRead("dotnet_bot.png")) + { + image = GraphicsPlatform.CurrentService.LoadImageFromStream(stream); + } + + var paint = image.AsPaint(); + + var labelImage = new Label + { + Text = "this has backgroudImage", + Background = paint + }; + // Background is null cause there is no ImageBrush + + if (labelImage.Background != null) + verticalStack.Add(labelImage); var labelG = new Label { Text = "this has gradient", Background = new RadialGradientBrush(new GradientStopCollection { - new (Colors.Aqua, 0), - new (Colors.Green, 10), - }) + new(Colors.Aqua, 0), + new(Colors.Green, 10), + }), + Padding = new Thickness(30), + Margin = new Thickness(10), }; + verticalStack.Add(labelG); - + verticalStack.Add(new ActivityIndicator()); verticalStack.Add(new ActivityIndicator @@ -360,16 +382,19 @@ void SetupMauiLayout() TextColor = Colors.Green, Text = "Hello I'm a button", BackgroundColor = Colors.Purple, - Margin = new Thickness(12) + Margin = new Thickness(12), }; + + horizontalStack.Add(button); horizontalStack.Add(button2); horizontalStack.Add(new Label { Text = "And these buttons are in a HorizontalStackLayout", - VerticalOptions = LayoutOptions.Center + VerticalOptions = LayoutOptions.Center, + HorizontalTextAlignment = TextAlignment.End }); verticalStack.Add(horizontalStack); @@ -465,12 +490,32 @@ void SetupMauiLayout() Placeholder = "MaxLength text" }); - verticalStack.Add(new Entry + var spacingEntry = new Entry { Text = "This should be text with character spacing", CharacterSpacing = 10 - }); + }; + + verticalStack.Add(spacingEntry); + button2.Clicked += (s, e) => + { + if (underlineLabel.TextDecorations.HasFlag(TextDecorations.Underline)) + { + underlineLabel.TextDecorations = TextDecorations.Strikethrough; + underlineLabel.Text = nameof(TextDecorations.Strikethrough); + underlineLabel.CharacterSpacing = 2; + } + else if (underlineLabel.TextDecorations.HasFlag(TextDecorations.Strikethrough)) + { + underlineLabel.TextDecorations = TextDecorations.Underline; + underlineLabel.Text = nameof(TextDecorations.Underline); + underlineLabel.CharacterSpacing = 1; + } + + spacingEntry.CharacterSpacing = spacingEntry.CharacterSpacing == 10 ? 5 : 10; + }; + verticalStack.Add(new Entry { Keyboard = Keyboard.Numeric, @@ -532,7 +577,7 @@ void SetupMauiLayout() verticalStack.Add(new Slider { ThumbColor = Colors.Aqua, - ThumbImageSource = "dotnet_bot.png" + ThumbImageSource = "rainbow_heart.png" }); verticalStack.Add(new Stepper()); @@ -606,7 +651,6 @@ void SetupCompatibilityLayout() verticalStack.Add(label); - var button = new Button() { Text = _viewModel.Text, @@ -679,7 +723,7 @@ IView CreateSampleGrid() var bottomLeft = new Label { Text = "Bottom Left", - BackgroundColor = Colors.Lavender + BackgroundColor = Colors.Lavender, }; layout.Add(bottomLeft); @@ -689,7 +733,9 @@ IView CreateSampleGrid() { Text = "Top Right", BackgroundColor = Colors.Orange, - TextColor = Colors.Chocolate + TextColor = Colors.Chocolate, + VerticalTextAlignment = TextAlignment.Start, + HorizontalTextAlignment = TextAlignment.End }; layout.Add(topRight); @@ -698,7 +744,9 @@ IView CreateSampleGrid() var bottomRight = new Label { Text = "Bottom Right", - BackgroundColor = Colors.MediumPurple + BackgroundColor = Colors.MediumPurple, + VerticalTextAlignment = TextAlignment.End, + HorizontalTextAlignment = TextAlignment.End }; layout.Add(bottomRight); diff --git a/src/Controls/samples/Controls.Sample.Gtk/rainbow_heart.png b/src/Controls/samples/Controls.Sample.Gtk/rainbow_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..21da2a14ab9a109babf175bd7e8957c936cc3dda GIT binary patch literal 1799 zcmV+i2l)7jP)j{0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmP!xqvQ>7vm2Q!E`WT;LSq!n@0DionYs1;guFnRrjCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$xj8AiNQw6)g%&Yhc)XAE?m4`7A0RZVOtX3>0Zq5f zbTT1jbE{J56(Iy5B955CEMrcVQ}C^?d+MdSi}Ec0zCUXqU$7VukcelQVcNtS#M7I$ z!FiupWMw5!d`>)J(glehxvqNr#<}FOz%xZNlb$CQiKS8(t6j{>rbawP9LZ}sZ^$yEU( z#{z25ptyeUKlnXcs~C@YN#O+0`{FnsV?byZXf+(?``B?>CqVESxY9fRS`(Q0B)!qm zB1gdBHgIv>(bPTQat9cGG89vBr64V#SOnhB=$mrD&@Irv=FP2rj?)JqL$gZV00)P_ zc!{#tecs*IJ-2^*+VlGXu9tGZBvZUi00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliruO$!wlRJ{&cQ z!IoCgf&nWH6blQ8JQw6umiNNC?Bn`LV}tF^&dwl=^Z$J2p8Gp@?wND%89>RC}l42bCCl81`K+1EzF>PW*n9G1_>7v433MY>e#JNMFv3` z5db2Qz-%;Ox_=b&<5SQ!XwXsFKzN4_mwV8R&>e_g=WWy0D`O1V#aa}Xjj)>7_9IWx zok!y#_wlf4yQDYZM$QlhZ{`zT;NRXDMUys!GafkV<7oiE;MgB{Gq)Sp>L(fbQbh*Q z1Meq8p;p-ytj^o7!=URyTgeO1k7yYAk}xsK4v(=5{GU?$xuW9SHoTjxrnYR868z|) z3#aS`|4VMlFvOgwhi6bMbO(KQz1rcudpb4bp#ga9d4F2+!DdKhP7e8zy0|0y zSOr|YYzO}BtCHU|24a)ViKvd zhaa!iRaQzcX7y&?t2qD1lQ7==IdgdB)`PrHYUh@9D^kLGh3~iTwfEk1KsfcgL<&V% z9AyOW>ZPVK_w|B0z_|NIGh2DNZv=!USFb=YU3tO5KPY)GgLiWC6yCYr$(b2EkvaQvg^^6kSvg5nG54_jiOso|2Ip5WB z>CyI8Eq*-vC994HtHxMnPct!5E2ph2Hfp(2jh_n3ShspucLlS0TZqYOr7!u1{3qZ| zrB!IWSm98Q%b}L&nf|-PXtl6zU$a%?#R@c)Ryo|Wme65CzE-lhiLE9iB5?-M# zCNpaDKEtn9Z*kJqD$)u#1Lq7L0Gj7?B(b#?-HUUagU^po zq3rlsjI?xf+Q;VfJsmSHk{5sZo>Wf`b2jF9#{euwQ^I8LFyT6=PJFzg?{wWJ)8{wR z4^x628mFVO0XK6#C46lq-ZE59iIyBXseyjc!ZNX4;T4=$cmSxZ(~;e;-a*e0^V{Hs zi5Zlqy?*;Q>I?vp}+p&m>gV>1^88G)}{0FeZ#?`gjKiSpI&>R&N~HK+mLw z!p-IWm|LtA*_X7)DjrzT`K-92!XBaRWsgyF^FC^B-bb}nPtZLv3X1=eiqa$K_4C{5 pvD$)ah!Q1AlqgZ6M2X@~e*#dM#GED`SaARV002ovPDHLkV1m}EV7&kU literal 0 HcmV?d00001 From f5ea0a7cf1b60457c768d557e183c4151b150cd6 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 13 Jul 2021 23:54:20 +0200 Subject: [PATCH 104/425] Core.csproj Gtk : SearchBarHandler.Gtk.cs: implement MapCharacterSpacing --- .../src/Handlers/SearchBar/SearchBarHandler.Gtk.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs index 730c8faa1799..7aec922da42a 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs @@ -1,5 +1,6 @@ using System; using Gtk; +using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui.Handlers { @@ -70,12 +71,15 @@ public static void MapMaxLength(SearchBarHandler handler, ISearchBar searchBar) nativeView.MaxLength = searchBar.MaxLength; } - [MissingMapper] - public static void MapCharacterSpacing(SearchBarHandler handler, ISearchBar searchBar) { } + public static void MapCharacterSpacing(SearchBarHandler handler, ISearchBar searchBar) + { + if (handler.NativeView?.Entry is { } nativeView) + nativeView.Attributes = nativeView.Attributes.AttrListFor(searchBar.CharacterSpacing); + } [MissingMapper] public static void MapIsTextPredictionEnabled(SearchBarHandler handler, ISearchBar searchBar) { } - + [MissingMapper] public static void MapCancelButtonColor(IViewHandler handler, ISearchBar searchBar) { } From 12e9f5c681ba6b9f2893f73b6ce23f2228cbc74b Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 14 Jul 2021 00:58:28 +0200 Subject: [PATCH 105/425] add Status.md --- Status.md | 459 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 459 insertions(+) create mode 100644 Status.md diff --git a/Status.md b/Status.md new file mode 100644 index 000000000000..89beb7e6c271 --- /dev/null +++ b/Status.md @@ -0,0 +1,459 @@ +We have created a detailed list to easily show the **.NET MAUI - Gtk status** and evolution. + +Note that only the Gtk-Section is actual in this Page. + +Icon | Description +-- | -- +⚠️ | Pending +⏳ | Underway +✅ | Done +💔 | Never implemented in Maui.Controls for this platform + +## Overview + +To track ongoing progress, filter on the [handlers label](https://github.com/xamarin/Xamarin.Forms/labels/handlers). + +### Pages + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| ContentPage | ✅ | ✅ | ✅ | ⚠️ | +| FlyoutPage | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| NavigationPage | ✅ | ✅ | ✅ | ⚠️ | +| TabbedPage | ✅ | ✅ | ✅ | ⚠️ | + +### Views + +### ✅ ActivityIndicator + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| Color | ✅ | ✅ | ✅ | ✅ | +| IsRunning | ✅ | ✅ | ✅ | ✅ | + +### ⚠️ Button + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| BackgroundColor | ✅ | ✅ | ✅ | ✅ | +| BorderColor | ⚠️ | ⚠️ | ⚠️ | ✅ | +| BorderWidth | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| CharacterSpacing | ✅ | ✅ | ✅ | ⚠️ | +| Clicked | ✅ | ✅ | ✅ | ✅ | +| Command | ✅ | ✅ | ✅ | ✅ | +| CommandParameter | ✅ | ✅ | ✅ | +| ContentLayout | ⚠️ | ⚠️ | ⚠️ | +| CornerRadius | ⚠️ | ⚠️ | ⚠️ | +| FontAttributes | ✅ | ✅ | ✅ | ✅ | +| FontFamily | ✅ | ✅ | ✅ | ✅ | +| FontSize | ✅ | ✅ | ✅ | ✅ | +| ImageSource | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| Padding | ✅ | ✅ | ✅ | ✅ | +| Pressed | ✅ | ✅ | ✅ | ✅ | +| Released | ✅ | ✅ | ✅ | ✅ | +| Text | ✅ | ✅ | ✅ | ✅ | +| TextColor | ✅ | ✅ | ✅ | ✅ | + + + +### ✅ CheckBox + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| Color | ✅ | ✅ | ✅ | ✅ | +| CheckedChanged | ✅ | ✅ | ✅ | ✅ | +| IsChecked | ✅ | ✅ | ✅ | ✅ | + +### ✅ DatePicker + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| BackgroundColor | ✅ | ✅ | ✅ | ⚠️ | +| CharacterSpacing | ✅ | ✅ | ✅ | ⚠️ | +| Date | ✅ | ✅ | ✅ | ⚠️ | +| DateSelected | ✅ | ✅ | ✅ | ⚠️ | +| FontAttributes | ✅ | ✅ | ✅ | ⚠️ | +| FontFamily | ✅ | ✅ | ✅ | ⚠️ | +| FontSize | ✅ | ✅ | ✅ | ⚠️ | +| Format | ✅ | ✅ | ✅ | ⚠️ | +| MaximumDate | ✅ | ✅ | ✅ | ⚠️ | +| MinimumDate | ✅ | ✅ | ✅ | ⚠️ | +| TextColor | ✅ | ✅ | ✅ | ⚠️ | + +### ⚠️ Editor + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| AutoSize | ⏳ | ⏳ | ⏳ | ⚠️ | +| Completed | ✅ | ✅ | ✅ | ⚠️ | +| CharacterSpacing | ✅ | ✅ | ✅ | ⚠️ | +| FontAttributes | ✅ | ✅ | ✅ | ✅ | +| FontFamily | ✅ | ✅ | ✅ | ✅ +| FontSize | ✅ | ✅ | ✅ | ✅ +| IsReadOnly | ✅ | ✅ | ✅ | ✅ +| IsTextPredictionEnabled | ✅ | ✅ | ⏳ |⚠️ +| PlaceHolder | ✅ | ✅ | ✅ | ⚠️ +| PlaceHolderColor | ✅ | ✅ | ✅ | ⚠️ +| Text | ✅ | ✅ | ✅ | ✅ | +| TextColor | ✅ | ✅ | ✅ | ✅ | +| MaxLength | ✅ | ✅ | ✅ | ⚠️ + +### ⚠️ Entry + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| ClearButtonVisibility | ✅ | ✅ | ✅ | ⚠️ +| CharacterSpacing | ✅ | ✅ | ✅ | ✅ | +| Completed | ✅ | ✅ | ✅ | ⚠️ +| CursorPosition | ✅ | ✅ | ⚠️ | ✅ +| FontAttributes | ✅ | ✅ | ✅ | ✅ +| FontFamily | ✅ | ✅ | ✅ | ✅ +| FontSize | ✅ | ✅ | ✅ | ✅ +| HorizontalTextAlignment | ✅ | ✅ | ⏳ | ✅ | +| IsTextPredictionEnabled | ✅ | ✅ | ⏳ | ⚠️ +| IsPassword | ✅ | ✅ | ⏳ | ✅ +| PlaceHolder | ✅ | ✅ | ✅ | ✅ +| PlaceHolderColor | ⏳ | ⏳ | ⏳ | ⚠️ +| VerticalTextAlignment | ⏳ | ⏳ | ⏳ | ⚠️ +| ReturnCommand | ✅ | ✅ | ✅ | ⚠️ +| ReturnCommandParameter | ✅ | ✅ | ✅ | ⚠️ +| ReturnType | ✅ | ✅ | ✅ | ⚠️ +| SelectionLength | ✅ | ✅ | ⚠️ | ✅ +| Text | ✅ | ✅ | ✅ | ✅ +| TextColor | ✅ | ✅ | ✅ | ✅ + +### ⚠️ Frame + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| BorderColor | ⏳ | ⏳ | ⚠️ | ⚠️ | +| CornerRadius | ⏳ | ⏳ | ⚠️ | ⚠️ | +| HasShadow | ⏳ | ⏳ | ⚠️ | ⚠️ | + + + +### ✅ Image + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| Aspect | ✅ | ✅ | ✅ | ⚠️ | +| IsLoading | ✅ | ✅ | ✅ | ✅ | +| Source | ✅ | ✅ | ✅ | ✅ | + + + +### ⚠️ Label + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| CharacterSpacing | ✅ | ✅ | ✅ | ✅ | +| Font | ✅ | ✅ | ✅ | ✅ | +| FontAttributes | ✅ | ✅ | ✅ | ✅ | +| FontFamily | ✅ | ✅ | ✅ | ✅ | +| FontSize | ✅ | ✅ | ✅ | ✅ | +| FormattedText | ✅ | ✅ | ⚠️ | ⚠️ | +| HorizontalTextAlignment | ✅ | ✅ | ✅ | ✅ | +| LineBreakMode | ✅ | ✅ | ✅ | ✅ | +| LineHeight | ✅ | ✅ | ✅ | ✅ | +| MaxLines | ✅ | ✅ | ✅ | ✅ | +| Padding | ✅ | ✅ | ✅ | ✅ | +| Text | ✅ | ✅ | ✅ | ✅ | +| TextColor | ✅ | ✅ | ✅ | ✅ | +| TextDecorations | ✅ | ✅ | ✅ | ✅ | +| TextType | ⏳ | ⏳ | ⏳ | ⚠️ | +| VerticalTextAlignment | ⚠️ | ⚠️ | ⏳ | ✅ | + + + +### ⚠️ Picker + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| CharacterSpacing | ✅ | ✅ | ✅ | ⚠️ | +| FontAttributes | ✅ | ✅ | ✅ | ✅ | +| FontFamily | ✅ | ✅ | ✅ | ✅ | +| FontSize | ✅ | ✅ | ✅ | ✅ | +| HorizontalTextAlignment | ✅ | ✅ | ✅ | ⚠️ | +| ItemDisplayBinding | ✅ | ✅ | ✅ | ✅ | +| Items | ✅ | ✅ | ✅ | ✅ +| ItemsSource | ✅ | ✅ | ✅ | ✅ +| SelectedIndex | ✅ | ✅ | ✅ | ✅ +| SelectedIndexChanged | ✅ | ✅ | ✅ | ⚠️ | +| SelectedItem | ✅ | ✅ | ⚠️ | ✅ +| TextColor | ✅ | ✅ | ⏳ | ✅ +| Title | ✅ | ✅ | ✅ | ⚠️ +| TitleColor | ✅ | ✅ | ✅ | ⚠️ +| VerticalTextAlignment | ⏳ | ⏳ | ⏳ | ⚠️ + +### ⚠️ ProgressBar + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| Progress | ✅ | ✅ | ✅ | ✅ | +| ProgressColor | ⏳ | ⏳ | ⏳ | ✅ | +| ProgressTo | ✅ | ✅ | ✅ | ✅ | + +### ⚠️ RadioButton + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| CheckedChanged | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| GroupName | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| IsChecked | ⏳ | ⏳ | ⚠️ | ⚠️ | + + + +### ⚠️ SearchBar + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| BackgroundColor | ✅ | ✅ | ✅ | ✅ | +| CharacterSpacing | ✅ | ✅ | ✅ | ✅ | +| CancelButtonColor | ⏳ | ⏳ | ✅ | +| FontAttributes | ✅ | ✅ | ⏳ | ✅ | +| FontSize | ✅ | ✅ | ⏳ | ✅ | +| HorizontalTextAlignment | ✅ | ✅ | ✅ | ✅ | +| MaxLength | ✅ | ✅ | ⏳ | ✅ | +| SearchCommand | ⏳ | ✅ | ✅ | +| SearchCommandParameter | ⏳ | ✅ | ✅ | +| Text | ✅ | ✅ | ✅ | ✅ | +| TextColor | ✅ | ✅ | ⏳ | ✅ | +| VerticalTextAlignment | ⚠️ | ⚠️ | ⚠️ | ⚠️ | + +### ✅ Shapes + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| Fill | ✅ | ✅ | ✅ | ✅ | +| Stroke | ✅ | ✅ | ✅ | ✅ | +| StrokeDashArray | ✅ | ✅ | ✅ | ✅ +| StrokeDashOffset | ✅ | ✅ | ✅ | ✅ +| StrokeLineCap | ✅ | ✅ | ✅ | ✅ +| StrokeLineJoin | ✅ | ✅ | ✅ | ✅ +| StrokeMiterLimit | ✅ | ✅ | ✅ | ✅ +| StrokeThickness | ✅ | ✅ | ✅ | ✅ | + +### ⚠️ Slider + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| DragCompleted | ✅ | ✅ | ✅ | +| DragCompletedCommand | ✅ | ✅ | ✅ | +| DragStarted | ✅ | ✅ | ✅ | +| DragStartedCommand | ✅ | ✅ | ✅ | +| Maximum | ✅ | ✅ | ✅ | ✅ | +| MaximumTrackColor | ✅ | ✅ | ✅ | +| Minimum | ✅ | ✅ | ✅ | ✅ | +| MinimumTrackColor | ✅ | ✅ | ✅ | +| ThumbColor | ✅ | ✅ | ⏳ | ✅ | +| ThumbImageSource | ⏳ | ⏳ | ✅ | ✅ | +| Value | ✅ | ✅ | ✅ | ✅ | ✅ | +| ValueChanged | ✅ | ✅ | ✅ | ✅ | + +### ✅ Stepper + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| Increment | ✅ | ✅ | ✅ | ✅ | +| Maximum | ✅ | ✅ | ✅ | ✅ | +| Minimum | ✅ | ✅ | ✅ | ✅ | +| Value | ✅ | ✅ | ✅ | ✅ | +| ValueChanged | ✅ | ✅ | ✅ | ✅ | + + + +### ⚠️ Switch + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| IsToggled | ✅ | ✅ | ✅ | ✅ | +| OnColor | ✅ | ✅ | ⏳ | ⚠️ | +| ThumbColor | ✅ | ✅ | ⏳ | ⚠️ | + +### ✅ TimePicker + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| BackgroundColor | ✅ | ✅ | ✅ | ⚠️ | +| CharacterSpacing | ✅ | ✅ | ✅ | ⚠️ | +| FontAttributes | ✅ | ✅ | ✅ | ⚠️ | +| FontFamily | ✅ | ✅ | ✅ | ⚠️ | +| FontSize | ✅ | ✅ | ✅ | ⚠️ | +| Format | ✅ | ✅ | ✅ | ⚠️ | +| Time | ✅ | ✅ | ✅ | ⚠️ | +| TextColor | ✅ | ✅ | ✅ | ⚠️ | + +### ⚠️ WebView + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| CanGoBack | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| CanGoForward | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| Cookies | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| Source | ⏳ | ⏳ | ⏳ | ⚠️ | +| Eval | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| EvaluateJavaScriptAsync | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| GoBack | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| GoForward | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| Reload | ⚠️ | ⚠️ | ⚠️ | ⚠️ | + +### Renderer Based Views + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| CarouselView | ✅ | ✅ | ⚠️ | ⚠️ | +| CollectionView | ✅ | ✅ | ⚠️ | ⚠️ | +| IndicatorView| ⏳ | ✅ | ⚠️ | ⚠️ | +| ImageButton| ✅ | ✅ | ✅ | ⚠️ | +| Map | ⏳ | ⏳ | ⚠️ | ⚠️ | +| RefreshView| ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| SwipeView| ✅ | ✅ | ⚠️ | ⚠️ | + +### Layouts + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| AbsoluteLayout | ✅ | ✅ | ✅ | +| ContentPresenter | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| ContentView | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| FlexLayout | ✅ | ✅ | ✅ | ✅ | +| Grid | ✅ | ✅ | ✅ | ✅ | +| RelativeLayout | ✅ | ✅ | ✅ | +| ScrollView | ✅ | ✅ | ✅ | ✅ | +| StackLayout | ✅ | ✅ | ✅ | ✅ | +| TemplatedView | ⚠️ | ⚠️ | ⚠️ | + +### Features + +| API | Android | iOS / Mac Catalyst | Windows | Gtk | +| ----|:-------:|:------------------:|:-------:|:----:| +| Accessibility | ✅ | ✅ | ✅ | ⚠️ | +| Animation | ✅ | ✅ | ✅ | ⚠️ | +| Border Everywhere | ⏳ | ⏳ | ⏳ | ⚠️ | +| Brushes Everywhere | ✅ | ✅ | ✅ | ⚠️ | +| CornerRadius Everywhere | ⏳ | ⏳ | ⏳ | ⚠️ | +| Device | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| Gestures | ✅ | ✅ | ✅ | ⚠️ | +| ImageHandlers | ✅ | ✅ | ✅ | ✅ | +| Interactivity (Behaviors, Triggers, Visual State Manager) | ✅ | ✅ | ✅ | ⚠️ | +| FlowDirection (RTL) | ⏳ | ⏳ | ⏳ | ⚠️ | +| Fonts | ✅ | ✅ | ✅ | ✅ | +| Lifecycle Events | ⏳ | ⏳ | ⏳ | ⏳ | +| Themes | ⏳ | ⏳ | ⚠️ | ⚠️ | +| Shell | ⏳ | ⏳ | ⏳ | ⚠️ | +| Styles | ✅ | ✅ | ✅ | ⚠️ | +| View Transforms | ✅ | ✅ | ✅ | ⚠️ | + From 0a007844de6131b7470e02a6860959b8e874d68b Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 14 Jul 2021 01:36:18 +0200 Subject: [PATCH 106/425] Core.csproj Gtk : PickerHandler.Gtk.cs: implement CharacterSpacing --- src/Core/src/Platform/Gtk/PickerExtensions.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Core/src/Platform/Gtk/PickerExtensions.cs b/src/Core/src/Platform/Gtk/PickerExtensions.cs index c5a6592f51b2..b4850c2a9d58 100644 --- a/src/Core/src/Platform/Gtk/PickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/PickerExtensions.cs @@ -1,5 +1,7 @@ using System.Linq; +using Gtk; using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui { @@ -37,6 +39,20 @@ public static void UpdateHorizontalTextAlignment(this Gtk.ComboBox? nativeView, cell.Xalign = nativeAlign; } + public static void UpdateCharacterSpacing(this Gtk.ComboBox? nativeView, double spacing) + { + if (nativeView == null || spacing == 0) + return; + + if (nativeView.HasEntry) + { + nativeView.Entry.Attributes = nativeView.Entry.Attributes.AttrListFor(spacing); + } + + if (nativeView.GetCellRendererText() is { } cell) + cell.Attributes = cell.Attributes.AttrListFor(spacing); + } + } } \ No newline at end of file From 5f0e20b79a82f67f5880852d4be8252fbac159ad Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 14 Jul 2021 01:36:57 +0200 Subject: [PATCH 107/425] Core.csproj Gtk : PickerHandler.Gtk.cs: implement CharacterSpacing --- src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs index 709b0b6e0d47..334c262b92e5 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs @@ -97,8 +97,10 @@ public static void MapFont(PickerHandler handler, IPicker view) } - [MissingMapper] - public static void MapCharacterSpacing(PickerHandler handler, IPicker view) { } + public static void MapCharacterSpacing(PickerHandler handler, IPicker view) + { + handler.NativeView.UpdateCharacterSpacing(view.CharacterSpacing); + } [MissingMapper] public static void MapTitle(PickerHandler handler, IPicker view) { } From ca72113beeff88cf307232d687eee16da4e939a0 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:12:29 +0200 Subject: [PATCH 108/425] build: Microsoft.Maui.Controls.MultiTargeting.targets: include Gtk-subdirs & Directory.Build.props: introduce BuildForGtk --- .nuspec/Microsoft.Maui.Controls.MultiTargeting.targets | 4 ++-- Directory.Build.props | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index 699dfbb953c0..09079f5bd57c 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -57,8 +57,8 @@ - - + + diff --git a/Directory.Build.props b/Directory.Build.props index d78ab73362e1..34fdb3008b4a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -24,8 +24,10 @@ net5 $(MauiGtkTargets) + true netstandard2.0;netstandard2.1 $(NonNet6EssentialsPlatforms);uap10.0.16299; + $(NonNet6EssentialsPlatforms);$(MauiGtkTargets); false true From 550cd830e3bbd9308c447e53d05ded25952f070c Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:16:36 +0200 Subject: [PATCH 109/425] Essentials.csproj: Gtk add stubs --- .../src/Accelerometer/Accelerometer.Gtk.cs | 14 +++ .../src/AppActions/AppActions.Gtk.cs | 18 +++ src/Essentials/src/AppInfo/AppInfo.Gtk.cs | 17 +++ src/Essentials/src/Barometer/Barometer.Gtk.cs | 14 +++ src/Essentials/src/Battery/Battery.Gtk.cs | 29 +++++ src/Essentials/src/Browser/Browser.Gtk.cs | 11 ++ src/Essentials/src/Compass/Compass.Gtk.cs | 14 +++ .../src/Connectivity/Connectivity.Gtk.cs | 19 +++ src/Essentials/src/Contacts/Contacts.Gtk.cs | 13 ++ .../src/DeviceInfo/DeviceInfo.Gtk.cs | 25 ++++ src/Essentials/src/Email/Email.Gtk.cs | 21 ++++ src/Essentials/src/Essentials.csproj | 5 + .../src/FilePicker/FilePicker.Gtk.cs | 30 +++++ .../src/FileSystem/FileSystem.Gtk.cs | 29 +++++ .../src/Flashlight/Flashlight.Gtk.cs | 13 ++ src/Essentials/src/Geocoding/Geocoding.Gtk.cs | 14 +++ .../src/Geolocation/Geolocation.Gtk.cs | 15 +++ src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs | 14 +++ .../src/HapticFeedback/HapticFeedback.Gtk.cs | 14 +++ src/Essentials/src/Launcher/Launcher.Gtk.cs | 20 +++ .../src/Magnetometer/Magnetometer.Gtk.cs | 14 +++ src/Essentials/src/Map/Map.Gtk.cs | 13 ++ .../src/MediaPicker/MediaPicker.Gtk.cs | 24 ++++ .../OrientationSensor.Gtk.cs | 14 +++ .../src/Permissions/Permissions.Gtk.cs | 114 ++++++++++++++++++ .../src/PhoneDialer/PhoneDialer.Gtk.cs | 11 ++ src/Essentials/src/Platform/Platform.Gtk.cs | 7 ++ .../src/Preferences/Preferences.Gtk.cs | 20 +++ .../src/Screenshot/Screenshot.Gtk.cs | 24 ++++ .../src/SecureStorage/SecureStorage.Gtk.cs | 19 +++ .../SemanticScreenReader.Gtk.cs | 12 ++ src/Essentials/src/Share/Share.Gtk.cs | 13 ++ src/Essentials/src/Sms/Sms.Gtk.cs | 13 ++ .../src/TextToSpeech/TextToSpeech.Gtk.cs | 15 +++ src/Essentials/src/Vibration/Vibration.Gtk.cs | 16 +++ .../AppleSignInAuthenticator.Gtk.cs | 13 ++ .../WebAuthenticator/WebAuthenticator.Gtk.cs | 13 ++ 37 files changed, 704 insertions(+) create mode 100644 src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs create mode 100644 src/Essentials/src/AppActions/AppActions.Gtk.cs create mode 100644 src/Essentials/src/AppInfo/AppInfo.Gtk.cs create mode 100644 src/Essentials/src/Barometer/Barometer.Gtk.cs create mode 100644 src/Essentials/src/Battery/Battery.Gtk.cs create mode 100644 src/Essentials/src/Browser/Browser.Gtk.cs create mode 100644 src/Essentials/src/Compass/Compass.Gtk.cs create mode 100644 src/Essentials/src/Connectivity/Connectivity.Gtk.cs create mode 100644 src/Essentials/src/Contacts/Contacts.Gtk.cs create mode 100644 src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs create mode 100644 src/Essentials/src/Email/Email.Gtk.cs create mode 100644 src/Essentials/src/FilePicker/FilePicker.Gtk.cs create mode 100644 src/Essentials/src/FileSystem/FileSystem.Gtk.cs create mode 100644 src/Essentials/src/Flashlight/Flashlight.Gtk.cs create mode 100644 src/Essentials/src/Geocoding/Geocoding.Gtk.cs create mode 100644 src/Essentials/src/Geolocation/Geolocation.Gtk.cs create mode 100644 src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs create mode 100644 src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs create mode 100644 src/Essentials/src/Launcher/Launcher.Gtk.cs create mode 100644 src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs create mode 100644 src/Essentials/src/Map/Map.Gtk.cs create mode 100644 src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs create mode 100644 src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs create mode 100644 src/Essentials/src/Permissions/Permissions.Gtk.cs create mode 100644 src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs create mode 100644 src/Essentials/src/Platform/Platform.Gtk.cs create mode 100644 src/Essentials/src/Preferences/Preferences.Gtk.cs create mode 100644 src/Essentials/src/Screenshot/Screenshot.Gtk.cs create mode 100644 src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs create mode 100644 src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs create mode 100644 src/Essentials/src/Share/Share.Gtk.cs create mode 100644 src/Essentials/src/Sms/Sms.Gtk.cs create mode 100644 src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs create mode 100644 src/Essentials/src/Vibration/Vibration.Gtk.cs create mode 100644 src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs create mode 100644 src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs diff --git a/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs b/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs new file mode 100644 index 000000000000..0ad34a8dfc2d --- /dev/null +++ b/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Accelerometer + { + internal static bool IsSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformStart(SensorSpeed sensorSpeed) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformStop() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/AppActions/AppActions.Gtk.cs b/src/Essentials/src/AppActions/AppActions.Gtk.cs new file mode 100644 index 000000000000..11b78741e205 --- /dev/null +++ b/src/Essentials/src/AppActions/AppActions.Gtk.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class AppActions + { + internal static bool PlatformIsSupported + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task> PlatformGetAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformSetAsync(IEnumerable actions) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs new file mode 100644 index 000000000000..7eec87e0c147 --- /dev/null +++ b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs @@ -0,0 +1,17 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class AppInfo + { + static string PlatformGetPackageName() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static string PlatformGetName() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static string PlatformGetVersionString() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static string PlatformGetBuild() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformShowSettingsUI() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static AppTheme PlatformRequestedTheme() => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Barometer/Barometer.Gtk.cs b/src/Essentials/src/Barometer/Barometer.Gtk.cs new file mode 100644 index 000000000000..12952526fc8a --- /dev/null +++ b/src/Essentials/src/Barometer/Barometer.Gtk.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Barometer + { + internal static bool IsSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStart(SensorSpeed sensorSpeed) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStop() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Battery/Battery.Gtk.cs b/src/Essentials/src/Battery/Battery.Gtk.cs new file mode 100644 index 000000000000..7a9bf9936e6b --- /dev/null +++ b/src/Essentials/src/Battery/Battery.Gtk.cs @@ -0,0 +1,29 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Battery + { + static void StartBatteryListeners() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void StopBatteryListeners() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static double PlatformChargeLevel => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static BatteryState PlatformState => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static BatteryPowerSource PlatformPowerSource => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void StartEnergySaverListeners() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void StopEnergySaverListeners() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static EnergySaverStatus PlatformEnergySaverStatus => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Browser/Browser.Gtk.cs b/src/Essentials/src/Browser/Browser.Gtk.cs new file mode 100644 index 000000000000..b641310231d0 --- /dev/null +++ b/src/Essentials/src/Browser/Browser.Gtk.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Browser + { + static Task PlatformOpenAsync(Uri uri, BrowserLaunchOptions options) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Compass/Compass.Gtk.cs b/src/Essentials/src/Compass/Compass.Gtk.cs new file mode 100644 index 000000000000..404dcb8048ad --- /dev/null +++ b/src/Essentials/src/Compass/Compass.Gtk.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Compass + { + internal static bool IsSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStart(SensorSpeed sensorSpeed, bool applyLowPassFilter) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStop() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Connectivity/Connectivity.Gtk.cs b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs new file mode 100644 index 000000000000..4e234aae6918 --- /dev/null +++ b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Connectivity + { + static NetworkAccess PlatformNetworkAccess => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static IEnumerable PlatformConnectionProfiles => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void StartListeners() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void StopListeners() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Contacts/Contacts.Gtk.cs b/src/Essentials/src/Contacts/Contacts.Gtk.cs new file mode 100644 index 000000000000..d66a50a49db7 --- /dev/null +++ b/src/Essentials/src/Contacts/Contacts.Gtk.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Contacts + { + static Task PlatformPickContactAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task> PlatformGetAllAsync(CancellationToken cancellationToken) => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs b/src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs new file mode 100644 index 000000000000..c8a9319b5012 --- /dev/null +++ b/src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs @@ -0,0 +1,25 @@ +namespace Microsoft.Maui.Essentials +{ + + public static partial class DeviceInfo + { + + static string GetModel() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static string GetManufacturer() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static string GetDeviceName() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static string GetVersionString() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static DevicePlatform Gtk { get; } = DevicePlatform.Create(nameof(Gtk)); + + static DevicePlatform GetPlatform() => Gtk; + + static DeviceIdiom GetIdiom() => DeviceIdiom.Desktop; + + static DeviceType GetDeviceType() => DeviceType.Unknown; + + } + +} \ No newline at end of file diff --git a/src/Essentials/src/Email/Email.Gtk.cs b/src/Essentials/src/Email/Email.Gtk.cs new file mode 100644 index 000000000000..b3bdfdf71325 --- /dev/null +++ b/src/Essentials/src/Email/Email.Gtk.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Email + { + internal static bool IsComposeSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformComposeAsync(EmailMessage message) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } + +#if NETSTANDARD1_0 || NETSTANDARD2_0 || NET6_0 + public partial class EmailAttachment + { + string PlatformGetContentType(string extension) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +#endif +} diff --git a/src/Essentials/src/Essentials.csproj b/src/Essentials/src/Essentials.csproj index bb43e548f268..79e1b7eba3c8 100644 --- a/src/Essentials/src/Essentials.csproj +++ b/src/Essentials/src/Essentials.csproj @@ -69,4 +69,9 @@ + + + + + diff --git a/src/Essentials/src/FilePicker/FilePicker.Gtk.cs b/src/Essentials/src/FilePicker/FilePicker.Gtk.cs new file mode 100644 index 000000000000..883a8279c42c --- /dev/null +++ b/src/Essentials/src/FilePicker/FilePicker.Gtk.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class FilePicker + { + static Task> PlatformPickAsync(PickOptions options, bool allowMultiple = false) + => throw new NotImplementedInReferenceAssemblyException(); + } + + public partial class FilePickerFileType + { + static FilePickerFileType PlatformImageFileType() + => throw new NotImplementedInReferenceAssemblyException(); + + static FilePickerFileType PlatformPngFileType() + => throw new NotImplementedInReferenceAssemblyException(); + + static FilePickerFileType PlatformJpegFileType() + => throw new NotImplementedInReferenceAssemblyException(); + + static FilePickerFileType PlatformVideoFileType() + => throw new NotImplementedInReferenceAssemblyException(); + + static FilePickerFileType PlatformPdfFileType() + => throw new NotImplementedInReferenceAssemblyException(); + } +} diff --git a/src/Essentials/src/FileSystem/FileSystem.Gtk.cs b/src/Essentials/src/FileSystem/FileSystem.Gtk.cs new file mode 100644 index 000000000000..fbe88b541e62 --- /dev/null +++ b/src/Essentials/src/FileSystem/FileSystem.Gtk.cs @@ -0,0 +1,29 @@ +using System.IO; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class FileSystem + { + static string PlatformCacheDirectory + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static string PlatformAppDataDirectory + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformOpenAppPackageFileAsync(string filename) + => throw ExceptionUtils.NotSupportedOrImplementedException; + } + + public partial class FileBase + { + static string PlatformGetContentType(string extension) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal void PlatformInit(FileBase file) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal virtual Task PlatformOpenReadAsync() + => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Flashlight/Flashlight.Gtk.cs b/src/Essentials/src/Flashlight/Flashlight.Gtk.cs new file mode 100644 index 000000000000..a63cef055aa5 --- /dev/null +++ b/src/Essentials/src/Flashlight/Flashlight.Gtk.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Flashlight + { + static Task PlatformTurnOnAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformTurnOffAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Geocoding/Geocoding.Gtk.cs b/src/Essentials/src/Geocoding/Geocoding.Gtk.cs new file mode 100644 index 000000000000..0ece1f89a970 --- /dev/null +++ b/src/Essentials/src/Geocoding/Geocoding.Gtk.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Geocoding + { + static Task> PlatformGetPlacemarksAsync(double latitude, double longitude) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task> PlatformGetLocationsAsync(string address) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Geolocation/Geolocation.Gtk.cs b/src/Essentials/src/Geolocation/Geolocation.Gtk.cs new file mode 100644 index 000000000000..1c70d04c06b1 --- /dev/null +++ b/src/Essentials/src/Geolocation/Geolocation.Gtk.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Geolocation + { + static Task PlatformLastKnownLocationAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformLocationAsync(GeolocationRequest request, CancellationToken cancellationToken) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs b/src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs new file mode 100644 index 000000000000..8fe3ef0a0ab7 --- /dev/null +++ b/src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Gyroscope + { + internal static bool IsSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStart(SensorSpeed sensorSpeed) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStop() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs b/src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs new file mode 100644 index 000000000000..3a7407846e58 --- /dev/null +++ b/src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs @@ -0,0 +1,14 @@ +using System; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class HapticFeedback + { + internal static bool IsSupported + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformPerform(HapticFeedbackType type) + => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Launcher/Launcher.Gtk.cs b/src/Essentials/src/Launcher/Launcher.Gtk.cs new file mode 100644 index 000000000000..a408e0005589 --- /dev/null +++ b/src/Essentials/src/Launcher/Launcher.Gtk.cs @@ -0,0 +1,20 @@ +using System; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Launcher + { + static Task PlatformCanOpenAsync(Uri uri) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformOpenAsync(Uri uri) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformOpenAsync(OpenFileRequest request) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformTryOpenAsync(Uri uri) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs b/src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs new file mode 100644 index 000000000000..637976c52e3a --- /dev/null +++ b/src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Magnetometer + { + internal static bool IsSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStart(SensorSpeed sensorSpeed) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static void PlatformStop() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Map/Map.Gtk.cs b/src/Essentials/src/Map/Map.Gtk.cs new file mode 100644 index 000000000000..7fc2bdf7789a --- /dev/null +++ b/src/Essentials/src/Map/Map.Gtk.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Map + { + internal static Task PlatformOpenMapsAsync(double latitude, double longitude, MapLaunchOptions options) + => throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static Task PlatformOpenMapsAsync(Placemark placemark, MapLaunchOptions options) + => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs b/src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs new file mode 100644 index 000000000000..223e7be4015b --- /dev/null +++ b/src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class MediaPicker + { + static bool PlatformIsCaptureSupported => + throw new NotImplementedInReferenceAssemblyException(); + + static Task PlatformPickPhotoAsync(MediaPickerOptions options) => + throw new NotImplementedInReferenceAssemblyException(); + + static Task PlatformCapturePhotoAsync(MediaPickerOptions options) => + throw new NotImplementedInReferenceAssemblyException(); + + static Task PlatformPickVideoAsync(MediaPickerOptions options) => + throw new NotImplementedInReferenceAssemblyException(); + + static Task PlatformCaptureVideoAsync(MediaPickerOptions options) => + throw new NotImplementedInReferenceAssemblyException(); + } +} diff --git a/src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs b/src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs new file mode 100644 index 000000000000..8cf49fe6dffc --- /dev/null +++ b/src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class OrientationSensor + { + internal static bool IsSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformStart(SensorSpeed sensorSpeed) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformStop() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Permissions/Permissions.Gtk.cs b/src/Essentials/src/Permissions/Permissions.Gtk.cs new file mode 100644 index 000000000000..281b3ac75218 --- /dev/null +++ b/src/Essentials/src/Permissions/Permissions.Gtk.cs @@ -0,0 +1,114 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Permissions + { + public partial class BasePlatformPermission : BasePermission + { + public override Task CheckStatusAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + public override Task RequestAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + public override void EnsureDeclared() => + throw ExceptionUtils.NotSupportedOrImplementedException; + + public override bool ShouldShowRationale() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } + + public partial class Battery : BasePlatformPermission + { + } + + public partial class CalendarRead : BasePlatformPermission + { + } + + public partial class CalendarWrite : BasePlatformPermission + { + } + + public partial class Camera : BasePlatformPermission + { + } + + public partial class ContactsRead : BasePlatformPermission + { + } + + public partial class ContactsWrite : BasePlatformPermission + { + } + + public partial class Flashlight : BasePlatformPermission + { + } + + public partial class LaunchApp : BasePlatformPermission + { + } + + public partial class LocationWhenInUse : BasePlatformPermission + { + } + + public partial class LocationAlways : BasePlatformPermission + { + } + + public partial class Maps : BasePlatformPermission + { + } + + public partial class Media : BasePlatformPermission + { + } + + public partial class Microphone : BasePlatformPermission + { + } + + public partial class NetworkState : BasePlatformPermission + { + } + + public partial class Phone : BasePlatformPermission + { + } + + public partial class Photos : BasePlatformPermission + { + } + + public partial class Reminders : BasePlatformPermission + { + } + + public partial class Sensors : BasePlatformPermission + { + } + + public partial class Sms : BasePlatformPermission + { + } + + public partial class Speech : BasePlatformPermission + { + } + + public partial class StorageRead : BasePlatformPermission + { + } + + public partial class StorageWrite : BasePlatformPermission + { + } + + public partial class Vibrate : BasePlatformPermission + { + } + } +} diff --git a/src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs b/src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs new file mode 100644 index 000000000000..5632a0a92762 --- /dev/null +++ b/src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs @@ -0,0 +1,11 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class PhoneDialer + { + internal static bool IsSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformOpen(string number) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Platform/Platform.Gtk.cs b/src/Essentials/src/Platform/Platform.Gtk.cs new file mode 100644 index 000000000000..893e43da68e4 --- /dev/null +++ b/src/Essentials/src/Platform/Platform.Gtk.cs @@ -0,0 +1,7 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Platform + { + } + +} diff --git a/src/Essentials/src/Preferences/Preferences.Gtk.cs b/src/Essentials/src/Preferences/Preferences.Gtk.cs new file mode 100644 index 000000000000..ce4e56cad11a --- /dev/null +++ b/src/Essentials/src/Preferences/Preferences.Gtk.cs @@ -0,0 +1,20 @@ +namespace Microsoft.Maui.Essentials +{ + public static partial class Preferences + { + static bool PlatformContainsKey(string key, string sharedName) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformRemove(string key, string sharedName) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformClear(string sharedName) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformSet(string key, T value, string sharedName) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static T PlatformGet(string key, T defaultValue, string sharedName) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Screenshot/Screenshot.Gtk.cs b/src/Essentials/src/Screenshot/Screenshot.Gtk.cs new file mode 100644 index 000000000000..1238da6b400e --- /dev/null +++ b/src/Essentials/src/Screenshot/Screenshot.Gtk.cs @@ -0,0 +1,24 @@ +using System.IO; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Screenshot + { + static bool PlatformIsCaptureSupported => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformCaptureAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } + + public partial class ScreenshotResult + { + ScreenshotResult() + { + } + + internal Task PlatformOpenReadAsync(ScreenshotFormat format) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs b/src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs new file mode 100644 index 000000000000..859e5a99f41f --- /dev/null +++ b/src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public partial class SecureStorage + { + static Task PlatformGetAsync(string key) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformSetAsync(string key, string data) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static bool PlatformRemove(string key) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformRemoveAll() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs b/src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs new file mode 100644 index 000000000000..d4d71567af53 --- /dev/null +++ b/src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Maui.Essentials +{ + public static partial class SemanticScreenReader + { + static void PlatformAnnounce(string text) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Share/Share.Gtk.cs b/src/Essentials/src/Share/Share.Gtk.cs new file mode 100644 index 000000000000..1f8e32355459 --- /dev/null +++ b/src/Essentials/src/Share/Share.Gtk.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Share + { + static Task PlatformRequestAsync(ShareTextRequest request) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformRequestAsync(ShareMultipleFilesRequest request) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Sms/Sms.Gtk.cs b/src/Essentials/src/Sms/Sms.Gtk.cs new file mode 100644 index 000000000000..85209c28a3d0 --- /dev/null +++ b/src/Essentials/src/Sms/Sms.Gtk.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Sms + { + internal static bool IsComposeSupported + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static Task PlatformComposeAsync(SmsMessage message) + => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs b/src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs new file mode 100644 index 000000000000..0c15a29fbb27 --- /dev/null +++ b/src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class TextToSpeech + { + internal static Task PlatformSpeakAsync(string text, SpeechOptions options, CancellationToken cancelToken = default) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + internal static Task> PlatformGetLocalesAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/Vibration/Vibration.Gtk.cs b/src/Essentials/src/Vibration/Vibration.Gtk.cs new file mode 100644 index 000000000000..045610e3e3d1 --- /dev/null +++ b/src/Essentials/src/Vibration/Vibration.Gtk.cs @@ -0,0 +1,16 @@ +using System; + +namespace Microsoft.Maui.Essentials +{ + public static partial class Vibration + { + internal static bool IsSupported + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformVibrate(TimeSpan duration) + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static void PlatformCancel() + => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs b/src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs new file mode 100644 index 000000000000..6de358baf980 --- /dev/null +++ b/src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class AppleSignInAuthenticator + { + static Task PlatformAuthenticateAsync(Options options) => + throw ExceptionUtils.NotSupportedOrImplementedException; + } +} diff --git a/src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs b/src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs new file mode 100644 index 000000000000..dd15307fabf1 --- /dev/null +++ b/src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + public static partial class WebAuthenticator + { + static Task PlatformAuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) + => throw ExceptionUtils.NotSupportedOrImplementedException; + } +} From 98cf20a777030c1df8704a91f8c1dfeb3906beee Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:17:47 +0200 Subject: [PATCH 110/425] Essentials.csproj: Gtk implement Clipboard.Gtk.cs & DeviceDisplay.Gtk.cs & MainThread.Gtk.cs --- src/Essentials/src/Clipboard/Clipboard.Gtk.cs | 44 +++++++++++ .../src/DeviceDisplay/DeviceDisplay.Gtk.cs | 79 +++++++++++++++++++ .../src/MainThread/MainThread.Gtk.cs | 42 ++++++++++ 3 files changed, 165 insertions(+) create mode 100644 src/Essentials/src/Clipboard/Clipboard.Gtk.cs create mode 100644 src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs create mode 100644 src/Essentials/src/MainThread/MainThread.Gtk.cs diff --git a/src/Essentials/src/Clipboard/Clipboard.Gtk.cs b/src/Essentials/src/Clipboard/Clipboard.Gtk.cs new file mode 100644 index 000000000000..9f5c7ca106a9 --- /dev/null +++ b/src/Essentials/src/Clipboard/Clipboard.Gtk.cs @@ -0,0 +1,44 @@ +using System.Threading.Tasks; + +namespace Microsoft.Maui.Essentials +{ + + public static partial class Clipboard + { + + static readonly Gdk.Atom clipboardAtom = Gdk.Atom.Intern("CLIPBOARD", false); + + static Task PlatformSetTextAsync(string text) + { + var clipboard = Gtk.Clipboard.Get(clipboardAtom); + clipboard.Text = text; + + return Task.FromResult(0); + } + + static bool PlatformHasText + { + get + { + var clipboard = Gtk.Clipboard.Get(clipboardAtom); + + return clipboard.WaitIsTextAvailable(); + } + } + + static Task PlatformGetTextAsync() + { + var clipboard = Gtk.Clipboard.Get(clipboardAtom); + + return Task.FromResult(clipboard.WaitForText()); + } + + static void StartClipboardListeners() + => throw ExceptionUtils.NotSupportedOrImplementedException; + + static void StopClipboardListeners() + => throw ExceptionUtils.NotSupportedOrImplementedException; + + } + +} \ No newline at end of file diff --git a/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs b/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs new file mode 100644 index 000000000000..792ce9efa877 --- /dev/null +++ b/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs @@ -0,0 +1,79 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Maui.Essentials +{ + + public static partial class DeviceDisplay + { + + static bool PlatformKeepScreenOn + { + get => throw ExceptionUtils.NotSupportedOrImplementedException; + set => throw ExceptionUtils.NotSupportedOrImplementedException; + } + + static DisplayInfo GetMainDisplayInfo() + { + var mainMonitor = PrimaryMonitor; + var geometry = mainMonitor.Geometry; + var orientation = geometry.Height > geometry.Width ? DisplayOrientation.Portrait : DisplayOrientation.Landscape; + var rate = mainMonitor.RefreshRate / 1000; // The value is in milli-Hertz, so a refresh rate of 60Hz is returned as 60000. + + return new DisplayInfo(geometry.Width, geometry.Height, DefaultScreen.Resolution, orientation, DisplayRotation.Unknown, rate); + } + + static void StartScreenMetricsListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; + + static void StopScreenMetricsListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; + + public static Gdk.Screen DefaultScreen => Gdk.Screen.Default; + + /// + /// A describes a particular video hardware display format. + /// It includes information about the number of bits used for each color, the way the bits are translated into an RGB value for display, + /// and the way the bits are stored in memory. For example, a piece of display hardware might support 24-bit color, 16-bit color, or 8-bit color; + /// meaning 24/16/8-bit pixel sizes. For a given pixel size, pixels can be in different formats; + /// for example the “red” element of an RGB pixel may be in the top 8 bits of the pixel, or may be in the lower 4 bits. + /// There are several standard visuals. + /// The visual returned by is the system’s default visual, + /// and the visual returned by should be used for creating windows with an alpha channel. + /// + /// Get the system’s default visual for screen . + /// This is the visual for the root window of the display. + /// The return value should not be freed. + /// + public static Gdk.Visual SystemVisual => Gdk.Screen.Default.SystemVisual; + + public static double DefaultResolution => DefaultScreen.Resolution; + + /// + /// GdkDisplay objects purpose are two fold: + /// to manage and provide information about input devices (pointers and keyboards) + /// to manage and provide information about the available s. + /// 's are the GDK representation of an X Display, which can be described as a workstation consisting of a keyboard, + /// a pointing device (such as a mouse) and one or more screens. + /// It is used to open and keep track of various objects currently instantiated by the application. + /// It is also used to access the keyboard(s) and mouse pointer(s) of the display. + /// + public static Gdk.Display DefaultDisplay => Gdk.Display.Default; + + public static Gdk.Monitor CurrentMonitor => DefaultDisplay.GetMonitorAtPoint(0, 0); // TODO: find out aktual mouse position + + public static Gdk.Monitor PrimaryMonitor => GetMonitors().Single(m => m.IsPrimary); + + public static int CurrentScaleFaktor = CurrentMonitor.ScaleFactor; + + public static IEnumerable GetMonitors() + { + + for (var i = 0; i < DefaultDisplay.NMonitors; i++) + { + yield return DefaultDisplay.GetMonitor(i); + } + + } + + } + +} \ No newline at end of file diff --git a/src/Essentials/src/MainThread/MainThread.Gtk.cs b/src/Essentials/src/MainThread/MainThread.Gtk.cs new file mode 100644 index 000000000000..8724a18ea075 --- /dev/null +++ b/src/Essentials/src/MainThread/MainThread.Gtk.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading; + +namespace Microsoft.Maui.Essentials +{ + + public static partial class MainThread + { + + static void PlatformBeginInvokeOnMainThread(Action action) + { + if (action == null) + throw new ArgumentNullException(nameof(action)); + + Gtk.Application.Invoke((o, args) => + { + action(); + }); + } + + static int? UIThreadId = null; + + static bool PlatformIsMainThread + { + get + { + if (UIThreadId != null) + return Thread.CurrentThread.ManagedThreadId == UIThreadId; + + Gtk.Application.Invoke((sender, args) => + { + UIThreadId = Thread.CurrentThread.ManagedThreadId; + }); + + return false; + + } + } + + } + +} \ No newline at end of file From 9ac10a31901b951fc17bd752d1ed5294a1f2644b Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:20:24 +0200 Subject: [PATCH 111/425] Core.csproj Gtk : TextExtensions.cs: adjust AttrListFor letterspacing --- src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs index 114994b6b1a2..43d1c38e4cdb 100644 --- a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs @@ -113,7 +113,7 @@ public static double ScaledFromPango(this double it) var spacing = letterspacing.ScaledToPango(); if (letterspacing <= 1) - return list; + return null; var l = new Pango.AttrList(); From 4200960630fe6e3bfe1cc6d683051b924eeba18b Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:22:24 +0200 Subject: [PATCH 112/425] Core.csproj Gtk : FontManager.Gtk.cs & FontExtensions.cs: track api changes for Font --- src/Core/src/Fonts/FontManager.Gtk.cs | 2 +- src/Core/src/Platform/Gtk/FontExtensions.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Core/src/Fonts/FontManager.Gtk.cs b/src/Core/src/Fonts/FontManager.Gtk.cs index 56fd8aaad36f..88c414aec93b 100644 --- a/src/Core/src/Fonts/FontManager.Gtk.cs +++ b/src/Core/src/Fonts/FontManager.Gtk.cs @@ -89,7 +89,7 @@ public FontDescription GetFontFamily(Font font) => public double GetFontSize(Font font) { - return font.FontSize; + return font.Size; } private IEnumerable<(Pango.FontFamily family, Pango.FontDescription description)> GetAvailableFamilyFaces(Pango.FontFamily family) diff --git a/src/Core/src/Platform/Gtk/FontExtensions.cs b/src/Core/src/Platform/Gtk/FontExtensions.cs index 63909684968a..edaa3613813a 100644 --- a/src/Core/src/Platform/Gtk/FontExtensions.cs +++ b/src/Core/src/Platform/Gtk/FontExtensions.cs @@ -58,9 +58,9 @@ public static Pango.Weight ToFontWeight(this FontWeight it) => public static Pango.FontDescription ToFontDescription(this Font it) => new() { - Family = it.FontFamily, - Size = (int)(it.FontSize * Pango.Scale.PangoScale), - Style = it.FontSlant.ToFontStyle(), + Family = it.Family, + Size = (int)(it.Size * Pango.Scale.PangoScale), + Style = it.Slant.ToFontStyle(), Weight = it.Weight.ToFontWeight(), Stretch = it.ToFontStretch() }; From ce9aa9ad53482cc18131bb3beeb045611bced475 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:24:52 +0200 Subject: [PATCH 113/425] Core.csproj Gtk : ButtonHandler.Gtk.cs: implement MapCharacterSpacing --- src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs | 14 +++++++++++--- src/Core/src/Platform/Gtk/ButtonExtensions.cs | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index 74d655c8999f..c943ac622d84 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -1,15 +1,18 @@ using System; using Gtk; +using Microsoft.Maui.Graphics.Native.Gtk; namespace Microsoft.Maui.Handlers { + // https://developer.gnome.org/gtk3/stable/GtkButton.html + public partial class ButtonHandler : ViewHandler { protected override Button CreateNativeView() { - return new Button(); + return Button.NewWithLabel(string.Empty); } protected override void ConnectHandler(Button nativeView) @@ -36,8 +39,13 @@ public static void MapTextColor(ButtonHandler handler, IButton button) handler.NativeView?.UpdateTextColor(button.TextColor); } - [MissingMapper] - public static void MapCharacterSpacing(ButtonHandler handler, IButton button) { } + public static void MapCharacterSpacing(ButtonHandler handler, IButton button) + { + if (handler.NativeView.Child is Label nativeView) + { + nativeView.Attributes = nativeView.Attributes.AttrListFor(button.CharacterSpacing); + } + } public static void MapFont(ButtonHandler handler, IButton button) { diff --git a/src/Core/src/Platform/Gtk/ButtonExtensions.cs b/src/Core/src/Platform/Gtk/ButtonExtensions.cs index 4a40fde87f56..d565f74faab8 100644 --- a/src/Core/src/Platform/Gtk/ButtonExtensions.cs +++ b/src/Core/src/Platform/Gtk/ButtonExtensions.cs @@ -2,11 +2,25 @@ namespace Microsoft.Maui { + public static class ButtonExtensions { + public static void UpdateText(this Button nativeButton, IButton button) { + // need to attach Attributes after setting text again, so get it ... + var attrs = (nativeButton.Child as Label)?.Attributes; + + // cause maybe a new label is created on assiging text: nativeButton.Label = button.Text; + + if (nativeButton.Child is Label lbl) + { + // and set it again on the new label: + lbl.Attributes = attrs; + } } + } + } \ No newline at end of file From e671fea521475746bb60f6ff15899c7f09f1a1f0 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:25:57 +0200 Subject: [PATCH 114/425] Core.csproj Gtk : LayoutView.cs: track api changes & use layoutManager --- src/Core/src/Platform/Gtk/LayoutView.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index fa6f78e107ea..667994f1b33f 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -150,11 +150,10 @@ protected void AllocateChildren(Rectangle allocation) protected void ArrangeAllocation(Rectangle allocation) { - if (VirtualView is not { } virtualView) + if (VirtualView is not { LayoutManager: { } layoutManager } virtualView) return; - virtualView.InvalidateArrange(); - virtualView.Arrange(allocation); + layoutManager.ArrangeChildren(allocation); } @@ -216,11 +215,10 @@ protected override void OnRealized() public SizeRequest Measure(double widthConstraint, double heightConstraint, SizeRequestMode mode) { - if (VirtualView is not { } virtualView) + if (VirtualView is not { LayoutManager: { } layoutManager } virtualView) return Size.Zero; - virtualView.InvalidateMeasure(); - var size1 = virtualView.Measure(widthConstraint, heightConstraint); + var size1 = layoutManager.Measure(widthConstraint, heightConstraint); sr++; return new SizeRequest(size1, size1); From 2d5faddc6bc34313dddcaa4f88ae68c777ff1735 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:28:27 +0200 Subject: [PATCH 115/425] Core.csproj Gtk : LayoutHandler.Gtk.cs: track api changes of IContainer:is a IList now --- src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index f381ac0b3ea6..92f7034c56a3 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -35,7 +35,7 @@ public override void SetVirtualView(IView view) NativeView.ClearChildren(); - foreach (var child in VirtualView.Children) + foreach (var child in VirtualView) { if (child.ToNative(MauiContext) is { } nativeChild) NativeView.Add(child, nativeChild); From 2aa29c39184ed62c2f9ff5c84f042fb5b3b06711 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:30:46 +0200 Subject: [PATCH 116/425] Core.csproj Gtk : move NavigationPageHandler from Controls.Core & adopt changes --- .../NavigationPageHandler.Gtk.cs | 99 ------------------- .../NavigationPageHandler.Gtk.cs | 47 +++++++++ src/Core/src/Platform/Gtk/NavigationView.cs | 11 +++ 3 files changed, 58 insertions(+), 99 deletions(-) delete mode 100644 src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/NavigationView.cs diff --git a/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs b/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs deleted file mode 100644 index 9616a1a36943..000000000000 --- a/src/Controls/src/Core/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs +++ /dev/null @@ -1,99 +0,0 @@ -#nullable enable -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Text; -using Gtk; -using Microsoft.Maui.Controls.Internals; -using Microsoft.Maui.Handlers; - -namespace Microsoft.Maui.Controls.Handlers -{ - - public partial class NavigationPageHandler : - ViewHandler - { - - protected override GtkNavigationPage CreateNativeView() - { - return new(); - } - - protected override void ConnectHandler(GtkNavigationPage nativeView) - { - base.ConnectHandler(nativeView); - - var virtualView = VirtualView; - virtualView.PushRequested += OnPushRequested; - virtualView.PopRequested += OnPopRequested; - virtualView.PopToRootRequested += OnPopToRootRequested; - virtualView.InternalChildren.CollectionChanged += OnChildrenChanged; - - SetPage(virtualView.CurrentPage); - } - - protected override void DisconnectHandler(GtkNavigationPage nativeView) - { - base.DisconnectHandler(nativeView); - - var virtualView = VirtualView; - virtualView.PushRequested -= OnPushRequested; - virtualView.PopRequested -= OnPopRequested; - virtualView.PopToRootRequested -= OnPopToRootRequested; - virtualView.InternalChildren.CollectionChanged -= OnChildrenChanged; - } - - void SetPage(Page page) - { - if (MauiContext == null) - return; - - if (page.ToNative(MauiContext) is { } nativePage) - NativeView.PackStart(nativePage, true, true, 0); - } - - void OnChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - ; - } - - void OnPopToRootRequested(object? sender, NavigationRequestedEventArgs e) - { - ; - } - - void OnPopRequested(object? sender, NavigationRequestedEventArgs e) - { - ; - } - - void OnPushRequested(object? sender, NavigationRequestedEventArgs e) - { - ; - } - - [MissingMapper] - public static void MapPadding(NavigationPageHandler handler, NavigationPage view) { } - - [MissingMapper] - public static void MapBarTextColor(NavigationPageHandler handler, NavigationPage view) { } - - [MissingMapper] - public static void MapBarBackground(NavigationPageHandler handler, NavigationPage view) { } - - [MissingMapper] - public static void MapTitleIcon(NavigationPageHandler handler, NavigationPage view) { } - - [MissingMapper] - public static void MapTitleView(NavigationPageHandler handler, NavigationPage view) { } - - } - - public class GtkNavigationPage : Gtk.Box - { - - public GtkNavigationPage() : base(Orientation.Horizontal, 0) { } - - } - -} \ No newline at end of file diff --git a/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs b/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs new file mode 100644 index 000000000000..61177043fc3c --- /dev/null +++ b/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Text; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Handlers +{ + + internal partial class NavigationPageHandler : ViewHandler + { + + protected override NavigationView CreateNativeView() + { + return new(); + } + + protected override void ConnectHandler(NavigationView nativeView) + { + base.ConnectHandler(nativeView); + + var virtualView = VirtualView; + + } + + protected override void DisconnectHandler(NavigationView nativeView) + { + base.DisconnectHandler(nativeView); + + var virtualView = VirtualView; + + } + + + private static void PushAsyncTo(NavigationPageHandler arg1, INavigationView arg2, object? arg3) + { + throw new NotImplementedException(); + } + + private static void PopAsyncTo(NavigationPageHandler arg1, INavigationView arg2, object? arg3) + { + throw new NotImplementedException(); + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/NavigationView.cs b/src/Core/src/Platform/Gtk/NavigationView.cs new file mode 100644 index 000000000000..a60480738bb2 --- /dev/null +++ b/src/Core/src/Platform/Gtk/NavigationView.cs @@ -0,0 +1,11 @@ +namespace Microsoft.Maui +{ + + public class NavigationView : Gtk.Box + { + + public NavigationView() : base(Gtk.Orientation.Horizontal, 0) { } + + } + +} \ No newline at end of file From 2f8727f8a9b21da6be2402c6dca254c78fddc5cd Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:33:21 +0200 Subject: [PATCH 117/425] Core.csproj Gtk : PickerHandler.Gtk.cs: track api changes & PickerExtensions.cs: allow setting CharacterSpacing = 0 --- src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs | 2 +- src/Core/src/Platform/Gtk/PickerExtensions.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs index 334c262b92e5..aaa867acf8ec 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs @@ -82,7 +82,7 @@ public static void MapSelectedIndex(PickerHandler handler, IPicker view) } } - public static void MapReload(PickerHandler handler, IPicker picker) + public static void MapReload(PickerHandler handler, IPicker picker, object? args) { var nativeView = handler.NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); _ = picker ?? throw new InvalidOperationException($"{nameof(picker)} should have been set by base class."); diff --git a/src/Core/src/Platform/Gtk/PickerExtensions.cs b/src/Core/src/Platform/Gtk/PickerExtensions.cs index b4850c2a9d58..ab6e1468c61c 100644 --- a/src/Core/src/Platform/Gtk/PickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/PickerExtensions.cs @@ -41,7 +41,7 @@ public static void UpdateHorizontalTextAlignment(this Gtk.ComboBox? nativeView, public static void UpdateCharacterSpacing(this Gtk.ComboBox? nativeView, double spacing) { - if (nativeView == null || spacing == 0) + if (nativeView == null) return; if (nativeView.HasEntry) From e71dd4b7983c97b6ea00fde678f3a3b457080b7b Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:37:25 +0200 Subject: [PATCH 118/425] Core.csproj Gtk : move ScrollViewHandler from Compatibility.Core & partially implement OnScrollFinished & track api changes --- .../Handlers/ScrollView/GtkScrollView.Gtk.cs | 16 - .../ScrollView/ScrollViewHandler.Gtk.cs | 162 ---------- .../ScrollView/ScrollViewHandler.Gtk.cs | 295 ++++++++++++++++++ src/Core/src/Platform/Gtk/ScrollView.cs | 14 + .../Platform/Gtk}/ScrollViewExtensions.Gtk.cs | 3 +- 5 files changed, 310 insertions(+), 180 deletions(-) delete mode 100644 src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs delete mode 100644 src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/ScrollView.cs rename src/{Compatibility/Core/src/Gtk/Handlers/ScrollView => Core/src/Platform/Gtk}/ScrollViewExtensions.Gtk.cs (94%) diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs deleted file mode 100644 index 06fccf81a0d1..000000000000 --- a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/GtkScrollView.Gtk.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using Gtk; -using Microsoft.Maui.Controls; - -namespace Microsoft.Maui.Handlers.ScrollView -{ - - public class GtkScrollView : Gtk.ScrolledWindow - { - - public ScrollOrientation ScrollOrientation { get; set; } - - - } - -} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs deleted file mode 100644 index 49848a5b3e9e..000000000000 --- a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using Gtk; -using Microsoft.Maui.Controls; -using NativeView = Gtk.Widget; - -namespace Microsoft.Maui.Handlers.ScrollView -{ - - // https://developer.gnome.org/gtk3/stable/GtkScrolledWindow.html - public class ScrollViewHandler : ViewHandler - { - - public static PropertyMapper ScrollViewMapper = new(ViewHandler.ViewMapper) - { - [nameof(Controls.ScrollView.ContentSize)] = MapContentSize, - [nameof(Controls.ScrollView.ScrollX)] = MapScrollX, - [nameof(Controls.ScrollView.ScrollY)] = MapScrollY, - [nameof(Controls.ScrollView.Orientation)] = MapOrientation, - [nameof(Controls.ScrollView.HorizontalScrollBarVisibility)] = MapHorizontalScrollBarVisibility, - [nameof(Controls.ScrollView.VerticalScrollBarVisibility)] = MapVerticalScrollBarVisibility, - - }; - - public static void MapContentSize(ScrollViewHandler handler, Controls.ScrollView view) - { - ; - } - - public static void MapScrollX(ScrollViewHandler handler, Controls.ScrollView view) - { - if (handler?.NativeView is not { } nativeView || !(nativeView.VScrollbar?.Visible ?? true)) - return; - - nativeView.Vadjustment.Value = view.ScrollX; - } - - public static void MapScrollY(ScrollViewHandler handler, Controls.ScrollView view) - { - if (handler?.NativeView is not { } nativeView || !(nativeView.HScrollbar?.Visible ?? true)) - return; - - nativeView.Hadjustment.Value = view.ScrollY; - - } - - public static void MapOrientation(ScrollViewHandler handler, Controls.ScrollView view) - { - if (handler?.NativeView is not { } nativeView) - return; - - switch (view.Orientation) - { - case ScrollOrientation.Both: - // nativeView.PropagateNaturalWidth = true; - // nativeView.PropagateNaturalHeight = true; - nativeView.SetPolicy(PolicyType.Always, PolicyType.Always); - nativeView.HScrollbar.Visible = true; - nativeView.VScrollbar.Visible = true; - - break; - case ScrollOrientation.Horizontal: - // nativeView.PropagateNaturalWidth = true; - // nativeView.PropagateNaturalHeight = false; - nativeView.SetPolicy(PolicyType.Always, PolicyType.Never); - nativeView.HScrollbar.Visible = true; - nativeView.VScrollbar.Visible = false; - - break; - case ScrollOrientation.Vertical: - // nativeView.PropagateNaturalHeight = true; - // nativeView.PropagateNaturalWidth = false; - nativeView.SetPolicy(PolicyType.Never, PolicyType.Always); - nativeView.HScrollbar.Visible = false; - nativeView.VScrollbar.Visible = true; - - break; - - case ScrollOrientation.Neither: - // nativeView.PropagateNaturalWidth = false; - // nativeView.PropagateNaturalHeight = false; - nativeView.SetPolicy(PolicyType.Never, PolicyType.Never); - nativeView.HScrollbar.Visible = false; - nativeView.VScrollbar.Visible = false; - - break; - default: - throw new ArgumentOutOfRangeException(); - } - - nativeView.ScrollOrientation = view.Orientation; - } - - public static void MapHorizontalScrollBarVisibility(ScrollViewHandler handler, Controls.ScrollView view) - { - if (handler?.NativeView is not { } nativeView) - return; - - nativeView.HscrollbarPolicy = view.HorizontalScrollBarVisibility.ToNative(); - - } - - public static void MapVerticalScrollBarVisibility(ScrollViewHandler handler, Controls.ScrollView view) - { - if (handler?.NativeView is not { } nativeView) - return; - - nativeView.VscrollbarPolicy = view.VerticalScrollBarVisibility.ToNative(); - - } - - public ScrollViewHandler() : base(ScrollViewMapper) - { } - - public ScrollViewHandler(PropertyMapper mapper = null) : base(mapper) { } - - protected override GtkScrollView CreateNativeView() - { - var s = new GtkScrollView(); - - s.SizeAllocated += (s, o) => - { - ; - }; - - s.ResizeChecked += (s, o) => - { - ; - }; - - return s; - } - - public override void SetVirtualView(IView view) - { - base.SetVirtualView(view); - - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); - _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); - _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - - var nativeContent = VirtualView.Content.ToNative(MauiContext); - var child = NativeView.Child; - - // check if nativeContent is set as child of Viewport: - if (child is Gtk.Viewport vp && vp != nativeContent) - { - child = vp.Child; - } - - if (child != nativeContent) - NativeView.Child = nativeContent; - } - - protected override void ConnectHandler(GtkScrollView nativeView) - { } - - protected override void DisconnectHandler(GtkScrollView nativeView) - { } - - } - -} \ No newline at end of file diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs new file mode 100644 index 000000000000..0ada98ea1e8f --- /dev/null +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -0,0 +1,295 @@ +using System; +using Gdk; +using Gtk; +using Point = Microsoft.Maui.Graphics.Point; + +namespace Microsoft.Maui.Handlers +{ + + // https://developer.gnome.org/gtk3/stable/GtkScrolledWindow.html + + public partial class ScrollViewHandler : ViewHandler + { + + protected override ScrollView CreateNativeView() + { + var s = new ScrollView(); + + return s; + } + + public override void SetVirtualView(IView view) + { + base.SetVirtualView(view); + + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + } + + public static void MapContent(ScrollViewHandler handler, IScrollView scrollView) + { + if (handler.MauiContext == null || scrollView.Content == null) + { + return; + } + + if (handler?.NativeView is not { } nativeView) + return; + + var nativeContent = scrollView.Content.ToNative(handler.MauiContext); + var child = nativeView.Child; + + // check if nativeContent is set as child of Viewport: + if (child is Gtk.Viewport vp && vp != nativeContent) + { + child = vp.Child; + } + + if (child != nativeContent) + { + nativeView.Child = nativeContent; + + } + } + + protected override void ConnectHandler(ScrollView nativeView) + { + base.ConnectHandler(nativeView); + + nativeView.Vadjustment.ValueChanged += OnNativeViewValueChanged; + nativeView.Hadjustment.ValueChanged += OnNativeViewValueChanged; + ConnectButtonEvents(nativeView); + ConnectButtonEvents(nativeView.VScrollbar); + ConnectButtonEvents(nativeView.HScrollbar); + + } + + protected virtual void ConnectButtonEvents(Widget? widget) + { + if (widget == null) return; + + widget.Events |= Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.ScrollMask | EventMask.SmoothScrollMask; + widget.ButtonPressEvent += OnNativeViewButtonPressEvent; + widget.ButtonReleaseEvent += OnNativeViewButtonReleaseEvent; + widget.ScrollEvent += OnNativeViewScrollEvent; + widget.MotionNotifyEvent += OnNativeViewotionNotifyEvent; + } + + protected virtual void DisconnectButtonEvents(Widget? widget) + { + if (widget == null) return; + + widget.ButtonPressEvent -= OnNativeViewButtonPressEvent; + widget.ButtonReleaseEvent -= OnNativeViewButtonReleaseEvent; + widget.ScrollEvent -= OnNativeViewScrollEvent; + + } + + protected override void DisconnectHandler(ScrollView nativeView) + { + base.OnDisconnectHandler(nativeView); + + nativeView.Vadjustment.ValueChanged -= OnNativeViewValueChanged; + nativeView.Hadjustment.ValueChanged -= OnNativeViewValueChanged; + DisconnectButtonEvents(nativeView); + DisconnectButtonEvents(nativeView.VScrollbar); + DisconnectButtonEvents(nativeView.HScrollbar); + } + + bool _scrolling = false; + Point _lastscroll = Point.Zero; + Point _lastMotion = Point.Zero; + double _lastDelta = 0d; + + bool _valueChanged = false; + bool _intermediate = true; + + void EndScrolling() + { + _scrolling = false; + _lastscroll = Point.Zero; + _lastDelta = 0d; + } + + void OnNativeViewotionNotifyEvent(object o, MotionNotifyEventArgs args) + { + _lastMotion = new Point(args.Event.X, args.Event.Y); + + if (_lastscroll != Point.Zero && _lastMotion != _lastscroll) + { + if (_scrolling) + { + _intermediate = false; + OnScrollFinished(); + } + + EndScrolling(); + + } + } + + [GLib.ConnectBefore] + void OnNativeViewScrollEvent(object o, ScrollEventArgs args) + { + var delta = args.Event.DeltaX == 0 ? args.Event.DeltaY : args.Event.DeltaX; + + if (delta != 0) + { + + if (delta < 0 && _lastDelta > 0 || delta > 0 && _lastDelta < 0) + { + _intermediate = false; + + } + + _lastDelta = delta; + _lastscroll = new Point(args.Event.X, args.Event.Y); + _scrolling = true; + + } + else + { + _intermediate = true; + _valueChanged = false; + EndScrolling(); + } + + } + + [GLib.ConnectBeforeAttribute] + void OnNativeViewButtonPressEvent(object o, ButtonPressEventArgs args) + { + _valueChanged = false; + _intermediate = true; + } + + void OnNativeViewButtonReleaseEvent(object o, ButtonReleaseEventArgs args) + { + _intermediate = false; + OnScrollFinished(); + + } + + protected virtual void OnNativeViewValueChanged(object? sender, EventArgs e) + { + if (NativeView is not { } nativeView || VirtualView is not { } virtualView || sender is not Adjustment adjustment) + return; + + if (nativeView.Vadjustment == adjustment && adjustment.Value != virtualView.HorizontalOffset) + { + virtualView.HorizontalOffset = adjustment.Value; + _valueChanged = true; + + } + + if (nativeView.Hadjustment == adjustment && adjustment.Value != virtualView.HorizontalOffset) + { + virtualView.VerticalOffset = adjustment.Value; + _valueChanged = true; + + } + + OnScrollFinished(); + + } + + [MissingMapper("detect more finishing of scroll")] + protected virtual void OnScrollFinished() + { + if (_intermediate || !_valueChanged) + return; + + VirtualView?.ScrollFinished(); + EndScrolling(); + + _valueChanged = false; + _intermediate = true; + + } + + public static void MapRequestScrollTo(ScrollViewHandler handler, IScrollView scrollView, object? args) + { + if (handler?.NativeView is not { } nativeView) + return; + + if (args is ScrollToRequest request) + { + if (nativeView.VScrollbar?.Visible ?? false) + nativeView.Vadjustment.Value = request.VerticalOffset; + + if (nativeView.HScrollbar?.Visible ?? false) + nativeView.Hadjustment.Value = request.HoriztonalOffset; + + } + } + + public static void MapOrientation(ScrollViewHandler handler, IScrollView view) + { + if (handler?.NativeView is not { } nativeView) + return; + + switch (view.Orientation) + { + case ScrollOrientation.Both: + // nativeView.PropagateNaturalWidth = true; + // nativeView.PropagateNaturalHeight = true; + nativeView.SetPolicy(PolicyType.Always, PolicyType.Always); + nativeView.HScrollbar.Visible = true; + nativeView.VScrollbar.Visible = true; + + break; + case ScrollOrientation.Horizontal: + // nativeView.PropagateNaturalWidth = true; + // nativeView.PropagateNaturalHeight = false; + nativeView.SetPolicy(PolicyType.Always, PolicyType.Never); + nativeView.HScrollbar.Visible = true; + nativeView.VScrollbar.Visible = false; + + break; + case ScrollOrientation.Vertical: + // nativeView.PropagateNaturalHeight = true; + // nativeView.PropagateNaturalWidth = false; + nativeView.SetPolicy(PolicyType.Never, PolicyType.Always); + nativeView.HScrollbar.Visible = false; + nativeView.VScrollbar.Visible = true; + + break; + + case ScrollOrientation.Neither: + // nativeView.PropagateNaturalWidth = false; + // nativeView.PropagateNaturalHeight = false; + nativeView.SetPolicy(PolicyType.Never, PolicyType.Never); + nativeView.HScrollbar.Visible = false; + nativeView.VScrollbar.Visible = false; + + break; + default: + throw new ArgumentOutOfRangeException(); + } + + nativeView.ScrollOrientation = view.Orientation; + } + + public static void MapHorizontalScrollBarVisibility(ScrollViewHandler handler, IScrollView view) + { + if (handler?.NativeView is not { } nativeView) + return; + + nativeView.HscrollbarPolicy = view.HorizontalScrollBarVisibility.ToNative(); + + } + + public static void MapVerticalScrollBarVisibility(ScrollViewHandler handler, IScrollView view) + { + if (handler?.NativeView is not { } nativeView) + return; + + nativeView.VscrollbarPolicy = view.VerticalScrollBarVisibility.ToNative(); + + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs new file mode 100644 index 000000000000..5ffe25de0bb0 --- /dev/null +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -0,0 +1,14 @@ +using System; + +namespace Microsoft.Maui +{ + + public class ScrollView : Gtk.ScrolledWindow + { + + public ScrollOrientation ScrollOrientation { get; set; } + + + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Gtk.cs b/src/Core/src/Platform/Gtk/ScrollViewExtensions.Gtk.cs similarity index 94% rename from src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Gtk.cs rename to src/Core/src/Platform/Gtk/ScrollViewExtensions.Gtk.cs index 961d48b5df14..999481881ea8 100644 --- a/src/Compatibility/Core/src/Gtk/Handlers/ScrollView/ScrollViewExtensions.Gtk.cs +++ b/src/Core/src/Platform/Gtk/ScrollViewExtensions.Gtk.cs @@ -1,8 +1,7 @@ using System; using Gtk; -using Microsoft.Maui.Controls; -namespace Microsoft.Maui.Handlers.ScrollView +namespace Microsoft.Maui { public static class ScrollViewExtensions From 793303f516968080197ec84066e6cf5c4f1188e1 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:48:08 +0200 Subject: [PATCH 119/425] Core.csproj Gtk : WindowExtensions.cs: introduce GetWindow / SetWindow & MauiGtkMainWindow.cs: remove obsolete VisibilityNotifyEvent --- .../src/Platform/Gtk/MauiGtkMainWindow.cs | 12 +++--- src/Core/src/Platform/Gtk/WindowExtensions.cs | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs b/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs index a0e834f00e69..4ace70e4ec61 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkMainWindow.cs @@ -15,7 +15,8 @@ public MauiGtkMainWindow() : base(WindowType.Toplevel) WindowStateEvent += OnWindowStateEvent; Shown += OnShown; Hidden += OnHidden; - VisibilityNotifyEvent += OnVisibilityNotifyEvent; + //GtkWidget::visibility-notify-event has been deprecated since version 3.12 + // VisibilityNotifyEvent += OnVisibilityNotifyEvent; DeleteEvent += OnDeleteEvent; } @@ -33,10 +34,11 @@ void OnDeleteEvent(object o, DeleteEventArgs args) } } - void OnVisibilityNotifyEvent(object o, VisibilityNotifyEventArgs args) - { - MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); - } + //GtkWidget::visibility-notify-event has been deprecated since version 3.12 + // void OnVisibilityNotifyEvent(object o, VisibilityNotifyEventArgs args) + // { + // MauiGtkApplication.Current.Services?.InvokeLifecycleEvents(del => del(this, args)); + // } void OnHidden(object? sender, EventArgs args) { diff --git a/src/Core/src/Platform/Gtk/WindowExtensions.cs b/src/Core/src/Platform/Gtk/WindowExtensions.cs index ba9642d6a94e..cedaa8d4fdb9 100644 --- a/src/Core/src/Platform/Gtk/WindowExtensions.cs +++ b/src/Core/src/Platform/Gtk/WindowExtensions.cs @@ -1,10 +1,47 @@ +using System; + namespace Microsoft.Maui { public static class WindowExtensions { + public static void UpdateTitle(this Gtk.Window nativeWindow, IWindow window) => nativeWindow.Title = window.Title; + + public static IWindow GetWindow(this Gtk.Window nativeWindow) + { + foreach (var window in MauiGtkApplication.Current.Application.Windows) + { + if (window?.Handler?.NativeView is Gtk.Window win && win == nativeWindow) + return window; + } + + throw new InvalidOperationException("Window Not Found"); + } + + public static void SetWindow(this Gtk.Window nativeWindow, IWindow window, IMauiContext context) + { + _ = nativeWindow ?? throw new ArgumentNullException(nameof(nativeWindow)); + _ = window ?? throw new ArgumentNullException(nameof(window)); + _ = context ?? throw new ArgumentNullException(nameof(context)); + + var handler = window.Handler; + + if (handler == null) + handler = context.Handlers.GetHandler(window.GetType()); + + if (handler == null) + throw new Exception($"Handler not found for window {window}."); + + handler.SetMauiContext(context); + + window.Handler = handler; + + if (handler.VirtualView != window) + handler.SetVirtualView(window); + } + } } \ No newline at end of file From 8d33d3d6115cc3fdb3da7dc7c2fdedd0d672333d Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:50:10 +0200 Subject: [PATCH 120/425] Core.csproj Gtk : extend LifecycleEvents --- .../AppHostBuilderExtensions.Gtk.cs | 69 +++++++++++++++++++ .../src/LifecycleEvents/Gtk/GtkLifecycle.cs | 6 +- .../Gtk/GtkLifecycleBuilderExtensions.cs | 15 ++-- .../src/Platform/Gtk/MauiGtkApplication.cs | 44 +++--------- 4 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs diff --git a/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs new file mode 100644 index 000000000000..483bc88c21b3 --- /dev/null +++ b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs @@ -0,0 +1,69 @@ +using Microsoft.Maui.Hosting; +using Gdk; + +namespace Microsoft.Maui.LifecycleEvents +{ + + public static partial class AppHostBuilderExtensions + { + + internal static IAppHostBuilder ConfigureCrossPlatformLifecycleEvents(this IAppHostBuilder builder) => + builder.ConfigureLifecycleEvents(events => events.AddGtk(OnConfigureLifeCycle)); + + [MissingMapper("Stopped(), Resumed()")] + static void OnConfigureLifeCycle(IGtkLifecycleBuilder gtk) + { + gtk + .OnCreated((window, args) => + { + window.GetWindow().Created(); + }) + .OnShown((window, args) => + { + window.GetWindow().Activated(); + }) + .OnStateChanged((window, args) => + { + + // TODO: changedmask can be removed or added to newwindowstate + switch (args.Event.ChangedMask) + { + case WindowState.Withdrawn: + break; + case WindowState.Iconified: + break; + case WindowState.Maximized: + break; + case WindowState.Sticky: + break; + case WindowState.Fullscreen: + break; + case WindowState.Above: + break; + case WindowState.Below: + break; + case WindowState.Focused: + break; + case WindowState.Tiled: + break; + default: + break; + } + + ; + }) + .OnClosed((window, args) => + { + window.GetWindow().Deactivated(); + }) + .OnDelete((window, args) => + { + window.GetWindow().Destroying(); + }) + ; + + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs index 3eaac589400b..4b7784c3a036 100644 --- a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycle.cs @@ -21,9 +21,9 @@ public static class GtkLifecycle public delegate void OnStartup(Gtk.Application application, EventArgs args); - public delegate void OnLaunching(MauiGtkApplication application, ActivationEventArgs args); + public delegate void OnLaunching(MauiGtkApplication application, EventArgs args); - public delegate void OnLaunched(Gtk.Application application, ActivationEventArgs args); + public delegate void OnLaunched(Gtk.Application application, EventArgs args); public delegate void OnOpened(Gtk.Application application, OpenedArgs args); @@ -31,6 +31,8 @@ public static class GtkLifecycle public delegate void OnShutdown(Gtk.Application application, EventArgs args); + public delegate void OnCreated(Gtk.Window window, EventArgs args); + public delegate void OnShown(Gtk.Window window, EventArgs args); public delegate void OnHidden(Gtk.Window window, EventArgs args); diff --git a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs index 9c0a56d57a0f..a9632ddefa6a 100644 --- a/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs +++ b/src/Core/src/LifecycleEvents/Gtk/GtkLifecycleBuilderExtensions.cs @@ -4,20 +4,23 @@ namespace Microsoft.Maui.LifecycleEvents public static class GtkLifecycleBuilderExtensions { - public static IGtkLifecycleBuilder OnActivated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnShown del) => lifecycle.OnEvent(del); - - public static IGtkLifecycleBuilder OnClosed(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnHidden del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnActivated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnApplicationActivated del) => lifecycle.OnEvent(del); public static IGtkLifecycleBuilder OnLaunching(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnLaunching del) => lifecycle.OnEvent(del); public static IGtkLifecycleBuilder OnLaunched(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnLaunched del) => lifecycle.OnEvent(del); - public static IGtkLifecycleBuilder OnVisibilityChanged(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnVisibilityChanged del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnCreated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnCreated del) => lifecycle.OnEvent(del); public static IGtkLifecycleBuilder OnShown(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnShown del) => lifecycle.OnEvent(del); - - internal static IGtkLifecycleBuilder OnMauiContextCreated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnMauiContextCreated del) => lifecycle.OnEvent(del); + public static IGtkLifecycleBuilder OnStateChanged(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnStateChanged del) => lifecycle.OnEvent(del); + + public static IGtkLifecycleBuilder OnClosed(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnHidden del) => lifecycle.OnEvent(del); + + public static IGtkLifecycleBuilder OnDelete(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnDelete del) => lifecycle.OnEvent(del); + + internal static IGtkLifecycleBuilder OnMauiContextCreated(this IGtkLifecycleBuilder lifecycle, GtkLifecycle.OnMauiContextCreated del) => lifecycle.OnEvent(del); } diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index f15ccc313dff..a5d14086f4ea 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -28,13 +28,6 @@ public abstract class MauiGtkApplication public abstract string ApplicationId { get; } - /// - /// overrides creation of rootcontainer - /// rootcontainer is MainWindow 's - /// paramter is Maui's Mainwindows as Gtk.Widget - /// - public Func TopContainerOverride { get; set; } = null!; - string? _name; // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid @@ -75,9 +68,6 @@ protected void RegisterLifecycleEvents(Gtk.Application app) protected void OnStartup(object sender, EventArgs args) { - - CreateMainWindow(); - Services.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } @@ -116,18 +106,6 @@ protected void OnWindowAdded(object o, WindowAddedArgs args) // future use: to have notifications at cross platform Window level } - Widget CreateRootContainer(Widget nativePage) - { - var b = new Box(Orientation.Vertical, 0) - { - Expand = true, - }; - - b.PackStart(nativePage, true, true, 0); - - return b; - } - protected abstract IStartup OnCreateStartup(); protected void StartupLauch(object sender, EventArgs args) @@ -141,39 +119,37 @@ protected void StartupLauch(object sender, EventArgs args) .Build(); Services = host.Services; + Services.InvokeLifecycleEvents(del => del(this, args)); var mauiContext = new MauiContext(Services); Services.InvokeLifecycleEvents(del => del(mauiContext)); var activationState = new ActivationState(mauiContext); - Services.InvokeLifecycleEvents(del => del(this, new ActivationEventArgs(activationState))); - Application = Services.GetRequiredService(); var window = Application.CreateWindow(activationState); - var content = window.Content; - var nativeContent = content.ToNative(mauiContext); + CreateMainWindow(window, mauiContext); - var canvas = TopContainerOverride?.Invoke(nativeContent) ?? CreateRootContainer(nativeContent); -#if DEBUG - nativeContent.SetBackgroundColor(Colors.White); -#endif - MainWindow.Child = canvas; MainWindow.QueueDraw(); MainWindow.ShowAll(); MainWindow.Present(); - Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, new ActivationEventArgs(activationState))); + Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } - void CreateMainWindow() + void CreateMainWindow(IWindow window, MauiContext context) { MainWindow = new MauiGtkMainWindow(); CurrentGtkApplication.AddWindow(MainWindow); + context.Window = MainWindow; + + MainWindow.SetWindow(window, context); + Services.InvokeLifecycleEvents(del => del(MainWindow, new EventArgs())); + } protected void Launch(EventArgs args) @@ -221,7 +197,7 @@ public static void DispatchPendingEvents() public static void Invoke(System.Action action) { if (action == null) - throw new ArgumentNullException("action"); + throw new ArgumentNullException(nameof(action)); // Switch to no Invoke(Action) once a gtk# release is done. Gtk.Application.Invoke((o, args) => From 60d771bd621178b296118ec48888868bcd571b89 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:51:25 +0200 Subject: [PATCH 121/425] Core.csproj Gtk : Semantics: enhance UpdateSemantics & introduce SemanticExtensions.cs (stub) --- src/Core/src/Platform/Gtk/SemanticExtensions.cs | 11 +++++++++++ src/Core/src/Platform/Gtk/ViewExtensions.cs | 12 +++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 src/Core/src/Platform/Gtk/SemanticExtensions.cs diff --git a/src/Core/src/Platform/Gtk/SemanticExtensions.cs b/src/Core/src/Platform/Gtk/SemanticExtensions.cs new file mode 100644 index 000000000000..938eedd9309b --- /dev/null +++ b/src/Core/src/Platform/Gtk/SemanticExtensions.cs @@ -0,0 +1,11 @@ +namespace Microsoft.Maui +{ + public static partial class SemanticExtensions + { + /// + /// Force semantic screen reader focus to specified element + /// + /// + public static void SetSemanticFocus(this IFrameworkElement element) { } + } +} diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index fe9766761d26..d29fc5742e2b 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -22,11 +22,10 @@ public static void UpdateBackground(this Widget nativeView, IView view) } var css = view.Background.ToCss(); - - + var disposePixbuf = false; var pixbuf = css == null ? view.Background?.ToPixbuf(out disposePixbuf) : default; - + // create a temporary file var tempFile = pixbuf?.TempFileFor(); @@ -118,6 +117,12 @@ public static void UpdateSemantics(this Widget nativeView, IView view) return; nativeView.TooltipText = semantics.Hint; + + if (nativeView.Accessible is { } accessible and not Atk.NoOpObject && semantics.Description != null) + { + accessible.Description = semantics.Description; + } + } public static void UpdateOpacity(this Widget nativeView, IView view) @@ -132,6 +137,7 @@ public static void UpdateClip(this WrapperView nativeView, IView view) public static void UpdateClip(this Widget nativeView, IView view) { } + } } \ No newline at end of file From 379837b784e96fe8781885a2b1e631c817d0819a Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:52:17 +0200 Subject: [PATCH 122/425] Core.csproj Gtk : introduce TransformationExtensions.cs (stub) --- .../Platform/Gtk/TransformationExtensions.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/Core/src/Platform/Gtk/TransformationExtensions.cs diff --git a/src/Core/src/Platform/Gtk/TransformationExtensions.cs b/src/Core/src/Platform/Gtk/TransformationExtensions.cs new file mode 100644 index 000000000000..593d9653d214 --- /dev/null +++ b/src/Core/src/Platform/Gtk/TransformationExtensions.cs @@ -0,0 +1,23 @@ +using Gtk; + +namespace Microsoft.Maui +{ + + public static class TransformationExtensions + { + + [MissingMapper] + public static void UpdateScale(this Widget? nativeView, double scale) + { + if (nativeView == null || scale == 0) + return; + + // fails: transform' is not a valid property name + // https://mail.gnome.org/archives/gtk-list/2017-May/msg00015.html + // nativeView.SetStyleValue($"scale({scale})", "transform"); + + } + + } + +} \ No newline at end of file From 3a5554884117e99335873574edbf80897267c6c7 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:53:39 +0200 Subject: [PATCH 123/425] Core.csproj Gtk : track MissingMapper's & some comments --- .../src/Handlers/Editor/EditorHandler.Gtk.cs | 5 ++++- .../src/Handlers/Switch/SwitchHandler.Gtk.cs | 2 -- src/Core/src/Handlers/View/ViewHandler.Gtk.cs | 19 ++++++++++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index 7b355ed2ed43..4a680d0479d2 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -79,7 +79,10 @@ public static void MapPlaceholder(EditorHandler handler, IEditor editor) { } public static void MapPlaceholderColor(EditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapCharacterSpacing(EditorHandler handler, IEditor editor) { } + public static void MapCharacterSpacing(EditorHandler handler, IEditor editor) + { + // see: https://developer.gnome.org/gtk3/stable/GtkTextTag.html#GtkTextTag--letter-spacing + } [MissingMapper] public static void MapMaxLength(EditorHandler handler, IEditor editor) { } diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs index a4c867d2e781..d1c1caeae6d2 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs @@ -21,13 +21,11 @@ public static void MapIsOn(SwitchHandler handler, ISwitch view) [MissingMapper] public static void MapTrackColor(SwitchHandler handler, ISwitch view) { } - [MissingMapper] public static void MapThumbColor(SwitchHandler handler, ISwitch view) { if (handler.NativeView is not { } nativeView) return; - // this don't work cause slider is an icon nativeView.SetColor(view.ThumbColor, "color", "slider"); } } diff --git a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs index ea0efbf85b42..83b7143039a8 100644 --- a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs @@ -1,25 +1,42 @@ namespace Microsoft.Maui.Handlers { + public partial class ViewHandler { + + [MissingMapper] public static void MapTranslationX(ViewHandler handler, IView view) { } + [MissingMapper] public static void MapTranslationY(ViewHandler handler, IView view) { } - public static void MapScale(ViewHandler handler, IView view) { } + [MissingMapper] + public static void MapScale(ViewHandler handler, IView view) + { + //handler.NativeView.UpdateScale(view.Scale); + } + [MissingMapper] public static void MapScaleX(ViewHandler handler, IView view) { } + [MissingMapper] public static void MapScaleY(ViewHandler handler, IView view) { } + [MissingMapper] public static void MapRotation(ViewHandler handler, IView view) { } + [MissingMapper] public static void MapRotationX(ViewHandler handler, IView view) { } + [MissingMapper] public static void MapRotationY(ViewHandler handler, IView view) { } + [MissingMapper] public static void MapAnchorX(ViewHandler handler, IView view) { } + [MissingMapper] public static void MapAnchorY(ViewHandler handler, IView view) { } + } + } \ No newline at end of file From 063142d999bb68c405f085c590d5ce615b4f87da Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:54:30 +0200 Subject: [PATCH 124/425] Core.csproj Gtk : MauiContext.Gtk.cs: make SetWindow internal --- src/Core/src/Platform/MauiContext.Gtk.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Platform/MauiContext.Gtk.cs b/src/Core/src/Platform/MauiContext.Gtk.cs index 66a7f4680588..e9b80bd86a8b 100644 --- a/src/Core/src/Platform/MauiContext.Gtk.cs +++ b/src/Core/src/Platform/MauiContext.Gtk.cs @@ -3,10 +3,12 @@ namespace Microsoft.Maui { + public partial class MauiContext : IMauiContext { - - public Gtk.Window? Window { get; private set; } + + public Gtk.Window? Window { get; internal set; } } + } \ No newline at end of file From 01dbe5c53be0c90a0174548356d18f2d8785ec75 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 15:59:04 +0200 Subject: [PATCH 125/425] Compatibility.csproj Gtk: AppHostBuilderExtensions.cs: track changes & introduce AppHostBuilderExtensions.Gtk.cs --- .../Core/src/AppHostBuilderExtensions.Gtk.cs | 31 +++++++++++++++++++ .../Core/src/AppHostBuilderExtensions.cs | 6 +--- .../Core/src/Compatibility.csproj | 21 +++---------- 3 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs new file mode 100644 index 000000000000..9d46d2856c29 --- /dev/null +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs @@ -0,0 +1,31 @@ +#nullable enable + +using Microsoft.Maui.LifecycleEvents; +using Microsoft.Maui.Controls.Compatibility; +using System; +using Microsoft.Maui.Hosting; + +namespace Microsoft.Maui.Controls.Hosting +{ + + public static partial class AppHostBuilderExtensions + { + + internal static IAppHostBuilder ConfigureCompatibilityLifecycleEvents(this IAppHostBuilder builder) => + builder.ConfigureLifecycleEvents(events => events.AddGtk(OnConfigureLifeCycle)); + + static void OnConfigureLifeCycle(IGtkLifecycleBuilder gtk) + { + gtk + .OnMauiContextCreated((mauiContext) => + { + // This is the final Init that sets up the real context from the application. + + var state = new ActivationState(mauiContext); + Forms.Init(state); + }); + } + + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs index 8f0b0ef94f5b..ce1463bdeceb 100644 --- a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs @@ -40,7 +40,6 @@ using Microsoft.Maui.Graphics.Native.Gtk; using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; using Microsoft.Maui.Controls.Handlers; -using ScrollViewHandler = Microsoft.Maui.Handlers.ScrollView.ScrollViewHandler; #endif @@ -175,9 +174,6 @@ static IAppHostBuilder SetupDefaults(this IAppHostBuilder builder) DependencyService.Register(); DependencyService.Register(); - handlers.AddHandler(); - handlers.AddHandler(); - DependencyService.Register(); DependencyService.Register(); @@ -225,7 +221,7 @@ public void ConfigureServices(HostBuilderContext context, IServiceCollection ser #elif __ANDROID__ services.AddSingleton(NativeGraphicsService.Instance); #elif WINDOWS - services.AddSingleton(W2DGraphicsService.Instance); + services.AddSingleton(W2DGraphicsService.Instance); #elif GTK services.AddSingleton(NativeGraphicsService.Instance); #endif diff --git a/src/Compatibility/Core/src/Compatibility.csproj b/src/Compatibility/Core/src/Compatibility.csproj index f89c0ce03f1a..1a246e916ee5 100644 --- a/src/Compatibility/Core/src/Compatibility.csproj +++ b/src/Compatibility/Core/src/Compatibility.csproj @@ -9,9 +9,6 @@ Windows\ Gtk\ - - $(DefineConstants);LINUX;GTK - Microsoft.Maui.Controls.Compatibility @@ -19,15 +16,15 @@ - + - + - + @@ -40,7 +37,7 @@ - + @@ -55,15 +52,7 @@ - - - - $(SolutionDir)\src\Microsoft.Maui.Graphics.Gtk\Microsoft.Maui.Graphics.Gtk.dll - - - - - + From 0a5c321bbae485e9cd3492f3aaeeb976a5f3bce2 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 16:11:35 +0200 Subject: [PATCH 126/425] Compatibility.csproj Gtk: GtkPlatformServices.cs GetNativeSize: nullcheck view.Handler & adjust result if no handler --- src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs index ec470c924e16..e8c1636a07ff 100644 --- a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs +++ b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs @@ -108,12 +108,12 @@ public void QuitApplication() public SizeRequest GetNativeSize(VisualElement view, double widthConstraint, double heightConstraint) { - if (view.Handler.NativeView is Widget w) + if (view.Handler?.NativeView is Widget w) { return view.Handler.GetDesiredSize(widthConstraint, heightConstraint); } - return new SizeRequest(new Size(widthConstraint, heightConstraint)); + return new SizeRequest(); } } From 205ec0d69f22d0d4f3a86b8c0b2b73a975c1b66c Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 16:13:31 +0200 Subject: [PATCH 127/425] Controls.Sample.csproj Gtk: BordelessEntryHandler.cs: add MapBorder (stub) --- .../Controls/BordelessEntry/BordelessEntryHandler.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs b/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs index 3d285b1d1cb0..74db1aaa45e0 100644 --- a/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs +++ b/src/Controls/samples/Controls.Sample/Controls/BordelessEntry/BordelessEntryHandler.cs @@ -34,15 +34,16 @@ public static void MapBorder(BordelessEntryHandler handler, BordelessEntry borde public static void MapBorder(BordelessEntryHandler handler, BordelessEntry borderlessEntry) { } -#else +#elif GTK public static void MapBorder(BordelessEntryHandler handler, BordelessEntry borderlessEntry) { + } -#elif GTK +#else public static void MapBorder(BordelessEntryHandler handler, BordelessEntry borderlessEntry) { - } + #endif } } \ No newline at end of file From dc774306dbe5213119fe1de1686e18dbc515bed8 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 16:28:56 +0200 Subject: [PATCH 128/425] Controls.Sample.csproj Gtk: don't call ConfigureEssentials at all for the moment --- src/Controls/samples/Controls.Sample/Startup.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controls/samples/Controls.Sample/Startup.cs b/src/Controls/samples/Controls.Sample/Startup.cs index 1679e734dcc2..7ceeea5417fe 100644 --- a/src/Controls/samples/Controls.Sample/Startup.cs +++ b/src/Controls/samples/Controls.Sample/Startup.cs @@ -130,9 +130,9 @@ public void Configure(IAppHostBuilder appBuilder) fonts.AddFont("SegoeUI-Italic.ttf", "Segoe UI Italic"); fonts.AddFont("SegoeUI-Bold-Italic.ttf", "Segoe UI Bold Italic"); }) +#if ! GTK .ConfigureEssentials(essentials => { -#if ! GTK essentials .UseVersionTracking() .UseMapServiceToken("YOUR-KEY-HERE") @@ -142,8 +142,8 @@ public void Configure(IAppHostBuilder appBuilder) { Debug.WriteLine($"You seem to have arrived from a special place: {appAction.Title} ({appAction.Id})"); }); -#endif }) +#endif .ConfigureLifecycleEvents(events => { events.AddEvent>("CustomEventName", value => LogEvent("CustomEventName")); From b85af6ecce2d043ec92b4c5b64f501b0ddd5af3a Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 16:46:39 +0200 Subject: [PATCH 129/425] Core.csproj Gtk : move all maui-specific Widgets into namespace Microsoft.Maui.Native to avoid naming conflicts --- src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs | 4 +++- src/Core/src/Handlers/Image/ImageHandler.Gtk.cs | 1 + src/Core/src/Handlers/Label/LabelHandler.Gtk.cs | 1 + src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs | 1 + .../src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs | 1 + src/Core/src/Handlers/Page/PageHandler.Gtk.cs | 1 + src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs | 1 + src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs | 1 + src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs | 1 + src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs | 4 +++- src/Core/src/Platform/Gtk/DatePickerExtensions.cs | 4 +++- src/Core/src/Platform/Gtk/ImageView.cs | 2 +- src/Core/src/Platform/Gtk/ImageViewExtensions.cs | 1 + src/Core/src/Platform/Gtk/LabelView.cs | 2 +- src/Core/src/Platform/Gtk/LayoutView.cs | 2 +- src/Core/src/Platform/Gtk/MauiDatePicker.cs | 2 +- src/Core/src/Platform/Gtk/MauiSearchBar.cs | 2 +- src/Core/src/Platform/Gtk/MauiShapeView.cs | 2 +- src/Core/src/Platform/Gtk/MauiTimePicker.cs | 2 +- src/Core/src/Platform/Gtk/MauiWindow.cs | 2 +- src/Core/src/Platform/Gtk/NavigationView.cs | 2 +- src/Core/src/Platform/Gtk/PageView.cs | 2 +- src/Core/src/Platform/Gtk/ScrollView.cs | 2 +- src/Core/src/Platform/Gtk/ShapeViewExtensions.cs | 1 + src/Core/src/Platform/Gtk/TimePickerExtensions.cs | 4 +++- 25 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs index 0a163c59b58e..669093222af5 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs @@ -1,4 +1,6 @@ -namespace Microsoft.Maui.Handlers +using Microsoft.Maui.Native; + +namespace Microsoft.Maui.Handlers { public partial class DatePickerHandler : ViewHandler { diff --git a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs index dca6222c2410..4707f2af4f6b 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs @@ -1,6 +1,7 @@ #nullable enable using System; using System.Threading.Tasks; +using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index 4623095d0b5e..6db17cba9b5c 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -2,6 +2,7 @@ using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 92f7034c56a3..421fdceb6b80 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -2,6 +2,7 @@ using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Layouts; +using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs b/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs index 61177043fc3c..d7b36c3ffd1b 100644 --- a/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs +++ b/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs @@ -3,6 +3,7 @@ using System.Collections.Specialized; using System.Text; using Microsoft.Maui.Handlers; +using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs index b464cbc73c4e..247ddd4d5474 100644 --- a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs @@ -1,5 +1,6 @@ using System; using Gtk; +using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 0ada98ea1e8f..4337d2b6f0b0 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -1,6 +1,7 @@ using System; using Gdk; using Gtk; +using Microsoft.Maui.Native; using Point = Microsoft.Maui.Graphics.Point; namespace Microsoft.Maui.Handlers diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs index 7aec922da42a..57a6a397ba5b 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs @@ -1,6 +1,7 @@ using System; using Gtk; using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs index 5eaba1a919c2..fbac3d521b35 100644 --- a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs @@ -1,4 +1,5 @@ using Microsoft.Maui.Graphics; +using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs index f46269d6dc9b..2d156836edc5 100644 --- a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs @@ -1,4 +1,6 @@ -namespace Microsoft.Maui.Handlers +using Microsoft.Maui.Native; + +namespace Microsoft.Maui.Handlers { public partial class TimePickerHandler : ViewHandler { diff --git a/src/Core/src/Platform/Gtk/DatePickerExtensions.cs b/src/Core/src/Platform/Gtk/DatePickerExtensions.cs index e1b544ee9a26..a4d5d54d9cd4 100644 --- a/src/Core/src/Platform/Gtk/DatePickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/DatePickerExtensions.cs @@ -1,4 +1,6 @@ -namespace Microsoft.Maui +using Microsoft.Maui.Native; + +namespace Microsoft.Maui { public static class DatePickerExtensions { diff --git a/src/Core/src/Platform/Gtk/ImageView.cs b/src/Core/src/Platform/Gtk/ImageView.cs index 61a56c1ca02e..280d7705156f 100644 --- a/src/Core/src/Platform/Gtk/ImageView.cs +++ b/src/Core/src/Platform/Gtk/ImageView.cs @@ -1,4 +1,4 @@ -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { // https://developer.gnome.org/gtk3/stable/GtkImage.html diff --git a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs index 8026c2d86a38..15bad0f0c0a8 100644 --- a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Native; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs index 4bd856a029a7..000203b9407a 100644 --- a/src/Core/src/Platform/Gtk/LabelView.cs +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -1,7 +1,7 @@ using Cairo; using Gtk; -namespace Microsoft.Maui.Handlers +namespace Microsoft.Maui.Native { public class LabelView : Label diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 667994f1b33f..b051bd0e6e15 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -6,7 +6,7 @@ using Rectangle = Microsoft.Maui.Graphics.Rectangle; using Size = Microsoft.Maui.Graphics.Size; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { // refactored from: https://github.com/mono/xwt/blob/501f6b529fca632655295169094f637627c74c47/Xwt.Gtk/Xwt.GtkBackend/BoxBackend.cs diff --git a/src/Core/src/Platform/Gtk/MauiDatePicker.cs b/src/Core/src/Platform/Gtk/MauiDatePicker.cs index 30891da2dcc7..75cc4a1e26b6 100644 --- a/src/Core/src/Platform/Gtk/MauiDatePicker.cs +++ b/src/Core/src/Platform/Gtk/MauiDatePicker.cs @@ -1,7 +1,7 @@ using System; using System.Runtime.Serialization; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { public class MauiDatePicker : Gtk.Label { diff --git a/src/Core/src/Platform/Gtk/MauiSearchBar.cs b/src/Core/src/Platform/Gtk/MauiSearchBar.cs index 84ddf9a1829b..30c1899f9594 100644 --- a/src/Core/src/Platform/Gtk/MauiSearchBar.cs +++ b/src/Core/src/Platform/Gtk/MauiSearchBar.cs @@ -1,7 +1,7 @@ using System; using Gtk; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { public class MauiSearchBar : Gtk.SearchBar diff --git a/src/Core/src/Platform/Gtk/MauiShapeView.cs b/src/Core/src/Platform/Gtk/MauiShapeView.cs index 6d95a936e465..7f8e6501e81c 100644 --- a/src/Core/src/Platform/Gtk/MauiShapeView.cs +++ b/src/Core/src/Platform/Gtk/MauiShapeView.cs @@ -1,6 +1,6 @@ using Microsoft.Maui.Graphics.Native.Gtk; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { public class MauiShapeView : GtkGraphicsView { diff --git a/src/Core/src/Platform/Gtk/MauiTimePicker.cs b/src/Core/src/Platform/Gtk/MauiTimePicker.cs index 1b208ae4e136..31dfe6ab84e8 100644 --- a/src/Core/src/Platform/Gtk/MauiTimePicker.cs +++ b/src/Core/src/Platform/Gtk/MauiTimePicker.cs @@ -1,6 +1,6 @@ using System; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { public class MauiTimePicker : Gtk.Label { diff --git a/src/Core/src/Platform/Gtk/MauiWindow.cs b/src/Core/src/Platform/Gtk/MauiWindow.cs index a727cd9004be..410375d36402 100644 --- a/src/Core/src/Platform/Gtk/MauiWindow.cs +++ b/src/Core/src/Platform/Gtk/MauiWindow.cs @@ -5,7 +5,7 @@ using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { [Obsolete("use MauiGtkApplication")] diff --git a/src/Core/src/Platform/Gtk/NavigationView.cs b/src/Core/src/Platform/Gtk/NavigationView.cs index a60480738bb2..15f4db42dd20 100644 --- a/src/Core/src/Platform/Gtk/NavigationView.cs +++ b/src/Core/src/Platform/Gtk/NavigationView.cs @@ -1,4 +1,4 @@ -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { public class NavigationView : Gtk.Box diff --git a/src/Core/src/Platform/Gtk/PageView.cs b/src/Core/src/Platform/Gtk/PageView.cs index 9e550ed1128f..9edb071fbf6c 100644 --- a/src/Core/src/Platform/Gtk/PageView.cs +++ b/src/Core/src/Platform/Gtk/PageView.cs @@ -2,7 +2,7 @@ using Gtk; using Microsoft.Maui.Graphics; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { public class PageView : Gtk.Box diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index 5ffe25de0bb0..3807a6c95ae3 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -1,6 +1,6 @@ using System; -namespace Microsoft.Maui +namespace Microsoft.Maui.Native { public class ScrollView : Gtk.ScrolledWindow diff --git a/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs b/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs index deb5f5c93159..43e40a93a064 100644 --- a/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Maui.Graphics; +using Microsoft.Maui.Native; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/TimePickerExtensions.cs b/src/Core/src/Platform/Gtk/TimePickerExtensions.cs index 37f28ba20c51..5ed99950324a 100644 --- a/src/Core/src/Platform/Gtk/TimePickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/TimePickerExtensions.cs @@ -1,4 +1,6 @@ -namespace Microsoft.Maui +using Microsoft.Maui.Native; + +namespace Microsoft.Maui { public static class TimePickerExtensions { From f7699aff65ef6c604b727d281362c6ae9dabbbd2 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 16:51:40 +0200 Subject: [PATCH 130/425] Controls.Sample.Gtk.csproj: track api changes & cleanup code & extend samples --- .../SimpleSampleApp/BasePage.cs | 2 +- .../SimpleSampleApp/ExamplePage.cs | 178 ++++++------------ .../SimpleSampleGtkApplication.cs | 4 +- .../SimpleSampleApp/SimpleSampleMauiApp.cs | 4 + .../SimpleSampleApp/Startup.cs | 3 +- 5 files changed, 71 insertions(+), 120 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/BasePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/BasePage.cs index 77cd3217342c..660ff1245c3a 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/BasePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/BasePage.cs @@ -3,7 +3,7 @@ namespace Maui.SimpleSampleApp { - public class BasePage : ContentPage, IPage + public class BasePage : ContentPage { } diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 3a656c4ec14c..6ddde5a5ccda 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -36,12 +36,11 @@ public ExamplePage(IServiceProvider services, MainPageViewModel viewModel) // SetupMauiLayoutSimple(); SetupMauiLayout(); - // SetupCompatibilityLayout(); } void SetupMauiLayoutLayouts() { - void Fill(Microsoft.Maui.Controls.Layout2.Layout l, string m, int count, Color bkCol) + void Fill(Layout l, string m, int count, Color bkCol) { var i = 0; @@ -107,7 +106,7 @@ void Fill(Microsoft.Maui.Controls.Layout2.Layout l, string m, int count, Color b } - void SetupMauiLayoutSimple() + void SetupMauiLayoutButtonSpacing() { var verticalStack = new VerticalStackLayout() { @@ -115,16 +114,6 @@ void SetupMauiLayoutSimple() BackgroundColor = Colors.WhiteSmoke, }; - var button = new Button - { - Padding = new Thickness(10), - Text = "Change the label!", - BackgroundColor = Colors.Red, - TextColor = Colors.Yellow, - }; - - verticalStack.Add(button); - var label = new Label { Text = "a label", @@ -134,19 +123,6 @@ void SetupMauiLayoutSimple() verticalStack.Add(label); - const string ltext = "changed"; - - button.Clicked += (s, e) => - { - label.Text = label.Text == ltext ? $"{ltext} again" : ltext; - - if (s is Button sender) - { - label.TextColor = sender.BackgroundColor; - label.BackgroundColor = sender.TextColor; - } - }; - var label1 = new Label { Text = "another label", @@ -162,13 +138,49 @@ void SetupMauiLayoutSimple() verticalStack.Add(label1); var entry = new Entry { Placeholder = "write something" }; + const string ltext = "changed"; + verticalStack.Add(entry); + + var button = new Button + { + Padding = new Thickness(10), + Text = "Change the label!", + BackgroundColor = Colors.Red, + TextColor = Colors.Yellow, + CharacterSpacing = 2 + }; + + verticalStack.Add(button); + + button.Clicked += (s, e) => + { + label.Text = label.Text == ltext ? $"{ltext} again" : ltext; + + if (s is Button sender) + { + label.TextColor = sender.BackgroundColor; + label.BackgroundColor = sender.TextColor; + } + }; button.Clicked += (s, e) => { entry.Text = string.IsNullOrEmpty(entry.Text) ? "entry text" : null; }; - verticalStack.Add(entry); + var button2 = new Button + { + Padding = new Thickness(10), + Text = "Change the button!", + BackgroundColor = Colors.Green, + TextColor = Colors.Yellow, + }; + + button2.Clicked += (sender, args) => + { + button.CharacterSpacing = button.CharacterSpacing > 1 ? 1 : 2; + }; + verticalStack.Add(button2); var activityIndicator = new ActivityIndicator { Color = Colors.Chartreuse }; @@ -218,10 +230,10 @@ void SetupMauiLayout() { Text = "End-aligned text", BackgroundColor = Colors.Fuchsia, - HorizontalTextAlignment = TextAlignment.End + HorizontalTextAlignment = TextAlignment.End, + Margin = new Thickness(15, 10, 20, 15) }; - label.Margin = new Thickness(15, 10, 20, 15); SemanticProperties.SetHint(label, "Hint Text"); SemanticProperties.SetDescription(label, "Description Text"); @@ -385,8 +397,6 @@ void SetupMauiLayout() Margin = new Thickness(12), }; - - horizontalStack.Add(button); horizontalStack.Add(button2); @@ -399,12 +409,10 @@ void SetupMauiLayout() verticalStack.Add(horizontalStack); - verticalStack.Add(new Button { Text = "CharacterSpacing" }); - verticalStack.Add(new Button { - CharacterSpacing = 8, - Text = "CharacterSpacing" + CharacterSpacing = 4, + Text = "CharacterSpacing 4" }); var checkbox = new CheckBox(); @@ -515,7 +523,7 @@ void SetupMauiLayout() spacingEntry.CharacterSpacing = spacingEntry.CharacterSpacing == 10 ? 5 : 10; }; - + verticalStack.Add(new Entry { Keyboard = Keyboard.Numeric, @@ -542,13 +550,20 @@ void SetupMauiLayout() ProgressColor = Colors.Purple }); - var searchBar = new SearchBar(); - searchBar.CharacterSpacing = 4; - searchBar.Text = "A search query"; + var searchBar = new SearchBar + { + CharacterSpacing = 4, + Text = "A search query" + }; + verticalStack.Add(searchBar); - var placeholderSearchBar = new SearchBar(); - placeholderSearchBar.Placeholder = "Placeholder"; + var placeholderSearchBar = new SearchBar + { + Placeholder = "Placeholder", + BackgroundColor = Colors.Plum + }; + verticalStack.Add(placeholderSearchBar); var monkeyList = new List @@ -568,10 +583,11 @@ void SetupMauiLayout() FontFamily = "Dokdo", TextColor = Colors.Chartreuse, BackgroundColor = Colors.Yellow, - HorizontalTextAlignment = TextAlignment.Center + HorizontalTextAlignment = TextAlignment.Center, + CharacterSpacing = 2, + ItemsSource = monkeyList, }; - picker.ItemsSource = monkeyList; verticalStack.Add(picker); verticalStack.Add(new Slider @@ -602,7 +618,7 @@ void SetupMauiLayout() verticalStack.Add(new GraphicsView { - Drawable = new TestDrawable(), + Drawable = new TextDrawable(), HeightRequest = 50, WidthRequest = 200 }); @@ -626,81 +642,11 @@ void SetupMauiLayout() Content = new ScrollView { Content = verticalStack }; } - void SetupCompatibilityLayout() - { - var verticalStack = new StackLayout() - { - Spacing = 5, - BackgroundColor = Colors.AntiqueWhite - }; - - var horizontalStack = new StackLayout() - { - Orientation = StackOrientation.Horizontal, - Spacing = 2, - BackgroundColor = Colors.CornflowerBlue - }; - - var label = new Label - { - Text = "This will disappear in ~5 seconds", - BackgroundColor = Colors.Fuchsia - }; - - label.Margin = new Thickness(15, 10, 20, 15); - - verticalStack.Add(label); - - var button = new Button() - { - Text = _viewModel.Text, - WidthRequest = 200 - }; - - var button2 = new Button() - { - TextColor = Colors.Green, - Text = "Hello I'm a button", - BackgroundColor = Colors.Purple, - Margin = new Thickness(12) - }; - - horizontalStack.Add(button); - horizontalStack.Add(button2); - horizontalStack.Add(new Label { Text = "And these buttons are in a HorizontalStackLayout" }); - - verticalStack.Add(horizontalStack); - verticalStack.Add(new Slider()); - verticalStack.Add(new Switch()); - verticalStack.Add(new Switch() { OnColor = Colors.Green }); - verticalStack.Add(new Switch() { ThumbColor = Colors.Yellow }); - - verticalStack.Add(new Switch() - { - OnColor = Colors.Green, - ThumbColor = Colors.Yellow - }); - - verticalStack.Add(new GraphicsView - { - Drawable = new TestDrawable(), - HeightRequest = 50, - WidthRequest = 200 - }); - - verticalStack.Add(new DatePicker()); - verticalStack.Add(new TimePicker()); - - verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); - - Content = verticalStack; - } - public IView View { get => (IView)Content; set => Content = (View)value; } IView CreateSampleGrid() { - var layout = new Microsoft.Maui.Controls.Layout2.GridLayout() + var layout = new GridLayout() { ColumnSpacing = 5, RowSpacing = 8 @@ -847,7 +793,7 @@ IView CreateShapes() } - class TestDrawable : IDrawable + class TextDrawable : IDrawable { public void Draw(ICanvas canvas, RectangleF dirtyRect) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs index 59968dc2753f..286766fb4d1f 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs @@ -1,3 +1,4 @@ +using System; using Gtk; using Microsoft.Maui; using Microsoft.Maui.Graphics; @@ -13,6 +14,7 @@ public SimpleSampleGtkApplication() : base() // TopContainerOverride = OnTopContainerOverride; } + [Obsolete("TopContainerOverride is dismissed")] Widget OnTopContainerOverride(Widget nativePage) { var b = new Box(Orientation.Vertical, 0) @@ -23,7 +25,7 @@ Widget OnTopContainerOverride(Widget nativePage) }; - var txt = $"{typeof(Startup).Namespace} {nameof(TopContainerOverride)}"; + var txt = $"{typeof(Startup).Namespace}"; var t = new Label(txt); t.SetBackgroundColor(Colors.White); t.SetForegroundColor(Colors.Coral); diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs index f16b84641545..f6cb8bee9c8b 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs @@ -34,6 +34,10 @@ public IWindow CreateWindow(IActivationState activationState) return window; } + public void ThemeChanged() + { + } + } } \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs index db3911e72d98..d9489fb1060f 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs @@ -86,11 +86,10 @@ public void Configure(IAppHostBuilder appBuilder) events.AddEvent>("CustomEventName", value => LogEvent("CustomEventName")); // Log everything in this one - events.AddGtk(windows => windows + events.AddGtk(gtk => gtk .OnActivated((a, b) => LogEvent(nameof(GtkLifecycle.OnApplicationActivated))) .OnClosed((a, b) => LogEvent(nameof(GtkLifecycle.OnHidden))) .OnLaunched((a, b) => LogEvent(nameof(GtkLifecycle.OnLaunched))) - .OnVisibilityChanged((a, b) => LogEvent(nameof(GtkLifecycle.OnVisibilityChanged))) .OnShown((a, b) => { LogEvent(nameof(GtkLifecycle.OnShown)); From f3d6bf56bf348afa61b65196a33c9aef05903f2f Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 16:55:30 +0200 Subject: [PATCH 131/425] Status.md: track changes --- Status.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/Status.md b/Status.md index 89beb7e6c271..401ca3c3aa9e 100644 --- a/Status.md +++ b/Status.md @@ -2,12 +2,12 @@ We have created a detailed list to easily show the **.NET MAUI - Gtk status** an Note that only the Gtk-Section is actual in this Page. -Icon | Description --- | -- -⚠️ | Pending -⏳ | Underway -✅ | Done -💔 | Never implemented in Maui.Controls for this platform +| Icon | Description | +| ----|:-------| +| ⚠️ | Pending +| ⏳ | Underway +| ✅ | Done +| 💔 | Never implemented in Maui.Controls for this platform ## Overview @@ -38,12 +38,12 @@ To track ongoing progress, filter on the [handlers label](https://github.com/xam | BackgroundColor | ✅ | ✅ | ✅ | ✅ | | BorderColor | ⚠️ | ⚠️ | ⚠️ | ✅ | | BorderWidth | ⚠️ | ⚠️ | ⚠️ | ⚠️ | -| CharacterSpacing | ✅ | ✅ | ✅ | ⚠️ | +| CharacterSpacing | ✅ | ✅ | ✅ | ✅ | | Clicked | ✅ | ✅ | ✅ | ✅ | | Command | ✅ | ✅ | ✅ | ✅ | -| CommandParameter | ✅ | ✅ | ✅ | -| ContentLayout | ⚠️ | ⚠️ | ⚠️ | -| CornerRadius | ⚠️ | ⚠️ | ⚠️ | +| CommandParameter | ✅ | ✅ | ✅ | ⚠️ | +| ContentLayout | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| CornerRadius | ⚠️ | ⚠️ | ⚠️ | ⚠️ | | FontAttributes | ✅ | ✅ | ✅ | ✅ | | FontFamily | ✅ | ✅ | ✅ | ✅ | | FontSize | ✅ | ✅ | ✅ | ✅ | @@ -263,16 +263,16 @@ To track ongoing progress, filter on the [handlers label](https://github.com/xam | API | Android | iOS / Mac Catalyst | Windows | Gtk | | ----|:-------:|:------------------:|:-------:|:----:| -| CharacterSpacing | ✅ | ✅ | ✅ | ⚠️ | +| CharacterSpacing | ✅ | ✅ | ✅ | ✅ | | FontAttributes | ✅ | ✅ | ✅ | ✅ | | FontFamily | ✅ | ✅ | ✅ | ✅ | | FontSize | ✅ | ✅ | ✅ | ✅ | -| HorizontalTextAlignment | ✅ | ✅ | ✅ | ⚠️ | +| HorizontalTextAlignment | ✅ | ✅ | ✅ | ✅ | | ItemDisplayBinding | ✅ | ✅ | ✅ | ✅ | | Items | ✅ | ✅ | ✅ | ✅ | ItemsSource | ✅ | ✅ | ✅ | ✅ | SelectedIndex | ✅ | ✅ | ✅ | ✅ -| SelectedIndexChanged | ✅ | ✅ | ✅ | ⚠️ | +| SelectedIndexChanged | ✅ | ✅ | ✅ | ✅ | | SelectedItem | ✅ | ✅ | ⚠️ | ✅ | TextColor | ✅ | ✅ | ⏳ | ✅ | Title | ✅ | ✅ | ✅ | ⚠️ @@ -282,7 +282,7 @@ To track ongoing progress, filter on the [handlers label](https://github.com/xam ### ⚠️ ProgressBar | API | Android | iOS / Mac Catalyst | Windows | Gtk | -| ----|:-------:|:------------------:|:-------:|:----:| +| ----|:-------:|:------------------:|:-------:|:----:| | Progress | ✅ | ✅ | ✅ | ✅ | | ProgressColor | ⏳ | ⏳ | ⏳ | ✅ | | ProgressTo | ✅ | ✅ | ✅ | ✅ | @@ -313,13 +313,13 @@ To track ongoing progress, filter on the [handlers label](https://github.com/xam | ----|:-------:|:------------------:|:-------:|:----:| | BackgroundColor | ✅ | ✅ | ✅ | ✅ | | CharacterSpacing | ✅ | ✅ | ✅ | ✅ | -| CancelButtonColor | ⏳ | ⏳ | ✅ | +| CancelButtonColor | ⏳ | ⏳ | ✅ | ⚠️ | | FontAttributes | ✅ | ✅ | ⏳ | ✅ | | FontSize | ✅ | ✅ | ⏳ | ✅ | | HorizontalTextAlignment | ✅ | ✅ | ✅ | ✅ | | MaxLength | ✅ | ✅ | ⏳ | ✅ | -| SearchCommand | ⏳ | ✅ | ✅ | -| SearchCommandParameter | ⏳ | ✅ | ✅ | +| SearchCommand | ⏳ | ✅ | ✅ | ⚠️ | +| SearchCommandParameter | ⏳ | ✅ | ✅ | ⚠️ | | Text | ✅ | ✅ | ✅ | ✅ | | TextColor | ✅ | ✅ | ⏳ | ✅ | | VerticalTextAlignment | ⚠️ | ⚠️ | ⚠️ | ⚠️ | @@ -341,14 +341,14 @@ To track ongoing progress, filter on the [handlers label](https://github.com/xam | API | Android | iOS / Mac Catalyst | Windows | Gtk | | ----|:-------:|:------------------:|:-------:|:----:| -| DragCompleted | ✅ | ✅ | ✅ | -| DragCompletedCommand | ✅ | ✅ | ✅ | -| DragStarted | ✅ | ✅ | ✅ | -| DragStartedCommand | ✅ | ✅ | ✅ | +| DragCompleted | ✅ | ✅ | ✅ | ⚠️ | +| DragCompletedCommand | ✅ | ✅ | ✅ | ⚠️ | +| DragStarted | ✅ | ✅ | ✅ | ⚠️ | +| DragStartedCommand | ✅ | ✅ | ✅ | ⚠️ | | Maximum | ✅ | ✅ | ✅ | ✅ | -| MaximumTrackColor | ✅ | ✅ | ✅ | +| MaximumTrackColor | ✅ | ✅ | ✅ | ⚠️ | | Minimum | ✅ | ✅ | ✅ | ✅ | -| MinimumTrackColor | ✅ | ✅ | ✅ | +| MinimumTrackColor | ✅ | ✅ | ✅ | ⚠️ | | ThumbColor | ✅ | ✅ | ⏳ | ✅ | | ThumbImageSource | ⏳ | ⏳ | ✅ | ✅ | | Value | ✅ | ✅ | ✅ | ✅ | ✅ | @@ -426,15 +426,15 @@ To track ongoing progress, filter on the [handlers label](https://github.com/xam | API | Android | iOS / Mac Catalyst | Windows | Gtk | | ----|:-------:|:------------------:|:-------:|:----:| -| AbsoluteLayout | ✅ | ✅ | ✅ | +| AbsoluteLayout | ✅ | ✅ | ✅ | ⚠️ | | ContentPresenter | ⚠️ | ⚠️ | ⚠️ | ⚠️ | | ContentView | ⚠️ | ⚠️ | ⚠️ | ⚠️ | | FlexLayout | ✅ | ✅ | ✅ | ✅ | | Grid | ✅ | ✅ | ✅ | ✅ | -| RelativeLayout | ✅ | ✅ | ✅ | +| RelativeLayout | ✅ | ✅ | ✅ | ⚠️ | | ScrollView | ✅ | ✅ | ✅ | ✅ | | StackLayout | ✅ | ✅ | ✅ | ✅ | -| TemplatedView | ⚠️ | ⚠️ | ⚠️ | +| TemplatedView | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ### Features From b934921c7cc4c0e0a7414c0cf2cbe551384e381b Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 2 Aug 2021 16:56:45 +0200 Subject: [PATCH 132/425] Core.csproj Gtk : introduce GtkInterop to prepare adding Fonts --- .../Gtk/GtkInterop/DllImportFontConfig.cs | 20 +++ .../src/Platform/Gtk/GtkInterop/FuncLoader.cs | 115 ++++++++++++++++++ .../src/Platform/Gtk/GtkInterop/GLibrary.cs | 93 ++++++++++++++ .../src/Platform/Gtk/GtkInterop/Library.cs | 22 ++++ 4 files changed, 250 insertions(+) create mode 100644 src/Core/src/Platform/Gtk/GtkInterop/DllImportFontConfig.cs create mode 100644 src/Core/src/Platform/Gtk/GtkInterop/FuncLoader.cs create mode 100644 src/Core/src/Platform/Gtk/GtkInterop/GLibrary.cs create mode 100644 src/Core/src/Platform/Gtk/GtkInterop/Library.cs diff --git a/src/Core/src/Platform/Gtk/GtkInterop/DllImportFontConfig.cs b/src/Core/src/Platform/Gtk/GtkInterop/DllImportFontConfig.cs new file mode 100644 index 000000000000..cc2a5160b560 --- /dev/null +++ b/src/Core/src/Platform/Gtk/GtkInterop/DllImportFontConfig.cs @@ -0,0 +1,20 @@ +using System.Runtime.InteropServices; + +// ReSharper disable CA2211 + +// ReSharper disable InconsistentNaming + +namespace Microsoft.Maui.GtkInterop +{ + + public static class DllImportFontConfig + { + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate bool d_FcConfigAppFontAddFile(System.IntPtr config, string fontPath); + + public static d_FcConfigAppFontAddFile FcConfigAppFontAddFile = FuncLoader.LoadFunction(FuncLoader.GetProcAddress(GLibrary.Load(Library.Fontconfig), "FcConfigAppFontAddFile")); + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/GtkInterop/FuncLoader.cs b/src/Core/src/Platform/Gtk/GtkInterop/FuncLoader.cs new file mode 100644 index 000000000000..cfe51699f1ac --- /dev/null +++ b/src/Core/src/Platform/Gtk/GtkInterop/FuncLoader.cs @@ -0,0 +1,115 @@ +using System; +using System.Runtime.InteropServices; + +namespace Microsoft.Maui.GtkInterop +{ + + class FuncLoader + { + + class Windows + { + + [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] + public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + + [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] + public static extern IntPtr LoadLibraryW(string lpszLib); + + } + + class Linux + { + + [DllImport("libdl.so.2")] + public static extern IntPtr dlopen(string path, int flags); + + [DllImport("libdl.so.2")] + public static extern IntPtr dlsym(IntPtr handle, string symbol); + + } + + class OSX + { + + [DllImport("/usr/lib/libSystem.dylib")] + public static extern IntPtr dlopen(string path, int flags); + + [DllImport("/usr/lib/libSystem.dylib")] + public static extern IntPtr dlsym(IntPtr handle, string symbol); + + } + + [DllImport("libc")] + static extern int uname(IntPtr buf); + + const int RTLD_LAZY = 0x0001; + const int RTLD_GLOBAL = 0x0100; + + public static bool IsWindows, IsOSX; + + static FuncLoader() + { + switch (Environment.OSVersion.Platform) + { + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + IsWindows = true; + + break; + case PlatformID.MacOSX: + IsOSX = true; + + break; + case PlatformID.Unix: + try + { + var buf = Marshal.AllocHGlobal(8192); + + if (uname(buf) == 0 && Marshal.PtrToStringAnsi(buf) == "Darwin") + IsOSX = true; + + Marshal.FreeHGlobal(buf); + } + catch { } + + break; + } + } + + public static IntPtr LoadLibrary(string libname) + { + if (IsWindows) + return Windows.LoadLibraryW(libname); + + if (IsOSX) + return OSX.dlopen(libname, RTLD_GLOBAL | RTLD_LAZY); + + return Linux.dlopen(libname, RTLD_GLOBAL | RTLD_LAZY); + } + + public static IntPtr GetProcAddress(IntPtr library, string function) + { + var ret = IntPtr.Zero; + + if (IsWindows) + ret = Windows.GetProcAddress(library, function); + else if (IsOSX) + ret = OSX.dlsym(library, function); + else + ret = Linux.dlsym(library, function); + + return ret; + } + + public static T LoadFunction(IntPtr procaddress) + { + return procaddress == IntPtr.Zero ? default(T)! : Marshal.GetDelegateForFunctionPointer(procaddress); + + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/GtkInterop/GLibrary.cs b/src/Core/src/Platform/Gtk/GtkInterop/GLibrary.cs new file mode 100644 index 000000000000..1c3da5333cc6 --- /dev/null +++ b/src/Core/src/Platform/Gtk/GtkInterop/GLibrary.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; + +namespace Microsoft.Maui.GtkInterop +{ + + class GLibrary + { + + [DllImport("kernel32.dll", SetLastError = true)] + static extern bool SetDllDirectory(string lpPathName); + + static Dictionary _libraries; + static Dictionary _customlibraries; + static Dictionary _libraryDefinitions; + + static GLibrary() + { + _customlibraries = new Dictionary(); + _libraries = new Dictionary(); + _libraryDefinitions = new Dictionary(); + _libraryDefinitions[Library.GLib] = new[] { "libglib-2.0-0.dll", "libglib-2.0.so.0", "libglib-2.0.0.dylib", "glib-2.dll" }; + _libraryDefinitions[Library.GObject] = new[] { "libgobject-2.0-0.dll", "libgobject-2.0.so.0", "libgobject-2.0.0.dylib", "gobject-2.dll" }; + _libraryDefinitions[Library.Cairo] = new[] { "libcairo-2.dll", "libcairo.so.2", "libcairo.2.dylib", "cairo.dll" }; + _libraryDefinitions[Library.Gio] = new[] { "libgio-2.0-0.dll", "libgio-2.0.so.0", "libgio-2.0.0.dylib", "gio-2.dll" }; + _libraryDefinitions[Library.Atk] = new[] { "libatk-1.0-0.dll", "libatk-1.0.so.0", "libatk-1.0.0.dylib", "atk-1.dll" }; + _libraryDefinitions[Library.Pango] = new[] { "libpango-1.0-0.dll", "libpango-1.0.so.0", "libpango-1.0.0.dylib", "pango-1.dll" }; + _libraryDefinitions[Library.Gdk] = new[] { "libgdk-3-0.dll", "libgdk-3.so.0", "libgdk-3.0.dylib", "gdk-3.dll" }; + _libraryDefinitions[Library.GdkPixbuf] = new[] { "libgdk_pixbuf-2.0-0.dll", "libgdk_pixbuf-2.0.so.0", "libgdk_pixbuf-2.0.dylib", "gdk_pixbuf-2.dll" }; + _libraryDefinitions[Library.Gtk] = new[] { "libgtk-3-0.dll", "libgtk-3.so.0", "libgtk-3.0.dylib", "gtk-3.dll" }; + _libraryDefinitions[Library.PangoCairo] = new[] { "libpangocairo-1.0-0.dll", "libpangocairo-1.0.so.0", "libpangocairo-1.0.0.dylib", "pangocairo-1.dll" }; + _libraryDefinitions[Library.Fontconfig] = new[] { "fontconfig.dll", "libfontconfig.so.1", "libfontconfig.1.dylib", "fontconfig.dll" }; + // + _libraryDefinitions[Library.Webkit] = new[] { "libwebkitgtk-3.0-0.dll", "libwebkitgtk-3.0.so.0", "libwebkitgtk-3.0.0.dylib", "libwebkitgtk-3.dll" }; + } + + public static IntPtr Load(Library library) + { + var ret = IntPtr.Zero; + + if (_libraries.TryGetValue(library, out ret)) + return ret; + + if (FuncLoader.IsWindows) + { + ret = FuncLoader.LoadLibrary(_libraryDefinitions[library][0]); + + if (ret == IntPtr.Zero) + { + SetDllDirectory(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Gtk", "3.24")); + ret = FuncLoader.LoadLibrary(_libraryDefinitions[library][0]); + } + } + else if (FuncLoader.IsOSX) + { + ret = FuncLoader.LoadLibrary(_libraryDefinitions[library][2]); + + if (ret == IntPtr.Zero) + { + ret = FuncLoader.LoadLibrary("/usr/local/lib/" + _libraryDefinitions[library][2]); + } + } + else + ret = FuncLoader.LoadLibrary(_libraryDefinitions[library][1]); + + if (ret == IntPtr.Zero) + { + for (int i = 0; i < _libraryDefinitions[library].Length; i++) + { + ret = FuncLoader.LoadLibrary(_libraryDefinitions[library][i]); + + if (ret != IntPtr.Zero) + break; + } + } + + if (ret == IntPtr.Zero) + { + var err = library + ": " + string.Join(", ", _libraryDefinitions[library]); + + throw new DllNotFoundException(err); + } + + _libraries[library] = ret; + + return ret; + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/GtkInterop/Library.cs b/src/Core/src/Platform/Gtk/GtkInterop/Library.cs new file mode 100644 index 000000000000..d1d6fb12aec6 --- /dev/null +++ b/src/Core/src/Platform/Gtk/GtkInterop/Library.cs @@ -0,0 +1,22 @@ +namespace Microsoft.Maui.GtkInterop +{ + + enum Library + { + + GLib, + GObject, + Cairo, + Gio, + Atk, + Pango, + PangoCairo, + Gdk, + GdkPixbuf, + Gtk, + Fontconfig, + Webkit + + } + +} \ No newline at end of file From ecbc2f082d7499db8c3f80d1129bd67c788e7e08 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 02:56:59 +0200 Subject: [PATCH 133/425] Microsoft.Maui.Graphics.Gtk.dll: update --- .../Microsoft.Maui.Graphics.Gtk.dll | Bin 53248 -> 53248 bytes .../Microsoft.Maui.Graphics.dll | Bin 162816 -> 186368 bytes .../ref/Microsoft.Maui.Graphics.Gtk.dll | Bin 26112 -> 26112 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll index 39ee10047af5e0374809be04cee7b764e0616f40..83c1e4bf4359a25d6db8854dee308186917e8704 100644 GIT binary patch delta 6497 zcmZ{p3tW_Sy2qdYI~Qh{dFKiPIF8IPz%VKUauqED0q-WtMM*_QBxSWzVw+`lh7l!O zulTNJyH?Dam8;ptv?pCPArNJ4t+p)7ZG%u#yQtN6bhXny|7TwL?D=%g@ZmeZ-|u<; zm-j#Kz@SZSil#Qj*7eGjOM|;wHx6ZMTKCR2q+bA-0sO%rN7?GK>YWVq+@A-ikX*t@ zshWA%dMSv^k@m9L%r7y)syZ9QAyVs!{BW5tdORB$eyZeIbzqJz6}m0+bPR?KTYy}o zsY5PFTa0|ovJBa-T`p@IY{6{kPNQTo z@rtqqlbI?7c0Qwg3iTSLBEVeGXx)tFk*ICRxlwI87p&Ct*386LbT&Ay3G2*|koE>9 z+v1KOXHa!4@yB7EnEb_i0!RHybqc9ewIIi;)Hw4&bvx3jdY9%ogY(?*EJjv(KE_e} zA_ELwj^c|QRDX(mU->z5sj40KxXkkf>Ud?pz+iLKSE!9q*O6bTe?Y#jyoFptSC$jS zuW7f6cYdn+3G;sv57Tx9njsji(KD!WiO8w;|52*dK1DmL3N&5T-_lhzy_3MX*T(ro zB4_sy&hMi*H6G4yDCwr;RqB6{*h74a_yWyPPn3vN#I?i~#3eNU!^D7nc)w89lxl6k z1;kj+F{BqIab2k3+#zxvcXA%Ja2`VD!SjMeZ-Xsh)2pE-ak)+nm9cKrGhAs%)o=wv zZD>a>ACivA&#N^79L8V-%fe$RV0n5z={TH}!FWvgUbXr@c@7+t@XOV|lKIUSdsRnAQzEiRDk&Mr5wgimVm*fIAES7IkFd z)836Vm@_gsi@l81^SB`f!-WI-swS(QpUs!VB09yNCx4CMJ*SE1G%eEe_a+3s#(5f@ z{4LxPKi2Urx;2B2*R~Bhh6l5Y+zv>w-N4%0vJ2{d(hG1+cK?x}78T%d0X}v>uR|1- zkS4nri&a!XpX~A!!vdlj?n;WZ?zDTvD5#ZPn>|z1z^*}8AZp?8VCQ%-8a|g@jAg2* zgKKv>b+bf0INgysZ|moZB9zH)Ld+u30PhdFrDDJcXJxxLu2D2WT5@EdF7a{E42xuU zQumZ-fnUq+h;ufgvA0kln8pzc7q}bT1#bLvt~9yl^+<$nI#&O2geyD7$lUPe{gD_COFbznrac zaJMny;AQ8N=(dwhVEs#R$$wKE@n8b1CwH(HH?F0gKocJJbWO#XDoj*On{j5 zNM~yNTZV~nn_Lj?(!3ooOoq)qUJSw$`ZI>9uwQo1Df$d$a87m~MxQZM!!_9rL|--3 zz#lUBxE6RoJY!e{g_)6Ao>Sa1Gysf>xE8C{xE#LEj�gu^LxEM-DlB<1&!a%Jm~$ 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 diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.dll b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.dll index 80e92a907d6eca5300e8e37b4c1e049eddba6119..ce951f73d82bc063be03f941b1c1fcd48233da83 100644 GIT binary patch literal 186368 zcmeFa33wdEwKm-9?&;YiS*?*rvSnNHN?Rit+ZZf+01KOaHy9(y5X@r0$S}6V7L0`0 zNmz3U#4(UKge*X~A%Os436Pb99l{b82SP3(A>oo-xFIa||Gwu`_smGLG57nv=l{Rw z`30Unb?VfqQ>RWrFrEk&AT6TX!FU1<5tY5s!B~U ztPkG9vi7fVtiIU$zYTMH&6?Dlu9#_APuP}~Q0&+K3b>gtrL}4V28wd?FML`ZhzFj3 zj=SKzVk6tE|%5E9g-o*@)^B-y~hHfvY~7q0#B6_cA&au^sZP{03l_yAhYm#ei+?C zMwkBeQ?K}=Y_=7%etU9-wc)G^t3t4rb?RHTb$dA*6EpH-k{tw=m9kn&f$4&=GBX|P zV3W-5YXP!9haY>AWeqOqZ!LmtMQ{eeKp0rI+rK@7PCsk|54$i6&;Hr?X_;WJm1kzA zZS8tx!+R*F+!nad6r zCtI1b5-p+4Iu;r+dYY(xqJfa5S6E1mAUPYkS6GB!RhUZOf-=P{D2iPm+Ep;7!t#)o z%~x7T;R!^g<8G`_AWhsWpo7KJT@hQMDBJN6yF0UK0UzoJJ&P6J3O~aHDGL~>is=yG z(1bol`j3?7ZOXC>DX>{P-6rrj1sE!#;}%v69>AW$^NNvZq!4ILg}qAiWk0>;d<)%R zy!FfrXK3C9a6)muZTIa1puY+x9`&qN5L&v9Wgd)l+P zL=Vf_rEZg_8>kAjd zoU-dhK**jI*-g%3zgqq(3@j)O><_$6VLy`6Q-e;eRoG99Q}E5u_DhKH zT|c%y<2k-pxCmJmAahCtskVSpDNiNqz zZ{7@QCo{?))r#toB6)=aS>#;Cgl(44ATffmX=4biLFxJQ&9l}#GkmTuu`Ck8vPcKZ zBAH$7_6ylguy)4{7SlkjmKnC=1cxY0-Fp^#1Zk@gH}xE*ruxT#jn_Y#%<#vtzyfwG zv3S;-XI7{h@XNl$wvdthMf{w#WTAYVwIuB4kL|2w(tiE`W@eHjV6qnefSH}-+4546 zqcSsmV#)&LB@eqgrb(+kO~&>G-HPv0aSA7&%w09J|Rze~y;m zj9q8sXT@|+O}@dYSNaW3 zgEH9Qj8TpoN(6SsDz^_iWPUH(#Ey$rb-aN|yHI zF*A1FvvOKSXlpxGX%7?O+)4+jPS!A@3{&{c`5WyM5 zwkV=!C}LF+u`7~@uN82d2Oyx>H2EIyR5-Wu!cBO~w z>^mGqk=_PH!@M&%okcqqKNi&iR4GQv`bCr#P7D0Q;Akc;GjjM1>0USztNSnnrOwjM z&0D6{wSoYPBLI8i5TP9;IzbAj-DY=Jn9PL3?vkZoq=;VPzW{H+D}!94DuO@RmWRim z@d(z2MbvhJ8J5yvUP&3cks*cZ?$nGrfft1Vuews{I{UDopt=%!qC^&!m)U3B9NaAQQ!(pn$RECjZ#ATx*bcs1 z?QUOL?Yh;mhVITyF5Dv2#aK(j4P7xBWs$=zCQ)^<`O)i{XIPH84s`B>{1zrM_J2+eXI7SA#>tN4Y=w?(svip@a9G#!p#=RCBwkU=`kNT4Mhhdwvi@cXdeyNm88Q1OB3vDZ-&YGJ z41metgWZBRUT|Bhil~y#>F!MB5*(lJT-24)=O$QaMOCux z&kTYqdN5A7d(sG6IzroPDQ-N#w8pEX3@mM}E!~Q}mcn;;23SAzEJm{Eh-7DDuVqmX z`4>heOml@zJ5~$$u*i%H z3lW$WNiU{mWn%T2%G@MO27MQ^LEDdMS*ntLRbfviu>4BQ6EUZZV`UPv!?tIW>b44@ z(j+sZ(9@2R_K=iyS9Bd1-?;=BuJ2VRgUcXj%FC|v>eqP<>%1}Rys_)N#&zDfb#`z$ z;>6EJd$KJH9g1(cDJ%@ex>U#M>O{3?;7V7Fu*PT?yNd!VzppXkObte(*?99}mtfRW@Wtq_^ZB3W6ER*$PD->1ldn**z;E(o4cl%jC+udm-$&B$w zXU6(j6;~Yh1?spzNW<{Q`eT-@3g8^2db)!~7;UDpgo$78*LV93K1SN^5{5)(i3I1- zcp^~WE%j^7-j*!JRl99zf1Jp)$>zew1b;#+7Eg#m|CJeMFOdaQK z$TY*|o5kj1)_&+OFo612OlL6^0fxhs{3LsfI~UbB#ke^Op|4KrD;4vWVWz|`)fjb^ z^eGk+!!qanH!Y-E`&_PCg=QWnDD$jLBAZFJ|AchOL}yhpL5*}Q>k27TB^XVRHY6c~ zN{lUj8g|)T9ix55VW^d809B6S;|7nGB>3uNk$1==J)B2pX4G&7owQ!R%CGiE`89=o zwS!5bgTb;^kB1({_x<@hpzE@@t}q4N7N1kia~hv#MdPf~PXeqWF&?W(60K{qjTl3y z2)IA!hZ-9Cx}a^WDtm=5v!k&#roC3I3}Zk|S+AfDE8v{kfGe|{&SJ}viFJ63pap%; zBkdrjj_f-(bjVNN?GA8zP_S!xFiU61s*An#{~hS*RuYY?vc+ zSW0P0!UWS3BuZ>SvVvOG_h6HxjnI-YPY94)-#-8W@g-iH!_k8*}`#Uxo?{i zFn2?ReyS3b?6c?~_@0i2n&y9l4kCuzq60&`Er!*%O@^gZ+rsbEZQ`d?Em&SK#xet7 zws4{(ChV5MCkcLAvhUfZ?3GIEW)|#8{%i-$Tusw9t=bN>Roj8IYU2wPPM1uOh;5?H zB!|#QFD=Q|whottZQTyo)<;Mill@e<+UVb6T`4!#mDcG-cctyc6N!RqN%DzVloOse z{Njq>Ntn9Zl>+p%Kxx;^7_APbg;Sltf92^hJIB7brl&)#>DjHhU1@P8CGD_$(ZOoE zk!4iN_@B#Imi{xySduOwdw`JB$An0_q@V*Dx2rKcoXe`>B9?Ju6NOVu<#9ioa}@dG z8p@VCK}lS|c?$J!ld|s_rQ3RMR+?4~c&qss@vyf2sr@848|q^$dw}DY3}*uz-3o&u z>~Ab}^b6ghhPuL0^2`=KXP!sOa{!K?TR4Jn3zq;T96TKQ^Nt0V+rkVHb2;5ApT$ix z2MaD^pzmNUY^c&s46LgF7g4yCtA}a@;W}p(aU_2l_Eguh>J*Xw*NT`%nmr~~x6KjtoMWZvbHwq@FL<9h0pAaDc z5c`G*0f5*qLLHN^!dxJ;HICt0#F+O1&_7=invSSnJ-JuP3>e;Ad*dJSkrZ9wlbZp8OW^m;qMi zaAGV#F;gPTY}?UQGv6*$!;H94!hO?|l;L7hRJk zcmsmoI2AclZzcp?Q(q=DR;ATYa3o|%=Vl0(l0+pbO2~uH3ALqrNv^atwE+sTZOKhF zi~auJP{z+LV~OTb4<(vMJfN+O-(|*!d@$8jkUrYK~bRpK#3b#BwfpWMWtsiD9G*{ut^f#{E7k zKzce;wOE>E+Llc?$rm-Sa~5?!a|pDUV;jG zAql6mQWjZCMvqE3O3kv5puqzcPwm9mM#m4d@P z)^3MlDu#}dHR5GF)PZHjV^O^;#~mq$iiw~v5Jl*WWpIJh)m<5FQoXw%?yTzW>c&#C znGU_XAOhlD5|?r1=onY#_K2aBHvXBGZ_NP==h?~~>aM~9G&d?fKs{&TxkHlfs?zYn z#43^$31%f$futCo$n>R%8Zt;02`pd7ftakdYk$y;gZtJ|O*O|oV>bh`j+#ISfOQlx zh&`&Q;kajl_aIc*FU71K5mBE0*eE?All~-Oa0)maTgpN0ml{wWjw=a<}wZ#v^qZ zVk=5v9`qQNwWg>qNl^lilp?Ju8cI@>z$2xAxCcezj)k~5XF2b&|L=;c1sqdSz!G?* z0#;eMHCh=HP&ypYY{g{ye^XW4<3==rD$G>16~)anVV+6zlva{SVh~R1S?T}Zj>{U| z|EqRf^_iPp>N7VxQ@|42wM*cU?6`8Mvc3k;c?bzcQlJP4X*LYhv z8-g=-@q~8mkx%8(?=rN~w+|)Pu0En4X{>p-WUPtFTAz+_Y-M+vG3=3r%VZ40Q^qhn zgVJ;^ecqC>Z-jK~c zInogU>uN&kmXl$HPB|`^m2{m>*Xi!cC7A^rq0a6UHP+#FdtK=(_MEDpC&8**qfpBUeX}0s1#tsZ!Q7BiA zflzymT&0E*U|5;dQa`1?OWS`BOwxC|GBLbau+%M0Yx6Ke>m(d`JTS&eu@=m#1N(k@KDeC(CXM#AU>hnx^S|>nH_ZEtZ{Kg?CJ5;XU)t}~XhsxpKy9=UHoe55MFHYHnEv?0GnTM?k zV8fP{i%Qk%=UA#%mI|{2WS!=q;A2&2Nk9YX^UaDD_{PQL47`QqAz& zN=mi8-&RtpnSNVXU$Y#4MvuRJk3X}=pVcG7KHJ!OaI||5E0%7KKWE;3Wu@COD&0>0 zjx60yEFEAiUEa?}^6gJ<{*EXeqPJMOx&GX!&UW^9j#5{%baTr~*Y3|PDcwAOZb|9p zJAQkQKd;B1-xGXdZ16WtkRa;0W@yiqj$g5|enta+8+I6lj;a^ihpU4%=+n@1V`)9J zi@(dfOOUc}or~^hSIgfu&Lmyy`#-|opug){KBl(0)9P}upqG8&qWZQ9%U={+%LKdo zyEp%M-qmXso)SX|c5nXKf84m^!dq;Ce{jY-*@b(fc>#a_es9DVeg(<}{Ej`%-El7f zb6@Xpc5GtoU&mMEn@4el&7kuaRasX13XB3k%%AhRljqBU63yiK9V!vMr$+yG%iS?y zbJd+YyZK$RhK}g`VPrEw>GnD9!B~EI7)^=tZ`B}rGxz9sZ=Sh!$E1k$<+0yM2)_gV zRiDVepEmr6&aWAb1W#y!S+6xG^Y3E36S0^)-$8!g*XW%Kb1Q{S-M-&W=XVe3h|Yfi zrtKFi-N)0&(@Tva@NK(S zkCmL(ef#11{Me8c(fJLOXuKv)9zS_(esNeHCeOzpR{N$#QNW3}Up_(D9QeewO{{ z#34VLoWD90lIZ-;5=d~SCYUziz3KT$s9xd6@t6j|p>S^85p-9<{d! z`F7u(dkA;;!WDbu&kvgu(fNNN)SlG@8(+R<&-`7XJu-QIIm_@*p4;2K`O3z#_7^tu z4?TLH{A*#pMCW%Wn-#j+d>P`Dy zxl{yx4T^F8l zf^dJe{r=HRkm&rL%r~ucXFR^oRr%X++C{|j=l5TgKQtt!Lh~6H#2YbY zKrwfDf4L#lYSl6Ebt3RvJ5IYsays35>+1YHVYfzf{yirCh9>S__u5zTUkJ6zA!E@kiRChE~4{KQf(h&SVIZFKJdvm^Jj+qm^^a6`$ zjh?doPB#miFXWeeH@|z>6o}3rNVEKr(p~+@t2gHtg;n1)f7e^`&xTBCviYyDM3*S> zldtagcxbmy$Gi808h+q`#dnDCv-W!9`;zP3Q!lwK|5m6%qVv^Y+rB^+Ef{;{wEm^{BP z+Hd<>jXq()D~}4B{7+W@ET0Y85S`zh6?Lf6EskIDSpKNc41V*UUwSNmVb~a`&^)d( zu-d07@k_VF{}gKV?YcicF9LtEcHlY5>E5ONPvoaLrU?+8-<5U#XN-?f$Nt~^(sTL! z!WP2h`QNi0{zjue`nQ8$7dFSo?Tz^tLah>=f1T!kqtda>BK8r*&W*4S5c@;LE{d>s5PQ91509`n6MKd7h}ee|I|_H0$;4{@9>m_F*j$9o6Z>Vw;&id0oki?`Vi!l)?T9^5u`41h{nz$G z6x$zRGsNz!*y|!}lGtgA{XvA?3~O$$QS7fG?EA!ih@loGej&oXP3#{P`?m=DIK2Ge7id_(4e?~0t3_@K zMcC_zouk-WBkY%mouJrlM2o!tO`f3lzIggx!tUQxtn-gq=%lr(#ctux-RHRBT^_olGoV z$zmxkjj&^g%_{bW2s?^cc~yQ6+7As_4{jLk5}yU2>T$h2P<|_g#8h*^d=$i;Su&$ zVy7tfVyhKiv3-LtswT_75k?M`%gNh>lB+z zgfje%*z*+I6k*>Wc9ml1McCgFyHv4T0STNL}H2zwu~b&CB_g#7`r zoJXL<&qdhp5c`&5-;c025c`Z`MS`Wt6s(K z6Jh_0*dr8sWQ6@Qv3n}^ga|91DP9s`Db_^T=SVwNvA7M*NcJePu3|At80^Euz60^V z;p-9hZem|l>~|vUZN&amvG+yTZxZ`G#XcEfze?=2iv3fBy^`2L#bOjTGF(XPNs3LU zL+n~&mnasVfT3MO?5>L4KEj?rY@pa(BJ7dG)+%LgRx}|_-w+96<$sF5QUE;e5k^m zgqJA1KjFg^?jXEW;W>m4S2!Ttsqi?$T?*F_?pD|(yiDN_F#j7kLSfE*2aZ(uHNrR( zPdR@}_$Y-RA-r5+t``g(t?=!Hk5Tw0!pADSj_`2`Uq*O^!h?j5SNK%ICn$U(;S&`; zg78X(4<_8B@a}|HDcnx@WQAJ^pQ3Ox;ex_-gjXw^AiPH5k1=l?=vDY#!hH(=k?^Ss zzexCWg&!k)hQbdKK2za434dPU?-D*s;p+*XtuW`P1N{nLKzKmmGYOxg@G8QC3NI&o zuEI+QpQrHNgwI!aXTldKjN_cvz=aA=A$*a-4TLXNxRUS}6t)O|QQ`M6n;y7S;kO81 zrtm9-FIV^}!dEE#bHZ0Dd=KHP6#gFJFDbl%@V_biWx`i0dcZ|1BF`&|4`v(!gnZKNBB;K6NG=H@W)s< z8n{d0cM0FE@E-}^qwtG_f2{Chgzr`OA;R}5d?(@i75*;a2Nb@Z@J|%JitvL9UqJXF zh0i4Xu)=tM-x~O-!gw*!8u*#QO9=m5VeT;w{6gWK3I9^znS_6(@D#$2DBM8!*9un> z{*A&o*k%nps_=Uj;Kvkxi}2$Lze4y4g`Xn)q{0xz8UTWQBh+LKJgqRQ&>DC~;SGeJ zRT$=O4LqmtC4`?BICsv#3ksY*@S*}I5ByGn;|5+*VA;US3LG*3agbwfpMh5u=or|j zz}$h~D==f=H3g;)ysp5wfj=ma8F)j16t{Hy(9@;PlFi+PnFam=oYBeb;qQT)I~;!j zH_Wl(WtAN7IThsouA98CVjsBgGz0>~=Q16BM;-6COJ(--_iPO;1Pf;(D6gDl_VV{4 z-@X04h3{VE>m!}TRW);NC}g~TON{sN_Zh}`Uw>aR-p}7p81GBQtcOyGKW`+)qJh_U z7A1z^=Q6wbyVdauwp3<+e}7&%vs+zV;p|A{1N;NX`9S}`)+AJM066E4E|oWAi>`fS zwg>qK4QG3>e=ylD_7@A=gUJ?NxgJa68$dXLRKo&Hvubv-DxsbVp3grVnAvb9O3qE4 z0k2|g0pm!@Jqm9%)mu%+;dY#?o{=^un!w3!Dg+o%QvpVq)MRqzA8wA^jDtwds%7%R z)3qa08FHKrAu&Y5J0}&^*$H7`HE;gl-Oa(@aSmbdU>H>M3vYjDf{Pi%y&@)f2!p@f ze2xhos`@FJd`_6}at8l)&2c97Xa-;T zAdEeR!JX?~F|o%oSk%UG3}T2iu`48aX&9s*)SSNP9ute2bDM9z`DPP5kwNRYkeCjU zcu0dMF{0=02Mk>ggO^&Dn&2u1x9>U31nDC+TbG66(oJf9Z1z`8EIlP?JWRWq!LzRY zvx!~9;Fb4ZX@b2BUb@TPCWyYoZ9eFr?M)C(+7<6<5FLfv{PYu{;HNYAto3C>hknCt zzPc_H2>k{W_FzbihUPY}T)EN^qXoO-Rt=)@g6^sbCIW5OZJspghbD-Y;WoefVaOEb zkJw8mnb>nAExx~@20X~%E3brAcCN&J@PUavk3s8&kobHCo4@sviM@cq!NEZjyikY- zL+R;!HE+N9HWPa>g5sPFqWgz@o5N;6XRP_om0=!VWblY19yiHgFK+XB)_x{<8G=pk zs_68}nlF1Z z{AC6=Z+^|By@tVOJ`CIZwG2M{?6W5JD-2%s&Q&J34ngtV2EWRPhwlmnTF>BF8^Yjq z4Bqm?W|QoC20wh_ViUZ9!LMF&h6#QRL2={;zs`t_Kfm2XY(TK-HC4|y7-dC$(Txnw zetfo}{3e5M!b+6*CI&%kg5Q#~R#>z2@0xFU{CE@l9R}eanBaFAeD<(=O^}XW^NXvm zHo;pMTyw|HCU`4@@0_^S1mP~Y&Feo5S>49qV^4>zihf`7g`GZ43)|Cxftk!|F#2zWM$qCU_TvR%F6bPc!&<_em!983wN!Ty28SA}GG*;BOg$)@dT1 zWAL1)89dM6o#*XoVqakJvOB}k?nMR%2Sc;?9fL1E7}m#24DNMo$oXXiv)X)KVa!vn zbr`O%GWgDUVWn?m@Q#h4q5dAh(VFfx#=IZ70IxHMYA|g6z~Jo1*PGxQ2)5`wA4zy6 zR!c9g&~STk2x+w)E2MzpRj#RmMjm4Io`V?YvKF{PZU9@COUrmy$AuQIUZqdfhwdJ? zF7#dv!UFpG6da=hI{8%L0txiuSWGbj$x;RM>M6@9pf^v!ox@r9M$7Acu#}8ZnjSH) zm&TyuHw?T2dVRed0pISK4wx^}G~&IK6Cv9i@%Q9&53O!pI@c9o#)F%@CRsT9U%*TV z3;BrxI%zK!E1X4D*ct?Z+^PUKuP27LW@5|q&XfyDlPI9$_R<^EiPm_+T*?-2(L33i zteuxxX{P4A5e<0mC^ED;b-7Br`MnBo464B;#cSY09qts$iSzqzT~+S%x>PeN?;Knl zF5gzj@Iwr_CFUax{KmqSVBzAtIll$5BN0~sfy*Jj2o3PP7M?}t>lZN}Z$@wDCwLtu z-%Uw?78gcR!qP7)%)Uuqpx)E6r?z?1`rg2O0E2&|nV=jt?*iZy&$kBt131-Zs_#XM*l4Y0Z z<`F1n9`nb$8T@ilx|y@{bo&qSYxm*=)#}3j$QrqZG3zAe+hGjvlQwAvB<4=W!0V7V zZCVpe$EDj>NCdVEO$1))Mk4g5$Y>vldp?Te*FwTL%uXQ$4n3N5G?y?l&K~Vvw>pgD z3!&-eR$$ZZ?}M}5TNB06l+t3o>2~yGh?@|_(X7(Voi@{97((3aD2^}kgmK@HxILpd zzKoM@=CV(^ogInYi^D@kPQHPYXl`~8ms@4`9v?;Eb&e?FP`eigTulmo{3FqPfuxvk z_g)f3)c7@sxJx1?+Pxd12)wotMI^KWc>6u=7xl?IFrqqjv*}!m-HStNnj1~1KAo$# zd$E(PDAc0ckj{}(u04_VKMs5v$;Y+3QZc71?Rnktcyv>#-09K?8$JYddD5YS?ZTDc zUFrBL+?WYhGu0zkGt61kJ?Z69`*bYhC9HE6CA%{2#)+Aj6*dq*W?Dz@^AO07^}#Jo zorT-P!?|#U)i%SLI9cYxw!EtzXMV!e<{M;l7A=!5N!mMP=Jz9fYjQ)|?n^$JnC!64 zTW*8L<6dHRT|!p{I^knadTqvvh20v%wr#U8%EO-g!NbRnedSyGca+3CRyX2zVIJn2 zNalu6a})BaZiEj)Ao7{o#>gi0IP$yvmmS&P_yUP@zt?5Ax#ItXr?>V`TC9{ zICw@3a$xrg>%dj*h66yajDv^!vT-N2*hoU|*4d4^D7hst9$G`8zD6l)=Quup>t;y&`S>w(ZW${oUk3#xLS7hh(YV$>%rVp^n2d2V;g z_By4%eA8~Y98QBhH7lhXcnw2*A6BGsMO8g8g9}P9{U0FG4m{Wn-lG_S8p#PAI__g)o^g$gukYK1lErbCIj-bk%oQv7&6u_qte6?mXSy;)UA~!m1vfibj|#%g0~!~EbIWQiQf9cuJ|?mz(nX`52<5`!#lmq z*<0_>u@f~G7J%9+vcTJtMHbR#OL#DH%RG=5ZQ=+#_hg=mJ z@Q6!8#VA>8B@90k179>zj~j@LQlLsYWNi<5+3nd3Jaa=6^I1`r51fOM^3hKKe5QQD z3c>4J#SBf^;JjITv20jnr)}Wgl-w*YzMeA&s=c*NpXFDt@vCs2Rga#q#u7t;P0jvw z*7S_*7iWR*-cnD-gv8`RRfoz5u%Lv=lpfJ7`DRXxeK)@=h<13zN_?6sz}gaSXz|Jo z*VIAWiLY~Ex6-1FJYuoG=a*m{Trt;9htnt2scUuMxsS-F#YO?@JB2&7o{A^D z#QGbh;t;dR#YY$Z8VBTLnn82E%jr%^BS z=`#6Lc6@kl@OwEM6Bie;X+Kek&6Mp(XY&&MR$TKA*8H4Z5_I%mlfYE@ zxXX+DpmWafw4}U%`~*xDeHYjLWNQ7|R?HcL8IpZ&=LC@%KO;zZ_PpO|yLi$GrV)X|DV#s?w3B=gP05 zs&L6hQtn5JToEY?`?V(K-&;4zTHSjDeo7?{Ft69^B|jHkPwMvn3-X}<{t%Criz2+U zmUt7nmXS(<`%f7mSEdR8ge2uRc?EzB?8~rjB4ZYsDAA7mZlW{jj;1P0vHV~xCmiAI zg7?Lv(fxQskoI22mL!bHh!@w|G=+!vp)D(iG@BAn*`gVX$vDDHqY@G+ik zslKm(*&ty-*oAcnvs0kVW66toN}LXwl?s>8xt!DU-cQhxc{Hz&vJ0mzy=S5ZqIo@O z%jfl&0GPZmucu6fuRAT?7Y)Ttx)=`RiG+0sy_HGSU(G48;;iFyd_&yhPY4>z=Q z4rgMb`VEkTwg!d9w|)&YT7DMNOIIL3DhpU0*RrpRjs+FI3xU%W{4NB(qa$Az#iWcK zj#Ic9xjKbg<@YxE{XTvJyahuC7`ZULZF5Yk7WOTut*p(FUujfHn`0iOQ6+7Txt2t2bDN_e z=Du^>h0eT92yKqpnGo6>bI{PxHir!ZYuTr@xo@MK#Wu%KvCT15Y;z2SZH`8bHaBae zHb*bt8uHU;5)5r)v)IOX{;3LSr2oTG-*=Evv0t+JoxdnfTK{*81RTSw5wGKrqhAm= zi5Z7}SpMt)N9sIS>hO-B59d$4;J+9h#+KZitFiAhwxtEr;_1SsWzUGAV`jC-mtd5c z8)&kNN@8RNj6GAOh#3mB^d?lJG<^YpXbuqquq^c3j$nNbKnUYQkGJ~LkZ6z?K{xb1 zfX=&corozIabW1llBT7_%G$vvS{$pP2#zU&V~b#Y2sUC(tqw{)QrdiL+`*^ku?ScX z$2Qi^1yw9Kz!?>Hb{Qu1>ra!K#jX_Q1hOaDXa)a`Y;i$Y;X>3O9@kTf_J^4`i!aIh z^2v7YIgJTPbuU*7(~fC}P`1V8*4kVGsbsG=<>4MHStEd@V3X6S_mf#c1UDlm%)gV; zG}6|_rc6qC*Z1!2TdTd`7K)NmQLK%)s*QY9_)7U)J*VmLHbr#o?TXC&fT6({May2V zg|AXhzu#(7o3?oeqV+lI3v1Av#l<+8nShmheoZ=NIq95lyRwWgF}y-uoOJf%OncP- zLfYk@IW0^Mi!f?~0ssMPRfGUQU@lLD*;WUljR-ukzMzx>V6q%Xqng^5m?j-TE>?H~ zmEAG|{>d%ipV|WcY2p_aC*A!b0mi1U% zk`+3Bfe&++Sy+fJ#_RW6qKmu9D2256FcLYehA6N|L+=oE1W{#}E&as4oIWerRzUZyeFJu1**A6->NrUb%L*5&4{7ri&ICWZ_dxs#OZ|>D zH%ZwB(brkWi`<3fkhSkN{9sXqi=8{5E5P(8Rb?fEf5)?}GTAg^Mm*WnCcUC`gXnmY zh3_MBnpw`)4;9S*x%O&i5gU1MPQKo@ER1dRkDCVivBd7$XV1p3ez?`H>z_lE*3s?Y zX>n7~470K+)`yvNs((jPW&1Ipx=!zjD3*K=p#bgUqoGdkS;Sn$(*D3;))VtJ{6sXk zXJK{k?WLHzi1}#=rtxyGcpnArcInd zm|$}2MDcp;wwv!-V>p^W6RWAY)kw=az|xg0-C|o-8l+T=;VUhU%fMRhOv?6CK^A7H z*JRolhw2f+cRfu4KdFM*_Svj*@qCmdELGud6cJl)a&7D9A&5%RTBFYb%+!2z+AI{? zYgzeRD#nZJhG-Ep#oxvmnVMpQegrj&rtH_4xl%ZJa!hy==Ho1J#>al4kB(`#abzOC zmi0N<>rwc}aVi||_5^$)ZP<}E!POM(jO^$%&5)Hb1_FmI1g)NdMyF}TjJVUZN3qQi z&1Fq94#uoqT+2d315ec{c0;JCrhyr?p0>QWXBwS!;PXCqAcbitSZq&CZL6GC>uef5 z2JI}FOJ@T%+rA&;2U|SC>Hy=mOf$(GQzuRPN9lqF(O~=aU~W>Kj8r^xGc47rVX2NU zrrIB=XxPJ24bKY>Uzpb_q@wu`OEo;N4^byZ!o87--qf&Edk>TF=fzYfA{95Xhow4k zSgI?Esg@!YPyGx_wRBi29t$!Oo{m)XuZE>MeORhV#Z-%siYJAJrCKyB)n75(n7ocf zDsHe0OLgq9RCg6q9g0-kfEkwR&|#?ti>dmMiVbjBs=i^V_ARDbj8xp(8J24CuvGNK zO}W+}70)dVOSNWLs*Tbz#O9YE6}N^afDL_x$mW+MLR-fu6XtO$sJUk}jQZ4w`n)3b zZlJF7>oEKe;l0~XiE;;-LL7}Gyk&P-lB0(u85b?`^iIg&3~F#RnzHG!_y!U-J%*-H zpDJb@1RFX@`jRHJd2~-09UCj%%N@ZqTfW;5r~9)*IV0qUxh4tk@xnjff3aa+;utK0zHiO>8J^ zl#-K)c|&5@7})S6%|uP}Yl)%3vvElp69dl&+-MAJK#~TH7~_z9h2CjmowJc(&!Ilh znB0KV#9oW70O)KmP7>r!aGKaH(aeR~pbvJM*zeGeg?hYF&vTmCvCv?J+Mp+u8xGDI zah;*ee4v&Yb{*42cm@290V`J7LC0r%ijWK{d)8>31x|Q z2W(Ias+2y`_++Y6A4~=Y!y0)c3JVdKW+&7!q)cHum;!l5i9DKEe@$`>uuSe1_GEJG z)41~8f>L@=PL-_7C|TAKX{U@#8?$bL9IJ-Qk(FXZ1(RZ;P%@?Ah^~%+IEhtuJmDmT zKI0~(Q8gKrVgtLdpJ>2S4bYpmaywbrk*4Cx3Z21swxrZJPwf>Blw??07MEJmK@Tz6 zuR3|l@{Yh4)ly_)vWTl##y0MS4o)et4c0u?Gt|%m#HK3cs{|Pj{?2^}wjKrGe%b@N zgQg`r*5G&XjInUh5Sme&>%eo(46K0RdFl*1hZ&9>qN~-ff8u}}5IkiE1Rpr-R$IYi z;sd#{oX?X!F!OHDXLfwj_td%gSbhA^+6B`QhDPc2G*(#wA${^M=S}O@Cksx7g zp``RuZz-!Az36JGH!THgYN*MIomJU^55;D1K24snav4-H8PDs(+vPZnfzLH?Q^Sv; zmU;FO52-9uiCT5RrI=q?Jb{8aG=zxziNelIj_dIO9!fBUSqOST_T+G(bLaR;F3++1 zZZIvxPi4O;y^FMTD|dvSPO}d@IU-7VVX(YnFumq}cSc%i6lKfd^XhfkL>mf&PsT}SIa_lg&93x2K zgi^GY6b3SkADM%rV#dVMhsmkmD`fxcSpO?>j;JrAtr6sOMkv=d$a#w0hlRRSKl}4& zts{C*hhn_hIBr;dEU)R<2R?aWV2rJZa%o@ zEFmnDZ7V#=qqNmU>>Cn|U{9y78tku%*yD7uoInj*7<|9^zu2^SvsrNBprGd@Y@WHY zPNk0F2eF^Q$y;;!+U-uG`@>pPD)<(DD)9l`C{Tr$p+w1cN$KsR;^a)n1n@nLeC@s* z*rpsOfa~MoNN}Nx)uE?9xaQ?pcYqe>0R581+;$p;+rJYZvHrPyRJ;B22)jYZ+H~5U6zSAc*=9MYd=fXicNxXLZ7%5#qwbh(b>oi1KJR?6Mf;;l=)+ zGE#%}h7#Wi4Soi6+jlpPs;$_R#p*|+dACdViEW$$J>r}4i9T5`gl`~!IPAuv8sQuj z@#m6(vz8_7`vn61Qr5LBsw2OJU#bi&wX>GLgFN~SQFdytq(P9Hy^v93_OIVn2flN{s@lgHah=x5E&$4mt6}#5f8Onp%a=nYs!V}614g=?J zip&e@Wi;r`M{RTR$5@JN9K40(9(C2=7%!j>}&=fS&ecH zkIzCiXtt`0cxBG0$q|v{pvvhcYn<$t#pA+LP#|U$C(&+OJ{QH7<8f{$%BlqcX?m<& z8LJ(RkJef(7o+qr;1Q-7@Pq5vfq)%gFJqxWW~K7Av3lsda5d~!EJQ{>LuSRXejejH zkg}yLHeHMS&o1Wg2y=9LdJbOSQ|Q-twz|U8kO(Jip)E|1wILRsp_K9gD86V0g@Y$; zI)^6)A=cTJ(z=Cbkr?J@)F?8cb(uXWZPC9i%TtDF^AKAi-640XAMSgomdI`)@ zG}Jj0sn|K0EJo^Gm2IQ4Evig(eO$zI%e@71!5+^RbIEESK9Vv0u1smv3HyL@ozWvM zmJ#EbHK27L**|O+BFuvbM1{KAnoijyj2f-nxFHFpp!Mb22)BbpC*6?Y9LnHo&e+JS zK|f^&;!JbV3TqusU|jh&ya5y(j6z`EO!*Q{;iY0_y7h&ZOKQ`y<*Y01+_NSQ)djx9 zCw5dFtM>3N(ms)9v|W5N(oHZAQLT+CQELX%9Ew)o6>w&P{++Kc@wGO%`y47pGQ6Qm zq3CXChHQ4R!Yf(~2CCgK#1>K=E3NXe<@Oqm2QJ^eEU)XZe8GNE$vAH87}1qgummEJ zSfvf+IhpQ8>TD%=NS*Qh6O^5G=2)?kI>ROshGphF&B|dhC{|W!Zdhry?I6^cZr?t%#2y!Ols3d6=_uL%`)!A=q6xG$uJ4;8Lou z9JqWc1d}=Ok@u)rLK%TE@8%04am>4|(Z~cZ|HE&0tX-iKNX-6aNi4erHMeAl)*4i6 z?H@pNqqDf^4BNKiZ8uqQYK+QDBr>t~zk<$n_pR?-f@`e-%N&gJDnm&12_c;9i0~Q` zQft)cIORwM3gLPsYyihxL8e$#=oqD<3h{CKSndpDI))_sC#X5tg{KmV6hcxbxl@8TA=U99s*Xy-WPX4?77Th{jcVmqIT9Rf}t zrs4oBySunJ%r_Cm^#HuRbvyXb4shE%AgKwe-teHEZjA@D4<4%`9v$StTB80J7hC_% z*rP9#gVs=#1)sAWCLU@AtbMX(uhRY>D7n-i>t=$jPCL{JQw&Eb=rpM9QV`*a|*c4st zk(VzlUB0*h%NJJJ@`Yx=Qzh)IG5Ik$cF9~I^2YW4noF${{t>Qm#4Koucl-<+Qy&Ii z#?&l6tn9Xbl|j`a_F*`~M_-0xkh-vjWq!O_pGXEv;D+D}7NEtqWf3Vug0`^SA-IhO zC>dD|YJndMJGF!vK3n}5m)c}tHI_KWkFnopqpB9FL_=pKUj;=ja64J%lKRDfh+b~~ zK^zdHnHzoEn1u}y3j_7Avc3X*NJ}?Di+r14#g`}+SxSYzW8P*eL^Xgy&U=$V7+^G- z)OVS(9z-`@R`AiC@a!y$hC{oVbdIN=v>E4Eg$?;Q3cw-_W|s zupZ-&K@UHKK^f~3ZraBr3U9EMhXmNgB(=Hc4rgH^|_c)FBYLN%w_@eivwJUFpJb`HZ$= z_3>~g{ggt{ox z{s~mz%iM-T(~RMS!*bAtf%czELJo8E$Mc__a2O*q%^vV&Mnq#ja$C62)k%tNaamNY zuQW{C^IZ^RT(Q2;;Ie)+k%C{N2FK6EK+j@wm#N9chnSqsM)jO2ZLS0V)ZtlR|Om3cm6W7z_xzA4f*DuhWk zbQH64V?)mDsM(F-8V8*F!KEN54r$PJCc}9;tYrQgxFx)~KpnKc7Bpyceb2R)jh&vk zcwHZldHTrf1D{0mf+InSo}6v(KcTNnsV^txro9-ho~m{`tGw7G;BmPV-s!3~mpVbn z5S;Y*W0ecKGa;1;#%&K*iAC$m(-`zUy_N~57UErTiS%84>iUk&m`=su4yBMDU~w@D z2bCDpX_A9JX+V9JaOzTw(w0S#f^1VIT_c@#A3zbs~-MuD){=Xn}!=49omM&_Zuwu-$QHzr^&QxWW=@;CL|r1 zje9i205s&4hN|_10%jB;1MU05D*4){NEQo@RncI#o`nlPtjndHSI1zN!SRTziIo{~ zby!hY|Mhuq7c#Dnsa43%2P`!18wAY6SfK}+G7C*q$BgOf5<0EXAQDmfM3J=`S|W*L zrOLq39fM$c)eKo19ce0NUaB;nKRv2}QzSltCR}9m)UF}86_iWsY7S=@Eu1-XO#E@zUD@HCBZBxyeuEq2tsJX<@nlrb{;eNNM<`P3|F6@?! zm7q$BHD|g()STg@c~vK6+}LW(>0S!=9IlkMXu4+En@pMj-rq63v|J0AGy$NCcMsUI zPkFTP$j(k<1(#<{_2q5d<>Z=yQ@-PfP5GUHZNa8&u!{D8gRO#Ciqm+zAZF9(W;lQ* zvIPgtl}yfiOo7Z-iOmQTesva0?3iX^M=I{=aS6P=B>dR#?hX1cksf~FbTfb(Ur+tO zbS=s$XA#vIlp`GF-XQK(`$gytl4mP;!aoT80pnI0SG1N_2k~fQ`Cc}C*Xv>L|0cRR z4en`pkHoz5fkqj*W8mpY8Xf}1u5~hr`Y_qycFu(VbtfTMvd zMx1bAA)xIZoZ`!M7)9Xh-jnbgGRfK`Zj~zR1ZHvySYF=`{u4oZB=j4|8H-QgY>w5b zD`ebdE()~Ws{R^h{B#?aKKaHv*3hge`Hacvr{ZUK$KEiF{5#TF2@}Q~ zQo@+kB!bhSRh*r3Rwd%W8H6$2{RhSLbG5a8@LvRL+5HJ$VBQ0!?LV;I;%~}Mgc{6& zLf>t`Jgl8N6hrexKJ{JBDsAyYa>*c>(!_jD-%Ck!i^x+_LO6~Mn;(Uh{Q z2y;L25Iny^yMzl}GJPDSZ%`Oy7lLd;-fis5Ekz@;O{KiS+ zyauZh);j4sq!)M0VL`KqrG5*>H}>#YyBC+Bvev;y5rtvz(Sehxgbk{Tw{>@5CXX;h z3P}hXR74^Nv};{+LO!GvX66Nvh?$lzBoSujm64D{nBi3+IVgr@X??;CQXrvEjNx%> zifvh6Wtr zF=vcso5B6Zeu`HvrdHwk5ubV&%pW11maKg-+N*i`NW3-4l2NybH( zscV!K_J>5@te0~MDKlk-Zn^DA$Uml3eiPV={0U7>ukte3i)Y=33deB|+(%FCVU5P) zNhw-J@GQR31wWwXKWdWnZO zg)?Q7t-fk1y`PR1)I+_j{my2juCzfrg=Di628we4}566oa_;;k*6&{ zZwSWdM8Ug}8^et3tJW-%WGUp)Jte4rbG|jGKr9?8d6rzPg4_Fe@Q-ixkG2B`M5U2Z z_DSIth+_x#q=>j4VNd{_7uO<>8z^fqh}5|L@L4!)Mk&;BuaO~qkHBGXVa=+N8M0-r zgQpC;S-tDI+S-fS za{I9%DHq=`NZp2EY*VR@9o}1@I^Lo{I0kC3C5Qff@B^4!`teRU-c-aQnxklgL9|e< zWqjcatP7x+AI?%rwz!p*?^Uq)W2i5up`ovfMu%0S!lg`LmE8o3jXvGuPg#{&z0b1| z`lO8=Vr-0dz&kM~NB4skUV!$ua64$oFJskC4etlF#a0dt`N1KlK{kf>gDSfrw}Z0Y zZMmENYe?63d&&KvFh$-EI*O0c{Z)LNO&l5&TtVCj%0RFIrIxv46UuVfki2W`;BqLV z>^4y57rhe!1r9FgN9XR^3Sx$U!;90wR7_xh2Hk$Ve=V=4{6Flyd3+T`)&^X?WKVz) z$i4!BOAO)E_6@;z=6%0EzCXV3qxw9j&N+3ex~jUWx^DG2UgPS<^0L4}jj9_D zvTTc8D}uEmS1ZxAB3sM&unox;3*Nv`xr}d}h39}L2Y51ZISxz+)GxXq3?WcHj%tUz z-Ny2HSjxw#!|z&MV=4YvJU*Kozu*O!54&R3*FoW=FL>1GWW?w^b|RhIsq?teX%VCI z#EEq7pw5#<2Zt2}e0%CdI(Jg%&qfDFrv!Aio=E2|>O5_9aKK7HXWNN%?xxOPj1Ers z2qI*DQRjK1lOLnA zyMYcWnC@3uf3{HX1*2CGqxWJ1J*hwJ?|)C7my8Zh2;d35n5p5VZ(T7j_{CO9jHNvd zE$Q@W>wemL+1P5OZMD|6Fk}>4r7^Z%Y24Nsu=NMpdezu!t8KN@w(wIxvDIF#admi+ z1{_~kF4u&*3b`iMb-*>+g7!9^7WxzQ0MmNSq*Y06w+?HqECci;l2#|V#?^I}YkVE1 zLEtCUb;UKB#_Nrz!Ls=y(|E(A(T&>pWgIW~Wt`Y@>w3o6+IM1G57O3OjV-J=&=yuW zX{)!fg|*9oUvD;UYY6=M6K%a^Y++tVTYa@H%mXFw{pA{0HvrdYUiY8a=0mjkH)C@k zwcWZwyu{TF7F%xJ5V^+HVJaQ4`F7(rS$+@G=HHFYVbsQBo0qt{5n>Au))-p{PHgKD z+Iq*>8l`QG*0#nNTVrEvy?bI?Sm8-u@Sd?XPTLx~+SVjvYqDJ9>Q0qwd>!`VNIje)*TlNhI_^8P>0G(R$FPNlY6 zcLpzUb!Un#x9%*t#??*3HEQ!<<2Kn3Jwclv8=KQ(v<@}Y;OMu?&y4O&t$R+4?&po_vR+|slD^;{Mt7FhJ(riby4k#-|2r?n)ECE@ z5hj3(%71#ZOzrT@Gd4$c3(AagJt(LZG3HPoFAigxS>|0?6y(o8>4f9PB$E* z`fWp1zwG`(-G3V0`C9kF7~La{>eAQk)cu#y^38_)D}6 zO!xxIb^~R<*swMk%=(WJM@yG7#<=TCWA!p9{Zmw$F@EM)f7l1?pkI#hYbhjrU8=d^1sgzlsN~jR|bA9sWD!9CrACgzrfB zE<#ynmdWiR%nHeO!sO$P-^o~ild*a|$IV_$bO@81KxAJyM=AV94!W{u##Y_o&o27o zT!dd*t1-UDgghA=5W~AMtMGqIr@wFTJj*Fg$|)2N@w$4J zie0yo7pHC&FK!(sbDYgw!OLPwU^W8}F`FR>B|;HnHqPxhZ`X6PigQ3eDBd+FHK{8EESS48%O6UxeWOd_inDSeyy_+VQcu-Xn~aGrMJ- zVita1j*4YtW**uLdH%}sbzaNX`!QG#zLop0bUe@|A}w`mQ0gJ@=S9UH5vb*m2bN7a zuG5(p=OU)+ugmb4!Y%9z$#d>z7r<=G7Pl++?|XHBmo)Rc}fIy(uwzwv@3v z!=mXiQ(c-z_2{Q$CAv0f%RY$4^jbF5lXoQgsTb+b`$WqZ*n-WGDw))%L-KWo#r_ z_>CSum#JHDBMc#;eavh0`S?EO6Qt(%F?ToYV?H}R zw$VNY9lZ20pF*B}%;&sHAERS%7gzy9I^I-2BZcy8(05R$Vc$WXb2r1#_b?vYcf8KL zITuCsqJ0N>%pdb<-WP>>Bb&PKVE)W2BF#O%?|4Js>qt4B4qdH5t3)U0JI)uq3r+g^ zYoq8pqy*S^FlqE1Qc}UbqZH+VmwfE6nC3j`Fy`tc4UpO>br)x;PzY;&N_8>s_XOx( zBhqJJpNjMultqiuXL@&Av<>V2wGlmb838@LbuFqF z+h>^cc#%HCDDv{FeMV4^eMXF4gFa&z@`s0iq+F37YEPNhu+s?GXc(z`jk(cYgBB*E z*Pza1={3liXFSnw-_UiVe#h}l7QD@s^#ALA18YtV`wg;U`;9M<^fFdAzuzE;_8Y6E z-ypB-UH|(ICin06^9kvHLN02D|8a@;`-S3(|MSmDXm!`9)%(erPfwtS&=PS*0{s>? zMCs*XA;7pc!Vm(C>mm#xz*rMu2m!|02tx=k)_R=>@}9t0$^T|hD1q$( zO*$~x!VoO!crHFck#am21G2Q^xcVawJS1fc22vAI^c;vKLXMqevRvarsdB|8)g~m+ zYoc!Qd4vleM`+d@pWz|{vt|^MF@Kz#1M;TSDF`Fg_U^As-W)V^foJ zH;GUNRDCVo_fLi1e)@@Mx`!>5Ar8y@jd0>!ggZUTrgx37>0N*=<8hWpC!`Y@Z!pcnKteo891K}X0wd8tqO&s9KXFl0%&4~zt9bjvlxQDuZ=z0c=(n%UuI>M4) z-&{2V_xf$=2csiXtXVFSNm$C23!ifqpi6X!bO*vkn z^JQ#(`iaa*6!uB$v4;>~{5HZ60*v($h7e%i= zzkzGO#n^&BiEF^c*n+>1i{-|SEx7Q=jk3N^zW;n>3D4{TDJjj@HvAlRfd z8>L}#2)6thkVbG@|HrWfGcIEb5}`q`=xasC7RB@v(R7dF0#4hag9v&T;RePQ^sW&$ zy$i4#9b23Z8DxYPnXSs$Vv1(+5_%FrgJ))NY%vtkCm35W3oy+K#}*Sc zt~w_t$u(w7u>qZuKc--FjgBdpq>KQhXW*EE9Np~9n1PHbrlUYS9oMbZ#FK%;@ep#u zkHm{b>2vs5akdz7suOnWvYluTxj7F5AC4s`p`&E|!Hf(Z0@w6Zs05D?>Fx>|+6%g- z*WmQ%gZ0()brhB}yhawsgUt}B+%_=1kQ_~=w8l6s1 zmtzM%FTplF4M_&_!gnWHPO{*yG0}e?(0L!w=g8`l{~VAp1j~SHAk>|VF$C2na|}V1 z$ufqZ2p2`fJg#CHS1~G&>cAM{J^f7i-;5z-nIv`$A*|Rjgjq}pjv*q8Dg41|bPU0K zE@L0#k0A)6V+gjkV=c*p`)Kzzzhy6f_JVXgzUpp*fFbeAy~x(QTcYHxB%{0ZZX~p8 zdAX<ftglq7MjGwh8aKcmM&0i#La!lN*5{E$wMLE8atFL;RMEmgcSU5En zo)HUY#=vG5#$+wkI3vTxV26i>q@U>4zNIOIw& zs-0$p&-*Xs=ZSm<>N|TK@jSr1UYPO%lWBi-|Y?Qx~;f_=5k^(FG#EE0PK_EICIB zNJ+2+bWub&;T8X73Sp7|Fp|RmRMbr(g&)396ze035lgRnOgSGf z-Y_RT&J{nurdIf3vGm^*!*4|6Kd(Ux|4aG#BLBZAHcu3#|Hwzy(1+t)hR%DaJ)Ug% zl@05BeE3`u14kFn!~F=GHLU?;p-v|co3!gYjpt#tX~PPjQ9 z0pLi_FWzWQ*|!mu%c3gbjHs}oQO~iZTQZ|bCN9rOy{_xZb5g2CcnK__nlSNj3s}OB zGw}wjEpsHimV6qSa-lzAVbGu|$H!F~O)ByOFn;Sg6}M2oJCUr(NMfkT1`fpyFO{$%y6ith9sEwmiWJPZF+vZt|U%tU+Q~6|Q3CIK{JDsQC-BfUr}h?lvgm zvI&>Sv$hv>^jdRNXQ;2^3KNBp;;r_X5ksyvw9&4m-N+h`!mIaMrr zQC9oR&{b^vYu)x@-WFXx`VB>fy*TPr_*$}9VjrgygPA;w4p%T^>u=6m(1hat{8H)p+$Brp$rD_;=7jC1^8{2(UJ55?axmy zrp<~l+N^Q1L7Vk;V%n@PtJ~~8-5=AEBfg={QpAz4=D7FmEVtuy&}O4LQ;ySNn+@uq z&5HPG0m%k!HtG-CY}EL#wb_6U+H6p#kv1E7_b*dtCA0VF{sj0-e*$ebYFn@Tq0L4U z5LSbAu@kh}8q`Bs_ahP7ihBAhZI+1!_G;)Pg>m9GD>~98z6*>qZ=%?e@eVK%PjJ>gCW27eN1`aONNqVD%@K)>fb#?CK9>1c7Gk=;x4 zxNbJr`^m>hWVs)U%t!)!idkY+aOmu-@@~ z@B6x4GE)BlwG{>;L^xityjeox#ijvqyB{Lrg%Du;A;J&>j0YkN zA;9=!gdqeN4@MY5fbpjY!w@=aczyjrSBt<&b_V%zG_akV*9v-)+bLKS| zpV&(&+3p-QiuNEIs7_Cz3{jn)#>K^Pn0R*L z;9z_4pUGal6=CQY>xJSu#xd-lh0R(*6WkZ*%DJK+)0fCs$vr!hdvT9)oa=vo=KmsB z)2Ka;HKbi)hQpjlK5{vOq;EJFo|kLS3+LkQAu9>yKBDfp{8^nkM4yAYEzr`iAN?rv zm=#KdP6|%2kei>t-yF2EYgs~bNwARS>iqMbW8E8b*UX9d76bN8w2e3szt$O9IAhvG zq(W!nb8FVR!U!G(fD=<+r9brRD_lPb+RDV~5>(aOs}mRGBQt3|{{S(S6fOX0t1o=H z&VvznXhQLR#7@cTj{WTb?*LRLlqa(bY?Y0mz-Zw3N*chq9Px!S(i5g-V_c2)`x3f6}tRP)5la3OV4A+}wM@rY7<-yl6TYc0&AX0Jtd(^GQ<ltL2b?jMQ-^3m&@X;PHgGz1d z9iwCk^cK}I-gbnWo#k^yJF2DQ16t2fOWW!k)xtqEk|txBb_DMvW}j>b)3hM5%Sb-Y z>zRSp#R#-6;Un*nzD7SE`XfoaZ^mynuqzf}^Z~(f?R?08%KLA3a9Wh(cNDE5f-Obz zk~fZryj^aXiO8JuWfS z96D`rBeNEq1IoM?X4>~5?axk>b|TX5iCV5slsuLd!flMRJoZeSJx%j2!jLbIwG+=F zecT2rYC?G*9UDqQO9SliANrmiXPkyNdGPy2Tt9EbZ=4wgC*1P71#M6OawfJenFXa% zApDFEPLG|&LQ2qul!!vYXIXV2rQ&#!#7tdEIOHuU+!ksI0$DZqZUb6EJK)j`o}kBr z-a0&_-c92%#)!c(6;8#8ewNhyj-yIVT%pq7uC#SLP1QfdZz(u@H&3qN5X|b~ra8#2 z9)eijjK<2x<77KcB0h)Oa~9$qw+5%6;G1kBl@M+(S;TRb;Zocboc+WV{)7a5$X$9I z4(P~{yN^?>5}=OuYb5p2xwDx+YC2PJ-{Qh;LAs$ESX9Yza&!=~58i^=2*PD7n1~cA zD-X2dfhK7^@!N)Ige@mp(TPV`20gDq01rc1umLT0Bm<)9W`@d{hbG2ue0q~9+JUBV z=}pp`g5AIYCRl#PaR!=297}Iz4B+(IW;g`zI0IPf;R*N&F(u7I?|R*hQ;-wP&xPc- zJ!4U3Uo>9l&{Eu<9TC5v0{)}g=}IT{3{8`5q_l(EHnTj@+-aMKkyT^m1Aivz4$OJH zKA=86TuGF`nisj5Xi61bajKHwgee)xI*o+%kXoQ7itAt$99G$Hp1UpY$gHlYs-VdRER84Uz1JpaQ}uKxHDw`t;2U$WQ2A2n4jXo=!jx|`iP z$I|Gx%{L&Udpprq**a`Vq9(dmqYq^D`ee*+zK~2it>Ng}?!r$D$XN5W|5&#yH=h+` znjG6;EP&?#(!{utzXvK|8`oCQppmOoV*uZ2gs#6IqX%@Si*7?7S{Wb2cg%{#dtEFt zD~{%)oo^$W=WL_h1vOgAH%2E;-Qp;oUyboNA2{%oHOP@L)E^|&q({;B4|l2>{V=OM zjYYgbwu)J<(b7%OeM~2*Zt|t77!Cbll(S)mDtOEV%<29DT@22C%|Nq`CM10ePPfiT zl-OVz`1(P5qIN!*a`{C;eN=3=!Re7?k=uZA=_gZozFJKNntULJU0Qm|lnk^nTw{~v zQEY)eO=np3#4qeI&zG8_>yCWHyZS8@ok`u)AUWT!0uyRo63sMQqbWG`6MY_z@I2m~ z^eGv5Iw1DAOv?uff==QaXr>k73kQ;nPGkyB0>yU>YBDm9H{WtfMivgdOK*8x=5VZB zdRB~i)pMe*5`l{1X5fIh>P^w?X5_@?EH^zTJ+~$!PgkLg{Peu^{F;n{<2}g*e@aGS zJmnk7E7XF{#HSaeW3xxJ;H&UyMpkJK%c74SQ!g>y!$VY;d{J!C6sH%Z7uRHzXooUd zrI)0)s>x`5ynn^uPswN#Px(d)3u>|cwN7vIpZbTEQHrsBX&JoaSZ^bW`7qlmzSzB# zuHz@Mol!Sa6D7lGiIS7d&hbh3>S|=~?j#J@d1K6zISylnDH-vJQoqyVbz{RriVqe% zUn+7in2JkJNDLHK7dGN@d=|VE-;WJaCgeIz~m*l zC-#QIPdwu2C?0Vfci{n6ErSU>@Itxl062;mgXbRaPlC z?Q$?rDEt&Wn3HiZA_k9s_BqW{0k0R`N;5A$gE+;52l6f)Tbdkcj zQoLvxC)|swxY=A^!Q#DMlQ#yg#4}h{4Z!Ezq=_G&*&;LmIg`jrESfo?fq>eMquN65 z8+oo|I@kmh>WwryBw%Hw|A6uY;6A{ip-_;=2<8Ks+yT^oKxmjY5=jeH56`vS%+T;i zTAcx%%+QF&5nw^R2eE3v^UjrCku<=KI|I0Jl)z0{q~pFjD$uc2SbyR)UPMaqn!I zOyJ~Fl&7;G94SutPv5xabwuLy@*j>hcbZ$_lW?0b`fxFxjZ?1w8+d(2)%1XTfqb0> zgO6nVB)>1T+Lk9_fh61yB=*YUb#w>2JQ2&M634X=N7lRlrTsB=$s91Af%7fxP=Ba$ zT88s<%j2&U`{DRuSYw>eYZ$q0I=vo;`@4FMHH{k!A z9+$uyr1$-a(;Il=^c*?*R_gw7`D-fq8wBM@gNx+t=!w%xMLj%0Svqnif=+97C1%NS z5{8B#1q_>`1>2GdAIqdjnB77odEAdU)eHlVA0&OQz+xeRUkh!4uZ3b^PuU(OEc0{2 z7a#_cRheFvswMBR4+;-OI!#r07%q&%GeIl<1&TOLp7Z?TUqGhWGAk;83?CTyo?2G6 z%t4B=_-THSHX8{f+c}N$Q|!D(`KhWWR;e%$ng(Tl!wF-x>WxTHc~}jbZ)b(iL&R#t zT0vTtVj3o`HL?R50lG1b6s?gH&cVl(q!2h;x-1-04jsGvzjWcxJ zxD}P+*3#_6TT642ZVlZ3Q?X{pzXik5#!I~qu^`}mg&;fvSe1Im$VkkNGO|H?WdTMn zGR6lO)5w?;U@Riz+5qELGPVR5Pm!@Bz}QE|p#bAMGMeN>{U`+O^$IXXl5s(Rv4o6O z0mcS09t<$HlksAJ@pePTK{Ad7B%0)c(FQ@JfVz?~KERkp#w7v9Dl#?(7+c8L6=1wc z#^(XXzsbnXi>49+?ez&TMw2luz?e_QiU8vVG9C;twv+LGfN_|NV*y5!d@%3@Xg_m( z$QU1BOe14SfN?Du4+a?9$=DlUyidlF0K+W+BO5`a2t#D_2{1;JF(<%SM8?JdV+$GE z0*qJ4I2d3YAtSjkno2HcFBD+(Bx7iRF`0}R0ftA$;s9ec88-(Q_mil$DTCSz)VF^`P;0AoEF_XikT$#^rsI7G%z0Y+*u7{v%8g29r?}V9X}t;sB$bjC%r%$H;gwz<8UCg8{}7G7?)y zlg$S06$cnqWDE{4CXz8fz*tJgngC-H84m;)+sJr5!1$1iZvzaw4H%gSBKNi}8C3yB ze=;Tp7&FPZB*0ij#>N0+3mMx3jJ;&M8(@4zMsjI1*<8?GRe;f-jL`wcR5IoV7)!}m z7hv2$#sdMyHZt}F7zfEX9AIGniWY?+lKp%#ItLg7$(S5q%pzlPfU%m4jRD3MGIj(Q z`^b1dz&K1sZo6o*WuU!Y0meu&P6;q(kl_Uw%NsJ*k#Sc*;t?`-2N?UwI22%fM@D=o z>PIGMuT_B2nT+89MhzMB1B|6)TpM8AO2$J0#ox2N?e*BeN`;Y+KM?&j4dM8K(spbI4c`VBA2) z{Q<^SGIj+RZ<28^z&Jt%R_3FX4zw2vFnW?P*k>%|3@W;VgL_JfG0ystV{J!XTw*~f zK6EnX#VIk{MiR>OyOTtflA-sB@C-Vv4XB@FoW5WgraW~Y%No%kgyE4KsbPveiX*tR zx`W^)aZZU{l(hum(TL!yDNg*drVPPr4cS_Q$)X&;fi(augrvJgO)Cq^u@E^?rt0|i zm?kjWKSel6c4&eSn2>41V`v!fBRl+7y_`XB)ds5(wI;Q2BBqr*o!Zjv_H5e=@X)nja%h1UPQbVU8Ow3Hg7MBU2 z@YOGtW0EPt@*GpJ0X-8154pa;Hwc)8<9*Hf@H^S|79&5Ip&Eb`+gs&>RAT{4^Rfs~ zeKiy#?qD-J)`iZDK$aoi!9-onh!?YX%R3r(twXxlHAr4^%a@cecubGO_mk34rR2p5 zUSRS?qF!o>7{_nD@cJ2V+Si%{ByqfE)UTmY0IUQ_VOf%A9&K5(4BTTUd@5{2K6;mo zhIA@&>%TqYx|#kC1QrX?-t@XzbA@HI5SMoRWixyd4Iey1DX<**uFRsm_9`}w6dUi& zr|3jnc|`{u)E<^#AdP(G6#s%5uq<*RwVGgRdXa9dE$`Lpm`8tu7uz_~cW6tRINNl5 zXev^~A~@G{8g>(AFG7OK$c^?B$w=E3e=6|ah_8cX%}3v%uvKnQa`m0f3%mJ<|c)1hnkjmJ-Z^JtIFF!v(U%r446_Qf{wgD zr;mJ(9(jSzEihc2I*C3?guFnHE6>17etCNykIx^up);Vv{Q-Pq-Qi$^-5T&^BJsaF>vJb@&C*>q>7NmkyKdTFeZyZo0vwb73=S6A#ZYUMqqQ8zA$=`~o zl(#BM>-Smzg9b9pbi=2yfXj1|!l#4CaP0(q>3u557H;TF<~m7d`n`8kk}49g@e3uO z4&eUz$tm;vSg%U|9O)xn*+(jUn1drkW$Cyrz88K545MnGTgt*VRIVU~QJtl>#fQ#f za=LBUsy~VbRV!V^>9*8eIbJ!VzSg7$Ggk-!-239Xjt&Q61{W9&P&KtYKT%ZE?Bvkx`?y4rxhNg?9?!;jZi~a4NmRo4 z1=Hc&qWJIuWH{Q#{w5Ae_$$WicojKfwzz{FG3#}eYqmF5t~p+fTywn(2ttOgy@s-prYU<@{qM28viFB`z zCYpPvX(Gd$r->HcVokL4>NSz+ZO}xPw?z}#-Y!k#c>6VhEx?+{^NwjE-)r7cQZMkz zG*Rdc*F=$brY4HLg_iB8^En&|A=og}R;UbZH>daX3k z&Fij-?p}XQ^zcS&qNg`g6V=`Yn&{;%)kJS^jVAhdcWL4z?;%a}^|ooEpZB6B`g;d7 zF~B>jiGf~fXYpr{*H#mQyUW+c0#8|IV6XU$mni%iR(ZtE#Dovc?ZPLU9Z;K`-dfPNH$$L=~lfAb!ajN&J zCThIou9CzQuUHeOdA&4ox;If1Q$0@;XL##0ai;f}CeHHS)WkIJJ55aYnspO{GrTsM zINR%~iJ9I=O`PM+(8Mfno+i%q7HeX*w@MS|c{gifj<-bbvnCI=$#QEN*nz+FG zNfTi&ySt>0RUJ)S=#A8b=bfpE1>S5;Ec850T;wg*#Kqn^P5j2&q=`$s&6>E>+p390 z-d;`AdY@`yvG<)O>b%q*lKK*_P!pGVRYDXmMGxfl)$}sbqcx4EpYo<^`f}3qHNArL z3Qb=@dV{9xN#CLAm8752G&kmYuV@-$KIOfs>8nV;uW63jy~CPbP5PLouOXe;lb#n} zOS(+c7~v_er>57C9<1rLq{nM|9qCz`zMk|#(hFvwJ1$GkEKANR8|v=G?{BQoTs*Nt zXOn+C2M_m|h{11i{sUn>=Ei9?DyiW!1A7pD!q3Jl(($VKSWAf5iJ_xl@b^&(6-oL7 z&1vO%-anL@AGenR+OIiqZoxbRi#Vv~vlu=rjEV6~lCyOy(&FR<-sCJ95eFVRNR!8n z_@gwwFZNcW6cEAFSz;nWcqC(#hN;7UnPvFo$hR(28p-p=(L7^Hi#&f2%rjZhJQMv| zo>O(6DaJhW+Gw76Je!}jI|F&<>2@&@|MxtnHInCZ@EZ+tpLq;PVrUo`{(UAZnrEWM z^BkveyHpdMXNob;ydIzD0yBWXZRHR7{Vei+dvqvZCcj^lRnUOqU5Y`%vq(nwDd;J%{Wj94 z5H&0-{-7(;r!?1PMKP8Yug8}assVpQ>1QL@r|?&mF%kc__Qm{VG?Kpu{QR97lRu(g z%U=tfKZ-Gbyf&IY{;=E6MzH_jFTGlq*IUXuEtxy|vAJ*>s#!<7{Db)DOcGsidvI0RA}4$f9zPW=obW7M?b;tPIm-*3 z3mPrre~NzKc&!R-b)8L%*w1?&uHiYx)PE!EyN9`)%k>?F10vGx+MnPYrayMMU0#e8 zr(=Ma2x0Lhp+(9&FQQ0n`M5|OmOC+16uDE3oLx(%U5kY#gxF%^hBsoC6`l+C(lDW$ zhiiucc4ldE9aFKB>TJqmHDU43!1%5)PHN_&@4NUBI-}C;#k?GAiS6o^-O}j6(gm=D zM46oa;>x>S;xjw8&>ZYr*D-n#0?UO($8>^{3>F8&RDZW+EI%PMpX|tdvZK2CDLFa; zSx!)U-cY%%;Y57d9CKT-KH$*%(1p;divw8}uh%^LD9c2gWSmv$mh)fF z%rd*BXk!0jT>=E~GbOt=9)x_`+^!{0zHeUVg2MVRtz<>CbUeN=gAJLK)Hq-uya$!; z820~n*qq4~02(RF)iYRZ@g!V52zODhU-p2nS#sZ*O3|?{*>)}SBDumw{7jw6}6 znQS&?!lddLNSQpqGVvQ2*Gj%eIpc?(s1s=r3be1LfYJ7~4PvH!HA94HUpx?oa&|45 z;r%CQQ?!gWmCg&>R1*-=rkY0D6r<3lcnP#A>P6d>Byls!D<#sV$YGn3m|&Zd1SOf+ zHWlR`*QPFeAljz3KObpReo^(pk87JFIj#m_kuQeNuak0ds3E@v`B-LZ$ZttLRuUWX zGs(xIRzrRk`B>p<$j>Gp>sJl=Ipkwus3D(U_6%c&(vY7=K4vHl`T68ye$tT7FL3gK z5#%pN`S2^7c5RV_#S)fK5)XoglC31RwS;XXETts6;h-d*bxHDlUDQ4PuDGp8wv#X< zVS5S7BrKP(Lc$IR&EahRoq7=#DkZj~gjEuDlCZOc{Pv|?+ZCZXqRrQ3?z%~AcL{q) z*prgzv4cKSvRY#K;Yz!`1=HBtEk9O@u2`5Q7S;A8#tdVevg#6N@U3)r0bK+Y}2~3q(e#p_T<#!zI z+Os5_hA{k_SRdGCr<0EXO|axo0e^;Qoy}MbSQ^I8l-P3^ixEsPmZdsNV$YRuwuI+V z5`&4LCz*J|bH!^_G*EP+^C63ew6CwzIVL1yF`i3nJIo8(5}4wdZ z%(F{=7_tgjzKK_Nl~`bi_b^z)zF_C5cQs<{+LaQLmM`(1FXPigEhG77Y=5qy@R>cL+!PQGed#VMnx;&yDW$bzmJ*}Tb_E5&7@GC>v&;# zUJF9XGd(gOU=#|Imq1}sFH)E$iI@Qa6Xk$F5)TdtBtc0gc0ds2M+OA?{E=SjioZn1 z1F!8rZam-@;=ltT~d494{U@Q#ka1LuWjP#AwU#`>q;c1L*< zUYMzWTU}Hp7$7gj|A+DaCJ3a)DRoDJQeA;j4;0psR3a6Daj)f>ig(`X6#R#}yz68f z|3ggvcgEGhf7}tdD)ng@IlVbAkD(V6|7Z%al$ksdYBbgQh86L=DI3Zz6O1wHh zk@UjCjn(n$ZKN2lHYSo^kwE^Y@-LI()g%e;tq|Q-lo^sQbjhBwcy(qm>E4~0;>8jk z?MTkyuGF28a0Wc@A=WmEo%lk=J~^1-_3atyeciGpLZA2{^<$i49g?u#jXr* zNMKl0!q|VcqSn=gO#NR)41ex&_o#TaQ%c}7NZ9T{FOGH-NaT33!{IKK0XmE){b)JWW&5L2Ahj$yAVhS%mWe6Jr$?t;=2&StUDWgKH$k79V~*f)^tZT(oD zSBgyge&qi~bRSCP{W>i42nny3aK7ZLwjIm=d8rB0g|9lY45!L{A0pxN`K$@0Lw9mp zipor4D6JXY=2=Cn`V8?=66!e-+eb6CW}H$ZfE=|9==lV%n#dLOQVXJF#53;QDxzjM zCz@@$sDh{kz5q%zr7KaMs#nX9-n)H>+Ni5V@A1(ZT`O^$`VzHM>$%@X{k5f6eId~A zB<{}sj2moFrAQ7}8zhCt3mG>YUrl9tSN0$pt=-(%*!3^uPG?o}UEM^#8t=+%XBKd3$; z*;P{bQ4JDwm6XemYOuxpb;$FoZ^sU@k=E@f?UnG1`^m;i+|NUp_n*}yiOZ^HoNa03 z8Z=qrx@PORD+Jv#PNRB3zZaXfwMx*D936MHq;MFiUkID)#Ixn%XFL!+`&3Fk-nv2b z`esru8HjO-`P56cZqhb07}pGl<#Lu-X=dFbl3NE*vYBXe z=2R)cA=YAvs~W}hhFVK)*1=8Ej)qy6OWYMwf}^d~g2srI(bhF$r5d#dt;1R?={?Y# z=}oY9h~)1?vL1-(U5Y&9t9omv&HA|!^%}L*+AWgDL~^C|f}l)EZ>9B;orL@i9O+eC z)=KMDLEDi(%eujjCs1hrrU(944Ug8M!~-EaL>B&)|T z?+;lYYCUOjj}jsECs3EN)sqHYF75Uy>tl(Vf?791J!Sn<^o~he*~V@WdAPsCs~)1B z0kVLeZ$Cyh!4{js-3A^3uwhxvaRbs;1*da@PKt3XWs zK1tz#LH)#+cdP*tSJI!UzhjMd`9zoqnxK|?U49HE-q4-4uqdKvbkf_@g%!hT%P z=aODa`$<8!4HrykLYHX#Y*n1A>Oxe;1_7dX)W+pv~gTIQu<86_VZr`vXB(B!HEv z_D6y~5;WcZSP(vlhPWB_CxUoJ%?LHq{!Gw&f@azO5VTxUpJRV1i1WJ<>U{faL6ao) z3+!(Mp*16JzWq-@SdIen?0>mVNi$WSLbSmCUg92>6fUuU7W6Mcwe~N9Hb@FfY%7j6 zYoFL$YCD3CVTa=gb%h-#s0n5PkueunTGY=nxSOS=%Qw^QRv z)TizLu1b_M<}kvq#~nh|ey=bQO?_S441}i){s^3>$CIvTO1de+64f;~Gpj_6lyHWG zpJe9X6+}jEYlQFSWLPEYL6JNuo${laFuVxi$xBnKXve|{n6Mnrupp6PYvDXAoL0iQ zat!&^;~1{$%JBLD3@;li9O1vvne;c=3^PZD;MIdoJ0LtMo#A`%AwK@4}spyD
    i-iA6H`0#^{~FxKT?yIUM6>; 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 D-MU|B literal 162816 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
      2N)jP2h#*agkQYP< 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 From 9cf00147e8c45453eba0b0456ace554bf55e5515 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 02:58:09 +0200 Subject: [PATCH 134/425] Core.csproj Gtk : FontManager.Gtk.cs: AddFontFile (draft) --- src/Core/src/Fonts/FontManager.Gtk.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Core/src/Fonts/FontManager.Gtk.cs b/src/Core/src/Fonts/FontManager.Gtk.cs index 88c414aec93b..b2130c5f9eca 100644 --- a/src/Core/src/Fonts/FontManager.Gtk.cs +++ b/src/Core/src/Fonts/FontManager.Gtk.cs @@ -4,11 +4,12 @@ using Microsoft.Extensions.Logging; using Microsoft.Maui.Graphics; using Pango; +using static Microsoft.Maui.GtkInterop.DllImportFontConfig; namespace Microsoft.Maui { - // see: https://developer.gnome.org/pygtk/stable/class-pangofontdescription.html + // see: https://docs.gtk.org/Pango/struct.FontDescription.html /* public enum Pango.Weight { @@ -118,6 +119,19 @@ private FontDescription[] GetAvailableFontStyles() return styles.ToArray(); } + + internal static bool AddFontFile (string fontPath) + { + // Try to add font file to the current fontconfig configuration + var result = FcConfigAppFontAddFile (System.IntPtr.Zero, fontPath); + + if (result) + { + _systemContext = null; + } + + return result; + } } From aaf81e9445588571743d6bda3f6a30011fc5519f Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:07:26 +0200 Subject: [PATCH 135/425] Core.csproj Gtk : ajdust gtk-doc references (new since august 2021) --- src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs | 2 +- src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs | 2 +- src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs | 4 ++-- src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs | 2 +- src/Core/src/Handlers/Label/LabelHandler.Gtk.cs | 6 +++--- src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs | 2 +- src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs | 2 +- src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs | 2 +- src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs | 2 +- src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs | 2 +- src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs | 2 +- src/Core/src/Platform/Gtk/ImageView.cs | 4 ++-- src/Core/src/Platform/Gtk/MauiGtkApplication.cs | 4 ++-- src/Core/src/Platform/Gtk/ProgressBarExtensions.cs | 2 +- src/Core/src/Platform/Gtk/TextAlignmentExtensions.cs | 4 ++-- src/Core/src/Platform/Gtk/ThicknessExtensions.cs | 2 +- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 2 +- 17 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index c943ac622d84..29f32b2c6c12 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkButton.html + // https://docs.gtk.org/gtk3/class.Button.html public partial class ButtonHandler : ViewHandler { diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs index d3547c1e128f..85e34c4bf03e 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkCheckButton.html + // https://docs.gtk.org/gtk3/class.CheckButton.html public partial class CheckBoxHandler : ViewHandler { diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index 4a680d0479d2..47a0c1c5401e 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -5,8 +5,8 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkTextView.html - + // https://docs.gtk.org/gtk3/class.TextView.html + public partial class EditorHandler : ViewHandler { diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index 01e41564d5c1..a446b65a8020 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkEntry.html + //https://docs.gtk.org/gtk3/class.Entry.html public partial class EntryHandler : ViewHandler { diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index 6db17cba9b5c..af4808d31c2a 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -15,7 +15,7 @@ public partial class LabelHandler : ViewHandler public Microsoft.Maui.Graphics.Native.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Native.Gtk.TextLayout( Microsoft.Maui.Graphics.Native.Gtk.NativeGraphicsService.Instance.SharedContext) { HeightForWidth = true }; - // https://developer.gnome.org/gtk3/stable/GtkLabel.html + // https://docs.gtk.org/gtk3/class.Label.html protected override LabelView CreateNativeView() { return new() @@ -183,9 +183,9 @@ public static void MapLineHeight(LabelHandler handler, ILabel label) // try to set it over css: not working: exception thrown: 'line-height' is not a valid property name // nativeView.SetStyleValue($"{(int)label.LineHeight}","line-height"); - // try to set it over https://developer.gnome.org/pango/1.46/pango-Layout-Objects.html#pango-layout-set-line-spacing + // try to set it over https://docs.gtk.org/Pango/method.Layout.set_line_spacing.html - // no effect: https://developer.gnome.org/gtk3/stable/GtkLabel.html#gtk-label-get-layout + // no effect: https://docs.gtk.org/gtk3/method.Label.get_layout.html // The label is free to recreate its layout at any time, so it should be considered read-only // nativeView.Layout.LineSpacing = (float)label.LineHeight; diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs index aaa867acf8ec..e23b1f102f81 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkComboBox.html + // https://docs.gtk.org/gtk3/class.ComboBox.html public partial class PickerHandler : ViewHandler { diff --git a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs index 8d6f11382336..1562e70bf130 100644 --- a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs @@ -2,7 +2,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkProgressBar.html + // https://docs.gtk.org/gtk3/class.ProgressBar.html public partial class ProgressBarHandler : ViewHandler { protected override ProgressBar CreateNativeView() diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 4337d2b6f0b0..01bb316729e2 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkScrolledWindow.html + // https://docs.gtk.org/gtk3/class.ScrolledWindow.html public partial class ScrollViewHandler : ViewHandler { diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs index 7fe20490d1de..25e46f344701 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkScale.html + // https://docs.gtk.org/gtk3/class.Scale.html public partial class SliderHandler : ViewHandler { diff --git a/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs b/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs index e8da92e597cc..88f562a70b1f 100644 --- a/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs +++ b/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkSpinButton.html + // https://docs.gtk.org/gtk3/class.SpinButton.html public partial class StepperHandler : ViewHandler { protected override SpinButton CreateNativeView() diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs index d1c1caeae6d2..ae57214b768d 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs @@ -3,7 +3,7 @@ namespace Microsoft.Maui.Handlers { - // https://developer.gnome.org/gtk3/stable/GtkSwitch.html + // https://docs.gtk.org/gtk3/class.Switch.html public partial class SwitchHandler : ViewHandler { diff --git a/src/Core/src/Platform/Gtk/ImageView.cs b/src/Core/src/Platform/Gtk/ImageView.cs index 280d7705156f..ba899f8d694f 100644 --- a/src/Core/src/Platform/Gtk/ImageView.cs +++ b/src/Core/src/Platform/Gtk/ImageView.cs @@ -1,10 +1,10 @@ namespace Microsoft.Maui.Native { - // https://developer.gnome.org/gtk3/stable/GtkImage.html + // https://docs.gtk.org/gtk3/class.Imgage.html // GtkImage has nothing like Aspect; maybe an ownerdrawn class is needed - // could be: https://developer.gnome.org/gtk3/stable/GtkDrawingArea.html + // could be: https://docs.gtk.org/gtk3/class.DrawingArea.html // or Microsoft.Maui.Graphics.Native.Gtk.GtkGraphicsView public class ImageView : Gtk.Image diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index a5d14086f4ea..c5a940680ab2 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -17,7 +17,7 @@ public class MauiGtkApplication : MauiGtkApplication protected override IStartup OnCreateStartup() => new TStartup(); - // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid + // https://docs.gtk.org/gio/type_func.Application.id_is_valid.html // TODO: find a better algo for id public override string ApplicationId => $"{typeof(TStartup).Namespace}.{typeof(TStartup).Name}.{Name}".PadRight(255, ' ').Substring(0, 255).Trim(); @@ -37,7 +37,7 @@ public string? Name set { _name = value; } } - // https://developer.gnome.org/gtk3/stable/GtkApplication.html + // https://docs.gtk.org/gtk3/class.Application.html public static Gtk.Application CurrentGtkApplication { get; internal set; } = null!; public static MauiGtkApplication Current { get; internal set; } = null!; diff --git a/src/Core/src/Platform/Gtk/ProgressBarExtensions.cs b/src/Core/src/Platform/Gtk/ProgressBarExtensions.cs index 5879b012c8a2..d61f882fcff2 100644 --- a/src/Core/src/Platform/Gtk/ProgressBarExtensions.cs +++ b/src/Core/src/Platform/Gtk/ProgressBarExtensions.cs @@ -6,7 +6,7 @@ public static class ProgressBarExtensions { public static void UpdateProgress(this ProgressBar nativeProgressBar, IProgress progress) { - // https://developer.gnome.org/gtk3/stable/GtkProgressBar.html#gtk-progress-bar-set-fraction + // https://docs.gtk.org/gtk3/method.ProgressBar.set_fraction.html nativeProgressBar.Fraction = progress.Progress; nativeProgressBar.TooltipText = $"{progress.Progress * 100}%"; } diff --git a/src/Core/src/Platform/Gtk/TextAlignmentExtensions.cs b/src/Core/src/Platform/Gtk/TextAlignmentExtensions.cs index 92784725075e..38150a580003 100644 --- a/src/Core/src/Platform/Gtk/TextAlignmentExtensions.cs +++ b/src/Core/src/Platform/Gtk/TextAlignmentExtensions.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui public static class TextAlignmentExtensions { - // https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--halign + // https://docs.gtk.org/gtk3/property.Widget.halign // How to distribute horizontal space if widget gets extra space, see GtkAlign internal static Align ToGtkAlign(this TextAlignment alignment) @@ -35,7 +35,7 @@ public static Justification ToJustification(this TextAlignment alignment) } /// - /// https://developer.gnome.org/gtk3/stable/GtkLabel.html#gtk-label-set-xalign + /// https://docs.gtk.org/gtk3/method.Label.set_xalign.html /// The xalign property determines the horizontal aligment of the label text inside the labels size allocation. /// Compare this to “halign”, which determines how the labels size allocation is positioned in the space available for the label. /// diff --git a/src/Core/src/Platform/Gtk/ThicknessExtensions.cs b/src/Core/src/Platform/Gtk/ThicknessExtensions.cs index fcac226dc19c..538e62c7481b 100644 --- a/src/Core/src/Platform/Gtk/ThicknessExtensions.cs +++ b/src/Core/src/Platform/Gtk/ThicknessExtensions.cs @@ -17,7 +17,7 @@ public static Border ToNative(this Thickness it) if (it == default) return it; - // https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--margin-start + // https://docs.gtk.org/gtk3/property.Widget.margin-start.html it.MarginStart = (int)padding.Left; it.MarginTop = (int)padding.Top; it.MarginEnd = (int)padding.Right; diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index 9064232335cb..0791f537038e 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -63,7 +63,7 @@ public static SizeRequest GetDesiredSize( if (!widthConstrained && !heightConstrained) { - // https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-get-preferred-size + // https://docs.gtk.org/gtk3/method.Widget.get_preferred_size.html nativeView.GetPreferredSize(out var minimumSize, out var req); return new SizeRequest(req.ToSize(), minimumSize.ToSize()); From 5bafc865b35d54c8bd4ea2957632c80b48ed0e92 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:07:57 +0200 Subject: [PATCH 136/425] Core.csproj Gtk : ButtonHandler.Gtk.cs: add MapImageSource (MissingMapper) --- src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index 29f32b2c6c12..23ce02e31d11 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -47,6 +47,9 @@ public static void MapCharacterSpacing(ButtonHandler handler, IButton button) } } + [MissingMapper] + public static void MapImageSource(ButtonHandler handler, IButton image) { } + public static void MapFont(ButtonHandler handler, IButton button) { handler.MapFont(button); From fbe7f4c5a065846fef2f692651c83a5e9a45f61a Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:10:47 +0200 Subject: [PATCH 137/425] Core.csproj Gtk : EditorHandler.Gtk.cs: set minimal Size & format code & adjust gtk-docs-reference --- .../src/Handlers/Editor/EditorHandler.Gtk.cs | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index 47a0c1c5401e..2ef8fb65aa13 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -25,29 +25,37 @@ protected override void DisconnectHandler(TextView nativeView) nativeView.Buffer.Changed -= OnNativeTextChanged; } - public override Size GetDesiredSize(double widthConstraint, double heightConstraint) { - var res = base.GetDesiredSize(widthConstraint, heightConstraint); + if (NativeView is not { } nativeView) + return Size.Zero; + + var res = base.GetDesiredSize(widthConstraint, heightConstraint); + + if (res.Height != 0 && res.Width != 0) + return res; + + var minSize = (int)Math.Round(nativeView.GetFontHeigth()); - if (res.Height == 0 && NativeView is { } nativeView) - { - res.Height = (int)Math.Round(nativeView.GetFontHeigth()); - } + if (res.Height == 0) + res.Height = minSize; + + if (res.Width == 0) + res.Width = minSize; return res; } protected void OnNativeTextChanged(object? sender, EventArgs e) { - if (NativeView is not { } nativeView || VirtualView is not { } virtualView) + if (NativeView is not { } nativeView || VirtualView is not { } virtualView) return; - + if (sender != nativeView.Buffer) return; var text = nativeView.Buffer.Text; - if (virtualView.Text != text) + if (virtualView.Text != text) virtualView.Text = text; } @@ -81,7 +89,7 @@ public static void MapPlaceholderColor(EditorHandler handler, IEditor editor) { [MissingMapper] public static void MapCharacterSpacing(EditorHandler handler, IEditor editor) { - // see: https://developer.gnome.org/gtk3/stable/GtkTextTag.html#GtkTextTag--letter-spacing + // see: https://docs.gtk.org/gtk3/property.TextTag.letter-spacing.html } [MissingMapper] @@ -92,6 +100,7 @@ public static void MapIsTextPredictionEnabled(EditorHandler handler, IEditor edi [MissingMapper] public static void MapKeyboard(EditorHandler handler, IEditor editor) { } + } } \ No newline at end of file From d1f3eae46f26a402f4c6b3b2a5a7e42d475532a5 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:12:02 +0200 Subject: [PATCH 138/425] Core.csproj Gtk : EntryHandler.Gtk.cs: adjust gtk-docs-reference in comment --- src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index a446b65a8020..09cce29e5301 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -181,7 +181,7 @@ public static void MapKeyboard(EntryHandler handler, IEntry entry) if (handler.NativeView is not { } nativeView) return; - // https://developer.gnome.org/gtk3/stable/GtkEntry.html#gtk-entry-set-input-purpose + // https://docs.gtk.org/gtk3/method.Entry.set_input_purpose.html // seems not to work switch (entry.Keyboard) { From 2b192d63a6eecab43808afd49d7d15a8edaad7fa Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:12:39 +0200 Subject: [PATCH 139/425] Core.csproj Gtk : PageHandler.Gtk.cs: track api changes --- src/Core/src/Handlers/Page/PageHandler.Gtk.cs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs index 247ddd4d5474..f73905e2a6b1 100644 --- a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers { - public partial class PageHandler : ViewHandler + public partial class PageHandler : ViewHandler { public override void SetVirtualView(IView view) @@ -27,10 +27,10 @@ void UpdateContent() _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); - if (VirtualView.Content != null) - NativeView.Content = VirtualView.Content.ToNative(MauiContext); + if (VirtualView is IContentView { Content: { } view }) + NativeView.Content = view.ToNative(MauiContext); } - + protected override PageView CreateNativeView() { if (VirtualView == null) @@ -47,16 +47,14 @@ protected override PageView CreateNativeView() return pw; } - public static void MapContent(PageHandler handler, IPage page) + public static void MapContent(PageHandler handler, IView page) { handler.UpdateContent(); } - + [MissingMapper] - public static void MapTitle(PageHandler handler, IPage page) + public static void MapTitle(PageHandler handler, IView page) { } - - } From 020e83220fd4288230463d932f7272a1af40208f Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:14:52 +0200 Subject: [PATCH 140/425] Core.csproj Gtk : ScrollViewHandler.Gtk.cs: MapOrientation enable PropagateNatural* & adjust SetPolicy --- .../ScrollView/ScrollViewHandler.Gtk.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 01bb316729e2..abe641cbe0d9 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -234,33 +234,33 @@ public static void MapOrientation(ScrollViewHandler handler, IScrollView view) switch (view.Orientation) { case ScrollOrientation.Both: - // nativeView.PropagateNaturalWidth = true; - // nativeView.PropagateNaturalHeight = true; - nativeView.SetPolicy(PolicyType.Always, PolicyType.Always); + nativeView.PropagateNaturalWidth = true; + nativeView.PropagateNaturalHeight = true; + nativeView.SetPolicy(PolicyType.Automatic, PolicyType.Automatic); nativeView.HScrollbar.Visible = true; nativeView.VScrollbar.Visible = true; break; case ScrollOrientation.Horizontal: - // nativeView.PropagateNaturalWidth = true; - // nativeView.PropagateNaturalHeight = false; - nativeView.SetPolicy(PolicyType.Always, PolicyType.Never); + nativeView.PropagateNaturalWidth = true; + nativeView.PropagateNaturalHeight = false; + nativeView.SetPolicy(PolicyType.Automatic, PolicyType.Never); nativeView.HScrollbar.Visible = true; nativeView.VScrollbar.Visible = false; break; case ScrollOrientation.Vertical: - // nativeView.PropagateNaturalHeight = true; - // nativeView.PropagateNaturalWidth = false; - nativeView.SetPolicy(PolicyType.Never, PolicyType.Always); + nativeView.PropagateNaturalHeight = true; + nativeView.PropagateNaturalWidth = false; + nativeView.SetPolicy(PolicyType.Never, PolicyType.Automatic); nativeView.HScrollbar.Visible = false; nativeView.VScrollbar.Visible = true; break; case ScrollOrientation.Neither: - // nativeView.PropagateNaturalWidth = false; - // nativeView.PropagateNaturalHeight = false; + nativeView.PropagateNaturalWidth = false; + nativeView.PropagateNaturalHeight = false; nativeView.SetPolicy(PolicyType.Never, PolicyType.Never); nativeView.HScrollbar.Visible = false; nativeView.VScrollbar.Visible = false; From 003bde850257b1fc411b5472a6f83005f5cd492e Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:15:43 +0200 Subject: [PATCH 141/425] Core.csproj Gtk : LabelExtensions.cs: handle TextType (stub) & Controls.Core.cproj: add Label.Gtk.cs --- .../src/Core/HandlerImpl/Label/Label.Gtk.cs | 21 ++++++++++++++++++ src/Core/src/Platform/Gtk/LabelExtensions.cs | 22 +++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs diff --git a/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs new file mode 100644 index 000000000000..3a16f220e02c --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs @@ -0,0 +1,21 @@ +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Controls +{ + + public partial class Label + { + + public static void MapTextType(LabelHandler handler, Label label) + { + handler.NativeView?.UpdateText(label, label.TextType); + } + + public static void MapText(LabelHandler handler, Label label) + { + handler.NativeView?.UpdateText(label, label.TextType); + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/LabelExtensions.cs b/src/Core/src/Platform/Gtk/LabelExtensions.cs index eb833df52862..8e2ec9a77d1c 100644 --- a/src/Core/src/Platform/Gtk/LabelExtensions.cs +++ b/src/Core/src/Platform/Gtk/LabelExtensions.cs @@ -9,9 +9,27 @@ namespace Microsoft.Maui public static class LabelExtensions { - public static void UpdateText(this Label nativeLabel, ILabel label) + public static void UpdateText(this Label nativeLabel, ILabel label, TextType type = TextType.Text) { - nativeLabel.Text = label.Text; + // https://docs.gtk.org/gtk3/method.Label.set_use_markup.html + + if (type == TextType.Html) + { + nativeLabel.Markup = HtmlToPangoMarkup(label.Text); + } + else + { + nativeLabel.UseMarkup = false; + nativeLabel.Text = label.Text; + } + + } + + // https://docs.gtk.org/Pango/pango_markup.html + [MissingMapper] + public static string HtmlToPangoMarkup(string text) + { + return text; } public static void UpdateMaxLines(this Label nativeLabel, ILabel label) From 14aed750ae5f26908ff358ff666b423ce183ed31 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:16:19 +0200 Subject: [PATCH 142/425] Core.csproj Gtk : SemanticExtensions.cs: track api changes --- src/Core/src/Platform/Gtk/SemanticExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Gtk/SemanticExtensions.cs b/src/Core/src/Platform/Gtk/SemanticExtensions.cs index 938eedd9309b..a68fc24b65e6 100644 --- a/src/Core/src/Platform/Gtk/SemanticExtensions.cs +++ b/src/Core/src/Platform/Gtk/SemanticExtensions.cs @@ -6,6 +6,6 @@ public static partial class SemanticExtensions /// Force semantic screen reader focus to specified element /// /// - public static void SetSemanticFocus(this IFrameworkElement element) { } + public static void SetSemanticFocus(this IView element) { } } } From 1695a81cc2af8d902d794d626f92f8379683a2fd Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:17:19 +0200 Subject: [PATCH 143/425] Core.csproj Gtk : add stubs for UpdateMinimumHeight,UpdateMinimumWidth,UpdateMaximumHeight,UpdateMaximumWidth,UpdateFlowDirection --- src/Core/src/Platform/Gtk/ViewExtensions.cs | 5 +++++ src/Core/src/Platform/Gtk/WidgetExtensions.cs | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index d29fc5742e2b..923005286acf 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -135,9 +135,14 @@ public static void UpdateClip(this WrapperView nativeView, IView view) nativeView.Clip = view.Clip; } + [MissingMapper] public static void UpdateClip(this Widget nativeView, IView view) { } + [MissingMapper] + public static void UpdateFlowDirection(this Widget nativeView, IView view) + { } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index 0791f537038e..4416ea1cd1e4 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -218,6 +218,22 @@ public static void ReplaceChild(this Gtk.Container cont, Gtk.Widget oldWidget, G } } + [MissingMapper] + public static void UpdateMinimumHeight(this Widget nativeView, IView view) + { } + + [MissingMapper] + public static void UpdateMinimumWidth(this Widget nativeView, IView view) + { } + + [MissingMapper] + public static void UpdateMaximumHeight(this Widget nativeView, IView view) + { } + + [MissingMapper] + public static void UpdateMaximumWidth(this Widget nativeView, IView view) + { } + } } \ No newline at end of file From 0dcc5d46b610266fff89c0367195cc447100040e Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:17:38 +0200 Subject: [PATCH 144/425] Core.csproj Gtk : implement RefreshViewHandler.Gtk (stub) --- .../RefreshView/RefreshViewHandler.Gtk.cs | 35 +++++++++++++++++++ src/Core/src/Platform/Gtk/RefreshView.cs | 11 ++++++ 2 files changed, 46 insertions(+) create mode 100644 src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/RefreshView.cs diff --git a/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs new file mode 100644 index 000000000000..437df7b0286d --- /dev/null +++ b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Native; + +namespace Microsoft.Maui.Handlers +{ + public partial class RefreshViewHandler : ViewHandler + { + protected override RefreshView CreateNativeView() + { + return new RefreshView(); + } + + [MissingMapper] + public static void MapIsRefreshing(RefreshViewHandler handler, IRefreshView refreshView) + { + } + + [MissingMapper] + public static void MapContent(RefreshViewHandler handler, IRefreshView refreshView) + { + } + + [MissingMapper] + public static void MapRefreshColor(RefreshViewHandler handler, IRefreshView refreshView) + { + } + + [MissingMapper] + public static void MapRefreshViewBackground(RefreshViewHandler handler, IView view) + { + } + } +} diff --git a/src/Core/src/Platform/Gtk/RefreshView.cs b/src/Core/src/Platform/Gtk/RefreshView.cs new file mode 100644 index 000000000000..328ceb1b601a --- /dev/null +++ b/src/Core/src/Platform/Gtk/RefreshView.cs @@ -0,0 +1,11 @@ +namespace Microsoft.Maui.Native +{ + + public class RefreshView : Gtk.Box + { + + public RefreshView() : base(Gtk.Orientation.Horizontal, 0) { } + + } + +} \ No newline at end of file From edde2271cdb7037ad0b937a61277d29e4ff386e9 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:19:50 +0200 Subject: [PATCH 145/425] Core.csproj Gtk : MauiGtkApplication.cs: track api changes --- .../src/Platform/Gtk/MauiGtkApplication.cs | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index c5a940680ab2..ff931d2d264a 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -11,26 +11,18 @@ namespace Microsoft.Maui { - public class MauiGtkApplication : MauiGtkApplication - where TStartup : IStartup, new() + public abstract class MauiGtkApplication { - protected override IStartup OnCreateStartup() => new TStartup(); + protected abstract MauiApp CreateMauiApp(); // https://docs.gtk.org/gio/type_func.Application.id_is_valid.html // TODO: find a better algo for id - public override string ApplicationId => $"{typeof(TStartup).Namespace}.{typeof(TStartup).Name}.{Name}".PadRight(255, ' ').Substring(0, 255).Trim(); - - } - - public abstract class MauiGtkApplication - { - - public abstract string ApplicationId { get; } + public virtual string ApplicationId => $"{typeof(MauiGtkApplication).Namespace}.{typeof(MauiGtkApplication).Name}.{Name}".PadRight(255, ' ').Substring(0, 255).Trim(); string? _name; - // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid + // https://docs.gtk.org/gio/type_func.Application.id_is_valid.html public string? Name { get => _name ??= $"A{Guid.NewGuid()}"; @@ -50,7 +42,7 @@ public string? Name public void Run() { - Launch(new EventArgs()); + Launch(EventArgs.Empty); } protected void RegisterLifecycleEvents(Gtk.Application app) @@ -106,19 +98,11 @@ protected void OnWindowAdded(object o, WindowAddedArgs args) // future use: to have notifications at cross platform Window level } - protected abstract IStartup OnCreateStartup(); - protected void StartupLauch(object sender, EventArgs args) { - var startup = OnCreateStartup(); - - var host = startup - .CreateAppHostBuilder() - .ConfigureServices(ConfigureNativeServices) - .ConfigureUsing(startup) - .Build(); + var startup = CreateMauiApp(); - Services = host.Services; + Services = startup.Services; Services.InvokeLifecycleEvents(del => del(this, args)); var mauiContext = new MauiContext(Services); @@ -148,7 +132,7 @@ void CreateMainWindow(IWindow window, MauiContext context) context.Window = MainWindow; MainWindow.SetWindow(window, context); - Services.InvokeLifecycleEvents(del => del(MainWindow, new EventArgs())); + Services.InvokeLifecycleEvents(del => del(MainWindow, EventArgs.Empty)); } From e435af104dc9cc7a07bb9be079637b7c76d2762b Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:20:01 +0200 Subject: [PATCH 146/425] Core.csproj Gtk : MauiWindow.cs: remove startup-code (it's a complete senseless class now) --- src/Core/src/Platform/Gtk/MauiWindow.cs | 37 ++++--------------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/src/Core/src/Platform/Gtk/MauiWindow.cs b/src/Core/src/Platform/Gtk/MauiWindow.cs index 410375d36402..a2588f1dd09b 100644 --- a/src/Core/src/Platform/Gtk/MauiWindow.cs +++ b/src/Core/src/Platform/Gtk/MauiWindow.cs @@ -7,41 +7,14 @@ namespace Microsoft.Maui.Native { - + [Obsolete("use MauiGtkApplication")] - public class MauiWindow : Window - where TStartup : IStartup, new() + public class MauiWindow : Window { - public MauiWindow() : base(WindowType.Toplevel) - { - var startup = new TStartup(); - - var host = startup - .CreateAppHostBuilder() - .ConfigureServices(ConfigureNativeServices) - .ConfigureUsing(startup) - .Build(); - - Services = host.Services; - Application = Services.GetRequiredService(); - - var mauiContext = new MauiContext(Services); - var activationState = new ActivationState(mauiContext); - var window = Application.CreateWindow(activationState); - var content = window.Content; - - Add(content.ToNative(mauiContext)); - Child.ShowAll(); - } - - public new IApplication Application { get; protected set; } = null!; - - public IServiceProvider Services { get; protected set; } = null!; + public MauiWindow() : base(WindowType.Toplevel) + { } - // Configure native services like HandlersContext, ImageSourceHandlers etc.. - void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollection services) - { - } } + } \ No newline at end of file From f435e41ae904d84d1c43f5fadb221d6e92dfcaf7 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:21:20 +0200 Subject: [PATCH 147/425] Core.csproj Gtk & Compatibility.Core.csproj Gtk: track api changes: IAppHostBuilder => MauiAppBuilder --- src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs | 2 +- .../src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs index 9d46d2856c29..321aeff63fde 100644 --- a/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs @@ -11,7 +11,7 @@ namespace Microsoft.Maui.Controls.Hosting public static partial class AppHostBuilderExtensions { - internal static IAppHostBuilder ConfigureCompatibilityLifecycleEvents(this IAppHostBuilder builder) => + internal static MauiAppBuilder ConfigureCompatibilityLifecycleEvents(this MauiAppBuilder builder) => builder.ConfigureLifecycleEvents(events => events.AddGtk(OnConfigureLifeCycle)); static void OnConfigureLifeCycle(IGtkLifecycleBuilder gtk) diff --git a/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs index 483bc88c21b3..87476ddda61e 100644 --- a/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs +++ b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui.LifecycleEvents public static partial class AppHostBuilderExtensions { - internal static IAppHostBuilder ConfigureCrossPlatformLifecycleEvents(this IAppHostBuilder builder) => + internal static MauiAppBuilder ConfigureCrossPlatformLifecycleEvents(this MauiAppBuilder builder) => builder.ConfigureLifecycleEvents(events => events.AddGtk(OnConfigureLifeCycle)); [MissingMapper("Stopped(), Resumed()")] From 2ad2c50536b7752072ff49079a02e2cc8cb7a249 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:22:05 +0200 Subject: [PATCH 148/425] Compatibility.Core.csproj Gtk: GtkPlatformServices.cs: remove GetMD5Hash --- src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs index e8c1636a07ff..e69de7e730b6 100644 --- a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs +++ b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs @@ -30,8 +30,6 @@ public string GetHash(string input) return Internals.Crc64.GetHash(input); } - string IPlatformServices.GetMD5Hash(string input) => GetHash(input); - public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSizes) { switch (size) From d838bad177a25aa23ede6c0a4e5ed5810701a984 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:22:40 +0200 Subject: [PATCH 149/425] Controls.Core.csproj Gtk: add ButtonExtensions.UpdateContentLayout (MissingMapper) --- .../Platform/Gtk/Extensions/ButtonExtensions.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs diff --git a/src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs b/src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs new file mode 100644 index 000000000000..c5f2fe1c39b3 --- /dev/null +++ b/src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs @@ -0,0 +1,14 @@ +using System; +using Microsoft.Maui.Handlers; +using static Microsoft.Maui.Controls.Button; + +namespace Microsoft.Maui.Controls.Platform +{ + public static class ButtonExtensions + { + [MissingMapper] + public static void UpdateContentLayout(this object nativeButton, Button button) + { + } + } +} \ No newline at end of file From 8b607370901d511d2796c88ced26baabda6f7899 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:26:13 +0200 Subject: [PATCH 150/425] Core.csproj Gtk : LayoutHandler.Gtk.cs: implement Insert, Update --- .../src/Handlers/Layout/LayoutHandler.Gtk.cs | 48 ++++++++++++++++ src/Core/src/Platform/Gtk/LayoutView.cs | 57 ++++++++++++------- 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 421fdceb6b80..4e8a9e51c3e1 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -47,6 +47,12 @@ public override void SetVirtualView(IView view) NativeView.QueueResize(); } + protected override void DisconnectHandler(LayoutView nativeView) + { + base.DisconnectHandler(nativeView); + NativeView.ClearChildren(); + } + public void Add(IView child) { _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); @@ -71,11 +77,53 @@ public void Remove(IView child) NativeView.QueueAllocate(); } + public void Clear() + { + NativeView?.ClearChildren(); + } + + public void Insert(int index, IView child) + { + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + if (child.ToNative(MauiContext) is { } nativeChild) + NativeView.Insert(child, nativeChild, index); + + NativeView.QueueAllocate(); + + } + + public void Update(int index, IView child) + { + _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + + if (child.ToNative(MauiContext) is { } nativeChild) + NativeView.Update(child, nativeChild, index); + + NativeView.QueueAllocate(); + + } + +#if DEBUG public override void NativeArrange(Rectangle rect) { NativeView?.Arrange(rect); } + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + if (NativeView is not { } nativeView) + return Size.Zero; + + return nativeView.GetDesiredSize(widthConstraint, heightConstraint); + } + +#endif + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index b051bd0e6e15..12119708bfcf 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using Gtk; @@ -37,17 +38,7 @@ protected override bool OnDrawn(Cairo.Context cr) public ILayout? VirtualView => CrossPlatformVirtualView?.Invoke(); - protected bool IsReallocating; - - protected Size? MeasuredArrange { get; set; } - - protected Size? MesuredAllocation { get; set; } - - public bool RestrictToMesuredAllocation { get; set; } - - public bool RestrictToMeasuredArrange { get; set; } - - Dictionary _children = new(); + List<(IView view, Widget widget)> _children = new(); public LayoutView() { @@ -56,14 +47,19 @@ public LayoutView() public void ReplaceChild(Widget oldWidget, Widget newWidget) { - var view = _children.FirstOrDefault(kvp => kvp.Value == oldWidget).Key; + var index = _children.FindIndex(c => c.widget == oldWidget); + + if (index == -1) + return; + + var view = _children[index].view; Remove(oldWidget); Add(newWidget); if (view != null) { - _children[view] = newWidget; + _children[index] = (view, newWidget); } } @@ -77,8 +73,8 @@ Orientation GetOrientation() => var orientation = GetOrientation(); var focusChain = _children + .Select(c => c.widget) // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) - .Values .ToArray(); FocusChain = focusChain; @@ -88,8 +84,8 @@ protected override void ForAll(bool includeInternals, Callback callback) { base.ForAll(includeInternals, callback); - foreach (var c in _children.Values.ToArray()) - callback(c); + foreach (var c in _children.ToArray()) + callback(c.widget); } public void ClearChildren() @@ -102,14 +98,31 @@ public void ClearChildren() _children.Clear(); } - public void Add(IView view, Widget gw) + public void Add(IView view, Widget widget) { - if (_children.ContainsKey(view)) + var index = _children.FindIndex(c => c.widget == widget); + + if (index != -1) return; - _children[view] = gw; + _children.Add((view, widget)); + + Add(widget); + } + + public void Insert(IView view, Widget widget, int index) + { + _children.Insert(index, (view, widget)); + Add(widget); + } + + public void Update(IView view, Widget widget, int index) + { + var replace = _children[index]; + _children[index] = (view, widget); + Remove(replace.widget); + Add(widget); - Add(gw); } protected override void OnAdded(Widget widget) @@ -134,8 +147,8 @@ protected void AllocateChildren(Rectangle allocation) foreach (var cr in _children.ToArray()) { - var w = cr.Value; - var v = cr.Key; + var w = cr.widget; + var v = cr.view; var r = v.Frame; if (r.IsEmpty) From 36deac154ed6b6e4cf48fdcdc26f7660f6ee1e62 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:27:38 +0200 Subject: [PATCH 151/425] Core.csproj Gtk : LayoutView.cs: refactor measure-caching --- src/Core/src/Platform/Gtk/LayoutView.cs | 261 ++++++++++++++++++------ 1 file changed, 193 insertions(+), 68 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 12119708bfcf..14cb04018b0c 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -1,11 +1,15 @@ -using System; +#define TRACE_ALLOCATION + +using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using Gtk; using Microsoft.Maui.Graphics.Native.Gtk; using Rectangle = Microsoft.Maui.Graphics.Rectangle; using Size = Microsoft.Maui.Graphics.Size; +using Point = Microsoft.Maui.Graphics.Point; namespace Microsoft.Maui.Native { @@ -21,18 +25,19 @@ protected override bool OnDrawn(Cairo.Context cr) stc.RenderBackground(cr, 0, 0, Allocation.Width, Allocation.Height); var r = base.OnDrawn(cr); -#if DEBUG +#if TRACE_ALLOCATION cr.Save(); cr.SetSourceColor(Graphics.Colors.Red.ToCairoColor()); cr.Rectangle(0, 0, Allocation.Width, Allocation.Height); cr.Stroke(); + cr.MoveTo(0, Allocation.Height - 12); + cr.ShowText($"{_measureCount} | {Allocation.Size}"); cr.Restore(); - +#endif return r; } -#endif public Func? CrossPlatformVirtualView { get; set; } @@ -90,6 +95,8 @@ protected override void ForAll(bool includeInternals, Callback callback) public void ClearChildren() { + ClearMeasured(); + foreach (var c in Children) { Remove(c); @@ -128,17 +135,13 @@ public void Update(IView view, Widget widget, int index) protected override void OnAdded(Widget widget) { widget.Parent = this; + ClearMeasured(); } protected override void OnRemoved(Widget widget) { - - var view = _children.FirstOrDefault(kvp => kvp.Value == widget).Key; - - if (view != null) - _children.Remove(view); - widget.Unparent(); + ClearMeasured(); QueueResize(); } @@ -170,30 +173,83 @@ protected void ArrangeAllocation(Rectangle allocation) } + protected bool RestrictToMesuredAllocation { get; set; } = true; + + protected bool RestrictToMeasuredArrange { get; set; } = true; + + protected bool IsReallocating; + + protected bool IsSizeAllocating; + + protected Size? MeasuredSizeH { get; set; } + + protected Size? MeasuredSizeV { get; set; } + + protected Size? MeasuredMinimum { get; set; } + + protected Rectangle LastAllocation { get; set; } + + protected void ClearMeasured(bool clearCache = true) + { + if (clearCache && !MeasureCache.IsEmpty) + { + MeasureCache.Clear(); + } + + MeasuredSizeH = null; + MeasuredSizeV = null; + MeasuredMinimum = null; + + } + protected override void OnSizeAllocated(Gdk.Rectangle allocation) { - base.OnSizeAllocated(allocation); - if (VirtualView is not { }) + if (IsSizeAllocating) return; + if (VirtualView is not { } virtualView) + { + base.OnSizeAllocated(allocation); + + return; + } + + var clearCache = true; + try { IsReallocating = true; - MesuredAllocation = MeasuredArrange ?? Measure(allocation.Width, allocation.Height, SizeRequestMode.ConstantSize); - var mAllocation = allocation.ToRectangle(); + clearCache = LastAllocation.IsEmpty || mAllocation.IsEmpty || LastAllocation != mAllocation; + ClearMeasured(clearCache); + + LastAllocation = mAllocation; + + var mesuredAllocation = Measure(allocation.Width, allocation.Height); + if (RestrictToMesuredAllocation) - mAllocation.Size = MesuredAllocation.Value; + mAllocation.Size = mesuredAllocation; - ArrangeAllocation(mAllocation); + ArrangeAllocation(new Rectangle(Point.Zero, mAllocation.Size)); AllocateChildren(mAllocation); + + if (virtualView.Frame != mAllocation) + { + IsSizeAllocating = true; + + Arrange(mAllocation); + } + + base.OnSizeAllocated(allocation); + } finally { IsReallocating = false; + IsSizeAllocating = false; } } @@ -202,6 +258,7 @@ protected override void OnUnrealized() { // force reallocation on next realization, since allocation may be lost IsReallocating = false; + ClearMeasured(); base.OnUnrealized(); } @@ -212,7 +269,9 @@ protected override void OnRealized() { try { - MesuredAllocation ??= Measure(Allocation.Width, Allocation.Height, SizeRequestMode.ConstantSize); + LastAllocation = Allocation.ToRectangle(); + Measure(Allocation.Width, Allocation.Height); + } catch { @@ -223,87 +282,143 @@ protected override void OnRealized() base.OnRealized(); } - int sr = 0; +#if TRACE_ALLOCATION + int _measureCount = 0; + bool _checkCacheHitFailed = false; +#endif + + protected ConcurrentDictionary<(double width, double height, SizeRequestMode mode), Size> MeasureCache { get; } = new(); - public SizeRequest Measure(double widthConstraint, double heightConstraint, SizeRequestMode mode) + public Size Measure(double widthConstraint, double heightConstraint, SizeRequestMode mode = SizeRequestMode.ConstantSize) { + bool CanBeCached() => !double.IsPositiveInfinity(widthConstraint) && !double.IsPositiveInfinity(heightConstraint); + if (VirtualView is not { LayoutManager: { } layoutManager } virtualView) return Size.Zero; - var size1 = layoutManager.Measure(widthConstraint, heightConstraint); - sr++; + var key = (widthConstraint, heightConstraint, mode); + + Size cached = Size.Zero; + + bool cacheHit = CanBeCached() && MeasureCache.TryGetValue(key, out cached); + + if (cacheHit) + { +#if TRACE_ALLOCATION + if (!_checkCacheHitFailed) +#endif + return cached; + + } + + var measured = layoutManager.Measure(widthConstraint, heightConstraint); + +#if TRACE_ALLOCATION + if (_checkCacheHitFailed && cacheHit && measured != cached) + { + Debug.WriteLine($"{cached} =! {measured}"); + } + + _measureCount++; +#endif - return new SizeRequest(size1, size1); + if (CanBeCached()) + MeasureCache[key] = measured; + + return measured; } - int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; + protected Size MeasureMinimum() + { + if (MeasuredMinimum != null) + return MeasuredMinimum.Value; + + if (VirtualView is not { } virtualView) + return Size.Zero; + + // ensure all children have DesiredSize: + + Measure(0, double.PositiveInfinity); + + var desiredMinimum = virtualView.Aggregate(new Size(), (s, c) => new Size(Math.Max(s.Width, c.DesiredSize.Width), s.Height + c.DesiredSize.Height)); + + MeasuredMinimum = Measure(desiredMinimum.Width, double.PositiveInfinity); + + return MeasuredMinimum.Value; + } - protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight) + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) { - SizeRequest size; + base.OnAdjustSizeRequest(orientation, out minimumSize, out naturalSize); - if (MeasuredArrange.HasValue) - size = MeasuredArrange.Value; - else + if (IsSizeAllocating) { + return; + } + + if (VirtualView is not { LayoutManager: { } layoutManager } virtualView) + return; - if (RequestMode == SizeRequestMode.HeightForWidth) + var measuredMinimum = MeasureMinimum(); + + double constraint = minimumSize; + + if (orientation == Orientation.Horizontal) + { + if (RequestMode is SizeRequestMode.WidthForHeight or SizeRequestMode.ConstantSize) { - OnGetPreferredWidth(out var minimumWidth, out var naturalWidth); - size = Measure(minimumWidth, double.PositiveInfinity, SizeRequestMode.HeightForWidth); + if (MeasuredSizeV is { Width : > 0 } size && (constraint == 0)) + constraint = size.Width; + + constraint = constraint == 0 ? double.PositiveInfinity : constraint; } else { - size = Measure(double.PositiveInfinity, 0, SizeRequestMode.WidthForHeight); + ; } - } - minimumHeight = Math.Max(HeightRequest, ToSize(size.Minimum.Height)); - naturalHeight = Math.Max(HeightRequest, ToSize(size.Request.Height)); - } + MeasuredSizeH = constraint != 0 ? Measure(constraint, double.PositiveInfinity) : measuredMinimum; - protected override void OnGetPreferredWidth(out int minimumWidth, out int naturalWidth) - { - SizeRequest size; + constraint = MeasuredSizeH.Value.Width; + + minimumSize = (int)measuredMinimum.Width; + naturalSize = (int)constraint; + } - if (MeasuredArrange.HasValue) - size = MeasuredArrange.Value; - else + if (orientation == Orientation.Vertical) { + var widthContraint = double.PositiveInfinity; - if (RequestMode == SizeRequestMode.HeightForWidth) + if (RequestMode is SizeRequestMode.HeightForWidth or SizeRequestMode.ConstantSize) { - size = Measure(0, double.PositiveInfinity, SizeRequestMode.HeightForWidth); + MeasuredSizeH ??= measuredMinimum; + + if (MeasuredSizeH is { } size && constraint == 0) + { + if (size.Height > 0) + constraint = size.Height; + + if (size.Width > 0) + widthContraint = size.Width; + } + + constraint = constraint == 0 ? double.PositiveInfinity : constraint; + } else { - GetPreferredHeight(out var minimumHeight, out var naturalHeight); - size = Measure(0, minimumHeight, SizeRequestMode.WidthForHeight); + ; } - } - - minimumWidth = Math.Max(WidthRequest, ToSize(size.Minimum.Width)); - naturalWidth = Math.Max(WidthRequest, ToSize(size.Request.Width)); - } + MeasuredSizeV = constraint != 0 ? Measure(widthContraint, constraint) : measuredMinimum; - protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) - { - base.OnAdjustSizeRequest(orientation, out minimumSize, out naturalSize); + constraint = MeasuredSizeV.Value.Height; - if (!MeasuredArrange.HasValue) - return; + minimumSize = (int)measuredMinimum.Height; + naturalSize = (int)constraint; - if (orientation == Orientation.Horizontal) - { - minimumSize = (int)MeasuredArrange.Value.Width; } - else - { - minimumSize = (int)MeasuredArrange.Value.Height; - } - } public void Arrange(Rectangle rect) @@ -312,14 +427,24 @@ public void Arrange(Rectangle rect) if (rect.IsEmpty) return; - if (rect != Allocation.ToRectangle()) + if (rect == Allocation.ToRectangle()) return; + + if (IsSizeAllocating) { - MeasuredArrange = Measure(rect.Width, rect.Height, SizeRequestMode.ConstantSize); - SizeAllocate(new Rectangle(rect.Location, RestrictToMeasuredArrange ? MeasuredArrange.Value : rect.Size).ToNative()); - QueueAllocate(); + + SizeAllocate(rect.ToNative()); + + return; } + + var measuredArrange = Measure(rect.Width, rect.Height); + var alloc = new Rectangle(rect.Location, RestrictToMeasuredArrange ? measuredArrange : rect.Size); + SizeAllocate(alloc.ToNative()); + QueueAllocate(); } + protected int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; + } } \ No newline at end of file From b8ad8fd4b4fc8a01530cec88f437eb4c35eb345f Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:28:44 +0200 Subject: [PATCH 152/425] Controls.Sample.Gtk.csproj: track api changes & enhance --- .../SimpleSampleApp/ExamplePage.cs | 73 +++++++++++-------- .../SimpleSampleGtkApplication.cs | 7 +- .../SimpleSampleApp/Startup.cs | 65 +++++++---------- 3 files changed, 78 insertions(+), 67 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 6ddde5a5ccda..a280fe9cefe9 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -36,6 +36,7 @@ public ExamplePage(IServiceProvider services, MainPageViewModel viewModel) // SetupMauiLayoutSimple(); SetupMauiLayout(); + // SetupMauiLayoutDrawables(); } void SetupMauiLayoutLayouts() @@ -106,6 +107,11 @@ void Fill(Layout l, string m, int count, Color bkCol) } + void SetupMauiLayoutDrawables() + { + Content = CreateShapes(); + } + void SetupMauiLayoutButtonSpacing() { var verticalStack = new VerticalStackLayout() @@ -180,6 +186,7 @@ void SetupMauiLayoutButtonSpacing() { button.CharacterSpacing = button.CharacterSpacing > 1 ? 1 : 2; }; + verticalStack.Add(button2); var activityIndicator = new ActivityIndicator { Color = Colors.Chartreuse }; @@ -234,7 +241,6 @@ void SetupMauiLayout() Margin = new Thickness(15, 10, 20, 15) }; - SemanticProperties.SetHint(label, "Hint Text"); SemanticProperties.SetDescription(label, "Description Text"); @@ -315,8 +321,6 @@ void SetupMauiLayout() verticalStack.Add(visibleClearButtonEntry); verticalStack.Add(hiddenClearButtonEntry); - verticalStack.Add(new Editor { Placeholder = "This is an editor placeholder." }); - var paddingButton = new Button { Padding = new Thickness(40), @@ -431,33 +435,39 @@ void SetupMauiLayout() Color = Colors.Aquamarine }); - verticalStack.Add(new Editor()); - verticalStack.Add(new Editor { Text = "Editor" }); - - verticalStack.Add(new Editor + if (true) +#pragma warning disable 162 { - Text = "Lorem ipsum dolor sit amet", - MaxLength = 10 - }); + verticalStack.Add(new Editor()); + verticalStack.Add(new Editor { Placeholder = "This is an editor placeholder." }); + verticalStack.Add(new Editor { Text = "Editor" }); - verticalStack.Add(new Editor - { - Text = "Predictive Text Off", - IsTextPredictionEnabled = false - }); + verticalStack.Add(new Editor + { + Text = "Lorem ipsum dolor sit amet", + MaxLength = 10 + }); - verticalStack.Add(new Editor - { - Text = "Lorem ipsum dolor sit amet", - FontSize = 10, - FontFamily = "dokdo_regular" - }); + verticalStack.Add(new Editor + { + Text = "Predictive Text Off", + IsTextPredictionEnabled = false + }); - verticalStack.Add(new Editor - { - Text = "ReadOnly Editor", - IsReadOnly = true - }); + verticalStack.Add(new Editor + { + Text = "Lorem ipsum dolor sit amet", + FontSize = 10, + FontFamily = "dokdo_regular" + }); + + verticalStack.Add(new Editor + { + Text = "ReadOnly Editor", + IsReadOnly = true + }); + } +#pragma warning restore 162 var entry = new Entry(); @@ -639,12 +649,16 @@ void SetupMauiLayout() verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); - Content = new ScrollView { Content = verticalStack }; + Content = new ScrollView + { + Content = verticalStack, + Orientation = ScrollOrientation.Both + }; } public IView View { get => (IView)Content; set => Content = (View)value; } - IView CreateSampleGrid() + View CreateSampleGrid() { var layout = new GridLayout() { @@ -670,6 +684,7 @@ IView CreateSampleGrid() { Text = "Bottom Left", BackgroundColor = Colors.Lavender, + VerticalTextAlignment = TextAlignment.End }; layout.Add(bottomLeft); @@ -704,7 +719,7 @@ IView CreateSampleGrid() return layout; } - IView CreateShapes() + View CreateShapes() { var ellipse = new Ellipse { diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs index 286766fb4d1f..eb71f87e2c9e 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs @@ -6,9 +6,14 @@ namespace Maui.SimpleSampleApp { - public class SimpleSampleGtkApplication : MauiGtkApplication + public class SimpleSampleGtkApplication : MauiGtkApplication { + protected override MauiApp CreateMauiApp() + { + return Startup.CreateMauiApp(); + } + public SimpleSampleGtkApplication() : base() { // TopContainerOverride = OnTopContainerOverride; diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs index d9489fb1060f..bf94b89faaee 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Maui; +using Microsoft.Maui.Controls; using Microsoft.Maui.Controls.Compatibility; using Microsoft.Maui.Controls.Hosting; using Microsoft.Maui.Hosting; @@ -15,15 +16,17 @@ namespace Maui.SimpleSampleApp { - public class Startup : IStartup + public class Startup { public readonly static bool UseSemanticsPage = false; public readonly static bool UseXamlPage = false; public readonly static bool UseXamlApp = true; - public void Configure(IAppHostBuilder appBuilder) + public static MauiApp CreateMauiApp() { + var appBuilder = MauiApp.CreateBuilder(); + // if (UseXamlApp) // { // // Use all the Forms features @@ -38,33 +41,30 @@ public void Configure(IAppHostBuilder appBuilder) .UseMauiApp(); } - appBuilder - .ConfigureAppConfiguration(config => - { - config.AddInMemoryCollection(new Dictionary - { - { "MyKey", "Dictionary MyKey Value" }, - { ":Title", "Dictionary_Title" }, - { "Position:Name", "Dictionary_Name" }, - { "Logging:LogLevel:Default", "Warning" } - }); - }) - .UseMauiServiceProviderFactory(true) - //.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory()) - .ConfigureServices(services => - { - services.AddSingleton(); - services.AddTransient(); + var services = appBuilder.Services; - // if (UseXamlPage) - // services.AddTransient(); - // else if (UseSemanticsPage) - // services.AddTransient(); - // else - services.AddTransient(); + appBuilder.Configuration.AddInMemoryCollection(new Dictionary + { + { "MyKey", "Dictionary MyKey Value" }, + { ":Title", "Dictionary_Title" }, + { "Position:Name", "Dictionary_Name" }, + { "Logging:LogLevel:Default", "Warning" } + }); + + services.AddSingleton(); + services.AddTransient(); + + // if (UseXamlPage) + // services.AddTransient(); + // else if (UseSemanticsPage) + // services.AddTransient(); + // else + services.AddTransient(); - services.AddTransient(); - }) + services.AddTransient(); + + appBuilder + //.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory()) .ConfigureFonts(fonts => { fonts.AddFont("Dokdo-Regular.ttf", "Dokdo"); @@ -104,17 +104,8 @@ static bool LogEvent(string eventName, string type = null) return true; } }); - } - - // To use the Microsoft.Extensions.DependencyInjection ServiceCollection and not the MAUI one - class DIExtensionsServiceProviderFactory : IServiceProviderFactory - { - - public ServiceCollection CreateBuilder(IServiceCollection services) - => new ServiceCollection { services }; - public IServiceProvider CreateServiceProvider(ServiceCollection containerBuilder) - => containerBuilder.BuildServiceProvider(); + return appBuilder.Build(); } From 4c26997e652631912edbef5ca6afd781457ac1cf Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 31 Aug 2021 03:38:55 +0200 Subject: [PATCH 153/425] Controls.Sample.Gtk.csproj: remove reference to Controls.Sample.csproj for the moment (it's not compiling any more) --- .../samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj index f48f06a9ef49..16c4f6fbdd21 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj +++ b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj @@ -14,7 +14,7 @@ - + From 1b5e0b9f742c467e7d99b5a522e89ba2062bb04a Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 18 Aug 2022 14:16:18 +0200 Subject: [PATCH 154/425] [Graphics.Gtk] move Microsoft.Maui.Graphics.Gtk + minor refactorings --- Microsoft.Maui.sln | 7 + Microsoft.Maui.sln.DotSettings | 2 + .../src/Graphics.Gtk/Extras/LineBreakMode.cs | 41 ++ .../src/Graphics.Gtk/Graphics.Gtk.csproj | 18 + .../src/Graphics.Gtk/Gtk/CanvasExtensions.cs | 43 ++ .../src/Graphics.Gtk/Gtk/ColorExtensions.cs | 22 + .../src/Graphics.Gtk/Gtk/FontExtensions.cs | 75 ++++ .../Graphics.Gtk/Gtk/GraphicsExtensions.cs | 61 +++ .../Gtk/GtkBitmapExportContext.cs | 63 +++ src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs | 64 +++ .../Graphics.Gtk/Gtk/HardwareInformations.cs | 53 +++ .../src/Graphics.Gtk/Gtk/ImageExtensions.cs | 133 ++++++ .../src/Graphics.Gtk/Gtk/PaintExtensions.cs | 112 +++++ .../Gtk/PlatformCanvas.Context.cs | 179 ++++++++ .../Gtk/PlatformCanvas.Patterns.cs | 120 ++++++ .../Graphics.Gtk/Gtk/PlatformCanvas.Shadow.cs | 47 +++ .../Graphics.Gtk/Gtk/PlatformCanvas.Text.cs | 51 +++ .../src/Graphics.Gtk/Gtk/PlatformCanvas.cs | 265 ++++++++++++ .../Graphics.Gtk/Gtk/PlatformCanvasState.cs | 80 ++++ .../Gtk/PlatformCanvasStateService.cs | 9 + .../Gtk/PlatformStringSizeService.cs | 47 +++ .../src/Graphics.Gtk/Gtk/TextLayout.cs | 382 ++++++++++++++++++ .../Graphics.Gtk/Gtk/TextLayoutExtensions.cs | 81 ++++ .../Graphics.Gtk/Gtk/Views/GtkGraphicsView.cs | 70 ++++ .../GtkMissingImplementationAttribute.cs | 3 + 25 files changed, 2028 insertions(+) create mode 100644 Microsoft.Maui.sln.DotSettings create mode 100644 src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/CanvasExtensions.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/ColorExtensions.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/FontExtensions.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/GraphicsExtensions.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/GtkBitmapExportContext.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/HardwareInformations.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/ImageExtensions.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Context.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Shadow.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Text.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasState.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasStateService.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/Views/GtkGraphicsView.cs create mode 100644 src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index 9b9b8c813d01..feedfe0cdd59 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -218,6 +218,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Graphics.Skia", "src\Graphi EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Graphics.Win2D", "src\Graphics\src\Graphics.Win2D\Graphics.Win2D.csproj", "{291F634A-2D8D-48B6-A1A0-BB9BC265D6E4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Graphics.Gtk", "src\Graphics\src\Graphics.Gtk\Graphics.Gtk.csproj", "{4EDE89FC-7C84-4855-8DD8-D7C8B128A974}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Graphics.Text.Markdig", "src\Graphics\src\Text.Markdig\Graphics.Text.Markdig.csproj", "{375B22F5-9D79-4D17-B759-F8220DFB8B70}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Graphics.Tests", "src\Graphics\tests\Graphics.Tests\Graphics.Tests.csproj", "{56BBFDBD-254F-42B6-9984-46E19C53FB00}" @@ -630,6 +632,10 @@ Global {F68932B0-81A2-4CC3-A4F7-28091EE91B23}.Debug|Any CPU.Build.0 = Debug|Any CPU {F68932B0-81A2-4CC3-A4F7-28091EE91B23}.Release|Any CPU.ActiveCfg = Release|Any CPU {F68932B0-81A2-4CC3-A4F7-28091EE91B23}.Release|Any CPU.Build.0 = Release|Any CPU + {4EDE89FC-7C84-4855-8DD8-D7C8B128A974}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EDE89FC-7C84-4855-8DD8-D7C8B128A974}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EDE89FC-7C84-4855-8DD8-D7C8B128A974}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EDE89FC-7C84-4855-8DD8-D7C8B128A974}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -747,6 +753,7 @@ Global {F26D31D3-CE4C-4F32-A77F-E2905C948674} = {42AB9AE1-631D-4AD4-85B7-910FF0940BDB} {F351A992-18E4-473C-8ADD-2BA0BAA7B5A2} = {1BA0121E-0B83-4C8F-81BE-C293E7E35DCE} {F68932B0-81A2-4CC3-A4F7-28091EE91B23} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E} + {4EDE89FC-7C84-4855-8DD8-D7C8B128A974} = {42AB9AE1-631D-4AD4-85B7-910FF0940BDB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50} diff --git a/Microsoft.Maui.sln.DotSettings b/Microsoft.Maui.sln.DotSettings new file mode 100644 index 000000000000..06b71d5de1e2 --- /dev/null +++ b/Microsoft.Maui.sln.DotSettings @@ -0,0 +1,2 @@ + + False \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs b/src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs new file mode 100644 index 000000000000..8a626b1d028d --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs @@ -0,0 +1,41 @@ +using System; + +// copied from: Microsoft.Maui/Core/src/Primitives/LineBreakMode.cs +// merged with: Xwt.Drawing/TextLayout.cs TextTrimming + +namespace Microsoft.Maui.Graphics.Extras; + +[Flags] +public enum LineBreakMode { + + None = 0, + + Wrap = 0x1 << 0, + Truncation = 0x1 << 1, + Elipsis = 0x1 << 2, + + Character = 0x1 << 3, + Word = 0x1 << 4, + + Start = 0x1 << 5, + Center = 0x1 << 6, + End = 0x1 << 7, + + NoWrap = None, + + WordWrap = Wrap | Word | End, + CharacterWrap = Wrap | Character | End, + WordCharacterWrap = Wrap | Word | Character | End, + + StartTruncation = Truncation | Character | Start, + EndTruncation = Truncation | Character | End, + CenterTruncation = Truncation | Character | Center, + + HeadTruncation = StartTruncation, + TailTruncation = EndTruncation, + MiddleTruncation = CenterTruncation, + + WordElipsis = Elipsis | Word | End, + CharacterElipsis = Elipsis | Character | End, + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj new file mode 100644 index 000000000000..3f02c5cb3e2b --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj @@ -0,0 +1,18 @@ + + + + netstandard2.1;netstandard2.0 + Microsoft.Maui.Graphics.Gtk + + + enable + $(NoWarn);CA1307;CA1309;CS8603;CS8618;CS0162 + + + + + + + + + diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/CanvasExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/CanvasExtensions.cs new file mode 100644 index 000000000000..1621e87c455e --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/CanvasExtensions.cs @@ -0,0 +1,43 @@ +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public static class CanvasExtensions { + + public static Cairo.LineJoin ToLineJoin(this LineJoin lineJoin) => + lineJoin switch { + LineJoin.Bevel => Cairo.LineJoin.Bevel, + LineJoin.Round => Cairo.LineJoin.Round, + _ => Cairo.LineJoin.Miter + }; + + public static Cairo.FillRule ToFillRule(this WindingMode windingMode) => + windingMode switch { + WindingMode.EvenOdd => Cairo.FillRule.EvenOdd, + _ => Cairo.FillRule.Winding + }; + + public static Cairo.LineCap ToLineCap(this LineCap lineCap) => + lineCap switch { + LineCap.Butt => Cairo.LineCap.Butt, + LineCap.Round => Cairo.LineCap.Round, + _ => Cairo.LineCap.Square + }; + + public static Cairo.Antialias ToAntialias(bool antialias) => antialias ? Cairo.Antialias.Default : Cairo.Antialias.None; + + public static Size? GetSize(this Cairo.Surface it) { + if (it is Cairo.ImageSurface i) + return new Size(i.Width, i.Height); + + if (it is Cairo.XlibSurface x) + return new Size(x.Width, x.Height); + + if (it is Cairo.XcbSurface c) + return null; + + if (it is Cairo.SvgSurface s) + return null; + + return null; + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/ColorExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/ColorExtensions.cs new file mode 100644 index 000000000000..4fcc5506d9a7 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/ColorExtensions.cs @@ -0,0 +1,22 @@ +using System; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public static class ColorExtensions { + + public static Gdk.RGBA ToGdkRgba(this Color color) + => color == default ? default : new Gdk.RGBA {Red = color.Red, Green = color.Green, Blue = color.Blue, Alpha = color.Alpha}; + + public static Color ToColor(this Gdk.RGBA color) + => new Color((float) color.Red, (float) color.Green, (float) color.Blue, (float) color.Alpha); + + public static Cairo.Color ToCairoColor(this Color color) + => color == default ? default : new Cairo.Color(color.Red, color.Green, color.Blue, color.Alpha); + + public static Cairo.Color ToCairoColor(this Gdk.RGBA color) + => new Cairo.Color(color.Red, color.Green, color.Blue, color.Alpha); + + public static Color ToColor(this Cairo.Color color) + => new Color((float) color.R, (float) color.G, (float) color.B, (float) color.A); + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/FontExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/FontExtensions.cs new file mode 100644 index 000000000000..96ae6473b6b6 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/FontExtensions.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public static class FontExtensions +{ + static Pango.Context? _systemContext; + static Pango.Context SystemContext => _systemContext ??= Gdk.PangoHelper.ContextGet(); + + static Pango.FontDescription? _systemFontDescription; + static Pango.FontDescription SystemFontDescription => _systemFontDescription ??= SystemContext.FontDescription; + + public static Pango.FontDescription Default => SystemFontDescription; + + /// + /// size in points + /// + /// the size of a font description is specified in pango units. + /// There are pango units in one device unit (the device unit is a point for font sizes). + /// + /// + /// + public static double GetSize(this Pango.FontDescription it) + => it.Size.ScaledFromPango(); + + public static Pango.Style ToPangoStyle(this FontStyleType it) => it switch + { + FontStyleType.Oblique => Pango.Style.Oblique, + FontStyleType.Italic => Pango.Style.Italic, + _ => Pango.Style.Normal + }; + + public static FontStyleType ToFontStyleType(this Pango.Style it) => it switch + { + Pango.Style.Oblique => FontStyleType.Oblique, + Pango.Style.Italic => FontStyleType.Italic, + _ => FontStyleType.Normal + }; + + // enum Pango.Weight { Thin = 100, Ultralight = 200, Light = 300, Semilight = 350, Book = 380, Normal = 400, Medium = 500, Semibold = 600, Bold = 700, Ultrabold = 800, Heavy = 900, Ultraheavy = 1000,} + + public static Pango.Weight ToPangoWeight(this int it) + { + static Pango.Weight Div(double v) => (Pango.Weight)((int)v / 100 * 100); + + if (it < 100) + return Pango.Weight.Thin; + else if (it > 1000) + return Pango.Weight.Ultraheavy; + else if (it > 390 || it < 325) + return Div(it); + else if (it > 375) + return Pango.Weight.Book; + else if (it > 325) + return Pango.Weight.Semilight; + else + return 0; + } + + public static double ToFontWeight(this Pango.Weight it) + => (int)it; + + public static Pango.FontDescription ToFontDescription(this IFont it) + => it is not {} || string.IsNullOrEmpty(it?.Name) + ? SystemFontDescription + : new Pango.FontDescription + { +#pragma warning disable CS8602 + Style = it.StyleType.ToPangoStyle(), +#pragma warning restore CS8602 + Weight = it.Weight.ToPangoWeight(), + Family = it.Name + }; +}; \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GraphicsExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/GraphicsExtensions.cs new file mode 100644 index 000000000000..e859336c1308 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/GraphicsExtensions.cs @@ -0,0 +1,61 @@ +using System; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public static class GraphicsExtensions { + + public static Rect ToRect(this Gdk.Rectangle it) + => new Rect(it.X, it.Y, it.Width, it.Height); + + public static RectF ToRectF(this Gdk.Rectangle it) + => new RectF(it.X, it.Y, it.Width, it.Height); + + public static Gdk.Rectangle ToNative(this Rect it) + => new Gdk.Rectangle((int) it.X, (int) it.Y, (int) it.Width, (int) it.Height); + + public static Gdk.Rectangle ToNative(this RectF it) + => new Gdk.Rectangle((int) it.X, (int) it.Y, (int) it.Width, (int) it.Height); + + public static Point ToPoint(this Gdk.Point it) + => new Point(it.X, it.Y); + + public static PointF ToPointF(this Gdk.Point it) + => new PointF(it.X, it.Y); + + public static PointF ToPointF(this Cairo.PointD it) + => new PointF((float) it.X, (float) it.Y); + + public static Gdk.Point ToNative(this Point it) + => new Gdk.Point((int) it.X, (int) it.Y); + + public static Gdk.Point ToNative(this PointF it) + => new Gdk.Point((int) it.X, (int) it.Y); + + public static Size ToSize(this Gdk.Size it) + => new Size(it.Width, it.Height); + + public static SizeF ToSizeF(this Gdk.Size it) + => new SizeF(it.Width, it.Height); + + public static Gdk.Size ToNative(this Size it) + => new Gdk.Size((int) it.Width, (int) it.Height); + + public static Gdk.Size ToNative(this SizeF it) + => new Gdk.Size((int) it.Width, (int) it.Height); + + public static double ScaledFromPango(this int it) + => Math.Ceiling(it / Pango.Scale.PangoScale); + + public static float ScaledFromPangoF(this int it) + => (float) Math.Ceiling(it / Pango.Scale.PangoScale); + + public static int ScaledToPango(this double it) + => (int) Math.Ceiling(it * Pango.Scale.PangoScale); + + public static int ScaledToPango(this float it) + => (int) Math.Ceiling(it * Pango.Scale.PangoScale); + + public static int ScaledToPango(this int it) + => (int) Math.Ceiling(it * Pango.Scale.PangoScale); + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GtkBitmapExportContext.cs b/src/Graphics/src/Graphics.Gtk/Gtk/GtkBitmapExportContext.cs new file mode 100644 index 000000000000..0d12f766dea1 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/GtkBitmapExportContext.cs @@ -0,0 +1,63 @@ +using System.IO; +using System.Threading; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public class GtkBitmapExportContext : BitmapExportContext { + + private PlatformCanvas _canvas; + private Cairo.ImageSurface _surface; + private Cairo.Context _context; + private Gdk.Pixbuf? _pixbuf; + + public GtkBitmapExportContext(int width, int height, float dpi) : base(width, height, dpi) { + _surface = new Cairo.ImageSurface(Cairo.Format.Argb32, width, height); + _context = new Cairo.Context(_surface); + + _canvas = new PlatformCanvas { + Context = _context + }; + } + + public ImageFormat Format => ImageFormat.Png; + + public override ICanvas Canvas => _canvas; + + /// + /// writes a pixbuf to stream + /// + /// + public override void WriteToStream(Stream stream) { + if (_pixbuf != null) { + _pixbuf.SaveToStream(stream, Format); + } else { + _pixbuf = _surface.SaveToStream(stream, Format); + } + } + + private GtkImage? _image; + + public override IImage? Image { + get { + _pixbuf ??= _surface.CreatePixbuf(); + + if (_pixbuf != null) return _image ??= new GtkImage(_pixbuf); + + return _image; + } + } + + public override void Dispose() { + _canvas?.Dispose(); + _context?.Dispose(); + _surface?.Dispose(); + + if (_pixbuf != null) { + var previousValue = Interlocked.Exchange(ref _pixbuf, null); + previousValue?.Dispose(); + } + + base.Dispose(); + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs b/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs new file mode 100644 index 000000000000..9a3e3073ee4b --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs @@ -0,0 +1,64 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public class GtkImage : IImage { + + public GtkImage(Gdk.Pixbuf pix) { + _pixbuf = pix; + } + + private Gdk.Pixbuf? _pixbuf; + + // https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html + public Gdk.Pixbuf? NativeImage => _pixbuf; + + public void Draw(ICanvas canvas, RectF dirtyRect) { + canvas.DrawImage(this, dirtyRect.Left, dirtyRect.Top, (float) Math.Round(dirtyRect.Width), (float) Math.Round(dirtyRect.Height)); + } + + public void Dispose() { + var previousValue = Interlocked.Exchange(ref _pixbuf, null); + previousValue?.Dispose(); + } + + public float Width => NativeImage?.Width ?? 0; + + public float Height => NativeImage?.Width ?? 0; + + [GtkMissingImplementation] + public IImage Downsize(float maxWidthOrHeight, bool disposeOriginal = false) { + return this; + } + + [GtkMissingImplementation] + public IImage Downsize(float maxWidth, float maxHeight, bool disposeOriginal = false) { + return this; + } + + [GtkMissingImplementation] + public IImage Resize(float width, float height, ResizeMode resizeMode = ResizeMode.Fit, bool disposeOriginal = false) { + return this; + } + + public void Save(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) { + NativeImage.SaveToStream(stream, format, quality); + } + + public async Task SaveAsync(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) { + await Task.Run(() => NativeImage.SaveToStream(stream, format, quality)); + } + + public IImage ToImage(int width, int height, float scale = 1f) + { + using var context = new GtkBitmapExportContext(width, height, scale); + context.Canvas.Scale(scale, scale); + Draw(context.Canvas, new RectF(0, 0, (float)width / scale, (float)height / scale)); + return context.Image; + } + + public IImage ToPlatformImage()=> this; +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/HardwareInformations.cs b/src/Graphics/src/Graphics.Gtk/Gtk/HardwareInformations.cs new file mode 100644 index 000000000000..c7da717f44b6 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/HardwareInformations.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public static class HardwareInformations { + + public static Gdk.Screen DefaultScreen => Gdk.Screen.Default; + + /// + /// A describes a particular video hardware display format. + /// It includes information about the number of bits used for each color, the way the bits are translated into an RGB value for display, + /// and the way the bits are stored in memory. For example, a piece of display hardware might support 24-bit color, 16-bit color, or 8-bit color; + /// meaning 24/16/8-bit pixel sizes. For a given pixel size, pixels can be in different formats; + /// for example the “red” element of an RGB pixel may be in the top 8 bits of the pixel, or may be in the lower 4 bits. + /// There are several standard visuals. + /// The visual returned by is the system’s default visual, + /// and the visual returned by should be used for creating windows with an alpha channel. + /// + /// Get the system’s default visual for screen . + /// This is the visual for the root window of the display. + /// The return value should not be freed. + /// + public static Gdk.Visual SystemVisual => Gdk.Screen.Default.SystemVisual; + + public static double DefaultResolution => DefaultScreen.Resolution; + + /// + /// GdkDisplay objects purpose are two fold: + /// to manage and provide information about input devices (pointers and keyboards) + /// to manage and provide information about the available s. + /// 's are the GDK representation of an X Display, which can be described as a workstation consisting of a keyboard, + /// a pointing device (such as a mouse) and one or more screens. + /// It is used to open and keep track of various objects currently instantiated by the application. + /// It is also used to access the keyboard(s) and mouse pointer(s) of the display. + /// + public static Gdk.Display DefaultDisplay => Gdk.Display.Default; + + public static Gdk.Monitor CurrentMonitor => DefaultDisplay.GetMonitorAtPoint(0, 0); // TODO: find out aktual mouse position + + public static Gdk.Monitor PrimaryMonitor => GetMonitors().Single(m => m.IsPrimary); + + public static int CurrentScaleFaktor = CurrentMonitor.ScaleFactor; + + public static IEnumerable GetMonitors() { + + for (var i = 0; i < DefaultDisplay.NMonitors; i++) { + yield return DefaultDisplay.GetMonitor(i); + } + + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/ImageExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/ImageExtensions.cs new file mode 100644 index 000000000000..16248aab1aaf --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/ImageExtensions.cs @@ -0,0 +1,133 @@ +using System; +using System.IO; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public static class ImageExtensions { + + public static string ToImageExtension(this ImageFormat imageFormat) => + imageFormat switch { + ImageFormat.Bmp => "bmp", + ImageFormat.Png => "png", + ImageFormat.Jpeg => "jpeg", + ImageFormat.Gif => "gif", + ImageFormat.Tiff => "tiff", + _ => throw new ArgumentOutOfRangeException(nameof(imageFormat), imageFormat, null) + }; + + public static Gdk.Pixbuf? SaveToStream(this Cairo.ImageSurface? surface, Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) { + if (surface == null) + return null; + try { + var px = surface.CreatePixbuf(); + SaveToStream(px, stream, format, quality); + + return px; + } catch (Exception ex) { + System.Diagnostics.Debug.WriteLine(ex); + + return default; + } + } + + public static bool SaveToStream(this Gdk.Pixbuf? pixbuf, Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) { + if (pixbuf == null) + return false; + + try { + var puf = pixbuf.SaveToBuffer(format.ToImageExtension()); + stream.Write(puf, 0, puf.Length); + puf = null; + } catch (Exception ex) { + System.Diagnostics.Debug.WriteLine(ex); + + return false; + } + + return true; + } + + public static Gdk.Pixbuf? CreatePixbuf(this Cairo.ImageSurface? surface) { + if (surface == null) + return null; + + var surfaceData = surface.Data; + var nbytes = surface.Format == Cairo.Format.Argb32 ? 4 : 3; + var pixData = new byte[surfaceData.Length / 4 * nbytes]; + + var i = 0; + var n = 0; + var stride = surface.Stride; + var ncols = surface.Width; + + if (BitConverter.IsLittleEndian) { + var row = surface.Height; + + while (row-- > 0) { + var prevPos = n; + var col = ncols; + + while (col-- > 0) { + var alphaFactor = nbytes == 4 ? 255d / surfaceData[n + 3] : 1; + pixData[i] = (byte) (surfaceData[n + 2] * alphaFactor + 0.5); + pixData[i + 1] = (byte) (surfaceData[n + 1] * alphaFactor + 0.5); + pixData[i + 2] = (byte) (surfaceData[n + 0] * alphaFactor + 0.5); + + if (nbytes == 4) + pixData[i + 3] = surfaceData[n + 3]; + + n += 4; + i += nbytes; + } + + n = prevPos + stride; + } + } else { + var row = surface.Height; + + while (row-- > 0) { + var prevPos = n; + var col = ncols; + + while (col-- > 0) { + var alphaFactor = nbytes == 4 ? 255d / surfaceData[n + 3] : 1; + pixData[i] = (byte) (surfaceData[n + 1] * alphaFactor + 0.5); + pixData[i + 1] = (byte) (surfaceData[n + 2] * alphaFactor + 0.5); + pixData[i + 2] = (byte) (surfaceData[n + 3] * alphaFactor + 0.5); + + if (nbytes == 4) + pixData[i + 3] = surfaceData[n + 0]; + + n += 4; + i += nbytes; + } + + n = prevPos + stride; + } + } + + return new Gdk.Pixbuf(pixData, Gdk.Colorspace.Rgb, nbytes == 4, 8, surface.Width, surface.Height, surface.Width * nbytes, null); + } + + public static Cairo.Pattern? CreatePattern(this Gdk.Pixbuf? pixbuf, double scaleFactor) { + if (pixbuf == null) + return null; + + using var surface = new Cairo.ImageSurface(Cairo.Format.Argb32, (int) (pixbuf.Width * scaleFactor), (int) (pixbuf.Height * scaleFactor)); + using var context = new Cairo.Context(surface); + context.Scale(surface.Width / (double) pixbuf.Width, surface.Height / (double) pixbuf.Height); + Gdk.CairoHelper.SetSourcePixbuf(context, pixbuf, 0, 0); + context.Paint(); + surface.Flush(); + + var pattern = new Cairo.SurfacePattern(surface); + + var matrix = new Cairo.Matrix(); + matrix.Scale(scaleFactor, scaleFactor); + pattern.Matrix = matrix; + + return pattern; + + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs new file mode 100644 index 000000000000..6c970aff35a5 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs @@ -0,0 +1,112 @@ +using System; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +internal static class PaintExtensions { + + public static Cairo.Context? PaintToSurface(this PatternPaint? it, Cairo.Surface? surface, float scale) { + if (surface == null || it == null) + return null; + + var context = new Cairo.Context(surface); + context.Scale(scale, scale); + + using var canv = new PlatformCanvas { + Context = context, + }; + + it.Pattern.Draw(canv); + + return context; + + } + + /* + Cairo.Extend is used to describe how pattern color/alpha will be determined for areas "outside" the pattern's natural area, + (for example, outside the surface bounds or outside the gradient geometry). + The default extend mode is CAIRO_EXTEND_NONE for surface patterns and CAIRO_EXTEND_PAD for gradient patterns. + + NONE pixels outside of the source pattern are fully transparent + REPEAT the pattern is tiled by repeating + REFLECT the pattern is tiled by reflecting at the edges (Implemented for surface patterns since 1.6) + PAD pixels outside of the pattern copy the closest pixel from the source (only implemented for surface patterns since 1.6) + + */ + + public static void SetCairoExtend(Cairo.Extend it) { } + + public static Gdk.Pixbuf? GetPatternBitmap(this PatternPaint? it, float scale) { + if (it == null) + return null; + + using var surface = new Cairo.ImageSurface(Cairo.Format.Argb32, (int) it.Pattern.Width, (int) it.Pattern.Height); + using var context = it.PaintToSurface(surface, scale); + surface.Flush(); + + return surface.CreatePixbuf(); + + } + + /// + /// does not work, pattern isn't shown + /// + [GtkMissingImplementation] + public static Cairo.Pattern? GetCairoPattern(this PatternPaint? it, Cairo.Surface? surface, float scale) { + if (surface == null || it == null) + return null; + + using var context = it.PaintToSurface(surface, scale); + surface.Flush(); + + var pattern = new Cairo.SurfacePattern(surface); + + return pattern; + } + + public static Cairo.Pattern? GetCairoPattern(this LinearGradientPaint? it, RectF rectangle, float scaleFactor) { + if (it == null) + return null; + + var x1 = it.StartPoint.X * rectangle.Width + rectangle.X; + var y1 = it.StartPoint.Y * rectangle.Height + rectangle.Y; + + var x2 = it.EndPoint.X * rectangle.Width + rectangle.X; + var y2 = it.EndPoint.Y * rectangle.Height + rectangle.Y; + + // https://developer.gnome.org/cairo/stable/cairo-cairo-pattern-t.html#cairo-pattern-create-linear + var pattern = new Cairo.LinearGradient(x1, y1, x2, y2); + + foreach (var s in it.GetSortedStops()) { + pattern.AddColorStop(s.Offset, s.Color.ToCairoColor()); + } + + return pattern; + } + + public static Cairo.Pattern? GetCairoPattern(this RadialGradientPaint? it, RectF rectangle, float scaleFactor) { + if (it == null) + return null; + + var centerX = it.Center.X * rectangle.Width; + var centerY = it.Center.Y * rectangle.Height; + + var x1 = centerX + rectangle.X; + var y1 = centerY + rectangle.Y; + + var x2 = rectangle.Right - centerX; + var y2 = rectangle.Bottom - centerY; + + var radius1 = it.Radius * 1; + var radius2 = it.Radius * Math.Max(rectangle.Width, rectangle.Height); + + // https://developer.gnome.org/cairo/stable/cairo-cairo-pattern-t.html#cairo-pattern-create-radial + var pattern = new Cairo.RadialGradient(x1, y1, radius1, x2, y2, radius2); + + foreach (var s in it.GetSortedStops()) { + pattern.AddColorStop(s.Offset, s.Color.ToCairoColor()); + } + + return pattern; + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Context.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Context.cs new file mode 100644 index 000000000000..22fa5fd932a2 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Context.cs @@ -0,0 +1,179 @@ +using System; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public partial class PlatformCanvas { + + private Cairo.Surface CreateSurface(Cairo.Context context, bool imageSurface = false) { + var surface = context.GetTarget(); + + var extents = context.PathExtents(); + var pathSize = new Size(extents.X + extents.Width, extents.Height + extents.Y); + + var s = surface.GetSize(); + + var shadowSurface = s.HasValue && !imageSurface ? + surface.CreateSimilar(surface.Content, (int) pathSize.Width, (int) pathSize.Height) : + new Cairo.ImageSurface(Cairo.Format.ARGB32, (int) pathSize.Width, (int) pathSize.Height); + + return shadowSurface; + + } + + private void AddLine(Cairo.Context context, float x1, float y1, float x2, float y2) { + context.MoveTo(x1, y1); + context.LineTo(x2, y2); + } + + private void AddArc(Cairo.Context context, float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) { + + AddArc(context, x, y, width, height, startAngle, endAngle, clockwise); + + if (closed) + context.ClosePath(); + } + + private void AddRectangle(Cairo.Context context, float x, float y, float width, float height) { + context.Rectangle(x, y, width, height); + } + + /// + /// degree-value * mRadians = radians + /// + private const double mRadians = System.Math.PI / 180d; + + private void AddRoundedRectangle(Cairo.Context context, float left, float top, float width, float height, float radius) { + + context.NewPath(); + // top left + context.Arc(left + radius, top + radius, radius, 180 * mRadians, 270 * mRadians); + // // top right + context.Arc(left + width - radius, top + radius, radius, 270 * mRadians, 0); + // // bottom right + context.Arc(left + width - radius, top + height - radius, radius, 0, 90 * mRadians); + // // bottom left + context.Arc(left + radius, top + height - radius, radius, 90 * mRadians, 180 * mRadians); + context.ClosePath(); + } + + public void AddEllipse(Cairo.Context context, float x, float y, float width, float height) { + context.Save(); + context.NewPath(); + + context.Translate(x + width / 2, y + height / 2); + context.Scale(width / 2f, height / 2f); + context.Arc(0, 0, 1, 0, 2 * Math.PI); + context.Restore(); + } + + private void AddArc(Cairo.Context context, float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise) { + + // https://developer.gnome.org/cairo/stable/cairo-Paths.html#cairo-arc + // Angles are measured in radians + + var startAngleInRadians = startAngle * -mRadians; + var endAngleInRadians = endAngle * -mRadians; + + var cx = x + width / 2f; + var cy = y + height / 2f; + + var r = 1; + + context.Save(); + + context.Translate(cx, cy); + context.Scale(width / 2f, height / 2f); + + if (clockwise) + context.Arc(0, 0, r, startAngleInRadians, endAngleInRadians); + else { + context.ArcNegative(0, 0, r, startAngleInRadians, endAngleInRadians); + } + + context.Restore(); + + } + + private void AddPath(Cairo.Context context, PathF target) { + var pointIndex = 0; + var arcAngleIndex = 0; + var arcClockwiseIndex = 0; + + foreach (var type in target.SegmentTypes) { + if (type == PathOperation.Move) { + var point = target[pointIndex++]; + context.MoveTo(point.X, point.Y); + } else if (type == PathOperation.Line) { + var endPoint = target[pointIndex++]; + context.LineTo(endPoint.X, endPoint.Y); + + } else if (type == PathOperation.Quad) { + var p1 = pointIndex > 0 ? target[pointIndex - 1] : context.CurrentPoint.ToPointF(); + var c = target[pointIndex++]; + var p2 = target[pointIndex++]; + + // quad bezier to cubic bezier: + // C1 = 2/3•C + 1/3•P1 + // C2 = 2/3•C + 1/3•P2 + + var c1 = new PointF(c.X * 2 / 3 + p1.X / 3, c.Y * 2 / 3 + p1.Y / 3); + var c2 = new PointF(c.X * 2 / 3 + p2.X / 3, c.Y * 2 / 3 + p2.Y / 3); + + // Adds a cubic Bézier spline to the path + context.CurveTo( + c1.X, c1.Y, + c2.X, c2.Y, + p2.X, p2.Y); + + } else if (type == PathOperation.Cubic) { + var controlPoint1 = target[pointIndex++]; + var controlPoint2 = target[pointIndex++]; + var endPoint = target[pointIndex++]; + + // https://developer.gnome.org/cairo/stable/cairo-Paths.html#cairo-curve-to + // Adds a cubic Bézier spline to the path from the current point to position (x3, y3) in user-space coordinates, + // using (x1, y1) and (x2, y2) as the control points. After this call the current point will be (x3, y3). + // If there is no current point before the call to cairo_curve_to() this function will behave as if preceded by a call to cairo_move_to(cr, x1, y1). + context.CurveTo( + controlPoint1.X, controlPoint1.Y, + controlPoint2.X, controlPoint2.Y, + endPoint.X, endPoint.Y); + + } else if (type == PathOperation.Arc) { + var topLeft = target[pointIndex++]; + var bottomRight = target[pointIndex++]; + var startAngle = target.GetArcAngle(arcAngleIndex++); + var endAngle = target.GetArcAngle(arcAngleIndex++); + var clockwise = target.GetArcClockwise(arcClockwiseIndex++); + + AddArc(context, topLeft.X, topLeft.Y, bottomRight.X - topLeft.X, bottomRight.Y - topLeft.Y, startAngle, endAngle, clockwise); + + } else if (type == PathOperation.Close) { + context.ClosePath(); + } + } + } + + public void DrawPixbuf(Cairo.Context context, Gdk.Pixbuf pixbuf, double x, double y, double width, double height) { + context.Save(); + context.Translate(x, y); + + context.Scale(width / pixbuf.Width, height / pixbuf.Height); + Gdk.CairoHelper.SetSourcePixbuf(context, pixbuf, 0, 0); + + using (var p = context.GetSource()) { + if (p is Cairo.SurfacePattern pattern) { + if (width > pixbuf.Width || height > pixbuf.Height) { + // Fixes blur issue when rendering on an image surface + pattern.Filter = Cairo.Filter.Fast; + } else + pattern.Filter = Cairo.Filter.Good; + } + } + + context.Paint(); + + context.Restore(); + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs new file mode 100644 index 000000000000..d023eb1cd3f2 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs @@ -0,0 +1,120 @@ +using System; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public partial class PlatformCanvas { + + public void DrawFillPaint(Cairo.Context? context, Paint? paint, RectF rectangle) { + if (paint == null || context == null) + return; + + switch (paint) { + + case SolidPaint solidPaint: { + FillColor = solidPaint.Color; + + break; + } + + case LinearGradientPaint linearGradientPaint: { + try { + if (linearGradientPaint.GetCairoPattern(rectangle, DisplayScale) is { } pattern) { + context.SetSource(pattern); + pattern.Dispose(); + } else { + FillColor = paint.BackgroundColor; + } + } catch (Exception exc) { + System.Diagnostics.Debug.WriteLine(exc); + FillColor = linearGradientPaint.BlendStartAndEndColors(); + } + + break; + } + + case RadialGradientPaint radialGradientPaint: { + + try { + if (radialGradientPaint.GetCairoPattern(rectangle, DisplayScale) is { } pattern) { + context.SetSource(pattern); + pattern.Dispose(); + } else { + FillColor = paint.BackgroundColor; + } + } catch (Exception exc) { + System.Diagnostics.Debug.WriteLine(exc); + FillColor = radialGradientPaint.BlendStartAndEndColors(); + } + + break; + } + + case PatternPaint patternPaint: { + try { + +#if UseSurfacePattern + // would be nice to have: draw pattern without creating a pixpuf: + + using var paintSurface = CreateSurface(context, true); + + if (patternPaint.GetCairoPattern(Graphics, paintSurface, DisplayScale) is { } pattern) { + pattern.Extend = Cairo.Extend.Repeat; + context.SetSource(pattern); + pattern.Dispose(); + + + } else { + FillColor = paint.BackgroundColor; + } +#else + using var pixbuf = patternPaint.GetPatternBitmap(DisplayScale); + + if (pixbuf?.CreatePattern(DisplayScale) is { } pattern) { + pattern.Extend = Cairo.Extend.Repeat; + context.SetSource(pattern); + pattern.Dispose(); + } + +#endif + + } catch (Exception exc) { + System.Diagnostics.Debug.WriteLine(exc); + FillColor = paint.BackgroundColor; + } + + break; + } + + case ImagePaint {Image: GtkImage image} imagePaint: { + var pixbuf = image.NativeImage; + + if (pixbuf?.CreatePattern(DisplayScale) is { } pattern) { + try { + + context.SetSource(pattern); + pattern.Dispose(); + + } catch (Exception exc) { + System.Diagnostics.Debug.WriteLine(exc); + FillColor = paint.BackgroundColor; + } + } else { + FillColor = paint.BackgroundColor ?? Colors.White; + } + + break; + } + + case ImagePaint imagePaint: + FillColor = paint.BackgroundColor ?? Colors.White; + + break; + + default: + FillColor = paint.BackgroundColor ?? Colors.White; + + break; + } + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Shadow.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Shadow.cs new file mode 100644 index 000000000000..d460f44f7c91 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Shadow.cs @@ -0,0 +1,47 @@ +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public partial class PlatformCanvas { + + public void DrawShadow(bool fill) { + + if (CurrentState.Shadow != default) { + + using var path = Context.CopyPath(); + + Context.Save(); + + var shadowSurface = CreateSurface(Context); + + var shadowCtx = new Cairo.Context(shadowSurface); + + var shadow = CurrentState.Shadow; + + shadowCtx.AppendPath(path); + + if (fill) + shadowCtx.ClosePath(); + + var color = shadow.color.ToCairoColor(); + shadowCtx.SetSourceRGBA(color.R, color.G, color.B, color.A); + shadowCtx.Clip(); + + if (true) + shadowCtx.PaintWithAlpha(0.3); + else { + shadowCtx.LineWidth = 10; + shadowCtx.Stroke(); + } + + // shadowCtx.PopGroupToSource(); + Context.SetSource(shadowSurface, shadow.offset.Width, shadow.offset.Height); + Context.Paint(); + + shadowCtx.Dispose(); + + shadowSurface.Dispose(); + + Context.Restore(); + } + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Text.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Text.cs new file mode 100644 index 000000000000..3611a336af34 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Text.cs @@ -0,0 +1,51 @@ +using Microsoft.Maui.Graphics.Text; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public partial class PlatformCanvas +{ + internal TextLayout CreateTextLayout() + { + var layout = new TextLayout(Context) + .WithCanvasState(CurrentState); + + layout.BeforeDrawn = LayoutBeforeDrawn; + layout.AfterDrawn = LayoutAfterDrawn; + + return layout; + } + + private void LayoutBeforeDrawn(TextLayout layout) + { + DrawFillPaint(Context, CurrentState.FillPaint.paint, CurrentState.FillPaint.rectangle); + } + + private void LayoutAfterDrawn(TextLayout layout) { } + + public override void DrawString(string value, float x, float y, HorizontalAlignment horizontalAlignment) + { + using var layout = CreateTextLayout(); + layout.HorizontalAlignment = horizontalAlignment; + + layout.DrawString(value, x, y); + } + + public override void DrawString(string value, float x, float y, float width, float height, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment, TextFlow textFlow = TextFlow.ClipBounds, float lineSpacingAdjustment = 0) + { + using var layout = CreateTextLayout(); + layout.HorizontalAlignment = horizontalAlignment; + layout.VerticalAlignment = verticalAlignment; + layout.TextFlow = textFlow; + layout.LineSpacingAdjustment = lineSpacingAdjustment; + + layout.DrawString(value, x, y, width, height); + } + + [GtkMissingImplementation] + public override void DrawText(IAttributedText value, float x, float y, float width, float height) + { + using var layout = CreateTextLayout(); + + layout.DrawAttributedText(value, x, y, width, height); + } +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs new file mode 100644 index 000000000000..3927557ca7f6 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs @@ -0,0 +1,265 @@ +using System.Numerics; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public partial class PlatformCanvas : AbstractCanvas +{ + public PlatformCanvas() + : base(new PlatformCanvasStateService(), new PlatformStringSizeService ()) + { + } + + private Cairo.Context _context; + + public Cairo.Context Context + { + get => _context; + set + { + _context = default!; + ResetState(); + _context = value; + } + } + + public override void SaveState() + { + Context?.Save(); + base.SaveState(); + } + + public override bool RestoreState() + { + Context?.Restore(); + + return base.RestoreState(); + } + + public override bool Antialias + { + set => CurrentState.Antialias = CanvasExtensions.ToAntialias(value); + } + + public override float MiterLimit + { + set => CurrentState.MiterLimit = value; + } + + public override Color StrokeColor + { + set => CurrentState.StrokeColor = value.ToCairoColor(); + } + + public override LineCap StrokeLineCap + { + set => CurrentState.LineCap = value.ToLineCap(); + } + + public override LineJoin StrokeLineJoin + { + set => CurrentState.LineJoin = value.ToLineJoin(); + } + + protected override float PlatformStrokeSize + { + set => CurrentState.StrokeSize = value; + } + + public override Color FillColor + { + set => CurrentState.FillColor = value.ToCairoColor(); + } + + public override Color FontColor + { + set => CurrentState.FontColor = value.ToCairoColor(); + } + + public override IFont Font + { + set => CurrentState.Font = value; + } + + public override float FontSize + { + set => CurrentState.FontSize = value; + } + + public override float Alpha + { + set => CurrentState.Alpha = value; + } + + public override BlendMode BlendMode + { + set => CurrentState.BlendMode = value; + } + + protected override void PlatformSetStrokeDashPattern(float[] strokePattern, float strokeDashOffset, float strokeSize) + { + CurrentState.StrokeDashPattern = strokePattern; + } + + private void Draw(bool preserve = false) + { + Context.SetSourceRGBA(CurrentState.StrokeColor.R, CurrentState.StrokeColor.G, CurrentState.StrokeColor.B, CurrentState.StrokeColor.A * CurrentState.Alpha); + Context.LineWidth = CurrentState.StrokeSize; + Context.MiterLimit = CurrentState.MiterLimit; + Context.LineCap = CurrentState.LineCap; + Context.LineJoin = CurrentState.LineJoin; + + Context.SetDash(CurrentState.NativeDash, 0); + DrawShadow(false); + + if (preserve) + Context.StrokePreserve(); + else + { + Context.Stroke(); + } + } + + public void Fill(bool preserve = false) + { + + Context.SetSourceRGBA(CurrentState.FillColor.R, CurrentState.FillColor.G, CurrentState.FillColor.B, CurrentState.FillColor.A * CurrentState.Alpha); + + DrawShadow(true); + + DrawFillPaint(Context, CurrentState.FillPaint.paint, CurrentState.FillPaint.rectangle); + + if (preserve) + { + Context.FillPreserve(); + } + else + { + Context.Fill(); + CurrentState.FillPaint = default; + } + + } + + protected override void PlatformDrawLine(float x1, float y1, float x2, float y2) + { + AddLine(Context, x1, y1, x2, y2); + Draw(); + } + + protected override void PlatformDrawArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) + { + AddArc(Context, x, y, width, height, startAngle, endAngle, clockwise, closed); + Draw(); + + } + + protected override void PlatformDrawRectangle(float x, float y, float width, float height) + { + AddRectangle(Context, x, y, width, height); + Draw(); + } + + protected override void PlatformDrawRoundedRectangle(float x, float y, float width, float height, float radius) + { + AddRoundedRectangle(Context, x, y, width, height, radius); + Draw(); + } + + protected override void PlatformDrawEllipse(float x, float y, float width, float height) + { + AddEllipse(Context, x, y, width, height); + Draw(); + } + + protected override void PlatformDrawPath(PathF path) + { + AddPath(Context, path); + Draw(); + } + + protected override void PlatformRotate(float degrees, float radians, float x, float y) + { + Context.Translate(x, y); + Context.Rotate(radians); + Context.Translate(-x, -y); + } + + protected override void PlatformRotate(float degrees, float radians) + { + Context.Rotate(radians); + } + + protected override void PlatformScale(float fx, float fy) + { + Context.Scale(fx, fy); + } + + protected override void PlatformTranslate(float tx, float ty) + { + Context.Translate(tx, ty); + } + + [GtkMissingImplementation] + protected override void PlatformConcatenateTransform(Matrix3x2 transform) { } + + public override void SetShadow(SizeF offset, float blur, Color color) + { + CurrentState.Shadow = (offset, blur, color); + } + + public override void SetFillPaint(Paint paint, RectF rectangle) + { + CurrentState.FillPaint = (paint, rectangle); + } + + public override void FillArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise) + { + AddArc(Context, x, y, width, height, startAngle, endAngle, clockwise, true); + Fill(); + } + + public override void FillRectangle(float x, float y, float width, float height) + { + AddRectangle(Context, x, y, width, height); + Fill(); + } + + public override void FillRoundedRectangle(float x, float y, float width, float height, float cornerRadius) + { + AddRoundedRectangle(Context, x, y, width, height, cornerRadius); + Fill(); + } + + public override void FillEllipse(float x, float y, float width, float height) + { + AddEllipse(Context, x, y, width, height); + Fill(); + } + + public override void FillPath(PathF path, WindingMode windingMode) + { + Context.Save(); + Context.FillRule = windingMode.ToFillRule(); + AddPath(Context, path); + Fill(); + Context.Restore(); + } + + public override void DrawImage(IImage image, float x, float y, float width, float height) + { + if (image is GtkImage { NativeImage: { } pixbuf }) + { + DrawPixbuf(Context, pixbuf, x, y, width, height); + } + } + + [GtkMissingImplementation] + public override void SubtractFromClip(float x, float y, float width, float height) { } + + [GtkMissingImplementation] + public override void ClipPath(PathF path, WindingMode windingMode = WindingMode.NonZero) { } + + [GtkMissingImplementation] + public override void ClipRectangle(float x, float y, float width, float height) { } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasState.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasState.cs new file mode 100644 index 000000000000..ed66f64724b7 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasState.cs @@ -0,0 +1,80 @@ +using System; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public class PlatformCanvasState : CanvasState { + + public PlatformCanvasState() { + Alpha = 1; + + StrokeColor = Colors.Black.ToCairoColor(); + FontColor = StrokeColor; + FillColor = Colors.White.ToCairoColor(); + + MiterLimit = 10; + LineJoin = Cairo.LineJoin.Miter; + LineCap = Cairo.LineCap.Butt; + } + + public PlatformCanvasState(PlatformCanvasState prototype) + : base(prototype) + { + Antialias = prototype.Antialias; + MiterLimit = prototype.MiterLimit; + StrokeColor = prototype.StrokeColor; + LineCap = prototype.LineCap; + LineJoin = prototype.LineJoin; + FillColor = prototype.FillColor; + + Font = prototype.Font; + FontSize = prototype.FontSize; + FontColor = prototype.FontColor; + + BlendMode = prototype.BlendMode; + Alpha = prototype.Alpha; + + Shadow = prototype.Shadow; + FillPaint = prototype.FillPaint; + + } + + public Cairo.Antialias Antialias { get; set; } + + public double MiterLimit { get; set; } + + public Cairo.Color StrokeColor { get; set; } + + public Cairo.LineCap LineCap { get; set; } + + public Cairo.LineJoin LineJoin { get; set; } + + public Cairo.Color FillColor { get; set; } + + public Cairo.Color FontColor { get; set; } + + public IFont? Font { get; set; } + + public float FontSize { get; set; } + + public BlendMode BlendMode { get; set; } + + public float Alpha { get; set; } + + private readonly double[] zerodash = new double[0]; + + public double[] NativeDash => StrokeDashPattern != null ? Array.ConvertAll(StrokeDashPattern, f => (double) f) : zerodash; + + public (SizeF offset, float blur, Color color) Shadow { get; set; } + + public (Paint paint, RectF rectangle) FillPaint { get; set; } + + public override void Dispose() { + + FillPaint = default; + Shadow = default; + StrokeDashPattern = default; + + base.Dispose(); + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasStateService.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasStateService.cs new file mode 100644 index 000000000000..4af0716a209b --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvasStateService.cs @@ -0,0 +1,9 @@ +using System; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public class PlatformCanvasStateService : ICanvasStateService { + public PlatformCanvasState CreateNew (object context) => new() { }; + + public PlatformCanvasState CreateCopy (PlatformCanvasState prototype) => new(prototype); +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs new file mode 100644 index 000000000000..b374caf7bba7 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs @@ -0,0 +1,47 @@ +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public class PlatformStringSizeService : IStringSizeService { + Cairo.Context? _sharedContext; + + internal Cairo.Context SharedContext { + get { + if (_sharedContext == null) { + using var sf = new Cairo.ImageSurface (Cairo.Format.ARGB32, 1, 1); + _sharedContext = new Cairo.Context (sf); + } + + return _sharedContext; + } + } + + private static TextLayout? _textLayout; + + private TextLayout SharedTextLayout => _textLayout ??= new TextLayout (SharedContext) { + HeightForWidth = true + }; + + public SizeF GetStringSize (string value, IFont font, float fontSize) { + if (string.IsNullOrEmpty (value)) + return new SizeF (); + + lock (SharedTextLayout) { + SharedTextLayout.SetFontStyle (font, fontSize); + var size = SharedTextLayout.GetPixelSize (value); + return new SizeF (size.width, size.height); + } + } + + public SizeF GetStringSize (string value, IFont font, float aFontSize, HorizontalAlignment aHorizontalAlignment, VerticalAlignment aVerticalAlignment) { + if (string.IsNullOrEmpty (value)) + return new SizeF (); + + lock (SharedTextLayout) { + SharedTextLayout.SetFontStyle (font, aFontSize); + + SharedTextLayout.HorizontalAlignment = aHorizontalAlignment; + SharedTextLayout.VerticalAlignment = aVerticalAlignment; + var size = SharedTextLayout.GetPixelSize (value); + return new SizeF (size.width, size.height); + } + } +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs new file mode 100644 index 000000000000..da52e82233cf --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs @@ -0,0 +1,382 @@ +using System; +using Microsoft.Maui.Graphics.Extras; +using Microsoft.Maui.Graphics.Text; +using Pango; +using Context = Cairo.Context; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +/// +/// Measures and draws text using +/// https://developer.gnome.org/pango/1.46/pango-Layout-Objects.html +/// https://developer.gnome.org/gdk3/stable/gdk3-Pango-Interaction.html +/// +internal class TextLayout : IDisposable { + + private Context _context; + + public TextLayout(Context context) { + + _context = context; + } + + public Context Context => _context; + + public string FontFamily { + get { + if (string.IsNullOrEmpty (_fontFamily)) { + _fontFamily = Gdk.PangoHelper.ContextGet ().FontDescription.Family; + } + + return _fontFamily; + } + set { + if (string.Equals (_fontFamily, value)) + return; + _fontFamily = value; + FontDescriptionChanged (); + } + } + + public Pango.Weight Weight { + get => _weight; + set { + if (_weight == value) + return; + + _weight = value; + FontDescriptionChanged (); + } + } + + public Pango.Style Style { + get => _style; + set { + if (_style == value) + return; + + _style = value; + FontDescriptionChanged (); + } + } + + public int PangoFontSize { + get { + if (_pangoFontSize == -1) { + _pangoFontSize = Gdk.PangoHelper.ContextGet ().FontDescription.Size; + } + + return _pangoFontSize; + } + set { + if (_pangoFontSize == value) + return; + + _pangoFontSize = value; + FontDescriptionChanged (); + } + } + + private Pango.Layout? _layout; + private bool _layoutOwned = false; + + public TextFlow TextFlow { get; set; } = TextFlow.OverflowBounds; + + public HorizontalAlignment HorizontalAlignment { get; set; } + + public VerticalAlignment VerticalAlignment { get; set; } + + public LineBreakMode LineBreakMode { get; set; } = LineBreakMode.EndTruncation; + + public Cairo.Color TextColor { get; set; } + + public float LineSpacingAdjustment { get; set; } + + public bool HeightForWidth { get; set; } = true; + + public Action BeforeDrawn { get; set; } + + public Action AfterDrawn { get; set; } + + public void SetLayout(Pango.Layout value) { + _layout = value; + _layoutOwned = false; + } + + private Pango.FontDescription? _fontDescription; + + void FontDescriptionChanged () { + if (_fontDescriptionOwned && _fontDescription is {}) { + _fontDescription.Family = FontFamily; + _fontDescription.Weight = Weight; + _fontDescription.Style = Style; + _fontDescription.Size = PangoFontSize; + } + } + + private bool _fontDescriptionOwned = false; + private string _fontFamily; + private Weight _weight = Pango.Weight.Normal; + private Style _style = Pango.Style.Normal; + private int _pangoFontSize = -1; + + public Pango.FontDescription FontDescription { + get { + if (_fontDescription == null) { + _fontDescription = new Pango.FontDescription { + Family = FontFamily, + Weight = Weight, + Style = Style, + Size = PangoFontSize + }; + + _fontDescriptionOwned = true; + } + + return _fontDescription; + } + set { + if (Equals (_fontDescription, value)) + return; + _fontDescription = value; + _fontDescriptionOwned = false; + } + } + + public Pango.Layout GetLayout() { + if (_layout == null) { + _layout = Pango.CairoHelper.CreateLayout(Context); + _layoutOwned = true; + } + + if (_layout.FontDescription != FontDescription) { + _layout.FontDescription = FontDescription; + } + + // align & justify per Size + _layout.Alignment = HorizontalAlignment.ToPango(); + _layout.Justify = HorizontalAlignment.HasFlag(HorizontalAlignment.Justified); + _layout.Wrap = LineBreakMode.ToPangoWrap(); + _layout.Ellipsize = LineBreakMode.ToPangoEllipsize(); + + // _layout.SingleParagraphMode = true; + return _layout; + } + + public void Dispose() { + if (_fontDescriptionOwned) { + _fontDescription?.Dispose(); + } + + if (_layoutOwned) { + _layout?.Dispose(); + } + } + + public (int width, int height) GetPixelSize(string text, double desiredSize = -1d) { + + var layout = GetLayout(); + + if (desiredSize > 0) { + if (HeightForWidth) { + layout.Width = desiredSize.ScaledToPango(); + } else { + layout.Height = desiredSize.ScaledToPango(); + } + } + + layout.SetText(text); + layout.GetPixelSize(out var textWidth, out var textHeight); + + return (textWidth, textHeight); + } + + private void Draw() { + if (_layout == null) + return; + + Context.SetSourceRGBA(TextColor.R, TextColor.G, TextColor.B, TextColor.A); + + BeforeDrawn?.Invoke(this); + + // https://developer.gnome.org/pango/1.46/pango-Cairo-Rendering.html#pango-cairo-show-layout + // Draws a PangoLayout in the specified cairo context. + // The top-left corner of the PangoLayout will be drawn at the current point of the cairo context. + Pango.CairoHelper.ShowLayout(Context, _layout); + } + + private float GetX(float x, int width) => HorizontalAlignment switch { + HorizontalAlignment.Left => x, + HorizontalAlignment.Right => x - width, + HorizontalAlignment.Center => x - width / 2f, + _ => x + }; + + private float GetY(float y, int height) => VerticalAlignment switch { + VerticalAlignment.Top => y, + VerticalAlignment.Center => y - height, + VerticalAlignment.Bottom => y - height / 2f, + _ => y + }; + + private float GetDx(int width) => HorizontalAlignment switch { + HorizontalAlignment.Left => 0, + HorizontalAlignment.Center => width / 2f, + HorizontalAlignment.Right => width, + _ => 0 + }; + + private float GetDy(int height) => VerticalAlignment switch { + VerticalAlignment.Top => 0, + VerticalAlignment.Center => height / 2f, + VerticalAlignment.Bottom => height, + _ => 0 + }; + + public void DrawString(string value, float x, float y) { + + Context.Save(); + + var layout = GetLayout(); + layout.SetText(value); + layout.GetPixelSize(out var textWidth, out var textHeight); + + if (layout.IsWrapped || layout.IsEllipsized) { + if (HeightForWidth) + layout.Width = textWidth.ScaledToPango(); + else + layout.Height = textWidth.ScaledToPango(); + } + + var mX = GetX(x, textWidth); + var mY = GetY(y, textHeight); + Context.MoveTo(mX, mY); + Draw(); + Context.Restore(); + + } + + public void DrawString(string value, float x, float y, float width, float height) { + + Context.Save(); + Context.Translate(x, y); + + var layout = GetLayout(); + layout.SetText(value); + + if (HeightForWidth) { + layout.Width = width.ScaledToPango(); + + if (TextFlow == TextFlow.ClipBounds) { + layout.Height = height.ScaledToPango(); + } + } else { + layout.Height = height.ScaledToPango(); + + if (TextFlow == TextFlow.ClipBounds) { + layout.Width = width.ScaledToPango(); + } + } + + if (TextFlow == TextFlow.ClipBounds && !layout.IsEllipsized) { + layout.Ellipsize = Pango.EllipsizeMode.End; + } + + if (!layout.IsWrapped || !layout.IsEllipsized) { + layout.Wrap = Pango.WrapMode.Char; + } + + layout.GetPixelExtents(out var inkRect, out var logicalRect); + + var mX = HeightForWidth ? + 0 : + TextFlow == TextFlow.ClipBounds ? + Math.Max(0, GetDx((int) width - logicalRect.Width - logicalRect.X)) : + GetDx((int) width - logicalRect.Width - inkRect.X); + + var mY = !HeightForWidth ? + 0 : + TextFlow == TextFlow.ClipBounds ? + Math.Max(0, GetDy((int) height - inkRect.Height - inkRect.Y)) : + GetDy((int) height - inkRect.Height - inkRect.Y); + + if (mY + inkRect.Height > height && TextFlow == TextFlow.ClipBounds && !HeightForWidth) { + mY = 0; + } + + Context.MoveTo(mX, mY); + Draw(); + Context.Restore(); + } + + [GtkMissingImplementation] + public void DrawAttributedText(IAttributedText value, float f, float f1, float width, float height) { } + + #region future use for better TextFlow.ClipBounds - algo without Elipsize + + /// + /// future use for + /// + private void ClampToContext() { + if (_layout == null || _context == null) + return; + + var ctxSize = Context.ClipExtents(); + + _layout.GetExtents(out var inkRect, out var logicalRect); + var maxW = ctxSize.Width.ScaledToPango(); + var maxH = ctxSize.Height.ScaledToPango(); + + while (logicalRect.Width > maxW) { + if (!_layout.IsWrapped) { + _layout.Wrap = Pango.WrapMode.Char; + } + + _layout.Width = maxW; + _layout.GetExtents(out inkRect, out logicalRect); + maxW -= 1.ScaledToPango(); + } + + while (logicalRect.Height > maxH) { + if (!_layout.IsWrapped) { + _layout.Wrap = Pango.WrapMode.Char; + } + + _layout.Height = maxH; + _layout.GetExtents(out inkRect, out logicalRect); + maxH -= 1.ScaledToPango(); + } + + var resLr = new Size(logicalRect.Width.ScaledFromPango(), logicalRect.Height.ScaledFromPango()); + + } + + /// + /// Get the distance in pixels between the top of the layout bounds and the first line's baseline + /// + public double GetBaseline() { + // Just get the first line + using var iter = GetLayout().Iter; + + return Pango.Units.ToPixels(iter.Baseline); + } + + /// + /// Get the distance in pixels between the top of the layout bounds and the first line's meanline (usually equivalent to the baseline minus half of the x-height) + /// + public double GetMeanline() { + var baseline = 0; + + var layout = GetLayout(); + using var iter = layout.Iter; + + baseline = iter.Baseline; + + var font = layout.Context.LoadFont(layout.FontDescription); + + return Pango.Units.ToPixels(baseline - font.GetMetrics(Pango.Language.Default).StrikethroughPosition); + } + + #endregion + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs new file mode 100644 index 000000000000..17218ea04ec0 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs @@ -0,0 +1,81 @@ +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +internal static class TextLayoutExtensions { + + public static void SetFontStyle(this TextLayout it, IFont font, double? fontSize = null, int? weight = null, FontStyleType? fontStyleType = null) { + + if (font is { }) + it.FontFamily = font.Name; + + if (weight.HasValue) + it.Weight = weight.Value.ToPangoWeight(); + + if (fontSize.HasValue) + it.PangoFontSize = fontSize.Value.ScaledToPango(); + + if (fontStyleType.HasValue) + it.Style = fontStyleType.Value switch + { + FontStyleType.Normal => Pango.Style.Normal, + FontStyleType.Italic => Pango.Style.Italic, + FontStyleType.Oblique => Pango.Style.Oblique, + _ => Pango.Style.Normal, + }; + } + + public static void SetCanvasState(this TextLayout it, PlatformCanvasState state) { + + var font = (state?.Font ?? Font.Default).ToFontDescription(); + + it.FontFamily = font.Family; + it.Weight = font.Weight; + + it.PangoFontSize = state?.FontSize.ScaledToPango() ?? 10; + it.TextColor = state?.FontColor ?? new Cairo.Color(); + } + + public static TextLayout WithCanvasState(this TextLayout it, PlatformCanvasState state) { + it.SetCanvasState(state); + + return it; + } + + public static Size GetSize(this TextLayout it, string text, float textHeigth) { + var (width, height) = it.GetPixelSize(text, (int) textHeigth); + + return new Size(width, height); + } + + public static Pango.Alignment ToPango(this HorizontalAlignment it) => it switch { + HorizontalAlignment.Center => Pango.Alignment.Center, + HorizontalAlignment.Right => Pango.Alignment.Right, + _ => Pango.Alignment.Left + }; + + public static Pango.WrapMode ToPangoWrap(this Extras.LineBreakMode it) { + if (it.HasFlag(Extras.LineBreakMode.CharacterWrap)) + return Pango.WrapMode.Char; + else if (it.HasFlag(Extras.LineBreakMode.WordCharacterWrap)) + return Pango.WrapMode.WordChar; + else + return Pango.WrapMode.Word; + } + + public static Pango.EllipsizeMode ToPangoEllipsize(this Extras.LineBreakMode it) { + + if (it.HasFlag(Extras.LineBreakMode.Elipsis | Extras.LineBreakMode.End)) + return Pango.EllipsizeMode.End; + + if (it.HasFlag(Extras.LineBreakMode.Elipsis | Extras.LineBreakMode.Center)) + return Pango.EllipsizeMode.Middle; + + if (it.HasFlag(Extras.LineBreakMode.Elipsis | Extras.LineBreakMode.Start)) + return Pango.EllipsizeMode.Start; + + if (it.HasFlag(Extras.LineBreakMode.Elipsis)) + return Pango.EllipsizeMode.End; + + return Pango.EllipsizeMode.None; + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/Views/GtkGraphicsView.cs b/src/Graphics/src/Graphics.Gtk/Gtk/Views/GtkGraphicsView.cs new file mode 100644 index 000000000000..11f05d8d166b --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/Views/GtkGraphicsView.cs @@ -0,0 +1,70 @@ +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public class GtkGraphicsView : global::Gtk.EventBox +{ + private IDrawable? _drawable; + private RectF _dirtyRect; + private Color? _backgroundColor; + + public GtkGraphicsView() + { + AppPaintable = true; + VisibleWindow = false; + } + + protected override bool OnDrawn(Cairo.Context context) + { + if (_drawable == null) + { + return base.OnDrawn(context); + } + + // ensure cr does not get disposed before it is passed back to Gtk + var canvas = new PlatformCanvas { Context = context }; + + canvas.SaveState(); + + if (_backgroundColor != null) + { + canvas.FillColor = _backgroundColor; + canvas.FillRectangle(_dirtyRect); + } + else + { + canvas.ClipRectangle(_dirtyRect); + } + + canvas.RestoreState(); + Drawable?.Draw(canvas, _dirtyRect); + + return base.OnDrawn(context); + } + + public Color? BackgroundColor + { + get => _backgroundColor; + set + { + _backgroundColor = value; + QueueDraw(); + } + } + + public IDrawable? Drawable + { + get => _drawable; + set + { + _drawable = value; + QueueDraw(); + } + } + + protected override void OnSizeAllocated(Gdk.Rectangle allocation) + { + _dirtyRect.Width = allocation.Width; + _dirtyRect.Height = allocation.Height; + base.OnSizeAllocated(allocation); + } + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs b/src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs new file mode 100644 index 000000000000..e9bc659b644b --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs @@ -0,0 +1,3 @@ +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public class GtkMissingImplementationAttribute : System.Attribute { } \ No newline at end of file From bdca567017dd973310c4fea1e4fafc9a0505c346 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 18 Aug 2022 14:28:10 +0200 Subject: [PATCH 155/425] [Graphics.Gtk] move GraphicsTester.Gtk --- Microsoft.Maui.sln | 7 ++ .../GraphicsTester.Gtk.csproj | 19 ++++ .../samples/GraphicsTester.Gtk/MainWindow.cs | 101 ++++++++++++++++++ .../samples/GraphicsTester.Gtk/Program.cs | 81 ++++++++++++++ .../samples/GraphicsTester.Gtk/StartupTest.cs | 36 +++++++ 5 files changed, 244 insertions(+) create mode 100644 src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj create mode 100644 src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs create mode 100644 src/Graphics/samples/GraphicsTester.Gtk/Program.cs create mode 100644 src/Graphics/samples/GraphicsTester.Gtk/StartupTest.cs diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index feedfe0cdd59..22d67befc940 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -234,6 +234,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsTester.Mac", "src\G EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsTester.MacCatalyst", "src\Graphics\samples\GraphicsTester.MacCatalyst\GraphicsTester.MacCatalyst.csproj", "{B3DD0741-2EC3-4A54-82B7-73923DE4CF48}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsTester.Gtk", "src\Graphics\samples\GraphicsTester.Gtk\GraphicsTester.Gtk.csproj", "{624D161D-762C-45F7-9CBC-9929BA5D13EF}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsTester.Portable", "src\Graphics\samples\GraphicsTester.Portable\GraphicsTester.Portable.csproj", "{546614BB-07AA-4E8E-B6AE-EBDC183C4DAB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsTester.Skia.Console", "src\Graphics\samples\GraphicsTester.Skia.Console\GraphicsTester.Skia.Console.csproj", "{EF6ACA06-D4DF-4C21-9F65-FBFEC6325094}" @@ -636,6 +638,10 @@ Global {4EDE89FC-7C84-4855-8DD8-D7C8B128A974}.Debug|Any CPU.Build.0 = Debug|Any CPU {4EDE89FC-7C84-4855-8DD8-D7C8B128A974}.Release|Any CPU.ActiveCfg = Release|Any CPU {4EDE89FC-7C84-4855-8DD8-D7C8B128A974}.Release|Any CPU.Build.0 = Release|Any CPU + {624D161D-762C-45F7-9CBC-9929BA5D13EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {624D161D-762C-45F7-9CBC-9929BA5D13EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {624D161D-762C-45F7-9CBC-9929BA5D13EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {624D161D-762C-45F7-9CBC-9929BA5D13EF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -754,6 +760,7 @@ Global {F351A992-18E4-473C-8ADD-2BA0BAA7B5A2} = {1BA0121E-0B83-4C8F-81BE-C293E7E35DCE} {F68932B0-81A2-4CC3-A4F7-28091EE91B23} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E} {4EDE89FC-7C84-4855-8DD8-D7C8B128A974} = {42AB9AE1-631D-4AD4-85B7-910FF0940BDB} + {624D161D-762C-45F7-9CBC-9929BA5D13EF} = {1BA0121E-0B83-4C8F-81BE-C293E7E35DCE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50} diff --git a/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj new file mode 100644 index 000000000000..bca0dee7bc9f --- /dev/null +++ b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj @@ -0,0 +1,19 @@ + + + + WinExe + net6.0 + GraphicsTester.Gtk + + GraphicsTester.Gtk + + + + + + + + + + + diff --git a/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs b/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs new file mode 100644 index 000000000000..4ed5163c3e01 --- /dev/null +++ b/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs @@ -0,0 +1,101 @@ +// This is free and unencumbered software released into the public domain. +// Happy coding!!! - GtkSharp Team + +using System; +using System.Collections.Generic; +using GraphicsTester.Scenarios; +using Gtk; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; + +namespace GraphicsTester.Gtk; + +class MainWindow : Window +{ + private TreeView _treeView; + private TreeStore _store; + private Dictionary _items; + private GtkGraphicsView _gtkGtkGraphicsView; + + public MainWindow() : base(WindowType.Toplevel) + { + // Setup GUI + WindowPosition = WindowPosition.Center; + DefaultSize = new Gdk.Size(800, 600); + + var headerBar = new HeaderBar { ShowCloseButton = true, Title = $"{typeof(Point).Namespace} Gtk Sample Application" }; + + var btnClickMe = new Button { AlwaysShowImage = true, Image = Image.NewFromIconName("document-new-symbolic", IconSize.Button) }; + + headerBar.PackStart(btnClickMe); + + Titlebar = headerBar; + + var hpanned = new HPaned { Position = 300 }; + + _treeView = new TreeView { HeadersVisible = false }; + + var scroll0 = new ScrolledWindow { Child = _treeView }; + + hpanned.Pack1(scroll0, true, true); + + _gtkGtkGraphicsView = new GtkGraphicsView { BackgroundColor = Colors.White }; + + var scroll1 = new ScrolledWindow { Child = _gtkGtkGraphicsView }; + + hpanned.Pack2(scroll1, true, true); + + Child = hpanned; + + // Fill up data + FillUpTreeView(); + + // Connect events + _treeView.Selection.Changed += Selection_Changed; + Destroyed += (sender, e) => this.Close(); + + var scenario = ScenarioList.Scenarios[0]; + _gtkGtkGraphicsView.Drawable = scenario; + } + + private void Selection_Changed(object sender, EventArgs e) + { + if (!_treeView.Selection.GetSelected(out TreeIter iter)) return; + + var s = _store.GetValue(iter, 0).ToString(); + + if (!_items.TryGetValue(s, out var scenario)) return; + + _gtkGtkGraphicsView.Drawable = scenario; + _gtkGtkGraphicsView.HeightRequest = (int)scenario.Height; + _gtkGtkGraphicsView.WidthRequest = (int)scenario.Width; + } + + private void FillUpTreeView() + { + // Init cells + var cellName = new CellRendererText(); + + // Init columns + var columeSections = new TreeViewColumn { Title = "Sections" }; + + columeSections.PackStart(cellName, true); + + columeSections.AddAttribute(cellName, "text", 0); + + _treeView.AppendColumn(columeSections); + + // Init treeview + _store = new TreeStore(typeof(string)); + _treeView.Model = _store; + _items = new Dictionary(); + + foreach (var scenario in ScenarioList.Scenarios) + { + _store.AppendValues(scenario.ToString()); + _items[scenario.ToString()] = scenario; + } + + _treeView.ExpandAll(); + } +} \ No newline at end of file diff --git a/src/Graphics/samples/GraphicsTester.Gtk/Program.cs b/src/Graphics/samples/GraphicsTester.Gtk/Program.cs new file mode 100644 index 000000000000..1d40f3a57115 --- /dev/null +++ b/src/Graphics/samples/GraphicsTester.Gtk/Program.cs @@ -0,0 +1,81 @@ +// This is free and unencumbered software released into the public domain. +// Happy coding!!! - GtkSharp Team + +using System; +using Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; + +namespace GraphicsTester.Gtk; + +class Program +{ + public static Application App; + public static Window Win; + + [STAThread] + public static void Main(string[] args) + { + Application.Init(); + + App = new Application("Microsoft.Maui.Graphics.Samples", GLib.ApplicationFlags.None); + + App.Startup += (s, e) => StartupTests(); + + App.Startup += (s, e) => + { + Win = new MainWindow(); + App.AddWindow(Win); + + var menu = new GLib.Menu(); + + menu.AppendItem(new GLib.MenuItem("About", "app.about")); + menu.AppendItem(new GLib.MenuItem("Quit", "app.quit")); + App.AppMenu = menu; + + var aboutAction = new GLib.SimpleAction("about", null); + aboutAction.Activated += AboutActivated; + App.AddAction(aboutAction); + + var quitAction = new GLib.SimpleAction("quit", null); + quitAction.Activated += QuitActivated; + App.AddAction(quitAction); + + Win.ShowAll(); + }; + + App.Activated += (s, e) => + { + App.Windows[0].Present(); + }; + + ((GLib.Application)App).Run(); + } + + private static void StartupTests() + { + StartupTest.InitTests(); + } + + private static void AboutActivated(object sender, EventArgs e) + { + var dialog = new AboutDialog + { + TransientFor = Win, + ProgramName = $"{nameof(GtkGraphicsView)} Sample Application", + Version = "1.0.0.0", + Comments = $"A gtk sample application for the {typeof(Microsoft.Maui.Graphics.Point).Namespace} project.", + LogoIconName = "system-run-symbolic", + License = "This sample application is licensed under public domain.", + Website = "https://www.github.com/dotnet/Microsoft.Maui.Graphics", + WebsiteLabel = "Microsoft.Maui.Graphics Website" + }; + + dialog.Run(); + dialog.Hide(); + } + + private static void QuitActivated(object sender, EventArgs e) + { + ((GLib.Application)App).Quit(); + } +} \ No newline at end of file diff --git a/src/Graphics/samples/GraphicsTester.Gtk/StartupTest.cs b/src/Graphics/samples/GraphicsTester.Gtk/StartupTest.cs new file mode 100644 index 000000000000..c7e65423df55 --- /dev/null +++ b/src/Graphics/samples/GraphicsTester.Gtk/StartupTest.cs @@ -0,0 +1,36 @@ +using System; +using Microsoft.Maui.Graphics.Platform.Gtk; + +namespace GraphicsTester.Gtk; + +public class StartupTest +{ + public static void InitTests() + { + var canvas = new PlatformCanvas(); + + Console.WriteLine(FontExtensions.Default); + + using var desc = Pango.FontDescription.FromString(FontExtensions.Default.Family); + Console.WriteLine(desc); + + var testStr = "123456"; + var size = canvas.GetStringSize(testStr, null, -1); + Console.WriteLine($"{testStr} : {size}"); + + size = canvas.GetStringSize(testStr, null, size.Width / 2); + Console.WriteLine($"{testStr} : {size}"); + + Console.WriteLine($"ScreenResolution {HardwareInformations.DefaultScreen.Resolution}"); + Console.WriteLine($"{nameof(HardwareInformations.CurrentScaleFaktor)} {HardwareInformations.CurrentScaleFaktor}"); + } + + void Notes() + { + // for context; + var x = typeof(Gdk.CairoHelper); + + // for fonts: + var y = typeof(Pango.CairoHelper); + } +} \ No newline at end of file From 7b9792f64391723c169d3fd6fa5b8d7a652e2e46 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 18 Aug 2022 14:49:15 +0200 Subject: [PATCH 156/425] [Graphics.Gtk] add Graphics.Gtk & GraphicsTester.Gtk to Microsoft.Maui.Graphics.slnf --- Microsoft.Maui.Graphics.slnf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Microsoft.Maui.Graphics.slnf b/Microsoft.Maui.Graphics.slnf index b3ab761d769f..0b3bcba48995 100644 --- a/Microsoft.Maui.Graphics.slnf +++ b/Microsoft.Maui.Graphics.slnf @@ -13,9 +13,11 @@ "src\\Graphics\\samples\\GraphicsTester.Skia.Windows\\GraphicsTester.Skia.Windows.csproj", "src\\Graphics\\samples\\GraphicsTester.WinUI.Desktop\\GraphicsTester.WinUI.Desktop.csproj", "src\\Graphics\\samples\\GraphicsTester.iOS\\GraphicsTester.iOS.csproj", + "src\\Graphics\\samples\\GraphicsTester.Gtk\\GraphicsTester.Gtk.csproj", "src\\Graphics\\src\\Graphics.Skia.GtkSharp\\Graphics.Skia.GtkSharp.csproj", "src\\Graphics\\src\\Graphics.Skia.WPF\\Graphics.Skia.WPF.csproj", "src\\Graphics\\src\\Graphics.Skia\\Graphics.Skia.csproj", + "src\\Graphics\\src\\Graphics.Gtk\\Graphics.Gtk.csproj", "src\\Graphics\\src\\Graphics.Win2D\\Graphics.Win2D.csproj", "src\\Graphics\\src\\Graphics\\Graphics.csproj", "src\\Graphics\\src\\Text.Markdig\\Graphics.Text.Markdig.csproj", @@ -23,4 +25,4 @@ "src\\Graphics\\tests\\Graphics.Tests\\Graphics.Tests.csproj" ] } -} \ No newline at end of file +} From 0f1496ffb0963681fc420de1b8dd26fda2965ba1 Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Fri, 19 Aug 2022 15:52:30 +0200 Subject: [PATCH 157/425] Delete Microsoft.Maui.sln.DotSettings --- Microsoft.Maui.sln.DotSettings | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 Microsoft.Maui.sln.DotSettings diff --git a/Microsoft.Maui.sln.DotSettings b/Microsoft.Maui.sln.DotSettings deleted file mode 100644 index 06b71d5de1e2..000000000000 --- a/Microsoft.Maui.sln.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - False \ No newline at end of file From 48ba4a13ccf2719c8c14066de034f0ffdea4b721 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 22 Aug 2022 16:14:27 +0200 Subject: [PATCH 158/425] [Gtk] introduce GtkSharpPackageVersion in Microsoft.Extensions.targets & Versions.props --- eng/Microsoft.Extensions.targets | 4 ++++ eng/Versions.props | 1 + 2 files changed, 5 insertions(+) diff --git a/eng/Microsoft.Extensions.targets b/eng/Microsoft.Extensions.targets index 5ad399a2a787..77c00a70e15d 100644 --- a/eng/Microsoft.Extensions.targets +++ b/eng/Microsoft.Extensions.targets @@ -153,5 +153,9 @@ Update="Fizzler" Version="$(FizzlerPackageVersion)" /> + diff --git a/eng/Versions.props b/eng/Versions.props index 2a501ccb09ac..9762a354aeb4 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -64,6 +64,7 @@ 0.9.0 0.5.13 1.2.0 + 3.24.24.64 From d8f0c30543b65409b9275ec215fd222a58f68a6e Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 22 Aug 2022 16:16:08 +0200 Subject: [PATCH 159/425] [Graphics.Gtk] adjust csproj-files with _MauiDotNetTfm & adjust Project Sdk --- .../samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj | 2 +- src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj index bca0dee7bc9f..07b5e81457de 100644 --- a/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj +++ b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj @@ -2,7 +2,7 @@ WinExe - net6.0 + $(_MauiDotNetTfm) GraphicsTester.Gtk GraphicsTester.Gtk diff --git a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj index 3f02c5cb3e2b..0278d774d482 100644 --- a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj +++ b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj @@ -1,7 +1,7 @@ - + - netstandard2.1;netstandard2.0 + netstandard2.1;netstandard2.0;$(_MauiDotNetTfm) Microsoft.Maui.Graphics.Gtk @@ -9,10 +9,10 @@ $(NoWarn);CA1307;CA1309;CS8603;CS8618;CS0162 - + - + From 3ca6c0819356a893354e4f938399d067819457b6 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 22 Aug 2022 16:19:26 +0200 Subject: [PATCH 160/425] [Graphics.Gtk] move LineBreakMode.cs to Microsoft.Maui.Graphics.Platform.Gtk & renamings to be more convergent with Maui.Core LineBreakMode-Api --- .../src/Graphics.Gtk/Extras/LineBreakMode.cs | 41 ------------------- .../src/Graphics.Gtk/Gtk/LineBreakMode.cs | 37 +++++++++++++++++ .../src/Graphics.Gtk/Gtk/TextLayout.cs | 2 +- .../Graphics.Gtk/Gtk/TextLayoutExtensions.cs | 18 ++++---- 4 files changed, 48 insertions(+), 50 deletions(-) delete mode 100644 src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/LineBreakMode.cs diff --git a/src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs b/src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs deleted file mode 100644 index 8a626b1d028d..000000000000 --- a/src/Graphics/src/Graphics.Gtk/Extras/LineBreakMode.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -// copied from: Microsoft.Maui/Core/src/Primitives/LineBreakMode.cs -// merged with: Xwt.Drawing/TextLayout.cs TextTrimming - -namespace Microsoft.Maui.Graphics.Extras; - -[Flags] -public enum LineBreakMode { - - None = 0, - - Wrap = 0x1 << 0, - Truncation = 0x1 << 1, - Elipsis = 0x1 << 2, - - Character = 0x1 << 3, - Word = 0x1 << 4, - - Start = 0x1 << 5, - Center = 0x1 << 6, - End = 0x1 << 7, - - NoWrap = None, - - WordWrap = Wrap | Word | End, - CharacterWrap = Wrap | Character | End, - WordCharacterWrap = Wrap | Word | Character | End, - - StartTruncation = Truncation | Character | Start, - EndTruncation = Truncation | Character | End, - CenterTruncation = Truncation | Character | Center, - - HeadTruncation = StartTruncation, - TailTruncation = EndTruncation, - MiddleTruncation = CenterTruncation, - - WordElipsis = Elipsis | Word | End, - CharacterElipsis = Elipsis | Character | End, - -} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/LineBreakMode.cs b/src/Graphics/src/Graphics.Gtk/Gtk/LineBreakMode.cs new file mode 100644 index 000000000000..4b6e4995ccc9 --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/LineBreakMode.cs @@ -0,0 +1,37 @@ +using System; + +// copied from: Microsoft.Maui/Core/src/Primitives/LineBreakMode.cs +// merged with: Xwt.Drawing/TextLayout.cs TextTrimming + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +[Flags] +public enum LineBreakMode { + + None = 0, + + Wrap = 0x1 << 0, + Truncation = 0x1 << 1, + Ellipsis = 0x1 << 2, + + Character = 0x1 << 3, + Word = 0x1 << 4, + + Head = 0x1 << 5, + Middle = 0x1 << 6, + Tail = 0x1 << 7, + + NoWrap = None, + + WordWrap = Wrap | Word | Tail, + CharacterWrap = Wrap | Character | Tail, + WordCharacterWrap = Wrap | Word | Character | Tail, + + HeadTruncation = Truncation | Character | Head, + TailTruncation = Truncation | Character | Tail, + MiddleTruncation = Truncation | Character | Middle, + + WordElipsis = Ellipsis | Word | Tail, + CharacterElipsis = Ellipsis | Character | Tail, + +} \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs index da52e82233cf..baf2a700e50c 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs @@ -86,7 +86,7 @@ public int PangoFontSize { public VerticalAlignment VerticalAlignment { get; set; } - public LineBreakMode LineBreakMode { get; set; } = LineBreakMode.EndTruncation; + public LineBreakMode LineBreakMode { get; set; } = LineBreakMode.TailTruncation; public Cairo.Color TextColor { get; set; } diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs index 17218ea04ec0..9f8d012087a3 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs @@ -52,27 +52,29 @@ public static Size GetSize(this TextLayout it, string text, float textHeigth) { _ => Pango.Alignment.Left }; - public static Pango.WrapMode ToPangoWrap(this Extras.LineBreakMode it) { + public static Pango.WrapMode ToPangoWrap(this Extras.LineBreakMode it) + { if (it.HasFlag(Extras.LineBreakMode.CharacterWrap)) return Pango.WrapMode.Char; - else if (it.HasFlag(Extras.LineBreakMode.WordCharacterWrap)) + + if (it.HasFlag(Extras.LineBreakMode.WordCharacterWrap)) return Pango.WrapMode.WordChar; - else - return Pango.WrapMode.Word; + + return Pango.WrapMode.Word; } public static Pango.EllipsizeMode ToPangoEllipsize(this Extras.LineBreakMode it) { - if (it.HasFlag(Extras.LineBreakMode.Elipsis | Extras.LineBreakMode.End)) + if (it.HasFlag(Extras.LineBreakMode.Ellipsis | Extras.LineBreakMode.Tail)) return Pango.EllipsizeMode.End; - if (it.HasFlag(Extras.LineBreakMode.Elipsis | Extras.LineBreakMode.Center)) + if (it.HasFlag(Extras.LineBreakMode.Ellipsis | Extras.LineBreakMode.Middle)) return Pango.EllipsizeMode.Middle; - if (it.HasFlag(Extras.LineBreakMode.Elipsis | Extras.LineBreakMode.Start)) + if (it.HasFlag(Extras.LineBreakMode.Ellipsis | Extras.LineBreakMode.Head)) return Pango.EllipsizeMode.Start; - if (it.HasFlag(Extras.LineBreakMode.Elipsis)) + if (it.HasFlag(Extras.LineBreakMode.Ellipsis)) return Pango.EllipsizeMode.End; return Pango.EllipsizeMode.None; From d07f9cb7b3a9f14a930ccb0b0fb6eff543f7c33f Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 22 Aug 2022 16:21:37 +0200 Subject: [PATCH 161/425] [Graphics.Gtk] make GtkMissingImplementationAttribute private --- .../src/Graphics.Gtk/GtkMissingImplementationAttribute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs b/src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs index e9bc659b644b..c22bf5057c92 100644 --- a/src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs +++ b/src/Graphics/src/Graphics.Gtk/GtkMissingImplementationAttribute.cs @@ -1,3 +1,3 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; -public class GtkMissingImplementationAttribute : System.Attribute { } \ No newline at end of file +class GtkMissingImplementationAttribute : System.Attribute { } \ No newline at end of file From a7a7c2c448fe94260100afb7111f91ac0597d7fd Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 22 Aug 2022 16:22:12 +0200 Subject: [PATCH 162/425] [Graphics.Gtk] adjust namespace --- src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs | 1 - .../src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs index baf2a700e50c..812d423dd009 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs @@ -1,5 +1,4 @@ using System; -using Microsoft.Maui.Graphics.Extras; using Microsoft.Maui.Graphics.Text; using Pango; using Context = Cairo.Context; diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs index 9f8d012087a3..134e3d28ad4f 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs @@ -52,29 +52,29 @@ public static Size GetSize(this TextLayout it, string text, float textHeigth) { _ => Pango.Alignment.Left }; - public static Pango.WrapMode ToPangoWrap(this Extras.LineBreakMode it) + public static Pango.WrapMode ToPangoWrap(this LineBreakMode it) { - if (it.HasFlag(Extras.LineBreakMode.CharacterWrap)) + if (it.HasFlag(LineBreakMode.CharacterWrap)) return Pango.WrapMode.Char; - if (it.HasFlag(Extras.LineBreakMode.WordCharacterWrap)) + if (it.HasFlag(LineBreakMode.WordCharacterWrap)) return Pango.WrapMode.WordChar; return Pango.WrapMode.Word; } - public static Pango.EllipsizeMode ToPangoEllipsize(this Extras.LineBreakMode it) { + public static Pango.EllipsizeMode ToPangoEllipsize(this LineBreakMode it) { - if (it.HasFlag(Extras.LineBreakMode.Ellipsis | Extras.LineBreakMode.Tail)) + if (it.HasFlag(LineBreakMode.Ellipsis | LineBreakMode.Tail)) return Pango.EllipsizeMode.End; - if (it.HasFlag(Extras.LineBreakMode.Ellipsis | Extras.LineBreakMode.Middle)) + if (it.HasFlag(LineBreakMode.Ellipsis | LineBreakMode.Middle)) return Pango.EllipsizeMode.Middle; - if (it.HasFlag(Extras.LineBreakMode.Ellipsis | Extras.LineBreakMode.Head)) + if (it.HasFlag(LineBreakMode.Ellipsis | LineBreakMode.Head)) return Pango.EllipsizeMode.Start; - if (it.HasFlag(Extras.LineBreakMode.Ellipsis)) + if (it.HasFlag(LineBreakMode.Ellipsis)) return Pango.EllipsizeMode.End; return Pango.EllipsizeMode.None; From ee1074abbeef4cfc48d57bedf95e69f9b4bc09c2 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 00:12:57 +0200 Subject: [PATCH 163/425] [Gtk] adjust Microsoft.Maui.Controls.MultiTargeting.targets, Directory.Build.props --- .../Microsoft.Maui.Controls.MultiTargeting.targets | 6 +++++- Directory.Build.props | 14 +++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets index d3c50a105e0e..8de3add21204 100644 --- a/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets +++ b/.nuspec/Microsoft.Maui.Controls.MultiTargeting.targets @@ -59,7 +59,7 @@ - + @@ -120,4 +120,8 @@ WINDOWS_UWP;$(DefineConstants) + + + $(DefineConstants);GTK + diff --git a/Directory.Build.props b/Directory.Build.props index 4c0a05f67c6f..fdebef370565 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -15,6 +15,8 @@ <_MauiTargetPlatformIstvOS Condition="'$(_MauiTargetPlatformIdentifier)' == 'tvos'">True <_MauiTargetPlatformIsWindows Condition="$(_MauiTargetPlatformIdentifier.Contains('windows')) == 'True'">True <_MauiTargetPlatformIsTizen Condition="'$(_MauiTargetPlatformIdentifier)' == 'tizen'">True + <_MauiTargetPlatformIsGtk Condition="'$(_MauiTargetPlatformIdentifier)' == 'gtk'">True + @@ -27,13 +29,17 @@ $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(DotNetWorkloadInstallLocation)\microsoft.net.sdk.macos\WorkloadManifest.json')), '$(DotNetWorkloadVersionRegex)')) $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(DotNetWorkloadInstallLocation)\samsung.net.sdk.tizen\WorkloadManifest.json')), $(DotNetWorkloadVersionRegex))) - + $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(DotNetWorkloadInstallLocation)\samsung.net.sdk.tizen\WorkloadManifest.json')), $(DotNetWorkloadVersionRegex))) + true true + true true true true + true + @@ -135,4 +141,10 @@ + + + net$(_MauiDotNetVersion)-gtk; + + + From 09546dd68054da3814eca33c6031b7c18bef6c5b Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 00:13:58 +0200 Subject: [PATCH 164/425] [Gtk] Essentials.csproj: track api changes --- .../src/Accelerometer/Accelerometer.Gtk.cs | 18 ++++++----- .../src/AppActions/AppActions.Gtk.cs | 18 ++++++----- src/Essentials/src/AppInfo/AppInfo.Gtk.cs | 26 ++++++++++------ src/Essentials/src/Barometer/Barometer.Gtk.cs | 21 +++++++------ src/Essentials/src/Battery/Battery.Gtk.cs | 25 ++++++++------- src/Essentials/src/Browser/Browser.Gtk.cs | 10 +++--- src/Essentials/src/Clipboard/Clipboard.Gtk.cs | 27 ++++++++++------ src/Essentials/src/Compass/Compass.Gtk.cs | 16 +++++----- .../src/Connectivity/Connectivity.Gtk.cs | 16 +++++----- src/Essentials/src/Contacts/Contacts.Gtk.cs | 13 +++++--- .../src/DeviceDisplay/DeviceDisplay.Gtk.cs | 26 +++++++++++----- .../src/DeviceInfo/DeviceInfo.Gtk.cs | 23 ++++++++------ src/Essentials/src/Email/Email.Gtk.cs | 19 ++++-------- src/Essentials/src/Essentials.csproj | 6 ++-- .../src/FilePicker/FilePicker.Gtk.cs | 11 ++++--- .../src/FileSystem/FileSystem.Gtk.cs | 25 ++++++++++----- .../src/Flashlight/Flashlight.Gtk.cs | 10 +++--- src/Essentials/src/Geocoding/Geocoding.Gtk.cs | 11 ++++--- .../src/Geolocation/Geolocation.Gtk.cs | 12 +++---- src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs | 15 ++++----- .../src/HapticFeedback/HapticFeedback.Gtk.cs | 14 +++++---- src/Essentials/src/Launcher/Launcher.Gtk.cs | 15 ++++----- .../src/Magnetometer/Magnetometer.Gtk.cs | 20 +++++++----- .../src/MainThread/MainThread.Gtk.cs | 2 +- src/Essentials/src/Map/Map.Gtk.cs | 18 ++++++++--- .../src/MediaPicker/MediaPicker.Gtk.cs | 19 +++++++----- .../OrientationSensor.Gtk.cs | 20 +++++++----- .../src/Permissions/Permissions.Gtk.cs | 16 ++++++++-- .../src/PhoneDialer/PhoneDialer.Gtk.cs | 11 +++---- src/Essentials/src/Platform/Platform.Gtk.cs | 4 +-- .../src/Preferences/Preferences.Gtk.cs | 18 ++++++----- .../src/Screenshot/Screenshot.Gtk.cs | 31 +++++++++++++------ .../src/Screenshot/Screenshot.shared.cs | 6 ++++ .../src/SecureStorage/SecureStorage.Gtk.cs | 15 ++++----- .../SemanticScreenReader.Gtk.cs | 9 +++--- src/Essentials/src/Share/Share.Gtk.cs | 13 +++++--- src/Essentials/src/Sms/Sms.Gtk.cs | 11 ++++--- .../src/TextToSpeech/TextToSpeech.Gtk.cs | 11 ++++--- src/Essentials/src/Vibration/Vibration.Gtk.cs | 19 ++++++++---- .../AppleSignInAuthenticator.Gtk.cs | 12 +++---- .../WebAuthenticator/WebAuthenticator.Gtk.cs | 10 +++--- 41 files changed, 386 insertions(+), 256 deletions(-) diff --git a/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs b/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs index 0ad34a8dfc2d..ee4a81592fd6 100644 --- a/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs +++ b/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs @@ -1,14 +1,16 @@ -namespace Microsoft.Maui.Essentials +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices.Sensors { - public static partial class Accelerometer + /// + partial class AccelerometerImplementation { - internal static bool IsSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; - - static void PlatformStart(SensorSpeed sensorSpeed) => + public bool IsSupported => false; + + void PlatformStart(SensorSpeed sensorSpeed) => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformStop() => + void PlatformStop() => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/AppActions/AppActions.Gtk.cs b/src/Essentials/src/AppActions/AppActions.Gtk.cs index 11b78741e205..c5137e0e8c07 100644 --- a/src/Essentials/src/AppActions/AppActions.Gtk.cs +++ b/src/Essentials/src/AppActions/AppActions.Gtk.cs @@ -2,17 +2,21 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { - public static partial class AppActions + /// + partial class AppActionsImplementation : IAppActions { - internal static bool PlatformIsSupported - => throw ExceptionUtils.NotSupportedOrImplementedException; + public bool IsSupported => false; - static Task> PlatformGetAsync() => + public Task> GetAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformSetAsync(IEnumerable actions) => + public Task SetAsync(IEnumerable actions) => throw ExceptionUtils.NotSupportedOrImplementedException; + +#pragma warning disable CS0067 // The event is never used + public event EventHandler AppActionActivated; +#pragma warning restore CS0067 // The event is never used } -} +} \ No newline at end of file diff --git a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs index 7eec87e0c147..fd874de831b6 100644 --- a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs +++ b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs @@ -1,17 +1,25 @@ -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { - public static partial class AppInfo + /// + class AppInfoImplementation : IAppInfo { - static string PlatformGetPackageName() => throw ExceptionUtils.NotSupportedOrImplementedException; + public string PackageName => throw ExceptionUtils.NotSupportedOrImplementedException; - static string PlatformGetName() => throw ExceptionUtils.NotSupportedOrImplementedException; + public string Name => throw ExceptionUtils.NotSupportedOrImplementedException; - static string PlatformGetVersionString() => throw ExceptionUtils.NotSupportedOrImplementedException; + public System.Version Version => Utils.ParseVersion(VersionString); - static string PlatformGetBuild() => throw ExceptionUtils.NotSupportedOrImplementedException; + public string VersionString => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformShowSettingsUI() => throw ExceptionUtils.NotSupportedOrImplementedException; + public string BuildString => throw ExceptionUtils.NotSupportedOrImplementedException; - static AppTheme PlatformRequestedTheme() => throw ExceptionUtils.NotSupportedOrImplementedException; + public void ShowSettingsUI() => throw ExceptionUtils.NotSupportedOrImplementedException; + + public AppTheme RequestedTheme => AppTheme.Unspecified; + + public AppPackagingModel PackagingModel => throw ExceptionUtils.NotSupportedOrImplementedException; + + // Returning the Unknown value for LayoutDirection so that unit tests can work + public LayoutDirection RequestedLayoutDirection => LayoutDirection.Unknown; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Barometer/Barometer.Gtk.cs b/src/Essentials/src/Barometer/Barometer.Gtk.cs index 12952526fc8a..e0fee589b32a 100644 --- a/src/Essentials/src/Barometer/Barometer.Gtk.cs +++ b/src/Essentials/src/Barometer/Barometer.Gtk.cs @@ -1,14 +1,17 @@ -namespace Microsoft.Maui.Essentials +using System; +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices.Sensors { - public static partial class Barometer + partial class BarometerImplementation : IBarometer { - internal static bool IsSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; + void PlatformStart(SensorSpeed sensorSpeed) + => throw ExceptionUtils.NotSupportedOrImplementedException; + + void PlatformStop() + => throw ExceptionUtils.NotSupportedOrImplementedException; - internal static void PlatformStart(SensorSpeed sensorSpeed) => - throw ExceptionUtils.NotSupportedOrImplementedException; + public bool IsSupported => false; - internal static void PlatformStop() => - throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Battery/Battery.Gtk.cs b/src/Essentials/src/Battery/Battery.Gtk.cs index 7a9bf9936e6b..d240857d4b5f 100644 --- a/src/Essentials/src/Battery/Battery.Gtk.cs +++ b/src/Essentials/src/Battery/Battery.Gtk.cs @@ -1,29 +1,32 @@ -namespace Microsoft.Maui.Essentials +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices { - public static partial class Battery + /// + partial class BatteryImplementation : IBattery { - static void StartBatteryListeners() => + void StartBatteryListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; - static void StopBatteryListeners() => + void StopBatteryListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; - static double PlatformChargeLevel => + public double ChargeLevel => throw ExceptionUtils.NotSupportedOrImplementedException; - static BatteryState PlatformState => + public BatteryState State => throw ExceptionUtils.NotSupportedOrImplementedException; - static BatteryPowerSource PlatformPowerSource => + public BatteryPowerSource PowerSource => throw ExceptionUtils.NotSupportedOrImplementedException; - static void StartEnergySaverListeners() => + void StartEnergySaverListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; - static void StopEnergySaverListeners() => + void StopEnergySaverListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; - static EnergySaverStatus PlatformEnergySaverStatus => + public EnergySaverStatus EnergySaverStatus => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Browser/Browser.Gtk.cs b/src/Essentials/src/Browser/Browser.Gtk.cs index b641310231d0..2f1a38c6c983 100644 --- a/src/Essentials/src/Browser/Browser.Gtk.cs +++ b/src/Essentials/src/Browser/Browser.Gtk.cs @@ -1,11 +1,13 @@ +#nullable enable using System; using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { - public static partial class Browser + /// + partial class BrowserImplementation : IBrowser { - static Task PlatformOpenAsync(Uri uri, BrowserLaunchOptions options) => + public Task OpenAsync(Uri uri, BrowserLaunchOptions options) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Clipboard/Clipboard.Gtk.cs b/src/Essentials/src/Clipboard/Clipboard.Gtk.cs index 9f5c7ca106a9..3fca1680a18b 100644 --- a/src/Essentials/src/Clipboard/Clipboard.Gtk.cs +++ b/src/Essentials/src/Clipboard/Clipboard.Gtk.cs @@ -1,14 +1,17 @@ +#nullable enable + using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel.DataTransfer { - public static partial class Clipboard + /// + partial class ClipboardImplementation : IClipboard { static readonly Gdk.Atom clipboardAtom = Gdk.Atom.Intern("CLIPBOARD", false); - static Task PlatformSetTextAsync(string text) + public Task SetTextAsync(string? text) { var clipboard = Gtk.Clipboard.Get(clipboardAtom); clipboard.Text = text; @@ -16,7 +19,7 @@ static Task PlatformSetTextAsync(string text) return Task.FromResult(0); } - static bool PlatformHasText + public bool HasText { get { @@ -26,18 +29,22 @@ static bool PlatformHasText } } - static Task PlatformGetTextAsync() + public Task GetTextAsync() { var clipboard = Gtk.Clipboard.Get(clipboardAtom); - return Task.FromResult(clipboard.WaitForText()); + return Task.FromResult(clipboard.WaitForText())!; } - static void StartClipboardListeners() - => throw ExceptionUtils.NotSupportedOrImplementedException; + void StartClipboardListeners() + { + throw ExceptionUtils.NotSupportedOrImplementedException; + } - static void StopClipboardListeners() - => throw ExceptionUtils.NotSupportedOrImplementedException; + void StopClipboardListeners() + { + throw ExceptionUtils.NotSupportedOrImplementedException; + } } diff --git a/src/Essentials/src/Compass/Compass.Gtk.cs b/src/Essentials/src/Compass/Compass.Gtk.cs index 404dcb8048ad..5eadf77b5f1d 100644 --- a/src/Essentials/src/Compass/Compass.Gtk.cs +++ b/src/Essentials/src/Compass/Compass.Gtk.cs @@ -1,14 +1,16 @@ -namespace Microsoft.Maui.Essentials +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices.Sensors { - public static partial class Compass + partial class CompassImplementation : ICompass { - internal static bool IsSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; - internal static void PlatformStart(SensorSpeed sensorSpeed, bool applyLowPassFilter) => + bool PlatformIsSupported => false; + + void PlatformStart(SensorSpeed sensorSpeed, bool applyLowPassFilter) => throw ExceptionUtils.NotSupportedOrImplementedException; - internal static void PlatformStop() => + void PlatformStop() => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Connectivity/Connectivity.Gtk.cs b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs index 4e234aae6918..b262827a64be 100644 --- a/src/Essentials/src/Connectivity/Connectivity.Gtk.cs +++ b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs @@ -1,19 +1,21 @@ using System.Collections.Generic; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Networking { - public static partial class Connectivity + /// + partial class ConnectivityImplementation : IConnectivity { - static NetworkAccess PlatformNetworkAccess => + public NetworkAccess NetworkAccess => throw ExceptionUtils.NotSupportedOrImplementedException; - static IEnumerable PlatformConnectionProfiles => + public IEnumerable ConnectionProfiles => throw ExceptionUtils.NotSupportedOrImplementedException; - static void StartListeners() => + void StartListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; - static void StopListeners() => + void StopListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Contacts/Contacts.Gtk.cs b/src/Essentials/src/Contacts/Contacts.Gtk.cs index d66a50a49db7..8d853be41a81 100644 --- a/src/Essentials/src/Contacts/Contacts.Gtk.cs +++ b/src/Essentials/src/Contacts/Contacts.Gtk.cs @@ -2,12 +2,15 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel.Communication { - public static partial class Contacts + /// + class ContactsImplementation : IContacts { - static Task PlatformPickContactAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; + public Task PickContactAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; - static Task> PlatformGetAllAsync(CancellationToken cancellationToken) => throw ExceptionUtils.NotSupportedOrImplementedException; + public Task> GetAllAsync(CancellationToken cancellationToken) => + throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs b/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs index 792ce9efa877..f1437057074d 100644 --- a/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs +++ b/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs @@ -1,10 +1,12 @@ using System.Collections.Generic; using System.Linq; +using Microsoft.Maui.ApplicationModel; +using Microsoft.Maui.Devices; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Devices { - public static partial class DeviceDisplay + partial class DeviceDisplayImplementation { static bool PlatformKeepScreenOn @@ -13,7 +15,7 @@ static bool PlatformKeepScreenOn set => throw ExceptionUtils.NotSupportedOrImplementedException; } - static DisplayInfo GetMainDisplayInfo() + protected override DisplayInfo GetMainDisplayInfo() { var mainMonitor = PrimaryMonitor; var geometry = mainMonitor.Geometry; @@ -23,9 +25,9 @@ static DisplayInfo GetMainDisplayInfo() return new DisplayInfo(geometry.Width, geometry.Height, DefaultScreen.Resolution, orientation, DisplayRotation.Unknown, rate); } - static void StartScreenMetricsListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; + protected override void StartScreenMetricsListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; - static void StopScreenMetricsListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; + protected override void StopScreenMetricsListeners() => throw ExceptionUtils.NotSupportedOrImplementedException; public static Gdk.Screen DefaultScreen => Gdk.Screen.Default; @@ -36,8 +38,8 @@ static DisplayInfo GetMainDisplayInfo() /// meaning 24/16/8-bit pixel sizes. For a given pixel size, pixels can be in different formats; /// for example the “red” element of an RGB pixel may be in the top 8 bits of the pixel, or may be in the lower 4 bits. /// There are several standard visuals. - /// The visual returned by is the system’s default visual, - /// and the visual returned by should be used for creating windows with an alpha channel. + /// The visual returned by Gdk.Screen.Default.SystemVisual is the system’s default visual, + /// and the visual returned Gdk.Screen.Default.RgbaVisual should be used for creating windows with an alpha channel. /// /// Get the system’s default visual for screen . /// This is the visual for the root window of the display. @@ -74,6 +76,16 @@ static DisplayInfo GetMainDisplayInfo() } + protected override bool GetKeepScreenOn() + { + throw ExceptionUtils.NotSupportedOrImplementedException; + } + + protected override void SetKeepScreenOn(bool keepScreenOn) + { + throw ExceptionUtils.NotSupportedOrImplementedException; + } + } } \ No newline at end of file diff --git a/src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs b/src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs index c8a9319b5012..9097979fce41 100644 --- a/src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs +++ b/src/Essentials/src/DeviceInfo/DeviceInfo.Gtk.cs @@ -1,24 +1,29 @@ -namespace Microsoft.Maui.Essentials +using System; +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices { - public static partial class DeviceInfo + class DeviceInfoImplementation : IDeviceInfo { - static string GetModel() => throw ExceptionUtils.NotSupportedOrImplementedException; + public string Model => throw ExceptionUtils.NotSupportedOrImplementedException; + + public string Manufacturer => throw ExceptionUtils.NotSupportedOrImplementedException; - static string GetManufacturer() => throw ExceptionUtils.NotSupportedOrImplementedException; + public string Name => throw ExceptionUtils.NotSupportedOrImplementedException; - static string GetDeviceName() => throw ExceptionUtils.NotSupportedOrImplementedException; + public string VersionString => throw ExceptionUtils.NotSupportedOrImplementedException; - static string GetVersionString() => throw ExceptionUtils.NotSupportedOrImplementedException; + public Version Version => throw ExceptionUtils.NotSupportedOrImplementedException; static DevicePlatform Gtk { get; } = DevicePlatform.Create(nameof(Gtk)); - static DevicePlatform GetPlatform() => Gtk; + public DevicePlatform Platform => Gtk; - static DeviceIdiom GetIdiom() => DeviceIdiom.Desktop; + public DeviceIdiom Idiom => DeviceIdiom.Desktop; - static DeviceType GetDeviceType() => DeviceType.Unknown; + public DeviceType DeviceType => DeviceType.Unknown; } diff --git a/src/Essentials/src/Email/Email.Gtk.cs b/src/Essentials/src/Email/Email.Gtk.cs index b3bdfdf71325..c7276cebd802 100644 --- a/src/Essentials/src/Email/Email.Gtk.cs +++ b/src/Essentials/src/Email/Email.Gtk.cs @@ -1,21 +1,14 @@ using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel.Communication { - public static partial class Email + /// + partial class EmailImplementation : IEmail { - internal static bool IsComposeSupported => + public bool IsComposeSupported => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformComposeAsync(EmailMessage message) => + Task PlatformComposeAsync(EmailMessage message) => throw ExceptionUtils.NotSupportedOrImplementedException; } - -#if NETSTANDARD1_0 || NETSTANDARD2_0 || NET6_0 - public partial class EmailAttachment - { - string PlatformGetContentType(string extension) => - throw ExceptionUtils.NotSupportedOrImplementedException; - } -#endif -} +} \ No newline at end of file diff --git a/src/Essentials/src/Essentials.csproj b/src/Essentials/src/Essentials.csproj index d1891f626983..fa77d283eca2 100644 --- a/src/Essentials/src/Essentials.csproj +++ b/src/Essentials/src/Essentials.csproj @@ -65,10 +65,10 @@ --> - - - + + + diff --git a/src/Essentials/src/FilePicker/FilePicker.Gtk.cs b/src/Essentials/src/FilePicker/FilePicker.Gtk.cs index 883a8279c42c..69cc55fab250 100644 --- a/src/Essentials/src/FilePicker/FilePicker.Gtk.cs +++ b/src/Essentials/src/FilePicker/FilePicker.Gtk.cs @@ -1,15 +1,16 @@ using System.Collections.Generic; -using System.IO; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Storage { - public static partial class FilePicker + partial class FilePickerImplementation : IFilePicker { - static Task> PlatformPickAsync(PickOptions options, bool allowMultiple = false) + Task> PlatformPickAsync(PickOptions options, bool allowMultiple = false) => throw new NotImplementedInReferenceAssemblyException(); } + /// public partial class FilePickerFileType { static FilePickerFileType PlatformImageFileType() @@ -27,4 +28,4 @@ static FilePickerFileType PlatformVideoFileType() static FilePickerFileType PlatformPdfFileType() => throw new NotImplementedInReferenceAssemblyException(); } -} +} \ No newline at end of file diff --git a/src/Essentials/src/FileSystem/FileSystem.Gtk.cs b/src/Essentials/src/FileSystem/FileSystem.Gtk.cs index fbe88b541e62..c73c2391b70c 100644 --- a/src/Essentials/src/FileSystem/FileSystem.Gtk.cs +++ b/src/Essentials/src/FileSystem/FileSystem.Gtk.cs @@ -1,29 +1,38 @@ using System.IO; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Storage { - public static partial class FileSystem + /// + partial class FileSystemImplementation : IFileSystem { - static string PlatformCacheDirectory + string PlatformCacheDirectory => throw ExceptionUtils.NotSupportedOrImplementedException; - static string PlatformAppDataDirectory + string PlatformAppDataDirectory => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformOpenAppPackageFileAsync(string filename) - => throw ExceptionUtils.NotSupportedOrImplementedException; + Task PlatformOpenAppPackageFileAsync(string filename) + => throw ExceptionUtils.NotSupportedOrImplementedException; + + Task PlatformAppPackageFileExistsAsync(string filename) + => throw ExceptionUtils.NotSupportedOrImplementedException; } + /// public partial class FileBase { static string PlatformGetContentType(string extension) => throw ExceptionUtils.NotSupportedOrImplementedException; - internal void PlatformInit(FileBase file) => + internal void Init(FileBase file) => throw ExceptionUtils.NotSupportedOrImplementedException; internal virtual Task PlatformOpenReadAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; + + void PlatformInit(FileBase file) + => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Flashlight/Flashlight.Gtk.cs b/src/Essentials/src/Flashlight/Flashlight.Gtk.cs index a63cef055aa5..9c51f320bb81 100644 --- a/src/Essentials/src/Flashlight/Flashlight.Gtk.cs +++ b/src/Essentials/src/Flashlight/Flashlight.Gtk.cs @@ -1,13 +1,15 @@ using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Devices { - public static partial class Flashlight + /// + class FlashlightImplementation : IFlashlight { - static Task PlatformTurnOnAsync() => + public Task TurnOnAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformTurnOffAsync() => + public Task TurnOffAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; } } diff --git a/src/Essentials/src/Geocoding/Geocoding.Gtk.cs b/src/Essentials/src/Geocoding/Geocoding.Gtk.cs index 0ece1f89a970..005dcfa8ea8e 100644 --- a/src/Essentials/src/Geocoding/Geocoding.Gtk.cs +++ b/src/Essentials/src/Geocoding/Geocoding.Gtk.cs @@ -1,14 +1,15 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Devices.Sensors { - public static partial class Geocoding + class GeocodingImplementation : IGeocoding { - static Task> PlatformGetPlacemarksAsync(double latitude, double longitude) => + public Task> GetPlacemarksAsync(double latitude, double longitude) => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task> PlatformGetLocationsAsync(string address) => + public Task> GetLocationsAsync(string address) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Geolocation/Geolocation.Gtk.cs b/src/Essentials/src/Geolocation/Geolocation.Gtk.cs index 1c70d04c06b1..22c22500e158 100644 --- a/src/Essentials/src/Geolocation/Geolocation.Gtk.cs +++ b/src/Essentials/src/Geolocation/Geolocation.Gtk.cs @@ -1,15 +1,15 @@ -using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Devices.Sensors { - public static partial class Geolocation + partial class GeolocationImplementation : IGeolocation { - static Task PlatformLastKnownLocationAsync() => + public Task GetLastKnownLocationAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformLocationAsync(GeolocationRequest request, CancellationToken cancellationToken) => + public Task GetLocationAsync(GeolocationRequest request, CancellationToken cancellationToken) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs b/src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs index 8fe3ef0a0ab7..397d3fdb993b 100644 --- a/src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs +++ b/src/Essentials/src/Gyroscope/Gyroscope.Gtk.cs @@ -1,14 +1,15 @@ -namespace Microsoft.Maui.Essentials +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices.Sensors { - public static partial class Gyroscope + partial class GyroscopeImplementation : IGyroscope { - internal static bool IsSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; + bool PlatformIsSupported => false; - internal static void PlatformStart(SensorSpeed sensorSpeed) => + void PlatformStart(SensorSpeed sensorSpeed) => throw ExceptionUtils.NotSupportedOrImplementedException; - internal static void PlatformStop() => + void PlatformStop() => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs b/src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs index 3a7407846e58..df9084b0a92d 100644 --- a/src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs +++ b/src/Essentials/src/HapticFeedback/HapticFeedback.Gtk.cs @@ -1,14 +1,16 @@ using System; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Devices { - public static partial class HapticFeedback + /// + partial class HapticFeedbackImplementation : IHapticFeedback { - internal static bool IsSupported - => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformPerform(HapticFeedbackType type) + public bool IsSupported => false; + + public void Perform(HapticFeedbackType type) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Launcher/Launcher.Gtk.cs b/src/Essentials/src/Launcher/Launcher.Gtk.cs index a408e0005589..28ecff67906a 100644 --- a/src/Essentials/src/Launcher/Launcher.Gtk.cs +++ b/src/Essentials/src/Launcher/Launcher.Gtk.cs @@ -1,20 +1,21 @@ using System; using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { - public static partial class Launcher + /// + partial class LauncherImplementation { - static Task PlatformCanOpenAsync(Uri uri) => + Task PlatformCanOpenAsync(Uri uri) => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformOpenAsync(Uri uri) => + Task PlatformOpenAsync(Uri uri) => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformOpenAsync(OpenFileRequest request) => + Task PlatformOpenAsync(OpenFileRequest request) => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformTryOpenAsync(Uri uri) => + Task PlatformTryOpenAsync(Uri uri) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs b/src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs index 637976c52e3a..896afe0a170a 100644 --- a/src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs +++ b/src/Essentials/src/Magnetometer/Magnetometer.Gtk.cs @@ -1,14 +1,20 @@ -namespace Microsoft.Maui.Essentials +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices.Sensors { - public static partial class Magnetometer + + /// + partial class MagnetometerImplementation { - internal static bool IsSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; - internal static void PlatformStart(SensorSpeed sensorSpeed) => + bool PlatformIsSupported => false; + + void PlatformStart(SensorSpeed sensorSpeed) => throw ExceptionUtils.NotSupportedOrImplementedException; - internal static void PlatformStop() => + void PlatformStop() => throw ExceptionUtils.NotSupportedOrImplementedException; + } -} + +} \ No newline at end of file diff --git a/src/Essentials/src/MainThread/MainThread.Gtk.cs b/src/Essentials/src/MainThread/MainThread.Gtk.cs index 8724a18ea075..9aa7867ad02f 100644 --- a/src/Essentials/src/MainThread/MainThread.Gtk.cs +++ b/src/Essentials/src/MainThread/MainThread.Gtk.cs @@ -1,7 +1,7 @@ using System; using System.Threading; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { public static partial class MainThread diff --git a/src/Essentials/src/Map/Map.Gtk.cs b/src/Essentials/src/Map/Map.Gtk.cs index 7fc2bdf7789a..fe420d8a5d5d 100644 --- a/src/Essentials/src/Map/Map.Gtk.cs +++ b/src/Essentials/src/Map/Map.Gtk.cs @@ -1,13 +1,21 @@ using System.Threading.Tasks; +using Microsoft.Maui.Devices.Sensors; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { - public static partial class Map + /// + class MapImplementation : IMap { - internal static Task PlatformOpenMapsAsync(double latitude, double longitude, MapLaunchOptions options) + public Task OpenAsync(double latitude, double longitude, MapLaunchOptions options) => throw ExceptionUtils.NotSupportedOrImplementedException; - internal static Task PlatformOpenMapsAsync(Placemark placemark, MapLaunchOptions options) + public Task OpenAsync(Placemark placemark, MapLaunchOptions options) + => throw ExceptionUtils.NotSupportedOrImplementedException; + + public Task TryOpenAsync(double latitude, double longitude, MapLaunchOptions options) + => throw ExceptionUtils.NotSupportedOrImplementedException; + + public Task TryOpenAsync(Placemark placemark, MapLaunchOptions options) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs b/src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs index 223e7be4015b..9145cf96005b 100644 --- a/src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs +++ b/src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs @@ -1,24 +1,27 @@ using System; using System.IO; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; +using Microsoft.Maui.Storage; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Media { - public static partial class MediaPicker + /// + partial class MediaPickerImplementation : IMediaPicker { - static bool PlatformIsCaptureSupported => + public bool IsCaptureSupported => throw new NotImplementedInReferenceAssemblyException(); - static Task PlatformPickPhotoAsync(MediaPickerOptions options) => + public Task PickPhotoAsync(MediaPickerOptions options) => throw new NotImplementedInReferenceAssemblyException(); - static Task PlatformCapturePhotoAsync(MediaPickerOptions options) => + public Task CapturePhotoAsync(MediaPickerOptions options) => throw new NotImplementedInReferenceAssemblyException(); - static Task PlatformPickVideoAsync(MediaPickerOptions options) => + public Task PickVideoAsync(MediaPickerOptions options) => throw new NotImplementedInReferenceAssemblyException(); - static Task PlatformCaptureVideoAsync(MediaPickerOptions options) => + public Task CaptureVideoAsync(MediaPickerOptions options) => throw new NotImplementedInReferenceAssemblyException(); } -} +} \ No newline at end of file diff --git a/src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs b/src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs index 8cf49fe6dffc..5c65f933e8ba 100644 --- a/src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs +++ b/src/Essentials/src/OrientationSensor/OrientationSensor.Gtk.cs @@ -1,14 +1,20 @@ -namespace Microsoft.Maui.Essentials +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Devices.Sensors { - public static partial class OrientationSensor + + /// + partial class OrientationSensorImplementation : IOrientationSensor { - internal static bool IsSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformStart(SensorSpeed sensorSpeed) => + bool PlatformIsSupported => false; + + void PlatformStart(SensorSpeed sensorSpeed) => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformStop() => + void PlatformStop() => throw ExceptionUtils.NotSupportedOrImplementedException; + } -} + +} \ No newline at end of file diff --git a/src/Essentials/src/Permissions/Permissions.Gtk.cs b/src/Essentials/src/Permissions/Permissions.Gtk.cs index 281b3ac75218..1d061ef7f444 100644 --- a/src/Essentials/src/Permissions/Permissions.Gtk.cs +++ b/src/Essentials/src/Permissions/Permissions.Gtk.cs @@ -1,11 +1,16 @@ using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { + /// public static partial class Permissions { - public partial class BasePlatformPermission : BasePermission + public abstract partial class BasePlatformPermission : BasePermission { + protected BasePlatformPermission() + { + } + public override Task CheckStatusAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; @@ -19,6 +24,7 @@ public override bool ShouldShowRationale() => throw ExceptionUtils.NotSupportedOrImplementedException; } + /// public partial class Battery : BasePlatformPermission { } @@ -43,6 +49,7 @@ public partial class ContactsWrite : BasePlatformPermission { } + /// public partial class Flashlight : BasePlatformPermission { } @@ -83,6 +90,10 @@ public partial class Photos : BasePlatformPermission { } + public partial class PhotosAddOnly : BasePlatformPermission + { + } + public partial class Reminders : BasePlatformPermission { } @@ -91,6 +102,7 @@ public partial class Sensors : BasePlatformPermission { } + /// public partial class Sms : BasePlatformPermission { } diff --git a/src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs b/src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs index 5632a0a92762..a1b5751002ed 100644 --- a/src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs +++ b/src/Essentials/src/PhoneDialer/PhoneDialer.Gtk.cs @@ -1,11 +1,10 @@ -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel.Communication { - public static partial class PhoneDialer + partial class PhoneDialerImplementation : IPhoneDialer { - internal static bool IsSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; + public bool IsSupported => false; - static void PlatformOpen(string number) => + public void Open(string number) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Platform/Platform.Gtk.cs b/src/Essentials/src/Platform/Platform.Gtk.cs index 893e43da68e4..afc81c6cb475 100644 --- a/src/Essentials/src/Platform/Platform.Gtk.cs +++ b/src/Essentials/src/Platform/Platform.Gtk.cs @@ -1,6 +1,6 @@ -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel { - public static partial class Platform + static class PlatformUtils { } diff --git a/src/Essentials/src/Preferences/Preferences.Gtk.cs b/src/Essentials/src/Preferences/Preferences.Gtk.cs index ce4e56cad11a..649fc0dc236a 100644 --- a/src/Essentials/src/Preferences/Preferences.Gtk.cs +++ b/src/Essentials/src/Preferences/Preferences.Gtk.cs @@ -1,20 +1,22 @@ -namespace Microsoft.Maui.Essentials +using Microsoft.Maui.ApplicationModel; + +namespace Microsoft.Maui.Storage { - public static partial class Preferences + class PreferencesImplementation : IPreferences { - static bool PlatformContainsKey(string key, string sharedName) => + public bool ContainsKey(string key, string sharedName) => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformRemove(string key, string sharedName) => + public void Remove(string key, string sharedName) => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformClear(string sharedName) => + public void Clear(string sharedName) => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformSet(string key, T value, string sharedName) => + public void Set(string key, T value, string sharedName) => throw ExceptionUtils.NotSupportedOrImplementedException; - static T PlatformGet(string key, T defaultValue, string sharedName) => + public T Get(string key, T defaultValue, string sharedName) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Screenshot/Screenshot.Gtk.cs b/src/Essentials/src/Screenshot/Screenshot.Gtk.cs index 1238da6b400e..a50684c4ecf4 100644 --- a/src/Essentials/src/Screenshot/Screenshot.Gtk.cs +++ b/src/Essentials/src/Screenshot/Screenshot.Gtk.cs @@ -1,24 +1,35 @@ using System.IO; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Media { - public static partial class Screenshot + + partial class ScreenshotImplementation : IScreenshot { - static bool PlatformIsCaptureSupported => - throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformCaptureAsync() => + public bool IsCaptureSupported => false; + + public Task CaptureAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; + } - public partial class ScreenshotResult + partial class ScreenshotResult { + ScreenshotResult() - { - } + { } - internal Task PlatformOpenReadAsync(ScreenshotFormat format) => + Task PlatformOpenReadAsync(ScreenshotFormat format, int quality) => throw ExceptionUtils.NotSupportedOrImplementedException; + + Task PlatformCopyToAsync(Stream destination, ScreenshotFormat format, int quality) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + Task PlatformToPixelBufferAsync() => + throw ExceptionUtils.NotSupportedOrImplementedException; + } -} + +} \ No newline at end of file diff --git a/src/Essentials/src/Screenshot/Screenshot.shared.cs b/src/Essentials/src/Screenshot/Screenshot.shared.cs index c68e13727746..43ea9b34f0cd 100644 --- a/src/Essentials/src/Screenshot/Screenshot.shared.cs +++ b/src/Essentials/src/Screenshot/Screenshot.shared.cs @@ -115,7 +115,13 @@ public static Task CaptureAsync(this IScreenshot screenshot, public static Task CaptureAsync(this IScreenshot screenshot, ElmSharp.EvasObject view) => screenshot.AsPlatform().CaptureAsync(view); +#elif GTK + public static Task CaptureAsync(this IScreenshot screenshot, Gtk.Window window) => + screenshot.AsPlatform().CaptureAsync(window); + + public static Task CaptureAsync(this IScreenshot screenshot, Gtk.Widget view) => + screenshot.AsPlatform().CaptureAsync(view); #endif } diff --git a/src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs b/src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs index 859e5a99f41f..fb25493f38e3 100644 --- a/src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs +++ b/src/Essentials/src/SecureStorage/SecureStorage.Gtk.cs @@ -1,19 +1,20 @@ using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Storage { - public partial class SecureStorage + partial class SecureStorageImplementation : ISecureStorage { - static Task PlatformGetAsync(string key) => + Task PlatformGetAsync(string key) => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformSetAsync(string key, string data) => + Task PlatformSetAsync(string key, string data) => throw ExceptionUtils.NotSupportedOrImplementedException; - static bool PlatformRemove(string key) => + bool PlatformRemove(string key) => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformRemoveAll() => + void PlatformRemoveAll() => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs b/src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs index d4d71567af53..f160abd5202c 100644 --- a/src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs +++ b/src/Essentials/src/SemanticScreenReader/SemanticScreenReader.Gtk.cs @@ -1,12 +1,13 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Accessibility { - public static partial class SemanticScreenReader + partial class SemanticScreenReaderImplementation : ISemanticScreenReader { - static void PlatformAnnounce(string text) => + public void Announce(string text) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Share/Share.Gtk.cs b/src/Essentials/src/Share/Share.Gtk.cs index 1f8e32355459..8ff6f0ac1384 100644 --- a/src/Essentials/src/Share/Share.Gtk.cs +++ b/src/Essentials/src/Share/Share.Gtk.cs @@ -1,13 +1,16 @@ using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel.DataTransfer { - public static partial class Share + partial class ShareImplementation : IShare { - static Task PlatformRequestAsync(ShareTextRequest request) => + Task PlatformRequestAsync(ShareTextRequest request) => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformRequestAsync(ShareMultipleFilesRequest request) => + Task PlatformRequestAsync(ShareFileRequest request) => + throw ExceptionUtils.NotSupportedOrImplementedException; + + Task PlatformRequestAsync(ShareMultipleFilesRequest request) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Sms/Sms.Gtk.cs b/src/Essentials/src/Sms/Sms.Gtk.cs index 85209c28a3d0..a793eebdc44e 100644 --- a/src/Essentials/src/Sms/Sms.Gtk.cs +++ b/src/Essentials/src/Sms/Sms.Gtk.cs @@ -1,13 +1,14 @@ using System.Threading.Tasks; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.ApplicationModel.Communication { - public static partial class Sms + /// + partial class SmsImplementation : ISms { - internal static bool IsComposeSupported + public bool IsComposeSupported => throw ExceptionUtils.NotSupportedOrImplementedException; - static Task PlatformComposeAsync(SmsMessage message) + Task PlatformComposeAsync(SmsMessage message) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs b/src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs index 0c15a29fbb27..b5e2fe356d81 100644 --- a/src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs +++ b/src/Essentials/src/TextToSpeech/TextToSpeech.Gtk.cs @@ -1,15 +1,16 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Media { - public static partial class TextToSpeech + partial class TextToSpeechImplementation : ITextToSpeech { - internal static Task PlatformSpeakAsync(string text, SpeechOptions options, CancellationToken cancelToken = default) => + Task PlatformSpeakAsync(string text, SpeechOptions options, CancellationToken cancelToken) => throw ExceptionUtils.NotSupportedOrImplementedException; - internal static Task> PlatformGetLocalesAsync() => + Task> PlatformGetLocalesAsync() => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/Vibration/Vibration.Gtk.cs b/src/Essentials/src/Vibration/Vibration.Gtk.cs index 045610e3e3d1..48ec390713c8 100644 --- a/src/Essentials/src/Vibration/Vibration.Gtk.cs +++ b/src/Essentials/src/Vibration/Vibration.Gtk.cs @@ -1,16 +1,23 @@ using System; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Devices { - public static partial class Vibration + + partial class VibrationImplementation : IVibration { - internal static bool IsSupported + + public bool IsSupported => false; + + void PlatformVibrate() => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformVibrate(TimeSpan duration) + void PlatformVibrate(TimeSpan duration) => throw ExceptionUtils.NotSupportedOrImplementedException; - static void PlatformCancel() + void PlatformCancel() => throw ExceptionUtils.NotSupportedOrImplementedException; + } -} + +} \ No newline at end of file diff --git a/src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs b/src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs index 6de358baf980..dc6290ae6dcc 100644 --- a/src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs +++ b/src/Essentials/src/WebAuthenticator/AppleSignInAuthenticator.Gtk.cs @@ -1,13 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Authentication { - public static partial class AppleSignInAuthenticator + partial class AppleSignInAuthenticatorImplementation : IAppleSignInAuthenticator { - static Task PlatformAuthenticateAsync(Options options) => + public Task AuthenticateAsync(AppleSignInAuthenticator.Options options) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file diff --git a/src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs b/src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs index dd15307fabf1..022a612bfe12 100644 --- a/src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs +++ b/src/Essentials/src/WebAuthenticator/WebAuthenticator.Gtk.cs @@ -2,12 +2,14 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; +using Microsoft.Maui.ApplicationModel; -namespace Microsoft.Maui.Essentials +namespace Microsoft.Maui.Authentication { - public static partial class WebAuthenticator + /// + partial class WebAuthenticatorImplementation : IWebAuthenticator { - static Task PlatformAuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) + public Task AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) => throw ExceptionUtils.NotSupportedOrImplementedException; } -} +} \ No newline at end of file From 7270bc28088b623252338a70d11de4b0dfc8ff34 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 00:15:26 +0200 Subject: [PATCH 165/425] [Gtk] Core.csproj: track api changes I --- src/Core/src/Core.csproj | 6 ++-- src/Core/src/Fonts/IFontManager.Gtk.cs | 4 +-- src/Core/src/Graphics/PaintExtensions.Gtk.cs | 2 +- .../src/Handlers/Button/ButtonHandler.Gtk.cs | 2 +- .../src/Handlers/Entry/EntryHandler.Gtk.cs | 2 +- .../GraphicsView/GraphicsViewHandler.Gtk.cs | 4 +-- src/Core/src/Handlers/IViewHandler.Gtk.cs | 4 +-- .../src/Handlers/Label/LabelHandler.Gtk.cs | 8 ++--- .../SearchBar/SearchBarHandler.Gtk.cs | 2 +- src/Core/src/Handlers/View/ViewHandler.Gtk.cs | 4 +++ .../src/Handlers/View/ViewHandlerOfT.Gtk.cs | 24 +++++++-------- src/Core/src/Handlers/View/ViewHandlerOfT.cs | 2 +- .../Gtk/ImageSourceServiceResult.cs | 6 ++-- .../ImageSources/ImageSourceServiceResult.cs | 2 ++ src/Core/src/Platform/Gtk/ActivationState.cs | 14 --------- src/Core/src/Platform/Gtk/CellExtensions.cs | 2 +- src/Core/src/Platform/Gtk/FontExtensions.cs | 2 +- src/Core/src/Platform/Gtk/GtkCssExtensions.cs | 2 +- .../src/Platform/Gtk/HandlerExtensions.cs | 7 ++--- src/Core/src/Platform/Gtk/ImageView.cs | 2 +- .../src/Platform/Gtk/ImageViewExtensions.cs | 2 +- src/Core/src/Platform/Gtk/LabelExtensions.cs | 30 +++++++++---------- src/Core/src/Platform/Gtk/LayoutView.cs | 8 ++--- .../src/Platform/Gtk/MauiGtkApplication.cs | 1 - src/Core/src/Platform/Gtk/MauiShapeView.cs | 2 +- src/Core/src/Platform/Gtk/MauiWindow.cs | 2 -- src/Core/src/Platform/Gtk/PickerExtensions.cs | 2 +- .../src/Platform/Gtk/SemanticExtensions.cs | 2 +- src/Core/src/Platform/Gtk/ViewExtensions.cs | 6 ++-- .../src/Platform/Gtk/WidgetColorExtensions.cs | 2 +- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 6 ++-- src/Core/src/Platform/Gtk/WindowExtensions.cs | 6 ++-- src/Core/src/Platform/MauiContext.Gtk.cs | 2 +- src/Core/src/Platform/ViewExtensions.cs | 4 +-- src/Core/src/SemanticExtensions.cs | 2 ++ src/Core/src/WindowExtensions.cs | 2 ++ .../Gtk/TextExtensions.cs | 2 +- 37 files changed, 85 insertions(+), 97 deletions(-) delete mode 100644 src/Core/src/Platform/Gtk/ActivationState.cs diff --git a/src/Core/src/Core.csproj b/src/Core/src/Core.csproj index 02fd8b1cbceb..6105a9539ca3 100644 --- a/src/Core/src/Core.csproj +++ b/src/Core/src/Core.csproj @@ -36,9 +36,11 @@ + + + - - + diff --git a/src/Core/src/Fonts/IFontManager.Gtk.cs b/src/Core/src/Fonts/IFontManager.Gtk.cs index cca517f46fba..e13507e1a33f 100644 --- a/src/Core/src/Fonts/IFontManager.Gtk.cs +++ b/src/Core/src/Fonts/IFontManager.Gtk.cs @@ -2,13 +2,11 @@ namespace Microsoft.Maui { - public interface IFontManager + public partial interface IFontManager { FontDescription DefaultFontFamily { get; } - double DefaultFontSize { get; } - FontDescription GetFontFamily(Font font); double GetFontSize(Font font); diff --git a/src/Core/src/Graphics/PaintExtensions.Gtk.cs b/src/Core/src/Graphics/PaintExtensions.Gtk.cs index b9fbd1f77c23..adb9fd182347 100644 --- a/src/Core/src/Graphics/PaintExtensions.Gtk.cs +++ b/src/Core/src/Graphics/PaintExtensions.Gtk.cs @@ -1,5 +1,5 @@ using System.Linq; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui.Graphics { diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index 23ce02e31d11..e1ba6d3cdb19 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -1,6 +1,6 @@ using System; using Gtk; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index 09cce29e5301..1b4c30003e0f 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -1,6 +1,6 @@ using System; using Gtk; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui.Handlers { diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs index c115c23660f7..444079f6ae9c 100644 --- a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs @@ -3,10 +3,10 @@ namespace Microsoft.Maui.Handlers { - public partial class GraphicsViewHandler : ViewHandler + public partial class GraphicsViewHandler : ViewHandler { - protected override Microsoft.Maui.Graphics.Native.Gtk.GtkGraphicsView CreateNativeView() => new(); + protected override Microsoft.Maui.Graphics.Platform.Gtk.GtkGraphicsView CreateNativeView() => new(); public static void MapDrawable(GraphicsViewHandler handler, IGraphicsView graphicsView) { diff --git a/src/Core/src/Handlers/IViewHandler.Gtk.cs b/src/Core/src/Handlers/IViewHandler.Gtk.cs index 80600e12f537..eea738aabf26 100644 --- a/src/Core/src/Handlers/IViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/IViewHandler.Gtk.cs @@ -1,7 +1,7 @@ namespace Microsoft.Maui { - public interface INativeViewHandler : IViewHandler + public interface IPlatformViewHandler : IViewHandler { - new Gtk.Widget? NativeView { get; } + new Gtk.Widget? PlatformView { get; } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index af4808d31c2a..cbb6c36f3da3 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -1,7 +1,7 @@ using System; using Gtk; using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers @@ -10,10 +10,10 @@ namespace Microsoft.Maui.Handlers public partial class LabelHandler : ViewHandler { - private static Microsoft.Maui.Graphics.Native.Gtk.TextLayout? _textLayout; + private static Microsoft.Maui.Graphics.Platform.Gtk.TextLayout? _textLayout; - public Microsoft.Maui.Graphics.Native.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Native.Gtk.TextLayout( - Microsoft.Maui.Graphics.Native.Gtk.NativeGraphicsService.Instance.SharedContext) { HeightForWidth = true }; + public Microsoft.Maui.Graphics.Platform.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Platform.Gtk.TextLayout( + Microsoft.Maui.Graphics.Platform.Gtk.NativeGraphicsService.Instance.SharedContext) { HeightForWidth = true }; // https://docs.gtk.org/gtk3/class.Label.html protected override LabelView CreateNativeView() diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs index 57a6a397ba5b..06552f71ffa5 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs @@ -1,6 +1,6 @@ using System; using Gtk; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; using Microsoft.Maui.Native; namespace Microsoft.Maui.Handlers diff --git a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs index 83b7143039a8..5e3e878c44a0 100644 --- a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs @@ -36,6 +36,10 @@ public static void MapAnchorX(ViewHandler handler, IView view) { } [MissingMapper] public static void MapAnchorY(ViewHandler handler, IView view) { } + + [MissingMapper] + public virtual bool NeedsContainer => false; + } diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs index 72be097ce2c6..e940798cf4ec 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs @@ -1,25 +1,23 @@ using System; using System.Diagnostics; -using Gdk; -using Microsoft.Maui.Graphics.Native.Gtk; -using Rectangle = Microsoft.Maui.Graphics.Rectangle; -using Size = Microsoft.Maui.Graphics.Size; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui.Handlers { - public partial class ViewHandler : INativeViewHandler + public partial class ViewHandler : IPlatformViewHandler { - Gtk.Widget? INativeViewHandler.NativeView => (Gtk.Widget?)base.NativeView; + Gtk.Widget? IPlatformViewHandler.PlatformView => (Gtk.Widget?)base.PlatformView; - public override void NativeArrange(Rectangle rect) + public override void NativeArrange(Rect rect) { - NativeView?.Arrange(rect); + PlatformView?.Arrange(rect); } public override Size GetDesiredSize(double widthConstraint, double heightConstraint) - => NativeView.GetDesiredSize(widthConstraint, heightConstraint); + => PlatformView.GetDesiredSize(widthConstraint, heightConstraint); protected override void SetupContainer() { } @@ -34,17 +32,17 @@ protected void InvokeEvent(Action action) public void MapFont(ITextStyle textStyle) { - MapFont(NativeView, textStyle); + MapFont(PlatformView, textStyle); } - public void MapFont(Gtk.Widget? nativeView, ITextStyle textStyle) + public void MapFont(Gtk.Widget? platformView, ITextStyle textStyle) { - if (nativeView == null) + if (platformView == null) return; var fontManager = this.GetRequiredService(); - nativeView.UpdateFont(textStyle, fontManager); + platformView.UpdateFont(textStyle, fontManager); } diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.cs index 86496d1bd0b8..242e1ba25135 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.cs @@ -17,7 +17,7 @@ namespace Microsoft.Maui.Handlers { public abstract partial class ViewHandler : ViewHandler, IViewHandler where TVirtualView : class, IView -#if !(NETSTANDARD || !PLATFORM) || IOS || ANDROID || WINDOWS || TIZEN +#if !(NETSTANDARD || !PLATFORM) || IOS || ANDROID || WINDOWS || TIZEN || GTK where TPlatformView : PlatformView #else where TPlatformView : class diff --git a/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs b/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs index 44cd64e4bd38..d704fd8afc8b 100644 --- a/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs +++ b/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs @@ -5,16 +5,16 @@ namespace Microsoft.Maui { - public class ImageSourceServiceResult : IImageSourceServiceResult + public class ImageSourceServiceResult_ : IImageSourceServiceResult { Action? _dispose; - public ImageSourceServiceResult(NativeImage image, Action? dispose = null) + public ImageSourceServiceResult_(NativeImage image, Action? dispose = null) : this(image, false, dispose) { } - public ImageSourceServiceResult(NativeImage image, bool resolutionDependent, Action? dispose = null) + public ImageSourceServiceResult_(NativeImage image, bool resolutionDependent, Action? dispose = null) { Value = image; IsResolutionDependent = resolutionDependent; diff --git a/src/Core/src/ImageSources/ImageSourceServiceResult.cs b/src/Core/src/ImageSources/ImageSourceServiceResult.cs index 0033b780c2b1..5fdcca725d92 100644 --- a/src/Core/src/ImageSources/ImageSourceServiceResult.cs +++ b/src/Core/src/ImageSources/ImageSourceServiceResult.cs @@ -8,6 +8,8 @@ using PlatformView = Microsoft.UI.Xaml.Media.ImageSource; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Image; +#elif GTK +using PlatformView = Gdk.Pixbuf; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Platform/Gtk/ActivationState.cs b/src/Core/src/Platform/Gtk/ActivationState.cs deleted file mode 100644 index 6719e581c7ce..000000000000 --- a/src/Core/src/Platform/Gtk/ActivationState.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace Microsoft.Maui -{ - public class ActivationState : IActivationState - { - public ActivationState(IMauiContext context) - { - Context = context ?? throw new ArgumentNullException(nameof(context)); - } - - public IMauiContext Context { get; } - } -} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/CellExtensions.cs b/src/Core/src/Platform/Gtk/CellExtensions.cs index bb9cdba0ba7f..0f37b057edea 100644 --- a/src/Core/src/Platform/Gtk/CellExtensions.cs +++ b/src/Core/src/Platform/Gtk/CellExtensions.cs @@ -1,5 +1,5 @@ using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/FontExtensions.cs b/src/Core/src/Platform/Gtk/FontExtensions.cs index edaa3613813a..cd7a7151a878 100644 --- a/src/Core/src/Platform/Gtk/FontExtensions.cs +++ b/src/Core/src/Platform/Gtk/FontExtensions.cs @@ -15,7 +15,7 @@ public static Pango.FontDescription GetPangoFontDescription(this Widget it) /// /// size in points - /// + /// /// the size of a font description is specified in pango units. /// There are pango units in one device unit (the device unit is a point for font sizes). /// diff --git a/src/Core/src/Platform/Gtk/GtkCssExtensions.cs b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs index 1ecc00e5b154..d98d3ec89996 100644 --- a/src/Core/src/Platform/Gtk/GtkCssExtensions.cs +++ b/src/Core/src/Platform/Gtk/GtkCssExtensions.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using Gtk; using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/HandlerExtensions.cs b/src/Core/src/Platform/Gtk/HandlerExtensions.cs index 477cd7bc6d11..1eff0fc0a6ba 100644 --- a/src/Core/src/Platform/Gtk/HandlerExtensions.cs +++ b/src/Core/src/Platform/Gtk/HandlerExtensions.cs @@ -12,10 +12,7 @@ public static Widget ToNative(this IView view, IMauiContext context) _ = view ?? throw new ArgumentNullException(nameof(view)); _ = context ?? throw new ArgumentNullException(nameof(context)); - var handler = view.Handler; - - if (handler == null) - handler = context.Handlers.GetHandler(view.GetType()) as IViewHandler; + var handler = view.Handler ?? context.Handlers.GetHandler(view.GetType()) as IViewHandler; if (handler == null) throw new Exception($"Handler not found for view {view}"); @@ -26,7 +23,7 @@ public static Widget ToNative(this IView view, IMauiContext context) handler.SetVirtualView(view); - if (handler.NativeView is not Widget result) + if (handler.PlatformView is not Widget result) { throw new InvalidOperationException($"Unable to convert {view} to {typeof(Widget)}"); } diff --git a/src/Core/src/Platform/Gtk/ImageView.cs b/src/Core/src/Platform/Gtk/ImageView.cs index ba899f8d694f..7ff8e0a1d9e7 100644 --- a/src/Core/src/Platform/Gtk/ImageView.cs +++ b/src/Core/src/Platform/Gtk/ImageView.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Native // GtkImage has nothing like Aspect; maybe an ownerdrawn class is needed // could be: https://docs.gtk.org/gtk3/class.DrawingArea.html - // or Microsoft.Maui.Graphics.Native.Gtk.GtkGraphicsView + // or Microsoft.Maui.Graphics.Platform.Gtk.GtkGraphicsView public class ImageView : Gtk.Image { diff --git a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs index 15bad0f0c0a8..6e48b32bf99a 100644 --- a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs @@ -3,7 +3,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; using Microsoft.Maui.Native; namespace Microsoft.Maui diff --git a/src/Core/src/Platform/Gtk/LabelExtensions.cs b/src/Core/src/Platform/Gtk/LabelExtensions.cs index 8e2ec9a77d1c..3c769c8d1c90 100644 --- a/src/Core/src/Platform/Gtk/LabelExtensions.cs +++ b/src/Core/src/Platform/Gtk/LabelExtensions.cs @@ -50,15 +50,15 @@ public static void AdjustMaxLines(this Label nativeLabel) } } - public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this LineBreakMode lineBreakMode) => + public static Graphics.Platform.Gtk.LineBreakMode GetLineBreakMode(this LineBreakMode lineBreakMode) => lineBreakMode switch { - LineBreakMode.NoWrap => Graphics.Extras.LineBreakMode.None, - LineBreakMode.WordWrap => Graphics.Extras.LineBreakMode.WordWrap, - LineBreakMode.CharacterWrap => Graphics.Extras.LineBreakMode.CharacterWrap, - LineBreakMode.HeadTruncation => Graphics.Extras.LineBreakMode.HeadTruncation, - LineBreakMode.TailTruncation => Graphics.Extras.LineBreakMode.TailTruncation, - LineBreakMode.MiddleTruncation => Graphics.Extras.LineBreakMode.MiddleTruncation, + LineBreakMode.NoWrap => Graphics.Platform.Gtk.LineBreakMode.None, + LineBreakMode.WordWrap => Graphics.Platform.Gtk.LineBreakMode.WordWrap, + LineBreakMode.CharacterWrap => Graphics.Platform.Gtk.LineBreakMode.CharacterWrap, + LineBreakMode.HeadTruncation => Graphics.Platform.Gtk.LineBreakMode.HeadTruncation, + LineBreakMode.TailTruncation => Graphics.Platform.Gtk.LineBreakMode.TailTruncation, + LineBreakMode.MiddleTruncation => Graphics.Platform.Gtk.LineBreakMode.MiddleTruncation, _ => throw new ArgumentOutOfRangeException() }; @@ -82,22 +82,22 @@ public static Maui.Graphics.VerticalAlignment GetVerticalAlignment(this TextAlig _ => throw new ArgumentOutOfRangeException(nameof(alignment), alignment, null) }; - public static Microsoft.Maui.Graphics.Extras.LineBreakMode GetLineBreakMode(this Label nativeLabel) + public static Microsoft.Maui.Graphics.Platform.Gtk.LineBreakMode GetLineBreakMode(this Label nativeLabel) { var res = nativeLabel.Ellipsize switch { - EllipsizeMode.None => Graphics.Extras.LineBreakMode.None, - EllipsizeMode.Start => Graphics.Extras.LineBreakMode.Start | Graphics.Extras.LineBreakMode.Elipsis, - EllipsizeMode.Middle => Graphics.Extras.LineBreakMode.Center | Graphics.Extras.LineBreakMode.Elipsis, - EllipsizeMode.End => Graphics.Extras.LineBreakMode.End | Graphics.Extras.LineBreakMode.Elipsis, + EllipsizeMode.None => Graphics.Platform.Gtk.LineBreakMode.None, + EllipsizeMode.Start => Graphics.Platform.Gtk.LineBreakMode.Head | Graphics.Platform.Gtk.LineBreakMode.Ellipsis, + EllipsizeMode.Middle => Graphics.Platform.Gtk.LineBreakMode.Middle | Graphics.Platform.Gtk.LineBreakMode.Ellipsis, + EllipsizeMode.End => Graphics.Platform.Gtk.LineBreakMode.Tail | Graphics.Platform.Gtk.LineBreakMode.Ellipsis, _ => throw new ArgumentOutOfRangeException() }; var res1 = nativeLabel.LineWrapMode switch { - WrapMode.Word => Graphics.Extras.LineBreakMode.Word, - WrapMode.Char => Graphics.Extras.LineBreakMode.Character, - WrapMode.WordChar => Graphics.Extras.LineBreakMode.Character | Graphics.Extras.LineBreakMode.Word, + WrapMode.Word => Graphics.Platform.Gtk.LineBreakMode.Word, + WrapMode.Char => Graphics.Platform.Gtk.LineBreakMode.Character, + WrapMode.WordChar => Graphics.Platform.Gtk.LineBreakMode.Character | Graphics.Platform.Gtk.LineBreakMode.Word, _ => throw new ArgumentOutOfRangeException() }; diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 14cb04018b0c..d5cdf3313bd9 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -6,8 +6,8 @@ using System.Diagnostics; using System.Linq; using Gtk; -using Microsoft.Maui.Graphics.Native.Gtk; -using Rectangle = Microsoft.Maui.Graphics.Rectangle; +using Microsoft.Maui.Graphics.Platform.Gtk; +using Rectangle = Microsoft.Maui.Graphics.Rect; using Size = Microsoft.Maui.Graphics.Size; using Point = Microsoft.Maui.Graphics.Point; @@ -221,7 +221,7 @@ protected override void OnSizeAllocated(Gdk.Rectangle allocation) { IsReallocating = true; - var mAllocation = allocation.ToRectangle(); + var mAllocation = allocation.ToRect(); clearCache = LastAllocation.IsEmpty || mAllocation.IsEmpty || LastAllocation != mAllocation; ClearMeasured(clearCache); @@ -269,7 +269,7 @@ protected override void OnRealized() { try { - LastAllocation = Allocation.ToRectangle(); + LastAllocation = Allocation.ToRect(); Measure(Allocation.Width, Allocation.Height); } diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index ff931d2d264a..e13b9e00f2ae 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using Gdk; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; using Gtk; diff --git a/src/Core/src/Platform/Gtk/MauiShapeView.cs b/src/Core/src/Platform/Gtk/MauiShapeView.cs index 7f8e6501e81c..e0ac3c19872d 100644 --- a/src/Core/src/Platform/Gtk/MauiShapeView.cs +++ b/src/Core/src/Platform/Gtk/MauiShapeView.cs @@ -1,4 +1,4 @@ -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui.Native { diff --git a/src/Core/src/Platform/Gtk/MauiWindow.cs b/src/Core/src/Platform/Gtk/MauiWindow.cs index a2588f1dd09b..bde10c700da5 100644 --- a/src/Core/src/Platform/Gtk/MauiWindow.cs +++ b/src/Core/src/Platform/Gtk/MauiWindow.cs @@ -1,7 +1,5 @@ using System; using Gtk; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; diff --git a/src/Core/src/Platform/Gtk/PickerExtensions.cs b/src/Core/src/Platform/Gtk/PickerExtensions.cs index ab6e1468c61c..9f0eddc1cac7 100644 --- a/src/Core/src/Platform/Gtk/PickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/PickerExtensions.cs @@ -1,7 +1,7 @@ using System.Linq; using Gtk; using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/SemanticExtensions.cs b/src/Core/src/Platform/Gtk/SemanticExtensions.cs index a68fc24b65e6..13de8a26e2f8 100644 --- a/src/Core/src/Platform/Gtk/SemanticExtensions.cs +++ b/src/Core/src/Platform/Gtk/SemanticExtensions.cs @@ -1,6 +1,6 @@ namespace Microsoft.Maui { - public static partial class SemanticExtensions + public static partial class SemanticExtensions_ { /// /// Force semantic screen reader focus to specified element diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 923005286acf..f60bd953a0ae 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -1,12 +1,12 @@ using System; using Gtk; using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; -namespace Microsoft.Maui +namespace Microsoft.Maui.Platform { - public static class ViewExtensions + public static partial class ViewExtensions { public static void UpdateAutomationId(this Widget nativeView, IView view) diff --git a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs index cef2cef4aab3..ef4e863d884e 100644 --- a/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetColorExtensions.cs @@ -1,7 +1,7 @@ using System; using Gtk; using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index 4416ea1cd1e4..da03d12d4e0f 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -1,7 +1,7 @@ using System; using Gtk; using Microsoft.Maui.Graphics; -using Microsoft.Maui.Graphics.Native.Gtk; +using Microsoft.Maui.Graphics.Platform.Gtk; namespace Microsoft.Maui { @@ -100,7 +100,7 @@ public static SizeRequest GetDesiredSize( return new SizeRequest(new Size(naturalWidth, naturalHeight), new Size(minimumWidth, minimumHeight)); } - public static void Arrange(this Widget? nativeView, Rectangle rect) + public static void Arrange(this Widget? nativeView, Rect rect) { if (nativeView == null) return; @@ -108,7 +108,7 @@ public static void Arrange(this Widget? nativeView, Rectangle rect) if (rect.IsEmpty) return; - if (rect != nativeView.Allocation.ToRectangle()) + if (rect != nativeView.Allocation.ToRect()) { nativeView.SizeAllocate(rect.ToNative()); nativeView.QueueAllocate(); diff --git a/src/Core/src/Platform/Gtk/WindowExtensions.cs b/src/Core/src/Platform/Gtk/WindowExtensions.cs index cedaa8d4fdb9..157137a77c63 100644 --- a/src/Core/src/Platform/Gtk/WindowExtensions.cs +++ b/src/Core/src/Platform/Gtk/WindowExtensions.cs @@ -1,9 +1,9 @@ using System; -namespace Microsoft.Maui +namespace Microsoft.Maui.Platform { - public static class WindowExtensions + public static partial class WindowExtensions { public static void UpdateTitle(this Gtk.Window nativeWindow, IWindow window) => @@ -13,7 +13,7 @@ public static IWindow GetWindow(this Gtk.Window nativeWindow) { foreach (var window in MauiGtkApplication.Current.Application.Windows) { - if (window?.Handler?.NativeView is Gtk.Window win && win == nativeWindow) + if (window?.Handler?.PlatformView is Gtk.Window win && win == nativeWindow) return window; } diff --git a/src/Core/src/Platform/MauiContext.Gtk.cs b/src/Core/src/Platform/MauiContext.Gtk.cs index e9b80bd86a8b..52a1046f645f 100644 --- a/src/Core/src/Platform/MauiContext.Gtk.cs +++ b/src/Core/src/Platform/MauiContext.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui { - public partial class MauiContext : IMauiContext + public partial class MauiContext_ : IMauiContext { public Gtk.Window? Window { get; internal set; } diff --git a/src/Core/src/Platform/ViewExtensions.cs b/src/Core/src/Platform/ViewExtensions.cs index 46dcb04697f6..89797e9f37e3 100644 --- a/src/Core/src/Platform/ViewExtensions.cs +++ b/src/Core/src/Platform/ViewExtensions.cs @@ -40,8 +40,8 @@ public static partial class ViewExtensions /// - public static IPlatformViewHandler ToHandler(this IView view, IMauiContext context) => - (IPlatformViewHandler)ElementExtensions.ToHandler(view, context); + public static IViewHandler ToHandler(this IView view, IMauiContext context) => + (IViewHandler)ElementExtensions.ToHandler(view, context); internal static T? GetParentOfType(this ParentView? view) where T : class diff --git a/src/Core/src/SemanticExtensions.cs b/src/Core/src/SemanticExtensions.cs index 6eaf2fe47298..0de8e5d9224a 100644 --- a/src/Core/src/SemanticExtensions.cs +++ b/src/Core/src/SemanticExtensions.cs @@ -13,6 +13,8 @@ using ElmSharp; using ElmSharp.Accessible; using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/WindowExtensions.cs b/src/Core/src/WindowExtensions.cs index 82d6300d792f..aed46d01e3ce 100644 --- a/src/Core/src/WindowExtensions.cs +++ b/src/Core/src/WindowExtensions.cs @@ -9,6 +9,8 @@ using PlatformView = Microsoft.UI.Xaml.Window; #elif TIZEN using PlatformView = ElmSharp.Window; +#elif GTK +using PlatformView = Gtk.Window; #endif namespace Microsoft.Maui diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs index 43d1c38e4cdb..971734c53ec5 100644 --- a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.Maui.Graphics.Native.Gtk +namespace Microsoft.Maui.Graphics.Platform.Gtk { public static class TextExtensions From 39128c01cf1f513d2efc096f22b3f319b1a59ac8 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 00:16:22 +0200 Subject: [PATCH 166/425] [Gtk] Essentials.csproj, Core.csproj: add PublicAPI --- .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 2340 +++++++++++++++++ .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 11 + .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 1187 +++++++++ .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 1 + 4 files changed, 3539 insertions(+) create mode 100644 src/Core/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Core/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt create mode 100644 src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt diff --git a/src/Core/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Core/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..16c33cf6dcee --- /dev/null +++ b/src/Core/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1,2340 @@ +#nullable enable +abstract Microsoft.Maui.Handlers.ElementHandler.CreatePlatformElement() -> TPlatformView! +abstract Microsoft.Maui.Handlers.ViewHandler.GetDesiredSize(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +abstract Microsoft.Maui.Handlers.ViewHandler.PlatformArrange(Microsoft.Maui.Graphics.Rect frame) -> void +abstract Microsoft.Maui.Handlers.ViewHandler.RemoveContainer() -> void +abstract Microsoft.Maui.Handlers.ViewHandler.SetupContainer() -> void +abstract Microsoft.Maui.Handlers.ViewHandler.CreatePlatformView() -> TPlatformView! +abstract Microsoft.Maui.Layouts.LayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +abstract Microsoft.Maui.Layouts.LayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +const Microsoft.Maui.Primitives.Dimension.Maximum = Infinity -> double +const Microsoft.Maui.Primitives.Dimension.Minimum = 0 -> double +const Microsoft.Maui.Primitives.Dimension.Unset = NaN -> double +Microsoft.Maui.ActivationState +Microsoft.Maui.ActivationState.ActivationState(Microsoft.Maui.IMauiContext! context) -> void +Microsoft.Maui.ActivationState.ActivationState(Microsoft.Maui.IMauiContext! context, Microsoft.Maui.IPersistedState! state) -> void +Microsoft.Maui.ActivationState.Context.get -> Microsoft.Maui.IMauiContext! +Microsoft.Maui.ActivationState.State.get -> Microsoft.Maui.IPersistedState! +Microsoft.Maui.Animations.Animation +Microsoft.Maui.Animations.Animation.Add(double beginAt, double duration, Microsoft.Maui.Animations.Animation! animation) -> void +Microsoft.Maui.Animations.Animation.Animation() -> void +Microsoft.Maui.Animations.Animation.Animation(System.Action! callback, double start = 0, double duration = 1, Microsoft.Maui.Easing? easing = null, System.Action? finished = null) -> void +Microsoft.Maui.Animations.Animation.Animation(System.Collections.Generic.List! animations) -> void +Microsoft.Maui.Animations.Animation.AnimationManager.get -> Microsoft.Maui.Animations.IAnimationManager? +Microsoft.Maui.Animations.Animation.animationManger -> Microsoft.Maui.Animations.IAnimationManager? +Microsoft.Maui.Animations.Animation.childrenAnimations -> System.Collections.Generic.List! +Microsoft.Maui.Animations.Animation.Commit(Microsoft.Maui.Animations.IAnimationManager! animationManger) -> void +Microsoft.Maui.Animations.Animation.CreateAutoReversing() -> Microsoft.Maui.Animations.Animation! +Microsoft.Maui.Animations.Animation.CurrentTime.get -> double +Microsoft.Maui.Animations.Animation.CurrentTime.set -> void +Microsoft.Maui.Animations.Animation.Dispose() -> void +Microsoft.Maui.Animations.Animation.Duration.get -> double +Microsoft.Maui.Animations.Animation.Duration.set -> void +Microsoft.Maui.Animations.Animation.Easing.get -> Microsoft.Maui.Easing! +Microsoft.Maui.Animations.Animation.Easing.set -> void +Microsoft.Maui.Animations.Animation.Finished.get -> System.Action? +Microsoft.Maui.Animations.Animation.Finished.set -> void +Microsoft.Maui.Animations.Animation.GetEnumerator() -> System.Collections.IEnumerator! +Microsoft.Maui.Animations.Animation.HasFinished.get -> bool +Microsoft.Maui.Animations.Animation.HasFinished.set -> void +Microsoft.Maui.Animations.Animation.IsDisposed.get -> bool +Microsoft.Maui.Animations.Animation.IsPaused.get -> bool +Microsoft.Maui.Animations.Animation.Name.get -> string? +Microsoft.Maui.Animations.Animation.Name.set -> void +Microsoft.Maui.Animations.Animation.Pause() -> void +Microsoft.Maui.Animations.Animation.Progress.get -> double +Microsoft.Maui.Animations.Animation.Progress.set -> void +Microsoft.Maui.Animations.Animation.RemoveFromParent() -> void +Microsoft.Maui.Animations.Animation.Repeats.get -> bool +Microsoft.Maui.Animations.Animation.Repeats.set -> void +Microsoft.Maui.Animations.Animation.Resume() -> void +Microsoft.Maui.Animations.Animation.StartDelay.get -> double +Microsoft.Maui.Animations.Animation.StartDelay.set -> void +Microsoft.Maui.Animations.Animation.Step.get -> System.Action? +Microsoft.Maui.Animations.Animation.Step.set -> void +Microsoft.Maui.Animations.Animation.Tick(double milliseconds) -> void +Microsoft.Maui.Animations.AnimationLerpingExtensions +Microsoft.Maui.Animations.AnimationManager +Microsoft.Maui.Animations.AnimationManager.Add(Microsoft.Maui.Animations.Animation! animation) -> void +Microsoft.Maui.Animations.AnimationManager.AnimationManager(Microsoft.Maui.Animations.ITicker! ticker) -> void +Microsoft.Maui.Animations.AnimationManager.AutoStartTicker.get -> bool +Microsoft.Maui.Animations.AnimationManager.AutoStartTicker.set -> void +Microsoft.Maui.Animations.AnimationManager.Dispose() -> void +Microsoft.Maui.Animations.AnimationManager.Remove(Microsoft.Maui.Animations.Animation! animation) -> void +Microsoft.Maui.Animations.AnimationManager.SpeedModifier.get -> double +Microsoft.Maui.Animations.AnimationManager.SpeedModifier.set -> void +Microsoft.Maui.Animations.AnimationManager.Ticker.get -> Microsoft.Maui.Animations.ITicker! +Microsoft.Maui.Animations.IAnimationManager +Microsoft.Maui.Animations.IAnimationManager.Add(Microsoft.Maui.Animations.Animation! animation) -> void +Microsoft.Maui.Animations.IAnimationManager.AutoStartTicker.get -> bool +Microsoft.Maui.Animations.IAnimationManager.AutoStartTicker.set -> void +Microsoft.Maui.Animations.IAnimationManager.Remove(Microsoft.Maui.Animations.Animation! animation) -> void +Microsoft.Maui.Animations.IAnimationManager.SpeedModifier.get -> double +Microsoft.Maui.Animations.IAnimationManager.SpeedModifier.set -> void +Microsoft.Maui.Animations.IAnimationManager.Ticker.get -> Microsoft.Maui.Animations.ITicker! +Microsoft.Maui.Animations.IAnimator +Microsoft.Maui.Animations.IAnimator.AddAnimation(Microsoft.Maui.Animations.Animation! animation) -> void +Microsoft.Maui.Animations.IAnimator.RemoveAnimation(Microsoft.Maui.Animations.Animation! animation) -> void +Microsoft.Maui.Animations.ITicker +Microsoft.Maui.Animations.ITicker.Fire.get -> System.Action? +Microsoft.Maui.Animations.ITicker.Fire.set -> void +Microsoft.Maui.Animations.ITicker.IsRunning.get -> bool +Microsoft.Maui.Animations.ITicker.MaxFps.get -> int +Microsoft.Maui.Animations.ITicker.MaxFps.set -> void +Microsoft.Maui.Animations.ITicker.Start() -> void +Microsoft.Maui.Animations.ITicker.Stop() -> void +Microsoft.Maui.Animations.ITicker.SystemEnabled.get -> bool +Microsoft.Maui.Animations.Lerp +Microsoft.Maui.Animations.Lerp.Calculate.get -> Microsoft.Maui.Animations.Lerp.LerpDelegate? +Microsoft.Maui.Animations.Lerp.Calculate.set -> void +Microsoft.Maui.Animations.Lerp.Lerp() -> void +Microsoft.Maui.Animations.Lerp.LerpDelegate +Microsoft.Maui.Animations.LerpingAnimation +Microsoft.Maui.Animations.LerpingAnimation.CurrentValue.get -> object? +Microsoft.Maui.Animations.LerpingAnimation.CurrentValue.set -> void +Microsoft.Maui.Animations.LerpingAnimation.EndValue.get -> object? +Microsoft.Maui.Animations.LerpingAnimation.EndValue.set -> void +Microsoft.Maui.Animations.LerpingAnimation.Lerp.get -> Microsoft.Maui.Animations.Lerp? +Microsoft.Maui.Animations.LerpingAnimation.Lerp.set -> void +Microsoft.Maui.Animations.LerpingAnimation.LerpingAnimation() -> void +Microsoft.Maui.Animations.LerpingAnimation.LerpingAnimation(System.Action! callback, double start = 0, double end = 1, Microsoft.Maui.Easing? easing = null, System.Action? finished = null) -> void +Microsoft.Maui.Animations.LerpingAnimation.LerpingAnimation(System.Collections.Generic.List! animations) -> void +Microsoft.Maui.Animations.LerpingAnimation.StartValue.get -> object? +Microsoft.Maui.Animations.LerpingAnimation.StartValue.set -> void +Microsoft.Maui.Animations.LerpingAnimation.ValueChanged.get -> System.Action? +Microsoft.Maui.Animations.LerpingAnimation.ValueChanged.set -> void +Microsoft.Maui.Animations.PlatformTicker +Microsoft.Maui.Animations.PlatformTicker.PlatformTicker() -> void +Microsoft.Maui.Animations.Ticker +Microsoft.Maui.Animations.Ticker.Fire.get -> System.Action? +Microsoft.Maui.Animations.Ticker.Fire.set -> void +Microsoft.Maui.Animations.Ticker.Ticker() -> void +Microsoft.Maui.Aspect +Microsoft.Maui.Aspect.AspectFill = 1 -> Microsoft.Maui.Aspect +Microsoft.Maui.Aspect.AspectFit = 0 -> Microsoft.Maui.Aspect +Microsoft.Maui.Aspect.Center = 3 -> Microsoft.Maui.Aspect +Microsoft.Maui.Aspect.Fill = 2 -> Microsoft.Maui.Aspect +Microsoft.Maui.ClearButtonVisibility +Microsoft.Maui.ClearButtonVisibility.Never = 0 -> Microsoft.Maui.ClearButtonVisibility +Microsoft.Maui.ClearButtonVisibility.WhileEditing = 1 -> Microsoft.Maui.ClearButtonVisibility +Microsoft.Maui.CommandMapper +Microsoft.Maui.CommandMapper.Chained.get -> Microsoft.Maui.CommandMapper? +Microsoft.Maui.CommandMapper.Chained.set -> void +Microsoft.Maui.CommandMapper.CommandMapper() -> void +Microsoft.Maui.CommandMapper.CommandMapper(Microsoft.Maui.CommandMapper! chained) -> void +Microsoft.Maui.CommandMapper +Microsoft.Maui.CommandMapper.Add(string! key, System.Action! action) -> void +Microsoft.Maui.CommandMapper.Add(string! key, System.Action! action) -> void +Microsoft.Maui.CommandMapper.CommandMapper() -> void +Microsoft.Maui.CommandMapper.CommandMapper(Microsoft.Maui.CommandMapper! chained) -> void +Microsoft.Maui.CommandMapper.this[string! key].get -> System.Action! +Microsoft.Maui.CommandMapper.this[string! key].set -> void +Microsoft.Maui.CommandMapper +Microsoft.Maui.CommandMapper.CommandMapper() -> void +Microsoft.Maui.CommandMapper.CommandMapper(Microsoft.Maui.CommandMapper! chained) -> void +Microsoft.Maui.CommandMapperExtensions +Microsoft.Maui.Converters.CornerRadiusTypeConverter +Microsoft.Maui.Converters.CornerRadiusTypeConverter.CornerRadiusTypeConverter() -> void +Microsoft.Maui.Converters.EasingTypeConverter +Microsoft.Maui.Converters.EasingTypeConverter.EasingTypeConverter() -> void +Microsoft.Maui.Converters.FlexAlignContentTypeConverter +Microsoft.Maui.Converters.FlexAlignContentTypeConverter.FlexAlignContentTypeConverter() -> void +Microsoft.Maui.Converters.FlexAlignItemsTypeConverter +Microsoft.Maui.Converters.FlexAlignItemsTypeConverter.FlexAlignItemsTypeConverter() -> void +Microsoft.Maui.Converters.FlexAlignSelfTypeConverter +Microsoft.Maui.Converters.FlexAlignSelfTypeConverter.FlexAlignSelfTypeConverter() -> void +Microsoft.Maui.Converters.FlexBasisTypeConverter +Microsoft.Maui.Converters.FlexBasisTypeConverter.FlexBasisTypeConverter() -> void +Microsoft.Maui.Converters.FlexDirectionTypeConverter +Microsoft.Maui.Converters.FlexDirectionTypeConverter.FlexDirectionTypeConverter() -> void +Microsoft.Maui.Converters.FlexJustifyTypeConverter +Microsoft.Maui.Converters.FlexJustifyTypeConverter.FlexJustifyTypeConverter() -> void +Microsoft.Maui.Converters.FlexWrapTypeConverter +Microsoft.Maui.Converters.FlexWrapTypeConverter.FlexWrapTypeConverter() -> void +Microsoft.Maui.Converters.KeyboardTypeConverter +Microsoft.Maui.Converters.KeyboardTypeConverter.KeyboardTypeConverter() -> void +Microsoft.Maui.Converters.ThicknessTypeConverter +Microsoft.Maui.Converters.ThicknessTypeConverter.ThicknessTypeConverter() -> void +Microsoft.Maui.CornerRadius +Microsoft.Maui.CornerRadius.BottomLeft.get -> double +Microsoft.Maui.CornerRadius.BottomRight.get -> double +Microsoft.Maui.CornerRadius.CornerRadius() -> void +Microsoft.Maui.CornerRadius.CornerRadius(double topLeft, double topRight, double bottomLeft, double bottomRight) -> void +Microsoft.Maui.CornerRadius.CornerRadius(double uniformRadius) -> void +Microsoft.Maui.CornerRadius.Deconstruct(out double topLeft, out double topRight, out double bottomLeft, out double bottomRight) -> void +Microsoft.Maui.CornerRadius.TopLeft.get -> double +Microsoft.Maui.CornerRadius.TopRight.get -> double +Microsoft.Maui.Crc64 +Microsoft.Maui.CustomKeyboard +Microsoft.Maui.CustomKeyboard.Flags.get -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.Dispatching.Dispatcher +Microsoft.Maui.Dispatching.Dispatcher.CreateTimer() -> Microsoft.Maui.Dispatching.IDispatcherTimer! +Microsoft.Maui.Dispatching.Dispatcher.Dispatch(System.Action! action) -> bool +Microsoft.Maui.Dispatching.Dispatcher.DispatchDelayed(System.TimeSpan delay, System.Action! action) -> bool +Microsoft.Maui.Dispatching.Dispatcher.IsDispatchRequired.get -> bool +Microsoft.Maui.Dispatching.DispatcherExtensions +Microsoft.Maui.Dispatching.DispatcherProvider +Microsoft.Maui.Dispatching.DispatcherProvider.DispatcherProvider() -> void +Microsoft.Maui.Dispatching.DispatcherProvider.GetForCurrentThread() -> Microsoft.Maui.Dispatching.IDispatcher? +Microsoft.Maui.Dispatching.IDispatcher +Microsoft.Maui.Dispatching.IDispatcher.CreateTimer() -> Microsoft.Maui.Dispatching.IDispatcherTimer! +Microsoft.Maui.Dispatching.IDispatcher.Dispatch(System.Action! action) -> bool +Microsoft.Maui.Dispatching.IDispatcher.DispatchDelayed(System.TimeSpan delay, System.Action! action) -> bool +Microsoft.Maui.Dispatching.IDispatcher.IsDispatchRequired.get -> bool +Microsoft.Maui.Dispatching.IDispatcherProvider +Microsoft.Maui.Dispatching.IDispatcherProvider.GetForCurrentThread() -> Microsoft.Maui.Dispatching.IDispatcher? +Microsoft.Maui.Dispatching.IDispatcherTimer +Microsoft.Maui.Dispatching.IDispatcherTimer.Interval.get -> System.TimeSpan +Microsoft.Maui.Dispatching.IDispatcherTimer.Interval.set -> void +Microsoft.Maui.Dispatching.IDispatcherTimer.IsRepeating.get -> bool +Microsoft.Maui.Dispatching.IDispatcherTimer.IsRepeating.set -> void +Microsoft.Maui.Dispatching.IDispatcherTimer.IsRunning.get -> bool +Microsoft.Maui.Dispatching.IDispatcherTimer.Start() -> void +Microsoft.Maui.Dispatching.IDispatcherTimer.Stop() -> void +Microsoft.Maui.Dispatching.IDispatcherTimer.Tick -> System.EventHandler! +Microsoft.Maui.DisplayDensityRequest +Microsoft.Maui.DisplayDensityRequest.DisplayDensityRequest() -> void +Microsoft.Maui.Easing +Microsoft.Maui.Easing.Ease(double v) -> double +Microsoft.Maui.Easing.Easing(System.Func! easingFunc) -> void +Microsoft.Maui.EmbeddedFont +Microsoft.Maui.EmbeddedFont.EmbeddedFont() -> void +Microsoft.Maui.EmbeddedFont.FontName.get -> string? +Microsoft.Maui.EmbeddedFont.FontName.set -> void +Microsoft.Maui.EmbeddedFont.ResourceStream.get -> System.IO.Stream? +Microsoft.Maui.EmbeddedFont.ResourceStream.set -> void +Microsoft.Maui.EmbeddedFontLoader +Microsoft.Maui.EmbeddedFontLoader.EmbeddedFontLoader() -> void +Microsoft.Maui.EmbeddedFontLoader.EmbeddedFontLoader(System.IServiceProvider? serviceProvider = null) -> void +Microsoft.Maui.EmbeddedFontLoader.LoadFont(Microsoft.Maui.EmbeddedFont! font) -> string? +Microsoft.Maui.EvaluateJavaScriptAsyncRequest +Microsoft.Maui.EvaluateJavaScriptAsyncRequest.EvaluateJavaScriptAsyncRequest(string! script) -> void +Microsoft.Maui.EvaluateJavaScriptAsyncRequest.Script.get -> string! +Microsoft.Maui.FileImageSourceService +Microsoft.Maui.FileImageSourceService.FileImageSourceService() -> void +Microsoft.Maui.FileImageSourceService.FileImageSourceService(Microsoft.Extensions.Logging.ILogger? logger = null) -> void +Microsoft.Maui.FileSystemEmbeddedFontLoader +Microsoft.Maui.FileSystemEmbeddedFontLoader.FileSystemEmbeddedFontLoader(string! rootPath, System.IServiceProvider? serviceProvider = null) -> void +Microsoft.Maui.FileSystemEmbeddedFontLoader.LoadFont(Microsoft.Maui.EmbeddedFont! font) -> string? +Microsoft.Maui.FilterMode +Microsoft.Maui.FilterMode.Multiply = 1 -> Microsoft.Maui.FilterMode +Microsoft.Maui.FilterMode.SrcAtop = 2 -> Microsoft.Maui.FilterMode +Microsoft.Maui.FilterMode.SrcIn = 0 -> Microsoft.Maui.FilterMode +Microsoft.Maui.FlowDirection +Microsoft.Maui.FlowDirection.LeftToRight = 1 -> Microsoft.Maui.FlowDirection +Microsoft.Maui.FlowDirection.MatchParent = 0 -> Microsoft.Maui.FlowDirection +Microsoft.Maui.FlowDirection.RightToLeft = 2 -> Microsoft.Maui.FlowDirection +Microsoft.Maui.FlyoutBehavior +Microsoft.Maui.FlyoutBehavior.Disabled = 0 -> Microsoft.Maui.FlyoutBehavior +Microsoft.Maui.FlyoutBehavior.Flyout = 1 -> Microsoft.Maui.FlyoutBehavior +Microsoft.Maui.FlyoutBehavior.Locked = 2 -> Microsoft.Maui.FlyoutBehavior +Microsoft.Maui.FocusRequest +Microsoft.Maui.FocusRequest.FocusRequest(bool isFocused) -> void +Microsoft.Maui.FocusRequest.IsFocused.get -> bool +Microsoft.Maui.FocusRequest.IsFocused.set -> void +Microsoft.Maui.Font +Microsoft.Maui.Font.AutoScalingEnabled.get -> bool +Microsoft.Maui.Font.Family.get -> string? +Microsoft.Maui.Font.Font() -> void +Microsoft.Maui.Font.IsDefault.get -> bool +Microsoft.Maui.Font.Size.get -> double +Microsoft.Maui.Font.Slant.get -> Microsoft.Maui.FontSlant +Microsoft.Maui.Font.Weight.get -> Microsoft.Maui.FontWeight +Microsoft.Maui.Font.WithAutoScaling(bool enabled) -> Microsoft.Maui.Font +Microsoft.Maui.Font.WithSize(double size) -> Microsoft.Maui.Font +Microsoft.Maui.Font.WithSlant(Microsoft.Maui.FontSlant fontSlant) -> Microsoft.Maui.Font +Microsoft.Maui.Font.WithWeight(Microsoft.Maui.FontWeight weight) -> Microsoft.Maui.Font +Microsoft.Maui.Font.WithWeight(Microsoft.Maui.FontWeight weight, Microsoft.Maui.FontSlant fontSlant) -> Microsoft.Maui.Font +Microsoft.Maui.FontFile +Microsoft.Maui.FontFile.Extension.get -> string? +Microsoft.Maui.FontFile.Extension.set -> void +Microsoft.Maui.FontFile.FileName.get -> string? +Microsoft.Maui.FontFile.FileName.set -> void +Microsoft.Maui.FontFile.FileNameWithExtension() -> string! +Microsoft.Maui.FontFile.FileNameWithExtension(string? extension) -> string! +Microsoft.Maui.FontFile.FontFile() -> void +Microsoft.Maui.FontFile.GetPostScriptNameWithSpaces() -> string! +Microsoft.Maui.FontFile.PostScriptName.get -> string? +Microsoft.Maui.FontFile.PostScriptName.set -> void +Microsoft.Maui.FontImageSourceService +Microsoft.Maui.FontImageSourceService.FontImageSourceService(Microsoft.Maui.IFontManager! fontManager) -> void +Microsoft.Maui.FontImageSourceService.FontImageSourceService(Microsoft.Maui.IFontManager! fontManager, Microsoft.Extensions.Logging.ILogger? logger = null) -> void +Microsoft.Maui.FontImageSourceService.FontManager.get -> Microsoft.Maui.IFontManager! +Microsoft.Maui.FontManager +Microsoft.Maui.FontManager.DefaultFontSize.get -> double +Microsoft.Maui.FontManager.FontManager(Microsoft.Maui.IFontRegistrar! fontRegistrar, System.IServiceProvider? serviceProvider = null) -> void +Microsoft.Maui.FontRegistrar +Microsoft.Maui.FontRegistrar.FontRegistrar(Microsoft.Maui.IEmbeddedFontLoader! fontLoader, System.IServiceProvider? serviceProvider = null) -> void +Microsoft.Maui.FontRegistrar.GetFont(string! font) -> string? +Microsoft.Maui.FontRegistrar.Register(string! filename, string? alias) -> void +Microsoft.Maui.FontRegistrar.Register(string! filename, string? alias, System.Reflection.Assembly! assembly) -> void +Microsoft.Maui.FontSlant +Microsoft.Maui.FontSlant.Default = 0 -> Microsoft.Maui.FontSlant +Microsoft.Maui.FontSlant.Italic = 1 -> Microsoft.Maui.FontSlant +Microsoft.Maui.FontSlant.Oblique = 2 -> Microsoft.Maui.FontSlant +Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Black = 900 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Bold = 700 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Heavy = 800 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Light = 300 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Medium = 500 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Regular = 400 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Semibold = 600 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Thin = 100 -> Microsoft.Maui.FontWeight +Microsoft.Maui.FontWeight.Ultralight = 200 -> Microsoft.Maui.FontWeight +Microsoft.Maui.GestureStatus +Microsoft.Maui.GestureStatus.Canceled = 3 -> Microsoft.Maui.GestureStatus +Microsoft.Maui.GestureStatus.Completed = 2 -> Microsoft.Maui.GestureStatus +Microsoft.Maui.GestureStatus.Running = 1 -> Microsoft.Maui.GestureStatus +Microsoft.Maui.GestureStatus.Started = 0 -> Microsoft.Maui.GestureStatus +Microsoft.Maui.Graphics.IShape +Microsoft.Maui.Graphics.IShape.PathForBounds(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.PathF! +Microsoft.Maui.Graphics.PaintExtensions +Microsoft.Maui.Graphics.ShapeDrawable +Microsoft.Maui.Graphics.ShapeDrawable.Draw(Microsoft.Maui.Graphics.ICanvas! canvas, Microsoft.Maui.Graphics.RectF dirtyRect) -> void +Microsoft.Maui.Graphics.ShapeDrawable.ShapeDrawable() -> void +Microsoft.Maui.Graphics.ShapeDrawable.ShapeDrawable(Microsoft.Maui.IShapeView? shape) -> void +Microsoft.Maui.Graphics.ShapeDrawable.UpdateRenderTransform(System.Numerics.Matrix3x2? renderTransform) -> void +Microsoft.Maui.Graphics.ShapeDrawable.UpdateShapeView(Microsoft.Maui.IShapeView? shape) -> void +Microsoft.Maui.Graphics.ShapeDrawable.UpdateWindingMode(Microsoft.Maui.Graphics.WindingMode windingMode) -> void +Microsoft.Maui.GridLength +Microsoft.Maui.GridLength.GridLength() -> void +Microsoft.Maui.GridLength.GridLength(double value) -> void +Microsoft.Maui.GridLength.GridLength(double value, Microsoft.Maui.GridUnitType type) -> void +Microsoft.Maui.GridLength.GridUnitType.get -> Microsoft.Maui.GridUnitType +Microsoft.Maui.GridLength.IsAbsolute.get -> bool +Microsoft.Maui.GridLength.IsAuto.get -> bool +Microsoft.Maui.GridLength.IsStar.get -> bool +Microsoft.Maui.GridLength.Value.get -> double +Microsoft.Maui.GridUnitType +Microsoft.Maui.GridUnitType.Absolute = 0 -> Microsoft.Maui.GridUnitType +Microsoft.Maui.GridUnitType.Auto = 2 -> Microsoft.Maui.GridUnitType +Microsoft.Maui.GridUnitType.Star = 1 -> Microsoft.Maui.GridUnitType +Microsoft.Maui.Handlers.ActivityIndicatorHandler +Microsoft.Maui.Handlers.ActivityIndicatorHandler.ActivityIndicatorHandler() -> void +Microsoft.Maui.Handlers.ActivityIndicatorHandler.ActivityIndicatorHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.ApplicationHandler +Microsoft.Maui.Handlers.ApplicationHandler.ApplicationHandler() -> void +Microsoft.Maui.Handlers.ApplicationHandler.ApplicationHandler(Microsoft.Maui.IPropertyMapper? mapper, Microsoft.Maui.CommandMapper? commandMapper) -> void +Microsoft.Maui.Handlers.BorderHandler +Microsoft.Maui.Handlers.BorderHandler.BorderHandler() -> void +Microsoft.Maui.Handlers.BorderHandler.BorderHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.BorderHandler.BorderHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.ButtonHandler +Microsoft.Maui.Handlers.ButtonHandler.ButtonHandler() -> void +Microsoft.Maui.Handlers.ButtonHandler.ButtonHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.ButtonHandler.ImageSourceLoader.get -> Microsoft.Maui.Platform.ImageSourcePartLoader! +Microsoft.Maui.Handlers.CheckBoxHandler +Microsoft.Maui.Handlers.CheckBoxHandler.CheckBoxHandler() -> void +Microsoft.Maui.Handlers.CheckBoxHandler.CheckBoxHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.ContentViewHandler +Microsoft.Maui.Handlers.ContentViewHandler.ContentViewHandler() -> void +Microsoft.Maui.Handlers.ContentViewHandler.ContentViewHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.ContentViewHandler.ContentViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.DatePickerHandler +Microsoft.Maui.Handlers.DatePickerHandler.DatePickerHandler() -> void +Microsoft.Maui.Handlers.DatePickerHandler.DatePickerHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.EditorHandler +Microsoft.Maui.Handlers.EditorHandler.EditorHandler() -> void +Microsoft.Maui.Handlers.EditorHandler.EditorHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.ElementHandler +Microsoft.Maui.Handlers.ElementHandler.ElementHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.ElementHandler.MauiContext.get -> Microsoft.Maui.IMauiContext? +Microsoft.Maui.Handlers.ElementHandler.PlatformView.get -> object? +Microsoft.Maui.Handlers.ElementHandler.Services.get -> System.IServiceProvider? +Microsoft.Maui.Handlers.ElementHandler.VirtualView.get -> Microsoft.Maui.IElement? +Microsoft.Maui.Handlers.ElementHandler +Microsoft.Maui.Handlers.ElementHandler.ElementHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.ElementHandler.PlatformView.get -> TPlatformView! +Microsoft.Maui.Handlers.ElementHandler.VirtualView.get -> TVirtualView! +Microsoft.Maui.Handlers.EntryHandler +Microsoft.Maui.Handlers.EntryHandler.EntryHandler() -> void +Microsoft.Maui.Handlers.EntryHandler.EntryHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.FlyoutViewHandler +Microsoft.Maui.Handlers.FlyoutViewHandler.FlyoutViewHandler() -> void +Microsoft.Maui.Handlers.GraphicsViewHandler +Microsoft.Maui.Handlers.GraphicsViewHandler.GraphicsViewHandler() -> void +Microsoft.Maui.Handlers.GraphicsViewHandler.GraphicsViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.IActivityIndicatorHandler +Microsoft.Maui.Handlers.IActivityIndicatorHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IActivityIndicatorHandler.VirtualView.get -> Microsoft.Maui.IActivityIndicator! +Microsoft.Maui.Handlers.IBorderHandler +Microsoft.Maui.Handlers.IBorderHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IBorderHandler.VirtualView.get -> Microsoft.Maui.IBorderView! +Microsoft.Maui.Handlers.IButtonHandler +Microsoft.Maui.Handlers.IButtonHandler.ImageSourceLoader.get -> Microsoft.Maui.Platform.ImageSourcePartLoader! +Microsoft.Maui.Handlers.IButtonHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IButtonHandler.VirtualView.get -> Microsoft.Maui.IButton! +Microsoft.Maui.Handlers.ICheckBoxHandler +Microsoft.Maui.Handlers.ICheckBoxHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ICheckBoxHandler.VirtualView.get -> Microsoft.Maui.ICheckBox! +Microsoft.Maui.Handlers.IContentViewHandler +Microsoft.Maui.Handlers.IContentViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IContentViewHandler.VirtualView.get -> Microsoft.Maui.IContentView! +Microsoft.Maui.Handlers.IDatePickerHandler +Microsoft.Maui.Handlers.IDatePickerHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IDatePickerHandler.VirtualView.get -> Microsoft.Maui.IDatePicker! +Microsoft.Maui.Handlers.IEditorHandler +Microsoft.Maui.Handlers.IEditorHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IEditorHandler.VirtualView.get -> Microsoft.Maui.IEditor! +Microsoft.Maui.Handlers.IEntryHandler +Microsoft.Maui.Handlers.IEntryHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IEntryHandler.VirtualView.get -> Microsoft.Maui.IEntry! +Microsoft.Maui.Handlers.IFlyoutViewHandler +Microsoft.Maui.Handlers.IFlyoutViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IFlyoutViewHandler.VirtualView.get -> Microsoft.Maui.IFlyoutView! +Microsoft.Maui.Handlers.IGraphicsViewHandler +Microsoft.Maui.Handlers.IGraphicsViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IGraphicsViewHandler.VirtualView.get -> Microsoft.Maui.IGraphicsView! +Microsoft.Maui.Handlers.IImageButtonHandler +Microsoft.Maui.Handlers.IImageButtonHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IImageButtonHandler.VirtualView.get -> Microsoft.Maui.IImageButton! +Microsoft.Maui.Handlers.IImageHandler +Microsoft.Maui.Handlers.IImageHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IImageHandler.SourceLoader.get -> Microsoft.Maui.Platform.ImageSourcePartLoader! +Microsoft.Maui.Handlers.IImageHandler.VirtualView.get -> Microsoft.Maui.IImage! +Microsoft.Maui.Handlers.IIndicatorViewHandler +Microsoft.Maui.Handlers.IIndicatorViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IIndicatorViewHandler.VirtualView.get -> Microsoft.Maui.IIndicatorView! +Microsoft.Maui.Handlers.ILabelHandler +Microsoft.Maui.Handlers.ILabelHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ILabelHandler.VirtualView.get -> Microsoft.Maui.ILabel! +Microsoft.Maui.Handlers.ImageButtonHandler +Microsoft.Maui.Handlers.ImageButtonHandler.ImageButtonHandler() -> void +Microsoft.Maui.Handlers.ImageButtonHandler.ImageButtonHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.ImageButtonHandler.SourceLoader.get -> Microsoft.Maui.Platform.ImageSourcePartLoader! +Microsoft.Maui.Handlers.ImageHandler +Microsoft.Maui.Handlers.ImageHandler.ImageHandler() -> void +Microsoft.Maui.Handlers.ImageHandler.ImageHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.ImageHandler.SourceLoader.get -> Microsoft.Maui.Platform.ImageSourcePartLoader! +Microsoft.Maui.Handlers.IMenuBarHandler +Microsoft.Maui.Handlers.IMenuBarHandler.Add(Microsoft.Maui.IMenuBarItem! view) -> void +Microsoft.Maui.Handlers.IMenuBarHandler.Clear() -> void +Microsoft.Maui.Handlers.IMenuBarHandler.Insert(int index, Microsoft.Maui.IMenuBarItem! view) -> void +Microsoft.Maui.Handlers.IMenuBarHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IMenuBarHandler.Remove(Microsoft.Maui.IMenuBarItem! view) -> void +Microsoft.Maui.Handlers.IMenuBarHandler.VirtualView.get -> Microsoft.Maui.IMenuBar! +Microsoft.Maui.Handlers.IMenuBarItemHandler +Microsoft.Maui.Handlers.IMenuBarItemHandler.Add(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.IMenuBarItemHandler.Clear() -> void +Microsoft.Maui.Handlers.IMenuBarItemHandler.Insert(int index, Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.IMenuBarItemHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IMenuBarItemHandler.Remove(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.IMenuBarItemHandler.VirtualView.get -> Microsoft.Maui.IMenuBarItem! +Microsoft.Maui.Handlers.IMenuFlyoutItemHandler +Microsoft.Maui.Handlers.IMenuFlyoutItemHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IMenuFlyoutItemHandler.VirtualView.get -> Microsoft.Maui.IMenuFlyoutItem! +Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler +Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler.Add(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler.Clear() -> void +Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler.Insert(int index, Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler.Remove(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler.VirtualView.get -> Microsoft.Maui.IMenuFlyoutSubItem! +Microsoft.Maui.Handlers.INavigationViewHandler +Microsoft.Maui.Handlers.INavigationViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.INavigationViewHandler.VirtualView.get -> Microsoft.Maui.IStackNavigationView! +Microsoft.Maui.Handlers.IndicatorViewHandler +Microsoft.Maui.Handlers.IndicatorViewHandler.IndicatorViewHandler() -> void +Microsoft.Maui.Handlers.IndicatorViewHandler.IndicatorViewHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.IPageHandler +Microsoft.Maui.Handlers.IPickerHandler +Microsoft.Maui.Handlers.IPickerHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IPickerHandler.VirtualView.get -> Microsoft.Maui.IPicker! +Microsoft.Maui.Handlers.IProgressBarHandler +Microsoft.Maui.Handlers.IProgressBarHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IProgressBarHandler.VirtualView.get -> Microsoft.Maui.IProgress! +Microsoft.Maui.Handlers.IRadioButtonHandler +Microsoft.Maui.Handlers.IRadioButtonHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IRadioButtonHandler.VirtualView.get -> Microsoft.Maui.IRadioButton! +Microsoft.Maui.Handlers.IRefreshViewHandler +Microsoft.Maui.Handlers.IRefreshViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IRefreshViewHandler.VirtualView.get -> Microsoft.Maui.IRefreshView! +Microsoft.Maui.Handlers.IScrollViewHandler +Microsoft.Maui.Handlers.IScrollViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IScrollViewHandler.VirtualView.get -> Microsoft.Maui.IScrollView! +Microsoft.Maui.Handlers.ISearchBarHandler +Microsoft.Maui.Handlers.ISearchBarHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ISearchBarHandler.QueryEditor.get -> object? +Microsoft.Maui.Handlers.ISearchBarHandler.VirtualView.get -> Microsoft.Maui.ISearchBar! +Microsoft.Maui.Handlers.IShapeViewHandler +Microsoft.Maui.Handlers.IShapeViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IShapeViewHandler.VirtualView.get -> Microsoft.Maui.IShapeView! +Microsoft.Maui.Handlers.ISliderHandler +Microsoft.Maui.Handlers.ISliderHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ISliderHandler.VirtualView.get -> Microsoft.Maui.ISlider! +Microsoft.Maui.Handlers.IStepperHandler +Microsoft.Maui.Handlers.IStepperHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IStepperHandler.VirtualView.get -> Microsoft.Maui.IStepper! +Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler +Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler.VirtualView.get -> Microsoft.Maui.ISwipeItemMenuItem! +Microsoft.Maui.Handlers.ISwipeItemViewHandler +Microsoft.Maui.Handlers.ISwipeItemViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ISwipeItemViewHandler.VirtualView.get -> Microsoft.Maui.ISwipeItemView! +Microsoft.Maui.Handlers.ISwipeViewHandler +Microsoft.Maui.Handlers.ISwipeViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ISwipeViewHandler.VirtualView.get -> Microsoft.Maui.ISwipeView! +Microsoft.Maui.Handlers.ISwitchHandler +Microsoft.Maui.Handlers.ISwitchHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ISwitchHandler.VirtualView.get -> Microsoft.Maui.ISwitch! +Microsoft.Maui.Handlers.ITabbedViewHandler +Microsoft.Maui.Handlers.ITabbedViewHandler.VirtualView.get -> Microsoft.Maui.ITabbedView! +Microsoft.Maui.Handlers.ITimePickerHandler +Microsoft.Maui.Handlers.ITimePickerHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.ITimePickerHandler.VirtualView.get -> Microsoft.Maui.ITimePicker! +Microsoft.Maui.Handlers.IToolbarHandler +Microsoft.Maui.Handlers.IToolbarHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IToolbarHandler.VirtualView.get -> Microsoft.Maui.IToolbar! +Microsoft.Maui.Handlers.IWebViewHandler +Microsoft.Maui.Handlers.IWebViewHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IWebViewHandler.VirtualView.get -> Microsoft.Maui.IWebView! +Microsoft.Maui.Handlers.IWindowHandler +Microsoft.Maui.Handlers.IWindowHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IWindowHandler.VirtualView.get -> Microsoft.Maui.IWindow! +Microsoft.Maui.Handlers.LabelHandler +Microsoft.Maui.Handlers.LabelHandler.LabelHandler() -> void +Microsoft.Maui.Handlers.LabelHandler.LabelHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.LayoutHandler +Microsoft.Maui.Handlers.LayoutHandler.Add(Microsoft.Maui.IView! view) -> void +Microsoft.Maui.Handlers.LayoutHandler.Clear() -> void +Microsoft.Maui.Handlers.LayoutHandler.Insert(int index, Microsoft.Maui.IView! view) -> void +Microsoft.Maui.Handlers.LayoutHandler.LayoutHandler() -> void +Microsoft.Maui.Handlers.LayoutHandler.LayoutHandler(Microsoft.Maui.IPropertyMapper? mapper = null, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.LayoutHandler.Remove(Microsoft.Maui.IView! view) -> void +Microsoft.Maui.Handlers.LayoutHandler.Update(int index, Microsoft.Maui.IView! view) -> void +Microsoft.Maui.Handlers.LayoutHandler.UpdateZIndex(Microsoft.Maui.IView! view) -> void +Microsoft.Maui.Handlers.LayoutHandlerUpdate +Microsoft.Maui.Handlers.LayoutHandlerUpdate.Index.get -> int +Microsoft.Maui.Handlers.LayoutHandlerUpdate.Index.init -> void +Microsoft.Maui.Handlers.LayoutHandlerUpdate.LayoutHandlerUpdate(int Index, Microsoft.Maui.IView! View) -> void +Microsoft.Maui.Handlers.LayoutHandlerUpdate.View.get -> Microsoft.Maui.IView! +Microsoft.Maui.Handlers.LayoutHandlerUpdate.View.init -> void +Microsoft.Maui.Handlers.MenuBarHandler +Microsoft.Maui.Handlers.MenuBarHandler.Add(Microsoft.Maui.IMenuBarItem! view) -> void +Microsoft.Maui.Handlers.MenuBarHandler.Clear() -> void +Microsoft.Maui.Handlers.MenuBarHandler.Insert(int index, Microsoft.Maui.IMenuBarItem! view) -> void +Microsoft.Maui.Handlers.MenuBarHandler.MenuBarHandler() -> void +Microsoft.Maui.Handlers.MenuBarHandler.MenuBarHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.MenuBarHandler.Remove(Microsoft.Maui.IMenuBarItem! view) -> void +Microsoft.Maui.Handlers.MenuBarHandlerUpdate +Microsoft.Maui.Handlers.MenuBarHandlerUpdate.Index.get -> int +Microsoft.Maui.Handlers.MenuBarHandlerUpdate.Index.init -> void +Microsoft.Maui.Handlers.MenuBarHandlerUpdate.MenuBarHandlerUpdate(int Index, Microsoft.Maui.IMenuBarItem! MenuBarItem) -> void +Microsoft.Maui.Handlers.MenuBarHandlerUpdate.MenuBarItem.get -> Microsoft.Maui.IMenuBarItem! +Microsoft.Maui.Handlers.MenuBarHandlerUpdate.MenuBarItem.init -> void +Microsoft.Maui.Handlers.MenuBarItemHandler +Microsoft.Maui.Handlers.MenuBarItemHandler.Add(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.MenuBarItemHandler.Clear() -> void +Microsoft.Maui.Handlers.MenuBarItemHandler.Insert(int index, Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.MenuBarItemHandler.MenuBarItemHandler() -> void +Microsoft.Maui.Handlers.MenuBarItemHandler.MenuBarItemHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.MenuBarItemHandler.Remove(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.MenuBarItemHandlerUpdate +Microsoft.Maui.Handlers.MenuBarItemHandlerUpdate.Index.get -> int +Microsoft.Maui.Handlers.MenuBarItemHandlerUpdate.Index.init -> void +Microsoft.Maui.Handlers.MenuBarItemHandlerUpdate.MenuBarItemHandlerUpdate(int Index, Microsoft.Maui.IMenuElement! MenuElement) -> void +Microsoft.Maui.Handlers.MenuBarItemHandlerUpdate.MenuElement.get -> Microsoft.Maui.IMenuElement! +Microsoft.Maui.Handlers.MenuBarItemHandlerUpdate.MenuElement.init -> void +Microsoft.Maui.Handlers.MenuFlyoutItemHandler +Microsoft.Maui.Handlers.MenuFlyoutItemHandler.MenuFlyoutItemHandler() -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.Add(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.Clear() -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.Insert(int index, Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.MenuFlyoutSubItemHandler() -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.MenuFlyoutSubItemHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.Remove(Microsoft.Maui.IMenuElement! view) -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandlerUpdate +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandlerUpdate.Index.get -> int +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandlerUpdate.Index.init -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandlerUpdate.MenuElement.get -> Microsoft.Maui.IMenuElement! +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandlerUpdate.MenuElement.init -> void +Microsoft.Maui.Handlers.MenuFlyoutSubItemHandlerUpdate.MenuFlyoutSubItemHandlerUpdate(int Index, Microsoft.Maui.IMenuElement! MenuElement) -> void +Microsoft.Maui.Handlers.NavigationViewHandler +Microsoft.Maui.Handlers.NavigationViewHandler.NavigationViewHandler() -> void +Microsoft.Maui.Handlers.NavigationViewHandler.NavigationViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.OpenWindowRequest +Microsoft.Maui.Handlers.OpenWindowRequest.OpenWindowRequest(Microsoft.Maui.IPersistedState? State = null) -> void +Microsoft.Maui.Handlers.OpenWindowRequest.State.get -> Microsoft.Maui.IPersistedState? +Microsoft.Maui.Handlers.OpenWindowRequest.State.init -> void +Microsoft.Maui.Handlers.PageHandler +Microsoft.Maui.Handlers.PageHandler.PageHandler() -> void +Microsoft.Maui.Handlers.PageHandler.PageHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.PickerHandler +Microsoft.Maui.Handlers.PickerHandler.PickerHandler() -> void +Microsoft.Maui.Handlers.PickerHandler.PickerHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.ProgressBarHandler +Microsoft.Maui.Handlers.ProgressBarHandler.ProgressBarHandler() -> void +Microsoft.Maui.Handlers.ProgressBarHandler.ProgressBarHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.RadioButtonHandler +Microsoft.Maui.Handlers.RadioButtonHandler.RadioButtonHandler() -> void +Microsoft.Maui.Handlers.RadioButtonHandler.RadioButtonHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.RefreshViewHandler +Microsoft.Maui.Handlers.RefreshViewHandler.RefreshViewHandler() -> void +Microsoft.Maui.Handlers.RefreshViewHandler.RefreshViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.ScrollViewHandler +Microsoft.Maui.Handlers.ScrollViewHandler.ScrollViewHandler() -> void +Microsoft.Maui.Handlers.ScrollViewHandler.ScrollViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.SearchBarHandler +Microsoft.Maui.Handlers.SearchBarHandler.QueryEditor.get -> object? +Microsoft.Maui.Handlers.SearchBarHandler.SearchBarHandler() -> void +Microsoft.Maui.Handlers.SearchBarHandler.SearchBarHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.ShapeViewHandler +Microsoft.Maui.Handlers.ShapeViewHandler.ShapeViewHandler() -> void +Microsoft.Maui.Handlers.ShapeViewHandler.ShapeViewHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.SliderHandler +Microsoft.Maui.Handlers.SliderHandler.SliderHandler() -> void +Microsoft.Maui.Handlers.SliderHandler.SliderHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.StepperHandler +Microsoft.Maui.Handlers.StepperHandler.StepperHandler() -> void +Microsoft.Maui.Handlers.StepperHandler.StepperHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.SwipeItemMenuItemHandler +Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.SourceLoader.get -> Microsoft.Maui.Platform.ImageSourcePartLoader! +Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.SwipeItemMenuItemHandler() -> void +Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.SwipeItemMenuItemHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.SwipeItemMenuItemHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.SwipeItemViewHandler +Microsoft.Maui.Handlers.SwipeItemViewHandler.SwipeItemViewHandler() -> void +Microsoft.Maui.Handlers.SwipeItemViewHandler.SwipeItemViewHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.SwipeItemViewHandler.SwipeItemViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.SwipeViewHandler +Microsoft.Maui.Handlers.SwipeViewHandler.SwipeViewHandler() -> void +Microsoft.Maui.Handlers.SwipeViewHandler.SwipeViewHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.SwipeViewHandler.SwipeViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.SwitchHandler +Microsoft.Maui.Handlers.SwitchHandler.SwitchHandler() -> void +Microsoft.Maui.Handlers.SwitchHandler.SwitchHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.TabbedViewHandler +Microsoft.Maui.Handlers.TabbedViewHandler.TabbedViewHandler() -> void +Microsoft.Maui.Handlers.TimePickerHandler +Microsoft.Maui.Handlers.TimePickerHandler.TimePickerHandler() -> void +Microsoft.Maui.Handlers.TimePickerHandler.TimePickerHandler(Microsoft.Maui.IPropertyMapper! mapper) -> void +Microsoft.Maui.Handlers.ToolbarHandler +Microsoft.Maui.Handlers.ToolbarHandler.ToolbarHandler() -> void +Microsoft.Maui.Handlers.ViewHandler +Microsoft.Maui.Handlers.ViewHandler.ContainerView.get -> object? +Microsoft.Maui.Handlers.ViewHandler.HasContainer.get -> bool +Microsoft.Maui.Handlers.ViewHandler.HasContainer.set -> void +Microsoft.Maui.Handlers.ViewHandler.PlatformView.get -> object? +Microsoft.Maui.Handlers.ViewHandler.ViewHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.ViewHandler.VirtualView.get -> Microsoft.Maui.IView? +Microsoft.Maui.Handlers.ViewHandler +Microsoft.Maui.Handlers.ViewHandler.PlatformView.get -> TPlatformView! +Microsoft.Maui.Handlers.ViewHandler.ViewHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.ViewHandler.VirtualView.get -> TVirtualView! +Microsoft.Maui.Handlers.WebViewHandler +Microsoft.Maui.Handlers.WebViewHandler.WebViewHandler() -> void +Microsoft.Maui.Handlers.WebViewHandler.WebViewHandler(Microsoft.Maui.IPropertyMapper? mapper = null, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Handlers.WindowHandler +Microsoft.Maui.Handlers.WindowHandler.WindowHandler() -> void +Microsoft.Maui.Handlers.WindowHandler.WindowHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Handlers.WindowHandler.WindowHandler(Microsoft.Maui.IPropertyMapper? mapper = null, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Hosting.AppHostBuilderExtensions +Microsoft.Maui.Hosting.EssentialsExtensions +Microsoft.Maui.Hosting.FontCollectionExtensions +Microsoft.Maui.Hosting.FontDescriptor +Microsoft.Maui.Hosting.FontDescriptor.Alias.get -> string? +Microsoft.Maui.Hosting.FontDescriptor.Assembly.get -> System.Reflection.Assembly? +Microsoft.Maui.Hosting.FontDescriptor.Filename.get -> string! +Microsoft.Maui.Hosting.FontDescriptor.FontDescriptor(string! filename, string? alias, System.Reflection.Assembly? assembly) -> void +Microsoft.Maui.Hosting.FontsMauiAppBuilderExtensions +Microsoft.Maui.Hosting.HandlerMauiAppBuilderExtensions +Microsoft.Maui.Hosting.IEssentialsBuilder +Microsoft.Maui.Hosting.IEssentialsBuilder.AddAppAction(Microsoft.Maui.ApplicationModel.AppAction! appAction) -> Microsoft.Maui.Hosting.IEssentialsBuilder! +Microsoft.Maui.Hosting.IEssentialsBuilder.OnAppAction(System.Action! action) -> Microsoft.Maui.Hosting.IEssentialsBuilder! +Microsoft.Maui.Hosting.IEssentialsBuilder.UseMapServiceToken(string! token) -> Microsoft.Maui.Hosting.IEssentialsBuilder! +Microsoft.Maui.Hosting.IEssentialsBuilder.UseVersionTracking() -> Microsoft.Maui.Hosting.IEssentialsBuilder! +Microsoft.Maui.Hosting.IFontCollection +Microsoft.Maui.Hosting.IImageSourceServiceCollection +Microsoft.Maui.Hosting.ImageSourceServiceCollectionExtensions +Microsoft.Maui.Hosting.ImageSourcesMauiAppBuilderExtensions +Microsoft.Maui.Hosting.IMauiHandlersCollection +Microsoft.Maui.Hosting.IMauiInitializeScopedService +Microsoft.Maui.Hosting.IMauiInitializeScopedService.Initialize(System.IServiceProvider! services) -> void +Microsoft.Maui.Hosting.IMauiInitializeService +Microsoft.Maui.Hosting.IMauiInitializeService.Initialize(System.IServiceProvider! services) -> void +Microsoft.Maui.Hosting.IMauiServiceCollection +Microsoft.Maui.Hosting.IMauiServiceCollection.TryGetService(System.Type! serviceType, out Microsoft.Extensions.DependencyInjection.ServiceDescriptor? descriptor) -> bool +Microsoft.Maui.Hosting.MauiApp +Microsoft.Maui.Hosting.MauiApp.Configuration.get -> Microsoft.Extensions.Configuration.IConfiguration! +Microsoft.Maui.Hosting.MauiApp.Dispose() -> void +Microsoft.Maui.Hosting.MauiApp.Services.get -> System.IServiceProvider! +Microsoft.Maui.Hosting.MauiAppBuilder +Microsoft.Maui.Hosting.MauiAppBuilder.Build() -> Microsoft.Maui.Hosting.MauiApp! +Microsoft.Maui.Hosting.MauiAppBuilder.Configuration.get -> Microsoft.Extensions.Configuration.ConfigurationManager! +Microsoft.Maui.Hosting.MauiAppBuilder.ConfigureContainer(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory! factory, System.Action? configure = null) -> void +Microsoft.Maui.Hosting.MauiAppBuilder.Logging.get -> Microsoft.Extensions.Logging.ILoggingBuilder! +Microsoft.Maui.Hosting.MauiAppBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +Microsoft.Maui.Hosting.MauiHandlersCollectionExtensions +Microsoft.Maui.HotReload.HotReloadExtensions +Microsoft.Maui.HotReload.IHotReloadableView +Microsoft.Maui.HotReload.IHotReloadableView.Reload() -> void +Microsoft.Maui.HotReload.IHotReloadableView.ReloadHandler.get -> Microsoft.Maui.HotReload.IReloadHandler! +Microsoft.Maui.HotReload.IHotReloadableView.ReloadHandler.set -> void +Microsoft.Maui.HotReload.IHotReloadableView.TransferState(Microsoft.Maui.IView! newView) -> void +Microsoft.Maui.HotReload.IReloadHandler +Microsoft.Maui.HotReload.IReloadHandler.Reload() -> void +Microsoft.Maui.HotReload.MauiHotReloadHelper +Microsoft.Maui.HotReload.OnHotReloadAttribute +Microsoft.Maui.HotReload.OnHotReloadAttribute.OnHotReloadAttribute() -> void +Microsoft.Maui.IAbsoluteLayout +Microsoft.Maui.IAbsoluteLayout.GetLayoutBounds(Microsoft.Maui.IView! view) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.IAbsoluteLayout.GetLayoutFlags(Microsoft.Maui.IView! view) -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.IActivationState +Microsoft.Maui.IActivationState.Context.get -> Microsoft.Maui.IMauiContext! +Microsoft.Maui.IActivationState.State.get -> Microsoft.Maui.IPersistedState! +Microsoft.Maui.IActivityIndicator +Microsoft.Maui.IActivityIndicator.Color.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.IActivityIndicator.IsRunning.get -> bool +Microsoft.Maui.IAdorner +Microsoft.Maui.IAdorner.Density.get -> float +Microsoft.Maui.IAdorner.VisualView.get -> Microsoft.Maui.IView! +Microsoft.Maui.IApplication +Microsoft.Maui.IApplication.CloseWindow(Microsoft.Maui.IWindow! window) -> void +Microsoft.Maui.IApplication.CreateWindow(Microsoft.Maui.IActivationState? activationState) -> Microsoft.Maui.IWindow! +Microsoft.Maui.IApplication.OpenWindow(Microsoft.Maui.IWindow! window) -> void +Microsoft.Maui.IApplication.ThemeChanged() -> void +Microsoft.Maui.IApplication.Windows.get -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.IBorder +Microsoft.Maui.IBorder.Border.get -> Microsoft.Maui.IBorderStroke! +Microsoft.Maui.IBorderStroke +Microsoft.Maui.IBorderStroke.Shape.get -> Microsoft.Maui.Graphics.IShape? +Microsoft.Maui.IBorderView +Microsoft.Maui.IButton +Microsoft.Maui.IButton.Clicked() -> void +Microsoft.Maui.IButton.Pressed() -> void +Microsoft.Maui.IButton.Released() -> void +Microsoft.Maui.IButtonStroke +Microsoft.Maui.IButtonStroke.CornerRadius.get -> int +Microsoft.Maui.IButtonStroke.StrokeColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.IButtonStroke.StrokeThickness.get -> double +Microsoft.Maui.ICheckBox +Microsoft.Maui.ICheckBox.Foreground.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.ICheckBox.IsChecked.get -> bool +Microsoft.Maui.ICheckBox.IsChecked.set -> void +Microsoft.Maui.IContainer +Microsoft.Maui.IContentView +Microsoft.Maui.IContentView.Content.get -> object? +Microsoft.Maui.IContentView.CrossPlatformArrange(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.IContentView.CrossPlatformMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.IContentView.PresentedContent.get -> Microsoft.Maui.IView? +Microsoft.Maui.IDatePicker +Microsoft.Maui.IDatePicker.Date.get -> System.DateTime +Microsoft.Maui.IDatePicker.Date.set -> void +Microsoft.Maui.IDatePicker.Format.get -> string! +Microsoft.Maui.IDatePicker.Format.set -> void +Microsoft.Maui.IDatePicker.MaximumDate.get -> System.DateTime +Microsoft.Maui.IDatePicker.MinimumDate.get -> System.DateTime +Microsoft.Maui.IEditor +Microsoft.Maui.IEditor.Completed() -> void +Microsoft.Maui.IElement +Microsoft.Maui.IElement.Handler.get -> Microsoft.Maui.IElementHandler? +Microsoft.Maui.IElement.Handler.set -> void +Microsoft.Maui.IElement.Parent.get -> Microsoft.Maui.IElement? +Microsoft.Maui.IElementHandler +Microsoft.Maui.IElementHandler.DisconnectHandler() -> void +Microsoft.Maui.IElementHandler.Invoke(string! command, object? args = null) -> void +Microsoft.Maui.IElementHandler.MauiContext.get -> Microsoft.Maui.IMauiContext? +Microsoft.Maui.IElementHandler.PlatformView.get -> object? +Microsoft.Maui.IElementHandler.SetMauiContext(Microsoft.Maui.IMauiContext! mauiContext) -> void +Microsoft.Maui.IElementHandler.SetVirtualView(Microsoft.Maui.IElement! view) -> void +Microsoft.Maui.IElementHandler.UpdateValue(string! property) -> void +Microsoft.Maui.IElementHandler.VirtualView.get -> Microsoft.Maui.IElement? +Microsoft.Maui.IEmbeddedFontLoader +Microsoft.Maui.IEmbeddedFontLoader.LoadFont(Microsoft.Maui.EmbeddedFont! font) -> string? +Microsoft.Maui.IEntry +Microsoft.Maui.IEntry.ClearButtonVisibility.get -> Microsoft.Maui.ClearButtonVisibility +Microsoft.Maui.IEntry.Completed() -> void +Microsoft.Maui.IEntry.IsPassword.get -> bool +Microsoft.Maui.IEntry.ReturnType.get -> Microsoft.Maui.ReturnType +Microsoft.Maui.IFileImageSource +Microsoft.Maui.IFileImageSource.File.get -> string! +Microsoft.Maui.IFlexLayout +Microsoft.Maui.IFlexLayout.AlignContent.get -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.IFlexLayout.AlignItems.get -> Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.IFlexLayout.Direction.get -> Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.IFlexLayout.GetAlignSelf(Microsoft.Maui.IView! view) -> Microsoft.Maui.Layouts.FlexAlignSelf +Microsoft.Maui.IFlexLayout.GetBasis(Microsoft.Maui.IView! view) -> Microsoft.Maui.Layouts.FlexBasis +Microsoft.Maui.IFlexLayout.GetFlexFrame(Microsoft.Maui.IView! view) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.IFlexLayout.GetGrow(Microsoft.Maui.IView! view) -> float +Microsoft.Maui.IFlexLayout.GetOrder(Microsoft.Maui.IView! view) -> int +Microsoft.Maui.IFlexLayout.GetShrink(Microsoft.Maui.IView! view) -> float +Microsoft.Maui.IFlexLayout.JustifyContent.get -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.IFlexLayout.Layout(double width, double height) -> void +Microsoft.Maui.IFlexLayout.Position.get -> Microsoft.Maui.Layouts.FlexPosition +Microsoft.Maui.IFlexLayout.Wrap.get -> Microsoft.Maui.Layouts.FlexWrap +Microsoft.Maui.IFlyoutView +Microsoft.Maui.IFlyoutView.Detail.get -> Microsoft.Maui.IView! +Microsoft.Maui.IFlyoutView.Flyout.get -> Microsoft.Maui.IView! +Microsoft.Maui.IFlyoutView.FlyoutBehavior.get -> Microsoft.Maui.FlyoutBehavior +Microsoft.Maui.IFlyoutView.FlyoutWidth.get -> double +Microsoft.Maui.IFlyoutView.IsGestureEnabled.get -> bool +Microsoft.Maui.IFlyoutView.IsPresented.get -> bool +Microsoft.Maui.IFlyoutView.IsPresented.set -> void +Microsoft.Maui.IFontImageSource +Microsoft.Maui.IFontImageSource.Color.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.IFontImageSource.Font.get -> Microsoft.Maui.Font +Microsoft.Maui.IFontImageSource.Glyph.get -> string! +Microsoft.Maui.IFontManager +Microsoft.Maui.IFontManager.DefaultFontSize.get -> double +Microsoft.Maui.IFontRegistrar +Microsoft.Maui.IFontRegistrar.GetFont(string! font) -> string? +Microsoft.Maui.IFontRegistrar.Register(string! filename, string? alias) -> void +Microsoft.Maui.IFontRegistrar.Register(string! filename, string? alias, System.Reflection.Assembly! assembly) -> void +Microsoft.Maui.IGraphicsView +Microsoft.Maui.IGraphicsView.CancelInteraction() -> void +Microsoft.Maui.IGraphicsView.DragInteraction(Microsoft.Maui.Graphics.PointF[]! points) -> void +Microsoft.Maui.IGraphicsView.Drawable.get -> Microsoft.Maui.Graphics.IDrawable! +Microsoft.Maui.IGraphicsView.EndHoverInteraction() -> void +Microsoft.Maui.IGraphicsView.EndInteraction(Microsoft.Maui.Graphics.PointF[]! points, bool isInsideBounds) -> void +Microsoft.Maui.IGraphicsView.Invalidate() -> void +Microsoft.Maui.IGraphicsView.MoveHoverInteraction(Microsoft.Maui.Graphics.PointF[]! points) -> void +Microsoft.Maui.IGraphicsView.StartHoverInteraction(Microsoft.Maui.Graphics.PointF[]! points) -> void +Microsoft.Maui.IGraphicsView.StartInteraction(Microsoft.Maui.Graphics.PointF[]! points) -> void +Microsoft.Maui.IGridColumnDefinition +Microsoft.Maui.IGridColumnDefinition.Width.get -> Microsoft.Maui.GridLength +Microsoft.Maui.IGridLayout +Microsoft.Maui.IGridLayout.ColumnDefinitions.get -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.IGridLayout.ColumnSpacing.get -> double +Microsoft.Maui.IGridLayout.GetColumn(Microsoft.Maui.IView! view) -> int +Microsoft.Maui.IGridLayout.GetColumnSpan(Microsoft.Maui.IView! view) -> int +Microsoft.Maui.IGridLayout.GetRow(Microsoft.Maui.IView! view) -> int +Microsoft.Maui.IGridLayout.GetRowSpan(Microsoft.Maui.IView! view) -> int +Microsoft.Maui.IGridLayout.RowDefinitions.get -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.IGridLayout.RowSpacing.get -> double +Microsoft.Maui.IGridRowDefinition +Microsoft.Maui.IGridRowDefinition.Height.get -> Microsoft.Maui.GridLength +Microsoft.Maui.IImage +Microsoft.Maui.IImage.Aspect.get -> Microsoft.Maui.Aspect +Microsoft.Maui.IImage.IsOpaque.get -> bool +Microsoft.Maui.IImageButton +Microsoft.Maui.IImageSource +Microsoft.Maui.IImageSource.IsEmpty.get -> bool +Microsoft.Maui.IImageSourcePart +Microsoft.Maui.IImageSourcePart.IsAnimationPlaying.get -> bool +Microsoft.Maui.IImageSourcePart.Source.get -> Microsoft.Maui.IImageSource? +Microsoft.Maui.IImageSourcePart.UpdateIsLoading(bool isLoading) -> void +Microsoft.Maui.IImageSourcePartEvents +Microsoft.Maui.IImageSourcePartEvents.LoadingCompleted(bool successful) -> void +Microsoft.Maui.IImageSourcePartEvents.LoadingFailed(System.Exception! exception) -> void +Microsoft.Maui.IImageSourcePartEvents.LoadingStarted() -> void +Microsoft.Maui.IImageSourceService +Microsoft.Maui.IImageSourceService +Microsoft.Maui.IImageSourceServiceProvider +Microsoft.Maui.IImageSourceServiceProvider.GetImageSourceService(System.Type! imageSource) -> Microsoft.Maui.IImageSourceService? +Microsoft.Maui.IImageSourceServiceProvider.GetImageSourceServiceType(System.Type! imageSource) -> System.Type! +Microsoft.Maui.IImageSourceServiceProvider.GetImageSourceType(System.Type! imageSource) -> System.Type! +Microsoft.Maui.IImageSourceServiceProvider.HostServiceProvider.get -> System.IServiceProvider! +Microsoft.Maui.IImageSourceServiceResult +Microsoft.Maui.IImageSourceServiceResult.IsDisposed.get -> bool +Microsoft.Maui.IImageSourceServiceResult.IsResolutionDependent.get -> bool +Microsoft.Maui.IImageSourceServiceResult +Microsoft.Maui.IImageSourceServiceResult.Value.get -> T +Microsoft.Maui.IIndicatorView +Microsoft.Maui.IIndicatorView.Count.get -> int +Microsoft.Maui.IIndicatorView.HideSingle.get -> bool +Microsoft.Maui.IIndicatorView.IndicatorColor.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.IIndicatorView.IndicatorSize.get -> double +Microsoft.Maui.IIndicatorView.IndicatorsShape.get -> Microsoft.Maui.Graphics.IShape! +Microsoft.Maui.IIndicatorView.MaximumVisible.get -> int +Microsoft.Maui.IIndicatorView.Position.get -> int +Microsoft.Maui.IIndicatorView.Position.set -> void +Microsoft.Maui.IIndicatorView.SelectedIndicatorColor.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.IItemDelegate +Microsoft.Maui.IItemDelegate.GetCount() -> int +Microsoft.Maui.IItemDelegate.GetItem(int index) -> T +Microsoft.Maui.ILabel +Microsoft.Maui.ILabel.LineHeight.get -> double +Microsoft.Maui.ILabel.TextDecorations.get -> Microsoft.Maui.TextDecorations +Microsoft.Maui.ILayout +Microsoft.Maui.ILayout.ClipsToBounds.get -> bool +Microsoft.Maui.ILayout.CrossPlatformArrange(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.ILayout.CrossPlatformMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.ILayoutHandler +Microsoft.Maui.ILayoutHandler.Add(Microsoft.Maui.IView! view) -> void +Microsoft.Maui.ILayoutHandler.Clear() -> void +Microsoft.Maui.ILayoutHandler.Insert(int index, Microsoft.Maui.IView! view) -> void +Microsoft.Maui.ILayoutHandler.PlatformView.get -> object! +Microsoft.Maui.ILayoutHandler.Remove(Microsoft.Maui.IView! view) -> void +Microsoft.Maui.ILayoutHandler.Update(int index, Microsoft.Maui.IView! view) -> void +Microsoft.Maui.ILayoutHandler.UpdateZIndex(Microsoft.Maui.IView! view) -> void +Microsoft.Maui.ILayoutHandler.VirtualView.get -> Microsoft.Maui.ILayout! +Microsoft.Maui.ImageSourceExtensions +Microsoft.Maui.ImageSourceService +Microsoft.Maui.ImageSourceService.ImageSourceService(Microsoft.Extensions.Logging.ILogger? logger = null) -> void +Microsoft.Maui.ImageSourceService.Logger.get -> Microsoft.Extensions.Logging.ILogger? +Microsoft.Maui.ImageSourceServiceLoadResult +Microsoft.Maui.ImageSourceServiceLoadResult.Dispose() -> void +Microsoft.Maui.ImageSourceServiceLoadResult.ImageSourceServiceLoadResult() -> void +Microsoft.Maui.ImageSourceServiceLoadResult.ImageSourceServiceLoadResult(bool resolutionDependent, System.Action? dispose = null) -> void +Microsoft.Maui.ImageSourceServiceLoadResult.ImageSourceServiceLoadResult(System.Action? dispose = null) -> void +Microsoft.Maui.ImageSourceServiceLoadResult.IsDisposed.get -> bool +Microsoft.Maui.ImageSourceServiceLoadResult.IsResolutionDependent.get -> bool +Microsoft.Maui.ImageSourceServiceProviderExtensions +Microsoft.Maui.ImageSourceServiceResult +Microsoft.Maui.ImageSourceServiceResult.Dispose() -> void +Microsoft.Maui.ImageSourceServiceResult.ImageSourceServiceResult(object! image, bool resolutionDependent, System.Action? dispose = null) -> void +Microsoft.Maui.ImageSourceServiceResult.ImageSourceServiceResult(object! image, System.Action? dispose = null) -> void +Microsoft.Maui.ImageSourceServiceResult.IsDisposed.get -> bool +Microsoft.Maui.ImageSourceServiceResult.IsResolutionDependent.get -> bool +Microsoft.Maui.ImageSourceServiceResult.Value.get -> object! +Microsoft.Maui.IMauiContext +Microsoft.Maui.IMauiContext.Handlers.get -> Microsoft.Maui.IMauiHandlersFactory! +Microsoft.Maui.IMauiContext.Services.get -> System.IServiceProvider! +Microsoft.Maui.IMauiFactory +Microsoft.Maui.IMauiHandlersFactory +Microsoft.Maui.IMauiHandlersFactory.GetCollection() -> Microsoft.Maui.Hosting.IMauiHandlersCollection! +Microsoft.Maui.IMauiHandlersFactory.GetHandler(System.Type! type) -> Microsoft.Maui.IElementHandler? +Microsoft.Maui.IMauiHandlersFactory.GetHandler() -> Microsoft.Maui.IElementHandler? +Microsoft.Maui.IMauiHandlersFactory.GetHandlerType(System.Type! iview) -> System.Type? +Microsoft.Maui.IMenuBar +Microsoft.Maui.IMenuBar.IsEnabled.get -> bool +Microsoft.Maui.IMenuBarElement +Microsoft.Maui.IMenuBarElement.MenuBar.get -> Microsoft.Maui.IMenuBar? +Microsoft.Maui.IMenuBarItem +Microsoft.Maui.IMenuBarItem.IsEnabled.get -> bool +Microsoft.Maui.IMenuBarItem.Text.get -> string! +Microsoft.Maui.IMenuElement +Microsoft.Maui.IMenuElement.Clicked() -> void +Microsoft.Maui.IMenuElement.IsEnabled.get -> bool +Microsoft.Maui.IMenuFlyoutItem +Microsoft.Maui.IMenuFlyoutSubItem +Microsoft.Maui.IPadding +Microsoft.Maui.IPadding.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.IPersistedState +Microsoft.Maui.IPicker +Microsoft.Maui.IPicker.Items.get -> System.Collections.Generic.IList! +Microsoft.Maui.IPicker.SelectedIndex.get -> int +Microsoft.Maui.IPicker.SelectedIndex.set -> void +Microsoft.Maui.IPicker.Title.get -> string! +Microsoft.Maui.IPicker.TitleColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.IPickerExtension +Microsoft.Maui.IPlaceholder +Microsoft.Maui.IPlaceholder.Placeholder.get -> string! +Microsoft.Maui.IPlaceholder.PlaceholderColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.IPlaceholder.PlaceholderColor.set -> void +Microsoft.Maui.IPlatformApplication +Microsoft.Maui.IPlatformApplication.Application.get -> Microsoft.Maui.IApplication! +Microsoft.Maui.IPlatformApplication.Services.get -> System.IServiceProvider! +Microsoft.Maui.IProgress +Microsoft.Maui.IProgress.Progress.get -> double +Microsoft.Maui.IProgress.ProgressColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.IPropertyMapper +Microsoft.Maui.IPropertyMapper.GetKeys() -> System.Collections.Generic.IEnumerable! +Microsoft.Maui.IPropertyMapper.GetProperty(string! key) -> System.Action? +Microsoft.Maui.IPropertyMapper.UpdateProperties(Microsoft.Maui.IElementHandler! elementHandler, Microsoft.Maui.IElement! virtualView) -> void +Microsoft.Maui.IPropertyMapper.UpdateProperty(Microsoft.Maui.IElementHandler! elementHandler, Microsoft.Maui.IElement! virtualView, string! property) -> void +Microsoft.Maui.IPropertyMapper +Microsoft.Maui.IPropertyMapper.Add(string! key, System.Action! action) -> void +Microsoft.Maui.IPropertyMapperView +Microsoft.Maui.IPropertyMapperView.GetPropertyMapperOverrides() -> Microsoft.Maui.PropertyMapper! +Microsoft.Maui.IRadioButton +Microsoft.Maui.IRadioButton.IsChecked.get -> bool +Microsoft.Maui.IRadioButton.IsChecked.set -> void +Microsoft.Maui.IRange +Microsoft.Maui.IRange.Maximum.get -> double +Microsoft.Maui.IRange.Minimum.get -> double +Microsoft.Maui.IRange.Value.get -> double +Microsoft.Maui.IRange.Value.set -> void +Microsoft.Maui.IRefreshView +Microsoft.Maui.IRefreshView.Content.get -> Microsoft.Maui.IView! +Microsoft.Maui.IRefreshView.IsRefreshing.get -> bool +Microsoft.Maui.IRefreshView.IsRefreshing.set -> void +Microsoft.Maui.IRefreshView.RefreshColor.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.IReplaceableView +Microsoft.Maui.IReplaceableView.ReplacedView.get -> Microsoft.Maui.IView! +Microsoft.Maui.ISafeAreaView +Microsoft.Maui.ISafeAreaView.IgnoreSafeArea.get -> bool +Microsoft.Maui.IScrollView +Microsoft.Maui.IScrollView.ContentSize.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.IScrollView.HorizontalOffset.get -> double +Microsoft.Maui.IScrollView.HorizontalOffset.set -> void +Microsoft.Maui.IScrollView.HorizontalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.IScrollView.Orientation.get -> Microsoft.Maui.ScrollOrientation +Microsoft.Maui.IScrollView.RequestScrollTo(double horizontalOffset, double verticalOffset, bool instant) -> void +Microsoft.Maui.IScrollView.ScrollFinished() -> void +Microsoft.Maui.IScrollView.VerticalOffset.get -> double +Microsoft.Maui.IScrollView.VerticalOffset.set -> void +Microsoft.Maui.IScrollView.VerticalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.ISearchBar +Microsoft.Maui.ISearchBar.CancelButtonColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.ISearchBar.SearchButtonPressed() -> void +Microsoft.Maui.IShadow +Microsoft.Maui.IShadow.Offset.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.IShadow.Opacity.get -> float +Microsoft.Maui.IShadow.Paint.get -> Microsoft.Maui.Graphics.Paint! +Microsoft.Maui.IShadow.Radius.get -> float +Microsoft.Maui.IShapeView +Microsoft.Maui.IShapeView.Aspect.get -> Microsoft.Maui.PathAspect +Microsoft.Maui.IShapeView.Fill.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.IShapeView.Shape.get -> Microsoft.Maui.Graphics.IShape? +Microsoft.Maui.ISlider +Microsoft.Maui.ISlider.DragCompleted() -> void +Microsoft.Maui.ISlider.DragStarted() -> void +Microsoft.Maui.ISlider.MaximumTrackColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.ISlider.MinimumTrackColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.ISlider.ThumbColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.ISlider.ThumbImageSource.get -> Microsoft.Maui.IImageSource! +Microsoft.Maui.IStackLayout +Microsoft.Maui.IStackLayout.Spacing.get -> double +Microsoft.Maui.IStackNavigation +Microsoft.Maui.IStackNavigation.NavigationFinished(System.Collections.Generic.IReadOnlyList! newStack) -> void +Microsoft.Maui.IStackNavigation.RequestNavigation(Microsoft.Maui.NavigationRequest! eventArgs) -> void +Microsoft.Maui.IStackNavigationView +Microsoft.Maui.IStepper +Microsoft.Maui.IStepper.Interval.get -> double +Microsoft.Maui.IStreamImageSource +Microsoft.Maui.IStreamImageSource.GetStreamAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Microsoft.Maui.IStroke +Microsoft.Maui.IStroke.Stroke.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.IStroke.StrokeDashOffset.get -> float +Microsoft.Maui.IStroke.StrokeDashPattern.get -> float[]? +Microsoft.Maui.IStroke.StrokeLineCap.get -> Microsoft.Maui.Graphics.LineCap +Microsoft.Maui.IStroke.StrokeLineJoin.get -> Microsoft.Maui.Graphics.LineJoin +Microsoft.Maui.IStroke.StrokeMiterLimit.get -> float +Microsoft.Maui.IStroke.StrokeThickness.get -> double +Microsoft.Maui.ISwipeItem +Microsoft.Maui.ISwipeItem.AutomationId.get -> string! +Microsoft.Maui.ISwipeItem.OnInvoked() -> void +Microsoft.Maui.ISwipeItemMenuItem +Microsoft.Maui.ISwipeItemMenuItem.Background.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.ISwipeItemMenuItem.Visibility.get -> Microsoft.Maui.Visibility +Microsoft.Maui.ISwipeItems +Microsoft.Maui.ISwipeItems.Mode.get -> Microsoft.Maui.SwipeMode +Microsoft.Maui.ISwipeItems.SwipeBehaviorOnInvoked.get -> Microsoft.Maui.SwipeBehaviorOnInvoked +Microsoft.Maui.ISwipeItemView +Microsoft.Maui.ISwipeView +Microsoft.Maui.ISwipeView.BottomItems.get -> Microsoft.Maui.ISwipeItems! +Microsoft.Maui.ISwipeView.IsOpen.get -> bool +Microsoft.Maui.ISwipeView.IsOpen.set -> void +Microsoft.Maui.ISwipeView.LeftItems.get -> Microsoft.Maui.ISwipeItems! +Microsoft.Maui.ISwipeView.RequestClose(Microsoft.Maui.SwipeViewCloseRequest! swipeCloseRequest) -> void +Microsoft.Maui.ISwipeView.RequestOpen(Microsoft.Maui.SwipeViewOpenRequest! swipeOpenRequest) -> void +Microsoft.Maui.ISwipeView.RightItems.get -> Microsoft.Maui.ISwipeItems! +Microsoft.Maui.ISwipeView.SwipeChanging(Microsoft.Maui.SwipeViewSwipeChanging! swipeChanging) -> void +Microsoft.Maui.ISwipeView.SwipeEnded(Microsoft.Maui.SwipeViewSwipeEnded! swipeEnded) -> void +Microsoft.Maui.ISwipeView.SwipeStarted(Microsoft.Maui.SwipeViewSwipeStarted! swipeStarted) -> void +Microsoft.Maui.ISwipeView.SwipeTransitionMode.get -> Microsoft.Maui.SwipeTransitionMode +Microsoft.Maui.ISwipeView.Threshold.get -> double +Microsoft.Maui.ISwipeView.TopItems.get -> Microsoft.Maui.ISwipeItems! +Microsoft.Maui.ISwitch +Microsoft.Maui.ISwitch.IsOn.get -> bool +Microsoft.Maui.ISwitch.IsOn.set -> void +Microsoft.Maui.ISwitch.ThumbColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.ISwitch.TrackColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.ITabbedView +Microsoft.Maui.ItemDelegateList +Microsoft.Maui.ItemDelegateList.Count.get -> int +Microsoft.Maui.ItemDelegateList.GetEnumerator() -> System.Collections.Generic.IEnumerator! +Microsoft.Maui.ItemDelegateList.ItemDelegate.get -> Microsoft.Maui.IItemDelegate! +Microsoft.Maui.ItemDelegateList.ItemDelegateList(Microsoft.Maui.IItemDelegate! itemDelegate) -> void +Microsoft.Maui.ItemDelegateList.this[int index].get -> T +Microsoft.Maui.ITemplatedIndicatorView +Microsoft.Maui.ITemplatedIndicatorView.IndicatorsLayoutOverride.get -> Microsoft.Maui.ILayout? +Microsoft.Maui.IText +Microsoft.Maui.IText.Text.get -> string! +Microsoft.Maui.ITextAlignment +Microsoft.Maui.ITextAlignment.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.ITextAlignment.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.ITextButton +Microsoft.Maui.ITextInput +Microsoft.Maui.ITextInput.CursorPosition.get -> int +Microsoft.Maui.ITextInput.CursorPosition.set -> void +Microsoft.Maui.ITextInput.IsReadOnly.get -> bool +Microsoft.Maui.ITextInput.IsTextPredictionEnabled.get -> bool +Microsoft.Maui.ITextInput.Keyboard.get -> Microsoft.Maui.Keyboard! +Microsoft.Maui.ITextInput.MaxLength.get -> int +Microsoft.Maui.ITextInput.SelectionLength.get -> int +Microsoft.Maui.ITextInput.SelectionLength.set -> void +Microsoft.Maui.ITextInput.Text.get -> string! +Microsoft.Maui.ITextInput.Text.set -> void +Microsoft.Maui.ITextInputExtensions +Microsoft.Maui.ITextStyle +Microsoft.Maui.ITextStyle.CharacterSpacing.get -> double +Microsoft.Maui.ITextStyle.Font.get -> Microsoft.Maui.Font +Microsoft.Maui.ITextStyle.TextColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.ITimePicker +Microsoft.Maui.ITimePicker.Format.get -> string! +Microsoft.Maui.ITimePicker.Time.get -> System.TimeSpan +Microsoft.Maui.ITimePicker.Time.set -> void +Microsoft.Maui.ITitledElement +Microsoft.Maui.ITitledElement.Title.get -> string? +Microsoft.Maui.IToolbar +Microsoft.Maui.IToolbar.BackButtonVisible.get -> bool +Microsoft.Maui.IToolbar.BackButtonVisible.set -> void +Microsoft.Maui.IToolbar.IsVisible.get -> bool +Microsoft.Maui.IToolbar.IsVisible.set -> void +Microsoft.Maui.IToolbar.Title.get -> string! +Microsoft.Maui.IToolbarElement +Microsoft.Maui.IToolbarElement.Toolbar.get -> Microsoft.Maui.IToolbar? +Microsoft.Maui.ITransform +Microsoft.Maui.ITransform.AnchorX.get -> double +Microsoft.Maui.ITransform.AnchorY.get -> double +Microsoft.Maui.ITransform.Rotation.get -> double +Microsoft.Maui.ITransform.RotationX.get -> double +Microsoft.Maui.ITransform.RotationY.get -> double +Microsoft.Maui.ITransform.Scale.get -> double +Microsoft.Maui.ITransform.ScaleX.get -> double +Microsoft.Maui.ITransform.ScaleY.get -> double +Microsoft.Maui.ITransform.TranslationX.get -> double +Microsoft.Maui.ITransform.TranslationY.get -> double +Microsoft.Maui.IUriImageSource +Microsoft.Maui.IUriImageSource.CacheValidity.get -> System.TimeSpan +Microsoft.Maui.IUriImageSource.CachingEnabled.get -> bool +Microsoft.Maui.IUriImageSource.Uri.get -> System.Uri! +Microsoft.Maui.IView +Microsoft.Maui.IView.Arrange(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.IView.AutomationId.get -> string! +Microsoft.Maui.IView.Background.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.IView.Clip.get -> Microsoft.Maui.Graphics.IShape? +Microsoft.Maui.IView.DesiredSize.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.IView.FlowDirection.get -> Microsoft.Maui.FlowDirection +Microsoft.Maui.IView.Focus() -> bool +Microsoft.Maui.IView.Frame.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.IView.Frame.set -> void +Microsoft.Maui.IView.Handler.get -> Microsoft.Maui.IViewHandler? +Microsoft.Maui.IView.Handler.set -> void +Microsoft.Maui.IView.Height.get -> double +Microsoft.Maui.IView.HorizontalLayoutAlignment.get -> Microsoft.Maui.Primitives.LayoutAlignment +Microsoft.Maui.IView.InputTransparent.get -> bool +Microsoft.Maui.IView.InvalidateArrange() -> void +Microsoft.Maui.IView.InvalidateMeasure() -> void +Microsoft.Maui.IView.IsEnabled.get -> bool +Microsoft.Maui.IView.IsFocused.get -> bool +Microsoft.Maui.IView.IsFocused.set -> void +Microsoft.Maui.IView.Margin.get -> Microsoft.Maui.Thickness +Microsoft.Maui.IView.MaximumHeight.get -> double +Microsoft.Maui.IView.MaximumWidth.get -> double +Microsoft.Maui.IView.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.IView.MinimumHeight.get -> double +Microsoft.Maui.IView.MinimumWidth.get -> double +Microsoft.Maui.IView.Opacity.get -> double +Microsoft.Maui.IView.Semantics.get -> Microsoft.Maui.Semantics? +Microsoft.Maui.IView.Shadow.get -> Microsoft.Maui.IShadow? +Microsoft.Maui.IView.Unfocus() -> void +Microsoft.Maui.IView.VerticalLayoutAlignment.get -> Microsoft.Maui.Primitives.LayoutAlignment +Microsoft.Maui.IView.Visibility.get -> Microsoft.Maui.Visibility +Microsoft.Maui.IView.Width.get -> double +Microsoft.Maui.IView.ZIndex.get -> int +Microsoft.Maui.IViewExtensions +Microsoft.Maui.IViewHandler +Microsoft.Maui.IViewHandler.ContainerView.get -> object? +Microsoft.Maui.IViewHandler.GetDesiredSize(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.IViewHandler.HasContainer.get -> bool +Microsoft.Maui.IViewHandler.HasContainer.set -> void +Microsoft.Maui.IViewHandler.PlatformArrange(Microsoft.Maui.Graphics.Rect frame) -> void +Microsoft.Maui.IViewHandler.VirtualView.get -> Microsoft.Maui.IView? +Microsoft.Maui.IVisualDiagnosticsOverlay +Microsoft.Maui.IVisualDiagnosticsOverlay.AddAdorner(Microsoft.Maui.IAdorner! adorner, bool scrollToElement) -> bool +Microsoft.Maui.IVisualDiagnosticsOverlay.AddAdorner(Microsoft.Maui.IVisualTreeElement! visualElement, bool scrollToElement) -> bool +Microsoft.Maui.IVisualDiagnosticsOverlay.AddScrollableElementHandler(Microsoft.Maui.IScrollView! view) -> void +Microsoft.Maui.IVisualDiagnosticsOverlay.AddScrollableElementHandlers() -> void +Microsoft.Maui.IVisualDiagnosticsOverlay.EnableElementSelector.get -> bool +Microsoft.Maui.IVisualDiagnosticsOverlay.EnableElementSelector.set -> void +Microsoft.Maui.IVisualDiagnosticsOverlay.Offset.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.IVisualDiagnosticsOverlay.RemoveAdorner(Microsoft.Maui.IAdorner! adorner) -> bool +Microsoft.Maui.IVisualDiagnosticsOverlay.RemoveAdorners() -> void +Microsoft.Maui.IVisualDiagnosticsOverlay.RemoveAdorners(Microsoft.Maui.IVisualTreeElement! visualElement) -> bool +Microsoft.Maui.IVisualDiagnosticsOverlay.RemoveScrollableElementHandler() -> void +Microsoft.Maui.IVisualDiagnosticsOverlay.ScrollToElement.get -> bool +Microsoft.Maui.IVisualDiagnosticsOverlay.ScrollToElement.set -> void +Microsoft.Maui.IVisualDiagnosticsOverlay.ScrollToView(Microsoft.Maui.IVisualTreeElement! element) -> void +Microsoft.Maui.IVisualDiagnosticsOverlay.ScrollViews.get -> System.Collections.Generic.IReadOnlyCollection! +Microsoft.Maui.IVisualTreeElement +Microsoft.Maui.IVisualTreeElement.GetVisualChildren() -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.IVisualTreeElement.GetVisualParent() -> Microsoft.Maui.IVisualTreeElement? +Microsoft.Maui.IWebView +Microsoft.Maui.IWebView.CanGoBack.get -> bool +Microsoft.Maui.IWebView.CanGoBack.set -> void +Microsoft.Maui.IWebView.CanGoForward.get -> bool +Microsoft.Maui.IWebView.CanGoForward.set -> void +Microsoft.Maui.IWebView.Cookies.get -> System.Net.CookieContainer! +Microsoft.Maui.IWebView.Eval(string! script) -> void +Microsoft.Maui.IWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! +Microsoft.Maui.IWebView.GoBack() -> void +Microsoft.Maui.IWebView.GoForward() -> void +Microsoft.Maui.IWebView.Navigated(Microsoft.Maui.WebNavigationEvent evnt, string! url, Microsoft.Maui.WebNavigationResult result) -> void +Microsoft.Maui.IWebView.Navigating(Microsoft.Maui.WebNavigationEvent evnt, string! url) -> bool +Microsoft.Maui.IWebView.Reload() -> void +Microsoft.Maui.IWebView.Source.get -> Microsoft.Maui.IWebViewSource! +Microsoft.Maui.IWebViewDelegate +Microsoft.Maui.IWebViewDelegate.LoadHtml(string? html, string? baseUrl) -> void +Microsoft.Maui.IWebViewDelegate.LoadUrl(string? url) -> void +Microsoft.Maui.IWebViewSource +Microsoft.Maui.IWebViewSource.Load(Microsoft.Maui.IWebViewDelegate! webViewDelegate) -> void +Microsoft.Maui.IWindow +Microsoft.Maui.IWindow.Activated() -> void +Microsoft.Maui.IWindow.AddOverlay(Microsoft.Maui.IWindowOverlay! overlay) -> bool +Microsoft.Maui.IWindow.BackButtonClicked() -> bool +Microsoft.Maui.IWindow.Backgrounding(Microsoft.Maui.IPersistedState! state) -> void +Microsoft.Maui.IWindow.Content.get -> Microsoft.Maui.IView! +Microsoft.Maui.IWindow.Created() -> void +Microsoft.Maui.IWindow.Deactivated() -> void +Microsoft.Maui.IWindow.Destroying() -> void +Microsoft.Maui.IWindow.DisplayDensityChanged(float displayDensity) -> void +Microsoft.Maui.IWindow.FlowDirection.get -> Microsoft.Maui.FlowDirection +Microsoft.Maui.IWindow.Overlays.get -> System.Collections.Generic.IReadOnlyCollection! +Microsoft.Maui.IWindow.RemoveOverlay(Microsoft.Maui.IWindowOverlay! overlay) -> bool +Microsoft.Maui.IWindow.RequestDisplayDensity() -> float +Microsoft.Maui.IWindow.Resumed() -> void +Microsoft.Maui.IWindow.Stopped() -> void +Microsoft.Maui.IWindow.VisualDiagnosticsOverlay.get -> Microsoft.Maui.IVisualDiagnosticsOverlay! +Microsoft.Maui.IWindowOverlay +Microsoft.Maui.IWindowOverlay.AddWindowElement(Microsoft.Maui.IWindowOverlayElement! element) -> bool +Microsoft.Maui.IWindowOverlay.Deinitialize() -> bool +Microsoft.Maui.IWindowOverlay.Density.get -> float +Microsoft.Maui.IWindowOverlay.DisableUITouchEventPassthrough.get -> bool +Microsoft.Maui.IWindowOverlay.DisableUITouchEventPassthrough.set -> void +Microsoft.Maui.IWindowOverlay.EnableDrawableTouchHandling.get -> bool +Microsoft.Maui.IWindowOverlay.EnableDrawableTouchHandling.set -> void +Microsoft.Maui.IWindowOverlay.HandleUIChange() -> void +Microsoft.Maui.IWindowOverlay.Initialize() -> bool +Microsoft.Maui.IWindowOverlay.Invalidate() -> void +Microsoft.Maui.IWindowOverlay.IsPlatformViewInitialized.get -> bool +Microsoft.Maui.IWindowOverlay.IsVisible.get -> bool +Microsoft.Maui.IWindowOverlay.IsVisible.set -> void +Microsoft.Maui.IWindowOverlay.RemoveWindowElement(Microsoft.Maui.IWindowOverlayElement! element) -> bool +Microsoft.Maui.IWindowOverlay.RemoveWindowElements() -> void +Microsoft.Maui.IWindowOverlay.Tapped -> System.EventHandler! +Microsoft.Maui.IWindowOverlay.Window.get -> Microsoft.Maui.IWindow! +Microsoft.Maui.IWindowOverlay.WindowElements.get -> System.Collections.Generic.IReadOnlyCollection! +Microsoft.Maui.IWindowOverlayElement +Microsoft.Maui.IWindowOverlayElement.Contains(Microsoft.Maui.Graphics.Point point) -> bool +Microsoft.Maui.Keyboard +Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.All = -1 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.CapitalizeCharacter = 16 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.CapitalizeNone = 32 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.CapitalizeSentence = 1 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.CapitalizeWord = 8 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.None = 0 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.Spellcheck = 2 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.KeyboardFlags.Suggestions = 4 -> Microsoft.Maui.KeyboardFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.All = -1 -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.HeightProportional = 8 -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.None = 0 -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.PositionProportional = Microsoft.Maui.Layouts.AbsoluteLayoutFlags.XProportional | Microsoft.Maui.Layouts.AbsoluteLayoutFlags.YProportional -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.SizeProportional = Microsoft.Maui.Layouts.AbsoluteLayoutFlags.WidthProportional | Microsoft.Maui.Layouts.AbsoluteLayoutFlags.HeightProportional -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.WidthProportional = 4 -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.XProportional = 1 -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutFlags.YProportional = 2 -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +Microsoft.Maui.Layouts.AbsoluteLayoutManager +Microsoft.Maui.Layouts.AbsoluteLayoutManager.AbsoluteLayout.get -> Microsoft.Maui.IAbsoluteLayout! +Microsoft.Maui.Layouts.AbsoluteLayoutManager.AbsoluteLayoutManager(Microsoft.Maui.IAbsoluteLayout! absoluteLayout) -> void +Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignContent.Center = 2 -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignContent.End = 4 -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignContent.SpaceAround = 6 -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignContent.SpaceBetween = 5 -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignContent.SpaceEvenly = 7 -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignContent.Start = 3 -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignContent.Stretch = 1 -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.Layouts.FlexAlignItems.Center = 2 -> Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.Layouts.FlexAlignItems.End = 4 -> Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.Layouts.FlexAlignItems.Start = 3 -> Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.Layouts.FlexAlignItems.Stretch = 1 -> Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.Layouts.FlexAlignSelf +Microsoft.Maui.Layouts.FlexAlignSelf.Auto = 0 -> Microsoft.Maui.Layouts.FlexAlignSelf +Microsoft.Maui.Layouts.FlexAlignSelf.Center = 2 -> Microsoft.Maui.Layouts.FlexAlignSelf +Microsoft.Maui.Layouts.FlexAlignSelf.End = 4 -> Microsoft.Maui.Layouts.FlexAlignSelf +Microsoft.Maui.Layouts.FlexAlignSelf.Start = 3 -> Microsoft.Maui.Layouts.FlexAlignSelf +Microsoft.Maui.Layouts.FlexAlignSelf.Stretch = 1 -> Microsoft.Maui.Layouts.FlexAlignSelf +Microsoft.Maui.Layouts.FlexBasis +Microsoft.Maui.Layouts.FlexBasis.FlexBasis() -> void +Microsoft.Maui.Layouts.FlexBasis.FlexBasis(float length, bool isRelative = false) -> void +Microsoft.Maui.Layouts.FlexBasis.Length.get -> float +Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.Layouts.FlexDirection.Column = 2 -> Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.Layouts.FlexDirection.ColumnReverse = 3 -> Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.Layouts.FlexDirection.Row = 0 -> Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.Layouts.FlexDirection.RowReverse = 1 -> Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Layouts.FlexJustify.Center = 2 -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Layouts.FlexJustify.End = 4 -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Layouts.FlexJustify.SpaceAround = 6 -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Layouts.FlexJustify.SpaceBetween = 5 -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Layouts.FlexJustify.SpaceEvenly = 7 -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Layouts.FlexJustify.Start = 3 -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Layouts.FlexLayoutManager +Microsoft.Maui.Layouts.FlexLayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Layouts.FlexLayoutManager.FlexLayoutManager(Microsoft.Maui.IFlexLayout! flexLayout) -> void +Microsoft.Maui.Layouts.FlexLayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Layouts.FlexPosition +Microsoft.Maui.Layouts.FlexPosition.Absolute = 1 -> Microsoft.Maui.Layouts.FlexPosition +Microsoft.Maui.Layouts.FlexPosition.Relative = 0 -> Microsoft.Maui.Layouts.FlexPosition +Microsoft.Maui.Layouts.FlexWrap +Microsoft.Maui.Layouts.FlexWrap.NoWrap = 0 -> Microsoft.Maui.Layouts.FlexWrap +Microsoft.Maui.Layouts.FlexWrap.Reverse = 2 -> Microsoft.Maui.Layouts.FlexWrap +Microsoft.Maui.Layouts.FlexWrap.Wrap = 1 -> Microsoft.Maui.Layouts.FlexWrap +Microsoft.Maui.Layouts.GridLayoutManager +Microsoft.Maui.Layouts.GridLayoutManager.Grid.get -> Microsoft.Maui.IGridLayout! +Microsoft.Maui.Layouts.GridLayoutManager.GridLayoutManager(Microsoft.Maui.IGridLayout! layout) -> void +Microsoft.Maui.Layouts.HorizontalStackLayoutManager +Microsoft.Maui.Layouts.HorizontalStackLayoutManager.HorizontalStackLayoutManager(Microsoft.Maui.IStackLayout! layout) -> void +Microsoft.Maui.Layouts.ILayoutManager +Microsoft.Maui.Layouts.ILayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Layouts.ILayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Layouts.LayoutExtensions +Microsoft.Maui.Layouts.LayoutManager +Microsoft.Maui.Layouts.LayoutManager.Layout.get -> Microsoft.Maui.ILayout! +Microsoft.Maui.Layouts.LayoutManager.LayoutManager(Microsoft.Maui.ILayout! layout) -> void +Microsoft.Maui.Layouts.StackLayoutManager +Microsoft.Maui.Layouts.StackLayoutManager.Stack.get -> Microsoft.Maui.IStackLayout! +Microsoft.Maui.Layouts.StackLayoutManager.StackLayoutManager(Microsoft.Maui.IStackLayout! stack) -> void +Microsoft.Maui.Layouts.VerticalStackLayoutManager +Microsoft.Maui.Layouts.VerticalStackLayoutManager.VerticalStackLayoutManager(Microsoft.Maui.IStackLayout! stackLayout) -> void +Microsoft.Maui.LifecycleEvents.AppHostBuilderExtensions +Microsoft.Maui.LifecycleEvents.ILifecycleBuilder +Microsoft.Maui.LifecycleEvents.ILifecycleBuilder.AddEvent(string! eventName, TDelegate! action) -> void +Microsoft.Maui.LifecycleEvents.ILifecycleEventService +Microsoft.Maui.LifecycleEvents.ILifecycleEventService.ContainsEvent(string! eventName) -> bool +Microsoft.Maui.LifecycleEvents.ILifecycleEventService.GetEventDelegates(string! eventName) -> System.Collections.Generic.IEnumerable! +Microsoft.Maui.LifecycleEvents.LifecycleBuilderExtensions +Microsoft.Maui.LifecycleEvents.LifecycleEventRegistration +Microsoft.Maui.LifecycleEvents.LifecycleEventRegistration.LifecycleEventRegistration(System.Action! registerAction) -> void +Microsoft.Maui.LifecycleEvents.LifecycleEventService +Microsoft.Maui.LifecycleEvents.LifecycleEventService.AddEvent(string! eventName, TDelegate! action) -> void +Microsoft.Maui.LifecycleEvents.LifecycleEventService.ContainsEvent(string! eventName) -> bool +Microsoft.Maui.LifecycleEvents.LifecycleEventService.GetEventDelegates(string! eventName) -> System.Collections.Generic.IEnumerable! +Microsoft.Maui.LifecycleEvents.LifecycleEventService.LifecycleEventService(System.Collections.Generic.IEnumerable! registrations) -> void +Microsoft.Maui.LifecycleEvents.LifecycleEventServiceExtensions +Microsoft.Maui.LifecycleEvents.MauiAppHostBuilderExtensions +Microsoft.Maui.LineBreakMode +Microsoft.Maui.LineBreakMode.CharacterWrap = 2 -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.LineBreakMode.HeadTruncation = 3 -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.LineBreakMode.MiddleTruncation = 5 -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.LineBreakMode.NoWrap = 0 -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.LineBreakMode.TailTruncation = 4 -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.LineBreakMode.WordWrap = 1 -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.LockableObservableListWrapper +Microsoft.Maui.LockableObservableListWrapper.Add(string! item) -> void +Microsoft.Maui.LockableObservableListWrapper.Clear() -> void +Microsoft.Maui.LockableObservableListWrapper.Contains(string! item) -> bool +Microsoft.Maui.LockableObservableListWrapper.CopyTo(string![]! array, int arrayIndex) -> void +Microsoft.Maui.LockableObservableListWrapper.Count.get -> int +Microsoft.Maui.LockableObservableListWrapper.GetEnumerator() -> System.Collections.Generic.IEnumerator! +Microsoft.Maui.LockableObservableListWrapper.IndexOf(string! item) -> int +Microsoft.Maui.LockableObservableListWrapper.Insert(int index, string! item) -> void +Microsoft.Maui.LockableObservableListWrapper.InternalAdd(string! item) -> void +Microsoft.Maui.LockableObservableListWrapper.InternalClear() -> void +Microsoft.Maui.LockableObservableListWrapper.InternalInsert(int index, string! item) -> void +Microsoft.Maui.LockableObservableListWrapper.InternalRemove(string! item) -> bool +Microsoft.Maui.LockableObservableListWrapper.InternalRemoveAt(int index) -> void +Microsoft.Maui.LockableObservableListWrapper.IsLocked.get -> bool +Microsoft.Maui.LockableObservableListWrapper.IsLocked.set -> void +Microsoft.Maui.LockableObservableListWrapper.IsReadOnly.get -> bool +Microsoft.Maui.LockableObservableListWrapper.LockableObservableListWrapper() -> void +Microsoft.Maui.LockableObservableListWrapper.Remove(string! item) -> bool +Microsoft.Maui.LockableObservableListWrapper.RemoveAt(int index) -> void +Microsoft.Maui.LockableObservableListWrapper.this[int index].get -> string! +Microsoft.Maui.LockableObservableListWrapper.this[int index].set -> void +Microsoft.Maui.MauiContext +Microsoft.Maui.MauiContext.Handlers.get -> Microsoft.Maui.IMauiHandlersFactory! +Microsoft.Maui.MauiContext.MauiContext(System.IServiceProvider! services) -> void +Microsoft.Maui.MauiContext.Services.get -> System.IServiceProvider! +Microsoft.Maui.MissingMapperAttribute +Microsoft.Maui.MissingMapperAttribute.Description.get -> string? +Microsoft.Maui.MissingMapperAttribute.Description.set -> void +Microsoft.Maui.MissingMapperAttribute.MissingMapperAttribute() -> void +Microsoft.Maui.MissingMapperAttribute.MissingMapperAttribute(string! description) -> void +Microsoft.Maui.NavigationRequest +Microsoft.Maui.NavigationRequest.Animated.get -> bool +Microsoft.Maui.NavigationRequest.NavigationRequest(System.Collections.Generic.IReadOnlyList! newNavigationStack, bool animated) -> void +Microsoft.Maui.NavigationRequest.NavigationStack.get -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.OpenSwipeItem +Microsoft.Maui.OpenSwipeItem.BottomItems = 3 -> Microsoft.Maui.OpenSwipeItem +Microsoft.Maui.OpenSwipeItem.LeftItems = 0 -> Microsoft.Maui.OpenSwipeItem +Microsoft.Maui.OpenSwipeItem.RightItems = 2 -> Microsoft.Maui.OpenSwipeItem +Microsoft.Maui.OpenSwipeItem.TopItems = 1 -> Microsoft.Maui.OpenSwipeItem +Microsoft.Maui.PathAspect +Microsoft.Maui.PathAspect.AspectFill = 4 -> Microsoft.Maui.PathAspect +Microsoft.Maui.PathAspect.AspectFit = 3 -> Microsoft.Maui.PathAspect +Microsoft.Maui.PathAspect.Center = 1 -> Microsoft.Maui.PathAspect +Microsoft.Maui.PathAspect.None = 0 -> Microsoft.Maui.PathAspect +Microsoft.Maui.PathAspect.Stretch = 2 -> Microsoft.Maui.PathAspect +Microsoft.Maui.PersistedState +Microsoft.Maui.PersistedState.PersistedState() -> void +Microsoft.Maui.Platform.ElementExtensions +Microsoft.Maui.Platform.ImageSourcePartLoader +Microsoft.Maui.Platform.ImageSourcePartLoader.ImageSourcePartLoader(Microsoft.Maui.IElementHandler! handler, System.Func! imageSourcePart, System.Action! setImage) -> void +Microsoft.Maui.Platform.ImageSourcePartLoader.Reset() -> void +Microsoft.Maui.Platform.ImageSourcePartLoader.UpdateImageSourceAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.Platform.StrokeExtensions +Microsoft.Maui.Platform.SwipeViewExtensions +Microsoft.Maui.Platform.TimeExtensions +Microsoft.Maui.Platform.ViewExtensions +Microsoft.Maui.Platform.WindowExtensions +Microsoft.Maui.Platform.WrapperView +Microsoft.Maui.Platform.WrapperView.Border.get -> Microsoft.Maui.IBorderStroke? +Microsoft.Maui.Platform.WrapperView.Border.set -> void +Microsoft.Maui.Platform.WrapperView.Clip.get -> Microsoft.Maui.Graphics.IShape? +Microsoft.Maui.Platform.WrapperView.Clip.set -> void +Microsoft.Maui.Platform.WrapperView.Shadow.get -> Microsoft.Maui.IShadow? +Microsoft.Maui.Platform.WrapperView.Shadow.set -> void +Microsoft.Maui.Platform.WrapperView.WrapperView() -> void +Microsoft.Maui.PortHandlerAttribute +Microsoft.Maui.PortHandlerAttribute.Description.get -> string? +Microsoft.Maui.PortHandlerAttribute.Description.set -> void +Microsoft.Maui.PortHandlerAttribute.PortHandlerAttribute() -> void +Microsoft.Maui.PortHandlerAttribute.PortHandlerAttribute(string! description) -> void +Microsoft.Maui.Primitives.Dimension +Microsoft.Maui.Primitives.LayoutAlignment +Microsoft.Maui.Primitives.LayoutAlignment.Center = 2 -> Microsoft.Maui.Primitives.LayoutAlignment +Microsoft.Maui.Primitives.LayoutAlignment.End = 3 -> Microsoft.Maui.Primitives.LayoutAlignment +Microsoft.Maui.Primitives.LayoutAlignment.Fill = 0 -> Microsoft.Maui.Primitives.LayoutAlignment +Microsoft.Maui.Primitives.LayoutAlignment.Start = 1 -> Microsoft.Maui.Primitives.LayoutAlignment +Microsoft.Maui.PropertyMapper +Microsoft.Maui.PropertyMapper.Chained.get -> Microsoft.Maui.IPropertyMapper![]? +Microsoft.Maui.PropertyMapper.Chained.set -> void +Microsoft.Maui.PropertyMapper.PropertyMapper() -> void +Microsoft.Maui.PropertyMapper.PropertyMapper(params Microsoft.Maui.IPropertyMapper![]? chained) -> void +Microsoft.Maui.PropertyMapper.UpdateProperties(Microsoft.Maui.IElementHandler! viewHandler, Microsoft.Maui.IElement? virtualView) -> void +Microsoft.Maui.PropertyMapper.UpdateProperty(Microsoft.Maui.IElementHandler! viewHandler, Microsoft.Maui.IElement? virtualView, string! property) -> void +Microsoft.Maui.PropertyMapper +Microsoft.Maui.PropertyMapper.Add(string! key, System.Action! action) -> void +Microsoft.Maui.PropertyMapper.PropertyMapper() -> void +Microsoft.Maui.PropertyMapper.PropertyMapper(params Microsoft.Maui.IPropertyMapper![]! chained) -> void +Microsoft.Maui.PropertyMapper.this[string! key].get -> System.Action! +Microsoft.Maui.PropertyMapper.this[string! key].set -> void +Microsoft.Maui.PropertyMapper +Microsoft.Maui.PropertyMapper.PropertyMapper() -> void +Microsoft.Maui.PropertyMapper.PropertyMapper(params Microsoft.Maui.PropertyMapper![]! chained) -> void +Microsoft.Maui.PropertyMapperExtensions +Microsoft.Maui.RectangleAdorner +Microsoft.Maui.RectangleAdorner.Density.get -> float +Microsoft.Maui.RectangleAdorner.DrawnRectangle.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.RectangleAdorner.FillColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.RectangleAdorner.Offset.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.RectangleAdorner.RectangleAdorner(Microsoft.Maui.IView! view, float density = 1, Microsoft.Maui.Graphics.Point? offset = null, Microsoft.Maui.Graphics.Color? fillColor = null, Microsoft.Maui.Graphics.Color? strokeColor = null) -> void +Microsoft.Maui.RectangleAdorner.StrokeColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.RectangleAdorner.VisualView.get -> Microsoft.Maui.IView! +Microsoft.Maui.RectangleGridAdorner +Microsoft.Maui.RectangleGridAdorner.RectangleGridAdorner(Microsoft.Maui.IView! view, float density = 1, Microsoft.Maui.Graphics.Point? offset = null, Microsoft.Maui.Graphics.Color? fillColor = null, Microsoft.Maui.Graphics.Color? strokeColor = null) -> void +Microsoft.Maui.RetrievePlatformValueRequest +Microsoft.Maui.RetrievePlatformValueRequest.Result.get -> T +Microsoft.Maui.RetrievePlatformValueRequest.RetrievePlatformValueRequest() -> void +Microsoft.Maui.RetrievePlatformValueRequest.SetResult(T result) -> void +Microsoft.Maui.RetrievePlatformValueRequest.TrySetResult(T result) -> bool +Microsoft.Maui.ReturnType +Microsoft.Maui.ReturnType.Default = 0 -> Microsoft.Maui.ReturnType +Microsoft.Maui.ReturnType.Done = 1 -> Microsoft.Maui.ReturnType +Microsoft.Maui.ReturnType.Go = 2 -> Microsoft.Maui.ReturnType +Microsoft.Maui.ReturnType.Next = 3 -> Microsoft.Maui.ReturnType +Microsoft.Maui.ReturnType.Search = 4 -> Microsoft.Maui.ReturnType +Microsoft.Maui.ReturnType.Send = 5 -> Microsoft.Maui.ReturnType +Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.ScrollBarVisibility.Always = 1 -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.ScrollBarVisibility.Default = 0 -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.ScrollBarVisibility.Never = 2 -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.ScrollOrientation +Microsoft.Maui.ScrollOrientation.Both = 2 -> Microsoft.Maui.ScrollOrientation +Microsoft.Maui.ScrollOrientation.Horizontal = 1 -> Microsoft.Maui.ScrollOrientation +Microsoft.Maui.ScrollOrientation.Neither = 3 -> Microsoft.Maui.ScrollOrientation +Microsoft.Maui.ScrollOrientation.Vertical = 0 -> Microsoft.Maui.ScrollOrientation +Microsoft.Maui.ScrollToRequest +Microsoft.Maui.ScrollToRequest.HoriztonalOffset.get -> double +Microsoft.Maui.ScrollToRequest.HoriztonalOffset.init -> void +Microsoft.Maui.ScrollToRequest.Instant.get -> bool +Microsoft.Maui.ScrollToRequest.Instant.init -> void +Microsoft.Maui.ScrollToRequest.ScrollToRequest(double HoriztonalOffset, double VerticalOffset, bool Instant) -> void +Microsoft.Maui.ScrollToRequest.VerticalOffset.get -> double +Microsoft.Maui.ScrollToRequest.VerticalOffset.init -> void +Microsoft.Maui.SemanticExtensions +Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level1 = 1 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level2 = 2 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level3 = 3 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level4 = 4 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level5 = 5 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level6 = 6 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level7 = 7 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level8 = 8 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.Level9 = 9 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.SemanticHeadingLevel.None = 0 -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.Semantics +Microsoft.Maui.Semantics.Description.get -> string? +Microsoft.Maui.Semantics.Description.set -> void +Microsoft.Maui.Semantics.HeadingLevel.get -> Microsoft.Maui.SemanticHeadingLevel +Microsoft.Maui.Semantics.HeadingLevel.set -> void +Microsoft.Maui.Semantics.Hint.get -> string? +Microsoft.Maui.Semantics.Hint.set -> void +Microsoft.Maui.Semantics.IsHeading.get -> bool +Microsoft.Maui.Semantics.Semantics() -> void +Microsoft.Maui.SizeRequest +Microsoft.Maui.SizeRequest.Minimum.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.SizeRequest.Minimum.set -> void +Microsoft.Maui.SizeRequest.Request.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.SizeRequest.Request.set -> void +Microsoft.Maui.SizeRequest.SizeRequest() -> void +Microsoft.Maui.SizeRequest.SizeRequest(Microsoft.Maui.Graphics.Size request) -> void +Microsoft.Maui.SizeRequest.SizeRequest(Microsoft.Maui.Graphics.Size request, Microsoft.Maui.Graphics.Size minimum) -> void +Microsoft.Maui.SourceInfo +Microsoft.Maui.SourceInfo.Deconstruct(out System.Uri! sourceUri, out int lineNumber, out int linePosition) -> void +Microsoft.Maui.SourceInfo.LineNumber.get -> int +Microsoft.Maui.SourceInfo.LinePosition.get -> int +Microsoft.Maui.SourceInfo.SourceInfo(System.Uri! sourceUri, int lineNumber, int linePosition) -> void +Microsoft.Maui.SourceInfo.SourceUri.get -> System.Uri! +Microsoft.Maui.StreamImageSourceService +Microsoft.Maui.StreamImageSourceService.StreamImageSourceService() -> void +Microsoft.Maui.StreamImageSourceService.StreamImageSourceService(Microsoft.Extensions.Logging.ILogger? logger = null) -> void +Microsoft.Maui.SwipeBehaviorOnInvoked +Microsoft.Maui.SwipeBehaviorOnInvoked.Auto = 0 -> Microsoft.Maui.SwipeBehaviorOnInvoked +Microsoft.Maui.SwipeBehaviorOnInvoked.Close = 1 -> Microsoft.Maui.SwipeBehaviorOnInvoked +Microsoft.Maui.SwipeBehaviorOnInvoked.RemainOpen = 2 -> Microsoft.Maui.SwipeBehaviorOnInvoked +Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeDirection.Down = 8 -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeDirection.Left = 2 -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeDirection.Right = 1 -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeDirection.Up = 4 -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeMode +Microsoft.Maui.SwipeMode.Execute = 1 -> Microsoft.Maui.SwipeMode +Microsoft.Maui.SwipeMode.Reveal = 0 -> Microsoft.Maui.SwipeMode +Microsoft.Maui.SwipeTransitionMode +Microsoft.Maui.SwipeTransitionMode.Drag = 1 -> Microsoft.Maui.SwipeTransitionMode +Microsoft.Maui.SwipeTransitionMode.Reveal = 0 -> Microsoft.Maui.SwipeTransitionMode +Microsoft.Maui.SwipeViewCloseRequest +Microsoft.Maui.SwipeViewCloseRequest.Animated.get -> bool +Microsoft.Maui.SwipeViewCloseRequest.Animated.init -> void +Microsoft.Maui.SwipeViewCloseRequest.SwipeViewCloseRequest(bool Animated) -> void +Microsoft.Maui.SwipeViewOpenRequest +Microsoft.Maui.SwipeViewOpenRequest.Animated.get -> bool +Microsoft.Maui.SwipeViewOpenRequest.Animated.init -> void +Microsoft.Maui.SwipeViewOpenRequest.OpenSwipeItem.get -> Microsoft.Maui.OpenSwipeItem +Microsoft.Maui.SwipeViewOpenRequest.OpenSwipeItem.init -> void +Microsoft.Maui.SwipeViewOpenRequest.SwipeViewOpenRequest(Microsoft.Maui.OpenSwipeItem OpenSwipeItem, bool Animated) -> void +Microsoft.Maui.SwipeViewSwipeChanging +Microsoft.Maui.SwipeViewSwipeChanging.Offset.get -> double +Microsoft.Maui.SwipeViewSwipeChanging.Offset.init -> void +Microsoft.Maui.SwipeViewSwipeChanging.SwipeDirection.get -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeViewSwipeChanging.SwipeDirection.init -> void +Microsoft.Maui.SwipeViewSwipeChanging.SwipeViewSwipeChanging(Microsoft.Maui.SwipeDirection SwipeDirection, double Offset) -> void +Microsoft.Maui.SwipeViewSwipeEnded +Microsoft.Maui.SwipeViewSwipeEnded.IsOpen.get -> bool +Microsoft.Maui.SwipeViewSwipeEnded.IsOpen.init -> void +Microsoft.Maui.SwipeViewSwipeEnded.SwipeDirection.get -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeViewSwipeEnded.SwipeDirection.init -> void +Microsoft.Maui.SwipeViewSwipeEnded.SwipeViewSwipeEnded(Microsoft.Maui.SwipeDirection SwipeDirection, bool IsOpen) -> void +Microsoft.Maui.SwipeViewSwipeStarted +Microsoft.Maui.SwipeViewSwipeStarted.SwipeDirection.get -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.SwipeViewSwipeStarted.SwipeDirection.init -> void +Microsoft.Maui.SwipeViewSwipeStarted.SwipeViewSwipeStarted(Microsoft.Maui.SwipeDirection SwipeDirection) -> void +Microsoft.Maui.TextAlignment +Microsoft.Maui.TextAlignment.Center = 1 -> Microsoft.Maui.TextAlignment +Microsoft.Maui.TextAlignment.End = 2 -> Microsoft.Maui.TextAlignment +Microsoft.Maui.TextAlignment.Start = 0 -> Microsoft.Maui.TextAlignment +Microsoft.Maui.TextDecorations +Microsoft.Maui.TextDecorations.None = 0 -> Microsoft.Maui.TextDecorations +Microsoft.Maui.TextDecorations.Strikethrough = 2 -> Microsoft.Maui.TextDecorations +Microsoft.Maui.TextDecorations.Underline = 1 -> Microsoft.Maui.TextDecorations +Microsoft.Maui.TextTransform +Microsoft.Maui.TextTransform.Default = 1 -> Microsoft.Maui.TextTransform +Microsoft.Maui.TextTransform.Lowercase = 2 -> Microsoft.Maui.TextTransform +Microsoft.Maui.TextTransform.None = 0 -> Microsoft.Maui.TextTransform +Microsoft.Maui.TextTransform.Uppercase = 3 -> Microsoft.Maui.TextTransform +Microsoft.Maui.TextType +Microsoft.Maui.TextType.Html = 1 -> Microsoft.Maui.TextType +Microsoft.Maui.TextType.Text = 0 -> Microsoft.Maui.TextType +Microsoft.Maui.Thickness +Microsoft.Maui.Thickness.Bottom.get -> double +Microsoft.Maui.Thickness.Bottom.set -> void +Microsoft.Maui.Thickness.Deconstruct(out double left, out double top, out double right, out double bottom) -> void +Microsoft.Maui.Thickness.HorizontalThickness.get -> double +Microsoft.Maui.Thickness.IsEmpty.get -> bool +Microsoft.Maui.Thickness.IsNaN.get -> bool +Microsoft.Maui.Thickness.Left.get -> double +Microsoft.Maui.Thickness.Left.set -> void +Microsoft.Maui.Thickness.Right.get -> double +Microsoft.Maui.Thickness.Right.set -> void +Microsoft.Maui.Thickness.Thickness() -> void +Microsoft.Maui.Thickness.Thickness(double horizontalSize, double verticalSize) -> void +Microsoft.Maui.Thickness.Thickness(double left, double top, double right, double bottom) -> void +Microsoft.Maui.Thickness.Thickness(double uniformSize) -> void +Microsoft.Maui.Thickness.Top.get -> double +Microsoft.Maui.Thickness.Top.set -> void +Microsoft.Maui.Thickness.VerticalThickness.get -> double +Microsoft.Maui.UriImageSourceService +Microsoft.Maui.UriImageSourceService.UriImageSourceService() -> void +Microsoft.Maui.UriImageSourceService.UriImageSourceService(Microsoft.Extensions.Logging.ILogger? logger = null) -> void +Microsoft.Maui.ViewExtensions +Microsoft.Maui.Visibility +Microsoft.Maui.Visibility.Collapsed = 2 -> Microsoft.Maui.Visibility +Microsoft.Maui.Visibility.Hidden = 1 -> Microsoft.Maui.Visibility +Microsoft.Maui.Visibility.Visible = 0 -> Microsoft.Maui.Visibility +Microsoft.Maui.VisualDiagnostics +Microsoft.Maui.VisualDiagnosticsOverlay +Microsoft.Maui.VisualDiagnosticsOverlay.AddAdorner(Microsoft.Maui.IAdorner! adorner, bool scrollToView = false) -> bool +Microsoft.Maui.VisualDiagnosticsOverlay.AddAdorner(Microsoft.Maui.IVisualTreeElement! visualElement, bool scrollToView = false) -> bool +Microsoft.Maui.VisualDiagnosticsOverlay.AddScrollableElementHandler(Microsoft.Maui.IScrollView! scrollBar) -> void +Microsoft.Maui.VisualDiagnosticsOverlay.AddScrollableElementHandlers() -> void +Microsoft.Maui.VisualDiagnosticsOverlay.EnableElementSelector.get -> bool +Microsoft.Maui.VisualDiagnosticsOverlay.EnableElementSelector.set -> void +Microsoft.Maui.VisualDiagnosticsOverlay.Offset.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.VisualDiagnosticsOverlay.RemoveAdorner(Microsoft.Maui.IAdorner! adorner) -> bool +Microsoft.Maui.VisualDiagnosticsOverlay.RemoveAdorners() -> void +Microsoft.Maui.VisualDiagnosticsOverlay.RemoveAdorners(Microsoft.Maui.IVisualTreeElement! visualElement) -> bool +Microsoft.Maui.VisualDiagnosticsOverlay.RemoveScrollableElementHandler() -> void +Microsoft.Maui.VisualDiagnosticsOverlay.ScrollToElement.get -> bool +Microsoft.Maui.VisualDiagnosticsOverlay.ScrollToElement.set -> void +Microsoft.Maui.VisualDiagnosticsOverlay.ScrollToView(Microsoft.Maui.IVisualTreeElement! element) -> void +Microsoft.Maui.VisualDiagnosticsOverlay.ScrollViews.get -> System.Collections.Generic.IReadOnlyCollection! +Microsoft.Maui.VisualDiagnosticsOverlay.VisualDiagnosticsOverlay(Microsoft.Maui.IWindow! window) -> void +Microsoft.Maui.VisualTreeChangeEventArgs +Microsoft.Maui.VisualTreeChangeEventArgs.ChangeType.get -> Microsoft.Maui.VisualTreeChangeType +Microsoft.Maui.VisualTreeChangeEventArgs.Child.get -> object! +Microsoft.Maui.VisualTreeChangeEventArgs.ChildIndex.get -> int +Microsoft.Maui.VisualTreeChangeEventArgs.Parent.get -> object? +Microsoft.Maui.VisualTreeChangeEventArgs.VisualTreeChangeEventArgs(object? parent, object! child, int childIndex, Microsoft.Maui.VisualTreeChangeType changeType) -> void +Microsoft.Maui.VisualTreeChangeType +Microsoft.Maui.VisualTreeChangeType.Add = 0 -> Microsoft.Maui.VisualTreeChangeType +Microsoft.Maui.VisualTreeChangeType.Remove = 1 -> Microsoft.Maui.VisualTreeChangeType +Microsoft.Maui.VisualTreeElementExtensions +Microsoft.Maui.WeakEventManager +Microsoft.Maui.WeakEventManager.AddEventHandler(System.Delegate? handler, string! eventName = "") -> void +Microsoft.Maui.WeakEventManager.AddEventHandler(System.EventHandler! handler, string! eventName = "") -> void +Microsoft.Maui.WeakEventManager.HandleEvent(object! sender, object! args, string! eventName) -> void +Microsoft.Maui.WeakEventManager.RemoveEventHandler(System.Delegate? handler, string! eventName = "") -> void +Microsoft.Maui.WeakEventManager.RemoveEventHandler(System.EventHandler! handler, string! eventName = "") -> void +Microsoft.Maui.WeakEventManager.WeakEventManager() -> void +Microsoft.Maui.WebNavigationEvent +Microsoft.Maui.WebNavigationEvent.Back = 1 -> Microsoft.Maui.WebNavigationEvent +Microsoft.Maui.WebNavigationEvent.Forward = 2 -> Microsoft.Maui.WebNavigationEvent +Microsoft.Maui.WebNavigationEvent.NewPage = 3 -> Microsoft.Maui.WebNavigationEvent +Microsoft.Maui.WebNavigationEvent.Refresh = 4 -> Microsoft.Maui.WebNavigationEvent +Microsoft.Maui.WebNavigationResult +Microsoft.Maui.WebNavigationResult.Cancel = 2 -> Microsoft.Maui.WebNavigationResult +Microsoft.Maui.WebNavigationResult.Failure = 4 -> Microsoft.Maui.WebNavigationResult +Microsoft.Maui.WebNavigationResult.Success = 1 -> Microsoft.Maui.WebNavigationResult +Microsoft.Maui.WebNavigationResult.Timeout = 3 -> Microsoft.Maui.WebNavigationResult +Microsoft.Maui.WindowExtensions +Microsoft.Maui.WindowOverlay +Microsoft.Maui.WindowOverlay.Density.get -> float +Microsoft.Maui.WindowOverlay.DisableUITouchEventPassthrough.get -> bool +Microsoft.Maui.WindowOverlay.DisableUITouchEventPassthrough.set -> void +Microsoft.Maui.WindowOverlay.Draw(Microsoft.Maui.Graphics.ICanvas! canvas, Microsoft.Maui.Graphics.RectF dirtyRect) -> void +Microsoft.Maui.WindowOverlay.EnableDrawableTouchHandling.get -> bool +Microsoft.Maui.WindowOverlay.EnableDrawableTouchHandling.set -> void +Microsoft.Maui.WindowOverlay.GraphicsView.get -> object? +Microsoft.Maui.WindowOverlay.Invalidate() -> void +Microsoft.Maui.WindowOverlay.IsPlatformViewInitialized.get -> bool +Microsoft.Maui.WindowOverlay.IsVisible.get -> bool +Microsoft.Maui.WindowOverlay.IsVisible.set -> void +Microsoft.Maui.WindowOverlay.Tapped -> System.EventHandler? +Microsoft.Maui.WindowOverlay.Window.get -> Microsoft.Maui.IWindow! +Microsoft.Maui.WindowOverlay.WindowElements.get -> System.Collections.Generic.IReadOnlyCollection! +Microsoft.Maui.WindowOverlay.WindowOverlay(Microsoft.Maui.IWindow! window) -> void +Microsoft.Maui.WindowOverlayTappedEventArgs +Microsoft.Maui.WindowOverlayTappedEventArgs.Point.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.WindowOverlayTappedEventArgs.VisualTreeElements.get -> System.Collections.Generic.IList! +Microsoft.Maui.WindowOverlayTappedEventArgs.WindowOverlayElements.get -> System.Collections.Generic.IList! +Microsoft.Maui.WindowOverlayTappedEventArgs.WindowOverlayTappedEventArgs(Microsoft.Maui.Graphics.Point point, System.Collections.Generic.IList! elements, System.Collections.Generic.IList! overlayElements) -> void +override Microsoft.Maui.Animations.LerpingAnimation.Update(double percent) -> void +override Microsoft.Maui.Converters.CornerRadiusTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext? context, System.Type! sourceType) -> bool +override Microsoft.Maui.Converters.CornerRadiusTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext? context, System.Type? destinationType) -> bool +override Microsoft.Maui.Converters.CornerRadiusTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext? context, System.Globalization.CultureInfo? culture, object? value) -> object! +override Microsoft.Maui.Converters.CornerRadiusTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext? context, System.Globalization.CultureInfo? culture, object? value, System.Type! destinationType) -> object! +override Microsoft.Maui.Converters.KeyboardTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext? context, System.Type! sourceType) -> bool +override Microsoft.Maui.Converters.KeyboardTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext? context, System.Type? destinationType) -> bool +override Microsoft.Maui.Converters.KeyboardTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext? context, System.Globalization.CultureInfo? culture, object? value) -> object! +override Microsoft.Maui.Converters.KeyboardTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext? context, System.Globalization.CultureInfo? culture, object? value, System.Type! destinationType) -> object! +override Microsoft.Maui.CornerRadius.Equals(object? obj) -> bool +override Microsoft.Maui.CornerRadius.GetHashCode() -> int +override Microsoft.Maui.Font.Equals(object? obj) -> bool +override Microsoft.Maui.Font.GetHashCode() -> int +override Microsoft.Maui.Font.ToString() -> string! +override Microsoft.Maui.GridLength.Equals(object? obj) -> bool +override Microsoft.Maui.GridLength.GetHashCode() -> int +override Microsoft.Maui.GridLength.ToString() -> string! +override Microsoft.Maui.Handlers.ActivityIndicatorHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ApplicationHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Handlers.BorderHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ButtonHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.CheckBoxHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ContentViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.DatePickerHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.EditorHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.EntryHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.FlyoutViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.GraphicsViewHandler.ConnectHandler(object! platformView) -> void +override Microsoft.Maui.Handlers.GraphicsViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.GraphicsViewHandler.DisconnectHandler(object! platformView) -> void +override Microsoft.Maui.Handlers.ImageButtonHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ImageHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.IndicatorViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.LabelHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.LayoutHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.MenuBarHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Handlers.MenuBarItemHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Handlers.MenuFlyoutItemHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Handlers.NavigationViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.PickerHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ProgressBarHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.RadioButtonHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.RefreshViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ScrollViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.SearchBarHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ShapeViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.SliderHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.StepperHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Handlers.SwipeItemViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.SwipeViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.SwitchHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.TabbedViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.TimePickerHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.ToolbarHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Handlers.ViewHandler.GetDesiredSize(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Handlers.ViewHandler.PlatformArrange(Microsoft.Maui.Graphics.Rect rect) -> void +override Microsoft.Maui.Handlers.ViewHandler.RemoveContainer() -> void +override Microsoft.Maui.Handlers.ViewHandler.SetupContainer() -> void +override Microsoft.Maui.Handlers.WebViewHandler.CreatePlatformView() -> object! +override Microsoft.Maui.Handlers.WindowHandler.CreatePlatformElement() -> object! +override Microsoft.Maui.Layouts.AbsoluteLayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Layouts.AbsoluteLayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Layouts.GridLayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Layouts.GridLayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Layouts.HorizontalStackLayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Layouts.HorizontalStackLayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Layouts.VerticalStackLayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Layouts.VerticalStackLayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.RectangleGridAdorner.Draw(Microsoft.Maui.Graphics.ICanvas! canvas, Microsoft.Maui.Graphics.RectF dirtyRect) -> void +override Microsoft.Maui.Semantics.ToString() -> string! +override Microsoft.Maui.SizeRequest.ToString() -> string! +override Microsoft.Maui.Thickness.Equals(object? obj) -> bool +override Microsoft.Maui.Thickness.GetHashCode() -> int +override Microsoft.Maui.VisualDiagnosticsOverlay.AddWindowElement(Microsoft.Maui.IWindowOverlayElement! drawable) -> bool +override Microsoft.Maui.VisualDiagnosticsOverlay.Deinitialize() -> bool +override Microsoft.Maui.VisualDiagnosticsOverlay.RemoveWindowElement(Microsoft.Maui.IWindowOverlayElement! drawable) -> bool +override Microsoft.Maui.VisualDiagnosticsOverlay.RemoveWindowElements() -> void +override sealed Microsoft.Maui.Handlers.ViewHandler.SetVirtualView(Microsoft.Maui.IElement! view) -> void +readonly Microsoft.Maui.LockableObservableListWrapper._list -> System.Collections.ObjectModel.ObservableCollection! +readonly Microsoft.Maui.PropertyMapper._mapper -> System.Collections.Generic.Dictionary!>! +static Microsoft.Maui.Animations.AnimationLerpingExtensions.GenericLerp(this T start, T end, double progress, double toggleThreshold = 0.5) -> T +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this double start, double end, double progress) -> double +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this float start, float end, double progress) -> float +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this float? start, float? end, double progress) -> float? +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.Color! color, Microsoft.Maui.Graphics.Color! endColor, double progress) -> Microsoft.Maui.Graphics.Color! +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.Point start, Microsoft.Maui.Graphics.Point end, double progress) -> Microsoft.Maui.Graphics.Point +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.PointF start, Microsoft.Maui.Graphics.PointF end, double progress) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.Rect start, Microsoft.Maui.Graphics.Rect end, double progress) -> Microsoft.Maui.Graphics.Rect +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.RectF start, Microsoft.Maui.Graphics.RectF end, double progress) -> Microsoft.Maui.Graphics.RectF +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.Size start, Microsoft.Maui.Graphics.Size end, double progress) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.SizeF start, Microsoft.Maui.Graphics.SizeF end, double progress) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Graphics.SolidPaint! paint, Microsoft.Maui.Graphics.SolidPaint! endPaint, double progress) -> Microsoft.Maui.Graphics.SolidPaint! +static Microsoft.Maui.Animations.AnimationLerpingExtensions.Lerp(this Microsoft.Maui.Thickness start, Microsoft.Maui.Thickness end, double progress) -> Microsoft.Maui.Thickness +static Microsoft.Maui.Animations.Lerp.GetLerp(System.Type! type) -> Microsoft.Maui.Animations.Lerp? +static Microsoft.Maui.CommandMapperExtensions.AppendToMapping(this Microsoft.Maui.CommandMapper! commandMapper, string! key, System.Action! method) -> void +static Microsoft.Maui.CommandMapperExtensions.ModifyMapping(this Microsoft.Maui.CommandMapper! commandMapper, string! key, System.Action?>! method) -> void +static Microsoft.Maui.CommandMapperExtensions.PrependToMapping(this Microsoft.Maui.CommandMapper! commandMapper, string! key, System.Action! method) -> void +static Microsoft.Maui.CornerRadius.implicit operator Microsoft.Maui.CornerRadius(double uniformRadius) -> Microsoft.Maui.CornerRadius +static Microsoft.Maui.CornerRadius.operator !=(Microsoft.Maui.CornerRadius left, Microsoft.Maui.CornerRadius right) -> bool +static Microsoft.Maui.CornerRadius.operator ==(Microsoft.Maui.CornerRadius left, Microsoft.Maui.CornerRadius right) -> bool +static Microsoft.Maui.Crc64.ComputeHash(byte[]! input) -> byte[]! +static Microsoft.Maui.Crc64.ComputeHash(System.IO.Stream! inputStream) -> byte[]! +static Microsoft.Maui.Crc64.ComputeHashString(string! input) -> string! +static Microsoft.Maui.Dispatching.Dispatcher.GetForCurrentThread() -> Microsoft.Maui.Dispatching.IDispatcher? +static Microsoft.Maui.Dispatching.DispatcherExtensions.DispatchAsync(this Microsoft.Maui.Dispatching.IDispatcher! dispatcher, System.Action! action) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Dispatching.DispatcherExtensions.DispatchAsync(this Microsoft.Maui.Dispatching.IDispatcher! dispatcher, System.Func! funcTask) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Dispatching.DispatcherExtensions.DispatchAsync(this Microsoft.Maui.Dispatching.IDispatcher! dispatcher, System.Func!>! funcTask) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Dispatching.DispatcherExtensions.DispatchAsync(this Microsoft.Maui.Dispatching.IDispatcher! dispatcher, System.Func! func) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Dispatching.DispatcherExtensions.GetSynchronizationContextAsync(this Microsoft.Maui.Dispatching.IDispatcher! dispatcher) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Dispatching.DispatcherExtensions.StartTimer(this Microsoft.Maui.Dispatching.IDispatcher! dispatcher, System.TimeSpan interval, System.Func! callback) -> void +static Microsoft.Maui.Dispatching.DispatcherProvider.Current.get -> Microsoft.Maui.Dispatching.IDispatcherProvider! +static Microsoft.Maui.Dispatching.DispatcherProvider.SetCurrent(Microsoft.Maui.Dispatching.IDispatcherProvider? provider) -> bool +static Microsoft.Maui.Easing.Default.get -> Microsoft.Maui.Easing! +static Microsoft.Maui.Easing.implicit operator Microsoft.Maui.Easing!(System.Func! func) -> Microsoft.Maui.Easing! +static Microsoft.Maui.Font.Default.get -> Microsoft.Maui.Font +static Microsoft.Maui.Font.OfSize(string? name, double size, Microsoft.Maui.FontWeight weight = Microsoft.Maui.FontWeight.Regular, Microsoft.Maui.FontSlant fontSlant = Microsoft.Maui.FontSlant.Default, bool enableScaling = true) -> Microsoft.Maui.Font +static Microsoft.Maui.Font.operator !=(Microsoft.Maui.Font left, Microsoft.Maui.Font right) -> bool +static Microsoft.Maui.Font.operator ==(Microsoft.Maui.Font left, Microsoft.Maui.Font right) -> bool +static Microsoft.Maui.Font.SystemFontOfSize(double size, Microsoft.Maui.FontWeight weight = Microsoft.Maui.FontWeight.Regular, Microsoft.Maui.FontSlant fontSlant = Microsoft.Maui.FontSlant.Default, bool enableScaling = true) -> Microsoft.Maui.Font +static Microsoft.Maui.Font.SystemFontOfWeight(Microsoft.Maui.FontWeight weight, Microsoft.Maui.FontSlant fontSlant = Microsoft.Maui.FontSlant.Default, bool enableScaling = true) -> Microsoft.Maui.Font +static Microsoft.Maui.FontFile.FromString(string! input) -> Microsoft.Maui.FontFile! +static Microsoft.Maui.Graphics.PaintExtensions.IsNullOrEmpty(this Microsoft.Maui.Graphics.Paint? paint) -> bool +static Microsoft.Maui.Graphics.PaintExtensions.ToColor(this Microsoft.Maui.Graphics.Paint? paint) -> Microsoft.Maui.Graphics.Color? +static Microsoft.Maui.GridLength.implicit operator Microsoft.Maui.GridLength(double absoluteValue) -> Microsoft.Maui.GridLength +static Microsoft.Maui.Handlers.ActivityIndicatorHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ActivityIndicatorHandler.MapColor(Microsoft.Maui.Handlers.IActivityIndicatorHandler! handler, Microsoft.Maui.IActivityIndicator! activityIndicator) -> void +static Microsoft.Maui.Handlers.ActivityIndicatorHandler.MapIsRunning(Microsoft.Maui.Handlers.IActivityIndicatorHandler! handler, Microsoft.Maui.IActivityIndicator! activityIndicator) -> void +static Microsoft.Maui.Handlers.ActivityIndicatorHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ApplicationHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ApplicationHandler.MapCloseWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void +static Microsoft.Maui.Handlers.ApplicationHandler.MapOpenWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void +static Microsoft.Maui.Handlers.ApplicationHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ApplicationHandler.MapTerminate(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void +static Microsoft.Maui.Handlers.BorderHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.BorderHandler.MapBackground(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapContent(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.BorderHandler.MapStroke(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapStrokeDashOffset(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapStrokeDashPattern(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapStrokeLineCap(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapStrokeLineJoin(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapStrokeMiterLimit(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapStrokeShape(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.BorderHandler.MapStrokeThickness(Microsoft.Maui.Handlers.IBorderHandler! handler, Microsoft.Maui.IBorderView! border) -> void +static Microsoft.Maui.Handlers.ButtonHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ButtonHandler.ImageButtonMapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ButtonHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.ITextStyle! button) -> void +static Microsoft.Maui.Handlers.ButtonHandler.MapCornerRadius(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.IButtonStroke! buttonStroke) -> void +static Microsoft.Maui.Handlers.ButtonHandler.MapFont(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.ITextStyle! button) -> void +static Microsoft.Maui.Handlers.ButtonHandler.MapImageSource(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.IImage! image) -> void +static Microsoft.Maui.Handlers.ButtonHandler.MapPadding(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.IButton! button) -> void +static Microsoft.Maui.Handlers.ButtonHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ButtonHandler.MapStrokeColor(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.IButtonStroke! buttonStroke) -> void +static Microsoft.Maui.Handlers.ButtonHandler.MapStrokeThickness(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.IButtonStroke! buttonStroke) -> void +static Microsoft.Maui.Handlers.ButtonHandler.MapText(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.IText! button) -> void +static Microsoft.Maui.Handlers.ButtonHandler.MapTextColor(Microsoft.Maui.Handlers.IButtonHandler! handler, Microsoft.Maui.ITextStyle! button) -> void +static Microsoft.Maui.Handlers.ButtonHandler.TextButtonMapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.CheckBoxHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.CheckBoxHandler.MapForeground(Microsoft.Maui.Handlers.ICheckBoxHandler! handler, Microsoft.Maui.ICheckBox! check) -> void +static Microsoft.Maui.Handlers.CheckBoxHandler.MapIsChecked(Microsoft.Maui.Handlers.ICheckBoxHandler! handler, Microsoft.Maui.ICheckBox! check) -> void +static Microsoft.Maui.Handlers.CheckBoxHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ContentViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ContentViewHandler.MapContent(Microsoft.Maui.Handlers.IContentViewHandler! handler, Microsoft.Maui.IContentView! page) -> void +static Microsoft.Maui.Handlers.ContentViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.DatePickerHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.DatePickerHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.IDatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void +static Microsoft.Maui.Handlers.DatePickerHandler.MapDate(Microsoft.Maui.Handlers.IDatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void +static Microsoft.Maui.Handlers.DatePickerHandler.MapFont(Microsoft.Maui.Handlers.IDatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void +static Microsoft.Maui.Handlers.DatePickerHandler.MapFormat(Microsoft.Maui.Handlers.IDatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void +static Microsoft.Maui.Handlers.DatePickerHandler.MapMaximumDate(Microsoft.Maui.Handlers.IDatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void +static Microsoft.Maui.Handlers.DatePickerHandler.MapMinimumDate(Microsoft.Maui.Handlers.IDatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void +static Microsoft.Maui.Handlers.DatePickerHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.DatePickerHandler.MapTextColor(Microsoft.Maui.Handlers.IDatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void +static Microsoft.Maui.Handlers.EditorHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.EditorHandler.MapCharacterSpacing(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapCursorPosition(Microsoft.Maui.Handlers.IEditorHandler! handler, Microsoft.Maui.ITextInput! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapFont(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapHorizontalTextAlignment(Microsoft.Maui.Handlers.IEditorHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapIsReadOnly(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapIsTextPredictionEnabled(Microsoft.Maui.Handlers.IEditorHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapKeyboard(Microsoft.Maui.Handlers.IEditorHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapMaxLength(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.EditorHandler.MapPlaceholder(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapPlaceholderColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapSelectionLength(Microsoft.Maui.Handlers.IEditorHandler! handler, Microsoft.Maui.ITextInput! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapText(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapTextColor(Microsoft.Maui.Handlers.IEditorHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapTextColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.EditorHandler.MapVerticalTextAlignment(Microsoft.Maui.Handlers.IEditorHandler! handler, Microsoft.Maui.IEditor! editor) -> void +static Microsoft.Maui.Handlers.ElementHandler.ElementCommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ElementHandler.ElementMapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.EntryHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.EntryHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapClearButtonVisibility(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapCursorPosition(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapFont(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapHorizontalTextAlignment(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapIsPassword(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapIsReadOnly(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapIsTextPredictionEnabled(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapKeyboard(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapMaxLength(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.EntryHandler.MapPlaceholder(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapPlaceholderColor(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapReturnType(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapSelectionLength(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapText(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapTextColor(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.EntryHandler.MapVerticalTextAlignment(Microsoft.Maui.Handlers.IEntryHandler! handler, Microsoft.Maui.IEntry! entry) -> void +static Microsoft.Maui.Handlers.FlyoutViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.FlyoutViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.GraphicsViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.GraphicsViewHandler.MapDrawable(Microsoft.Maui.Handlers.IGraphicsViewHandler! handler, Microsoft.Maui.IGraphicsView! graphicsView) -> void +static Microsoft.Maui.Handlers.GraphicsViewHandler.MapFlowDirection(Microsoft.Maui.Handlers.IGraphicsViewHandler! handler, Microsoft.Maui.IGraphicsView! graphicsView) -> void +static Microsoft.Maui.Handlers.GraphicsViewHandler.MapInvalidate(Microsoft.Maui.Handlers.IGraphicsViewHandler! handler, Microsoft.Maui.IGraphicsView! graphicsView, object? arg) -> void +static Microsoft.Maui.Handlers.GraphicsViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ImageButtonHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ImageButtonHandler.ImageMapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ImageButtonHandler.MapCornerRadius(Microsoft.Maui.Handlers.IImageButtonHandler! handler, Microsoft.Maui.IButtonStroke! buttonStroke) -> void +static Microsoft.Maui.Handlers.ImageButtonHandler.MapPadding(Microsoft.Maui.Handlers.IImageButtonHandler! handler, Microsoft.Maui.IImageButton! imageButton) -> void +static Microsoft.Maui.Handlers.ImageButtonHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ImageButtonHandler.MapStrokeColor(Microsoft.Maui.Handlers.IImageButtonHandler! handler, Microsoft.Maui.IButtonStroke! buttonStroke) -> void +static Microsoft.Maui.Handlers.ImageButtonHandler.MapStrokeThickness(Microsoft.Maui.Handlers.IImageButtonHandler! handler, Microsoft.Maui.IButtonStroke! buttonStroke) -> void +static Microsoft.Maui.Handlers.ImageHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ImageHandler.MapAspect(Microsoft.Maui.Handlers.IImageHandler! handler, Microsoft.Maui.IImage! image) -> void +static Microsoft.Maui.Handlers.ImageHandler.MapIsAnimationPlaying(Microsoft.Maui.Handlers.IImageHandler! handler, Microsoft.Maui.IImage! image) -> void +static Microsoft.Maui.Handlers.ImageHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ImageHandler.MapSource(Microsoft.Maui.Handlers.IImageHandler! handler, Microsoft.Maui.IImage! image) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapCount(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapHideSingle(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapIndicatorColor(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapIndicatorShape(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapIndicatorSize(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapMaximumVisible(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapPosition(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.IndicatorViewHandler.MapSelectedIndicatorColor(Microsoft.Maui.Handlers.IIndicatorViewHandler! handler, Microsoft.Maui.IIndicatorView! indicator) -> void +static Microsoft.Maui.Handlers.LabelHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.LabelHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapFont(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapHorizontalTextAlignment(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapLineHeight(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapMaxLines(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapPadding(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.LabelHandler.MapText(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapTextColor(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapTextDecorations(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LabelHandler.MapVerticalTextAlignment(Microsoft.Maui.Handlers.ILabelHandler! handler, Microsoft.Maui.ILabel! label) -> void +static Microsoft.Maui.Handlers.LayoutHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.LayoutHandler.MapAdd(Microsoft.Maui.ILayoutHandler! handler, Microsoft.Maui.ILayout! layout, object? arg) -> void +static Microsoft.Maui.Handlers.LayoutHandler.MapBackground(Microsoft.Maui.ILayoutHandler! handler, Microsoft.Maui.ILayout! layout) -> void +static Microsoft.Maui.Handlers.LayoutHandler.MapClear(Microsoft.Maui.ILayoutHandler! handler, Microsoft.Maui.ILayout! layout, object? arg) -> void +static Microsoft.Maui.Handlers.LayoutHandler.MapClipsToBounds(Microsoft.Maui.ILayoutHandler! handler, Microsoft.Maui.ILayout! layout) -> void +static Microsoft.Maui.Handlers.LayoutHandler.MapInsert(Microsoft.Maui.ILayoutHandler! handler, Microsoft.Maui.ILayout! layout, object? arg) -> void +static Microsoft.Maui.Handlers.LayoutHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.LayoutHandler.MapRemove(Microsoft.Maui.ILayoutHandler! handler, Microsoft.Maui.ILayout! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.MenuBarHandler.MapAdd(Microsoft.Maui.Handlers.IMenuBarHandler! handler, Microsoft.Maui.IMenuBar! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarHandler.MapClear(Microsoft.Maui.Handlers.IMenuBarHandler! handler, Microsoft.Maui.IMenuBar! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarHandler.MapInsert(Microsoft.Maui.Handlers.IMenuBarHandler! handler, Microsoft.Maui.IMenuBar! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.MenuBarHandler.MapRemove(Microsoft.Maui.Handlers.IMenuBarHandler! handler, Microsoft.Maui.IMenuBar! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarItemHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.MenuBarItemHandler.MapAdd(Microsoft.Maui.Handlers.IMenuBarItemHandler! handler, Microsoft.Maui.IMenuBarItem! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarItemHandler.MapClear(Microsoft.Maui.Handlers.IMenuBarItemHandler! handler, Microsoft.Maui.IMenuBarItem! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarItemHandler.MapInsert(Microsoft.Maui.Handlers.IMenuBarItemHandler! handler, Microsoft.Maui.IMenuBarItem! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuBarItemHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.MenuBarItemHandler.MapRemove(Microsoft.Maui.Handlers.IMenuBarItemHandler! handler, Microsoft.Maui.IMenuBarItem! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuFlyoutItemHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.MenuFlyoutItemHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.MapAdd(Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler! handler, Microsoft.Maui.IMenuElement! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.MapClear(Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler! handler, Microsoft.Maui.IMenuElement! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.MapInsert(Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler! handler, Microsoft.Maui.IMenuElement! layout, object? arg) -> void +static Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.MenuFlyoutSubItemHandler.MapRemove(Microsoft.Maui.Handlers.IMenuFlyoutSubItemHandler! handler, Microsoft.Maui.IMenuElement! layout, object? arg) -> void +static Microsoft.Maui.Handlers.NavigationViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.NavigationViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.NavigationViewHandler.RequestNavigation(Microsoft.Maui.Handlers.INavigationViewHandler! arg1, Microsoft.Maui.IStackNavigation! arg2, object? arg3) -> void +static Microsoft.Maui.Handlers.PageHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.PageHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.PageHandler.MapTitle(Microsoft.Maui.Handlers.IPageHandler! handler, Microsoft.Maui.IContentView! page) -> void +static Microsoft.Maui.Handlers.PickerHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.PickerHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.PickerHandler.MapFont(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.PickerHandler.MapHorizontalTextAlignment(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.PickerHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.PickerHandler.MapReload(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! picker, object? args) -> void +static Microsoft.Maui.Handlers.PickerHandler.MapSelectedIndex(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.PickerHandler.MapTextColor(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.PickerHandler.MapTitle(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.PickerHandler.MapTitleColor(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.PickerHandler.MapVerticalTextAlignment(Microsoft.Maui.Handlers.IPickerHandler! handler, Microsoft.Maui.IPicker! view) -> void +static Microsoft.Maui.Handlers.ProgressBarHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ProgressBarHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ProgressBarHandler.MapProgress(Microsoft.Maui.Handlers.IProgressBarHandler! handler, Microsoft.Maui.IProgress! progress) -> void +static Microsoft.Maui.Handlers.ProgressBarHandler.MapProgressColor(Microsoft.Maui.Handlers.IProgressBarHandler! handler, Microsoft.Maui.IProgress! progress) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.RadioButtonHandler.MapBackground(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.IRadioButton! radioButton) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.ITextStyle! textStyle) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.MapContent(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.IRadioButton! radioButton) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.MapCornerRadius(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.IRadioButton! radioButton) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.MapFont(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.ITextStyle! textStyle) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.MapIsChecked(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.IRadioButton! radioButton) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.RadioButtonHandler.MapStrokeColor(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.IRadioButton! radioButton) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.MapStrokeThickness(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.IRadioButton! radioButton) -> void +static Microsoft.Maui.Handlers.RadioButtonHandler.MapTextColor(Microsoft.Maui.Handlers.IRadioButtonHandler! handler, Microsoft.Maui.ITextStyle! textStyle) -> void +static Microsoft.Maui.Handlers.RefreshViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.RefreshViewHandler.MapContent(Microsoft.Maui.Handlers.IRefreshViewHandler! handler, Microsoft.Maui.IRefreshView! refreshView) -> void +static Microsoft.Maui.Handlers.RefreshViewHandler.MapIsRefreshing(Microsoft.Maui.Handlers.IRefreshViewHandler! handler, Microsoft.Maui.IRefreshView! refreshView) -> void +static Microsoft.Maui.Handlers.RefreshViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.RefreshViewHandler.MapRefreshColor(Microsoft.Maui.Handlers.IRefreshViewHandler! handler, Microsoft.Maui.IRefreshView! refreshView) -> void +static Microsoft.Maui.Handlers.RefreshViewHandler.MapRefreshViewBackground(Microsoft.Maui.Handlers.IRefreshViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ScrollViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ScrollViewHandler.MapContent(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IScrollView! scrollView) -> void +static Microsoft.Maui.Handlers.ScrollViewHandler.MapContentSize(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IScrollView! scrollView) -> void +static Microsoft.Maui.Handlers.ScrollViewHandler.MapHorizontalScrollBarVisibility(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IScrollView! scrollView) -> void +static Microsoft.Maui.Handlers.ScrollViewHandler.MapOrientation(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IScrollView! scrollView) -> void +static Microsoft.Maui.Handlers.ScrollViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ScrollViewHandler.MapRequestScrollTo(Microsoft.Maui.Handlers.IScrollViewHandler! handler, Microsoft.Maui.IScrollView! scrollView, object? args) -> void +static Microsoft.Maui.Handlers.ScrollViewHandler.MapVerticalScrollBarVisibility(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IScrollView! scrollView) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.SearchBarHandler.MapBackground(Microsoft.Maui.Handlers.ISearchBarHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapCancelButtonColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapCharacterSpacing(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapFont(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapHorizontalTextAlignment(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapIsEnabled(Microsoft.Maui.Handlers.ISearchBarHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapIsReadOnly(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapIsTextPredictionEnabled(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapMaxLength(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.SearchBarHandler.MapPlaceholder(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapPlaceholderColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapText(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapTextColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.SearchBarHandler.MapVerticalTextAlignment(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISearchBar! searchBar) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ShapeViewHandler.MapAspect(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapBackground(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapFill(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ShapeViewHandler.MapShape(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapStroke(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapStrokeDashOffset(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapStrokeDashPattern(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapStrokeLineCap(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapStrokeLineJoin(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapStrokeMiterLimit(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.ShapeViewHandler.MapStrokeThickness(Microsoft.Maui.Handlers.IShapeViewHandler! handler, Microsoft.Maui.IShapeView! shapeView) -> void +static Microsoft.Maui.Handlers.SliderHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.SliderHandler.MapMaximum(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISlider! slider) -> void +static Microsoft.Maui.Handlers.SliderHandler.MapMaximumTrackColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISlider! slider) -> void +static Microsoft.Maui.Handlers.SliderHandler.MapMinimum(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISlider! slider) -> void +static Microsoft.Maui.Handlers.SliderHandler.MapMinimumTrackColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISlider! slider) -> void +static Microsoft.Maui.Handlers.SliderHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.SliderHandler.MapThumbColor(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISlider! slider) -> void +static Microsoft.Maui.Handlers.SliderHandler.MapThumbImageSource(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISlider! slider) -> void +static Microsoft.Maui.Handlers.SliderHandler.MapValue(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.ISlider! slider) -> void +static Microsoft.Maui.Handlers.StepperHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.StepperHandler.MapIncrement(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IStepper! stepper) -> void +static Microsoft.Maui.Handlers.StepperHandler.MapMaximum(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IStepper! stepper) -> void +static Microsoft.Maui.Handlers.StepperHandler.MapMinimum(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IStepper! stepper) -> void +static Microsoft.Maui.Handlers.StepperHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.StepperHandler.MapValue(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IStepper! stepper) -> void +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapBackground(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ISwipeItemMenuItem! view) -> void +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ITextStyle! view) -> void +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapFont(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ITextStyle! view) -> void +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapSource(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ISwipeItemMenuItem! image) -> void +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapSourceAsync(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ISwipeItemMenuItem! image) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapText(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ISwipeItemMenuItem! view) -> void +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapTextColor(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ITextStyle! view) -> void +static Microsoft.Maui.Handlers.SwipeItemMenuItemHandler.MapVisibility(Microsoft.Maui.Handlers.ISwipeItemMenuItemHandler! handler, Microsoft.Maui.ISwipeItemMenuItem! view) -> void +static Microsoft.Maui.Handlers.SwipeItemViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.SwipeItemViewHandler.MapContent(Microsoft.Maui.Handlers.ISwipeItemViewHandler! handler, Microsoft.Maui.ISwipeItemView! page) -> void +static Microsoft.Maui.Handlers.SwipeItemViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.SwipeItemViewHandler.MapVisibility(Microsoft.Maui.Handlers.ISwipeItemViewHandler! handler, Microsoft.Maui.ISwipeItemView! view) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.SwipeViewHandler.MapBottomItems(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! view) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.MapContent(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! view) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.MapLeftItems(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! view) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.SwipeViewHandler.MapRequestClose(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! swipeView, object? args) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.MapRequestOpen(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! swipeView, object? args) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.MapRightItems(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! view) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.MapSwipeTransitionMode(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! swipeView) -> void +static Microsoft.Maui.Handlers.SwipeViewHandler.MapTopItems(Microsoft.Maui.Handlers.ISwipeViewHandler! handler, Microsoft.Maui.ISwipeView! view) -> void +static Microsoft.Maui.Handlers.SwitchHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.SwitchHandler.MapIsOn(Microsoft.Maui.Handlers.ISwitchHandler! handler, Microsoft.Maui.ISwitch! view) -> void +static Microsoft.Maui.Handlers.SwitchHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.SwitchHandler.MapThumbColor(Microsoft.Maui.Handlers.ISwitchHandler! handler, Microsoft.Maui.ISwitch! view) -> void +static Microsoft.Maui.Handlers.SwitchHandler.MapTrackColor(Microsoft.Maui.Handlers.ISwitchHandler! handler, Microsoft.Maui.ISwitch! view) -> void +static Microsoft.Maui.Handlers.TabbedViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.TabbedViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.TimePickerHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.TimePickerHandler.MapCharacterSpacing(Microsoft.Maui.Handlers.ITimePickerHandler! handler, Microsoft.Maui.ITimePicker! view) -> void +static Microsoft.Maui.Handlers.TimePickerHandler.MapFont(Microsoft.Maui.Handlers.ITimePickerHandler! handler, Microsoft.Maui.ITimePicker! view) -> void +static Microsoft.Maui.Handlers.TimePickerHandler.MapFormat(Microsoft.Maui.Handlers.ITimePickerHandler! handler, Microsoft.Maui.ITimePicker! view) -> void +static Microsoft.Maui.Handlers.TimePickerHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.TimePickerHandler.MapTextColor(Microsoft.Maui.Handlers.ITimePickerHandler! handler, Microsoft.Maui.ITimePicker! timePicker) -> void +static Microsoft.Maui.Handlers.TimePickerHandler.MapTime(Microsoft.Maui.Handlers.ITimePickerHandler! handler, Microsoft.Maui.ITimePicker! view) -> void +static Microsoft.Maui.Handlers.ToolbarHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ToolbarHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ToolbarHandler.MapTitle(Microsoft.Maui.Handlers.IToolbarHandler! arg1, Microsoft.Maui.IToolbar! arg2) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapAnchorX(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapAnchorY(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapAutomationId(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapBackground(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapBorderView(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapClip(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapContainerView(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapFlowDirection(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapFocus(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view, object? args) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapFrame(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view, object? args) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapHeight(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapInputTransparent(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapInvalidateMeasure(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view, object? args) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapIsEnabled(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapMaximumHeight(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapMaximumWidth(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapMinimumHeight(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapMinimumWidth(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapOpacity(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapRotation(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapRotationX(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapRotationY(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapScale(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapScaleX(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapScaleY(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapSemantics(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapShadow(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapTranslationX(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapTranslationY(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapUnfocus(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view, object? args) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapVisibility(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapWidth(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Handlers.ViewHandler.MapZIndex(Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view, object? args) -> void +static Microsoft.Maui.Handlers.ViewHandler.ViewCommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.ViewHandler.ViewMapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.ViewHandler.PlatformViewFactory.get -> System.Func!, TPlatformView!>? +static Microsoft.Maui.Handlers.ViewHandler.PlatformViewFactory.set -> void +static Microsoft.Maui.Handlers.WebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.WebViewHandler.MapEval(Microsoft.Maui.Handlers.IWebViewHandler! handler, Microsoft.Maui.IWebView! webView, object? arg) -> void +static Microsoft.Maui.Handlers.WebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IWebViewHandler! handler, Microsoft.Maui.IWebView! webView, object? arg) -> void +static Microsoft.Maui.Handlers.WebViewHandler.MapGoBack(Microsoft.Maui.Handlers.IWebViewHandler! handler, Microsoft.Maui.IWebView! webView, object? arg) -> void +static Microsoft.Maui.Handlers.WebViewHandler.MapGoForward(Microsoft.Maui.Handlers.IWebViewHandler! handler, Microsoft.Maui.IWebView! webView, object? arg) -> void +static Microsoft.Maui.Handlers.WebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.WebViewHandler.MapReload(Microsoft.Maui.Handlers.IWebViewHandler! handler, Microsoft.Maui.IWebView! webView, object? arg) -> void +static Microsoft.Maui.Handlers.WebViewHandler.MapSource(Microsoft.Maui.Handlers.IWebViewHandler! handler, Microsoft.Maui.IWebView! webView) -> void +static Microsoft.Maui.Handlers.WindowHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.WindowHandler.MapContent(Microsoft.Maui.Handlers.IWindowHandler! handler, Microsoft.Maui.IWindow! window) -> void +static Microsoft.Maui.Handlers.WindowHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Handlers.WindowHandler.MapRequestDisplayDensity(Microsoft.Maui.Handlers.IWindowHandler! handler, Microsoft.Maui.IWindow! window, object? args) -> void +static Microsoft.Maui.Handlers.WindowHandler.MapTitle(Microsoft.Maui.Handlers.IWindowHandler! handler, Microsoft.Maui.IWindow! window) -> void +static Microsoft.Maui.Hosting.AppHostBuilderExtensions.ConfigureAnimations(this Microsoft.Maui.Hosting.MauiAppBuilder! builder) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.AppHostBuilderExtensions.ConfigureDispatching(this Microsoft.Maui.Hosting.MauiAppBuilder! builder) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.EssentialsExtensions.AddAppAction(this Microsoft.Maui.Hosting.IEssentialsBuilder! essentials, string! id, string! title, string? subtitle = null, string? icon = null) -> Microsoft.Maui.Hosting.IEssentialsBuilder! +static Microsoft.Maui.Hosting.EssentialsExtensions.ConfigureEssentials(this Microsoft.Maui.Hosting.MauiAppBuilder! builder, System.Action? configureDelegate = null) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.FontCollectionExtensions.AddEmbeddedResourceFont(this Microsoft.Maui.Hosting.IFontCollection! fontCollection, System.Reflection.Assembly! assembly, string! filename, string? alias = null) -> Microsoft.Maui.Hosting.IFontCollection! +static Microsoft.Maui.Hosting.FontCollectionExtensions.AddFont(this Microsoft.Maui.Hosting.IFontCollection! fontCollection, string! filename, string? alias = null) -> Microsoft.Maui.Hosting.IFontCollection! +static Microsoft.Maui.Hosting.FontsMauiAppBuilderExtensions.ConfigureFonts(this Microsoft.Maui.Hosting.MauiAppBuilder! builder) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.FontsMauiAppBuilderExtensions.ConfigureFonts(this Microsoft.Maui.Hosting.MauiAppBuilder! builder, System.Action? configureDelegate) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.HandlerMauiAppBuilderExtensions.ConfigureMauiHandlers(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action? configureDelegate) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Maui.Hosting.HandlerMauiAppBuilderExtensions.ConfigureMauiHandlers(this Microsoft.Maui.Hosting.MauiAppBuilder! builder, System.Action? configureDelegate) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.ImageSourceServiceCollectionExtensions.AddService(this Microsoft.Maui.Hosting.IImageSourceServiceCollection! services) -> Microsoft.Maui.Hosting.IImageSourceServiceCollection! +static Microsoft.Maui.Hosting.ImageSourceServiceCollectionExtensions.AddService(this Microsoft.Maui.Hosting.IImageSourceServiceCollection! services, System.Func!>! implementationFactory) -> Microsoft.Maui.Hosting.IImageSourceServiceCollection! +static Microsoft.Maui.Hosting.ImageSourcesMauiAppBuilderExtensions.ConfigureImageSources(this Microsoft.Maui.Hosting.MauiAppBuilder! builder) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.ImageSourcesMauiAppBuilderExtensions.ConfigureImageSources(this Microsoft.Maui.Hosting.MauiAppBuilder! builder, System.Action? configureDelegate) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.MauiApp.CreateBuilder(bool useDefaults = true) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Hosting.MauiHandlersCollectionExtensions.AddHandler(this Microsoft.Maui.Hosting.IMauiHandlersCollection! handlersCollection, System.Type! viewType, System.Type! handlerType) -> Microsoft.Maui.Hosting.IMauiHandlersCollection! +static Microsoft.Maui.Hosting.MauiHandlersCollectionExtensions.AddHandler(this Microsoft.Maui.Hosting.IMauiHandlersCollection! handlersCollection) -> Microsoft.Maui.Hosting.IMauiHandlersCollection! +static Microsoft.Maui.Hosting.MauiHandlersCollectionExtensions.TryAddHandler(this Microsoft.Maui.Hosting.IMauiHandlersCollection! handlersCollection, System.Type! viewType, System.Type! handlerType) -> Microsoft.Maui.Hosting.IMauiHandlersCollection! +static Microsoft.Maui.Hosting.MauiHandlersCollectionExtensions.TryAddHandler(this Microsoft.Maui.Hosting.IMauiHandlersCollection! handlersCollection) -> Microsoft.Maui.Hosting.IMauiHandlersCollection! +static Microsoft.Maui.HotReload.HotReloadExtensions.CheckHandlers(this Microsoft.Maui.IView? view) -> void +static Microsoft.Maui.HotReload.HotReloadExtensions.GetOnHotReloadMethods(this System.Type! type) -> System.Collections.Generic.List! +static Microsoft.Maui.HotReload.MauiHotReloadHelper.AddActiveView(Microsoft.Maui.HotReload.IHotReloadableView! view) -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.ClearCache(System.Type![]! types) -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.GetReplacedView(Microsoft.Maui.HotReload.IHotReloadableView! view) -> Microsoft.Maui.IView! +static Microsoft.Maui.HotReload.MauiHotReloadHelper.IsEnabled.get -> bool +static Microsoft.Maui.HotReload.MauiHotReloadHelper.IsEnabled.set -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.IsReplacedView(Microsoft.Maui.HotReload.IHotReloadableView! view, Microsoft.Maui.IView! newView) -> bool +static Microsoft.Maui.HotReload.MauiHotReloadHelper.Register(Microsoft.Maui.HotReload.IHotReloadableView! view, params object![]! parameters) -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.RegisterHandlers(Microsoft.Maui.Hosting.IMauiHandlersCollection! handlerService) -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.RegisterReplacedView(string! oldViewType, System.Type! newViewType) -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.Reset() -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.TriggerReload() -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.UnRegister(Microsoft.Maui.HotReload.IHotReloadableView! view) -> void +static Microsoft.Maui.HotReload.MauiHotReloadHelper.UpdateApplication(System.Type![]! types) -> void +static Microsoft.Maui.ImageSourceExtensions.GetPlatformImageAsync(this Microsoft.Maui.IImageSource? imageSource, Microsoft.Maui.IMauiContext! mauiContext) -> System.Threading.Tasks.Task?>! +static Microsoft.Maui.ImageSourceExtensions.GetPlatformImageAsync(this Microsoft.Maui.IImageSourceService! imageSourceService, Microsoft.Maui.IImageSource? imageSource, Microsoft.Maui.IMauiContext! mauiContext) -> System.Threading.Tasks.Task?>! +static Microsoft.Maui.ImageSourceExtensions.LoadImage(this Microsoft.Maui.IImageSource? source, Microsoft.Maui.IMauiContext! mauiContext, System.Action?>? finished = null) -> void +static Microsoft.Maui.ImageSourceServiceProviderExtensions.GetImageSourceService(this Microsoft.Maui.IImageSourceServiceProvider! provider, Microsoft.Maui.IImageSource! imageSource) -> Microsoft.Maui.IImageSourceService? +static Microsoft.Maui.ImageSourceServiceProviderExtensions.GetImageSourceService(this Microsoft.Maui.IImageSourceServiceProvider! provider) -> Microsoft.Maui.IImageSourceService? +static Microsoft.Maui.ImageSourceServiceProviderExtensions.GetRequiredImageSourceService(this Microsoft.Maui.IImageSourceServiceProvider! provider, Microsoft.Maui.IImageSource! imageSource) -> Microsoft.Maui.IImageSourceService! +static Microsoft.Maui.ImageSourceServiceProviderExtensions.GetRequiredImageSourceService(this Microsoft.Maui.IImageSourceServiceProvider! provider, System.Type! imageSourceType) -> Microsoft.Maui.IImageSourceService! +static Microsoft.Maui.ImageSourceServiceProviderExtensions.GetRequiredImageSourceService(this Microsoft.Maui.IImageSourceServiceProvider! provider) -> Microsoft.Maui.IImageSourceService! +static Microsoft.Maui.IPickerExtension.GetItemsAsArray(this Microsoft.Maui.IPicker! picker) -> string![]! +static Microsoft.Maui.IPickerExtension.GetItemsAsList(this Microsoft.Maui.IPicker! picker) -> System.Collections.Generic.List! +static Microsoft.Maui.ITextInputExtensions.UpdateText(this Microsoft.Maui.ITextInput! textInput, string? text) -> void +static Microsoft.Maui.IViewExtensions.GetEffectiveFlowDirection(this Microsoft.Maui.IView! view) -> Microsoft.Maui.FlowDirection +static Microsoft.Maui.Keyboard.Chat.get -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Create(Microsoft.Maui.KeyboardFlags flags) -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Default.get -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Email.get -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Numeric.get -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Plain.get -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Telephone.get -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Text.get -> Microsoft.Maui.Keyboard! +static Microsoft.Maui.Keyboard.Url.get -> Microsoft.Maui.Keyboard! +static readonly Microsoft.Maui.Layouts.FlexBasis.Auto -> Microsoft.Maui.Layouts.FlexBasis +static Microsoft.Maui.Layouts.FlexBasis.implicit operator Microsoft.Maui.Layouts.FlexBasis(float length) -> Microsoft.Maui.Layouts.FlexBasis +static Microsoft.Maui.Layouts.LayoutExtensions.AdjustForFill(this Microsoft.Maui.Graphics.Size size, Microsoft.Maui.Graphics.Rect bounds, Microsoft.Maui.IView! view) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Layouts.LayoutExtensions.ArrangeContent(this Microsoft.Maui.IContentView! contentView, Microsoft.Maui.Graphics.Rect bounds) -> void +static Microsoft.Maui.Layouts.LayoutExtensions.ComputeDesiredSize(this Microsoft.Maui.IView! view, double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Layouts.LayoutExtensions.ComputeFrame(this Microsoft.Maui.IView! view, Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Rect +static Microsoft.Maui.Layouts.LayoutExtensions.MeasureContent(this Microsoft.Maui.IContentView! contentView, double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Layouts.LayoutExtensions.MeasureContent(this Microsoft.Maui.IContentView! contentView, Microsoft.Maui.Thickness inset, double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Layouts.LayoutExtensions.ShouldArrangeLeftToRight(this Microsoft.Maui.IView! view) -> bool +static Microsoft.Maui.Layouts.LayoutManager.ResolveConstraints(double externalConstraint, double explicitLength, double measuredLength, double min = 0, double max = Infinity) -> double +static Microsoft.Maui.Layouts.StackLayoutManager.MeasureSpacing(double spacing, int childCount) -> double +static Microsoft.Maui.LifecycleEvents.LifecycleBuilderExtensions.AddEvent(this Microsoft.Maui.LifecycleEvents.ILifecycleBuilder! builder, string! eventName, System.Action! action) -> Microsoft.Maui.LifecycleEvents.ILifecycleBuilder! +static Microsoft.Maui.LifecycleEvents.LifecycleBuilderExtensions.AddEvent(this Microsoft.Maui.LifecycleEvents.ILifecycleBuilder! builder, string! eventName, TDelegate! action) -> Microsoft.Maui.LifecycleEvents.ILifecycleBuilder! +static Microsoft.Maui.LifecycleEvents.LifecycleEventServiceExtensions.InvokeEvents(this Microsoft.Maui.LifecycleEvents.ILifecycleEventService! lifecycleService, string! eventName) -> void +static Microsoft.Maui.LifecycleEvents.LifecycleEventServiceExtensions.InvokeEvents(this Microsoft.Maui.LifecycleEvents.ILifecycleEventService! lifecycleService, string! eventName, System.Action! action) -> void +static Microsoft.Maui.LifecycleEvents.MauiAppHostBuilderExtensions.ConfigureLifecycleEvents(this Microsoft.Maui.Hosting.MauiAppBuilder! builder, System.Action? configureDelegate) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Platform.ElementExtensions.SetApplicationHandler(this object! platformApplication, Microsoft.Maui.IApplication! application, Microsoft.Maui.IMauiContext! context) -> void +static Microsoft.Maui.Platform.ElementExtensions.SetWindowHandler(this object! platformWindow, Microsoft.Maui.IWindow! window, Microsoft.Maui.IMauiContext! context) -> void +static Microsoft.Maui.Platform.ElementExtensions.ToHandler(this Microsoft.Maui.IElement! view, Microsoft.Maui.IMauiContext! context) -> Microsoft.Maui.IElementHandler! +static Microsoft.Maui.Platform.ElementExtensions.ToPlatform(this Microsoft.Maui.IElement! view, Microsoft.Maui.IMauiContext! context) -> object! +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStroke(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStrokeDashOffset(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStrokeDashPattern(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStrokeLineCap(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStrokeLineJoin(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStrokeMiterLimit(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStrokeShape(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.StrokeExtensions.UpdateStrokeThickness(this object! platformView, Microsoft.Maui.IBorderStroke! border) -> void +static Microsoft.Maui.Platform.SwipeViewExtensions.GetTextColor(this Microsoft.Maui.ISwipeItemMenuItem! swipeItemMenuItem) -> Microsoft.Maui.Graphics.Color? +static Microsoft.Maui.Platform.TimeExtensions.ToFormattedString(this Microsoft.Maui.ITimePicker! timePicker) -> string! +static Microsoft.Maui.Platform.TimeExtensions.ToFormattedString(this System.TimeSpan time, string! format, System.Globalization.CultureInfo? cultureInfo = null) -> string! +static Microsoft.Maui.Platform.ViewExtensions.Focus(this object! platformView, Microsoft.Maui.FocusRequest! request) -> void +static Microsoft.Maui.Platform.ViewExtensions.InvalidateMeasure(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.ToHandler(this Microsoft.Maui.IView! view, Microsoft.Maui.IMauiContext! context) -> Microsoft.Maui.IViewHandler! +static Microsoft.Maui.Platform.ViewExtensions.Unfocus(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateAnchorX(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateAnchorY(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateAutomationId(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateBackground(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateBackgroundImageSourceAsync(this object! platformView, Microsoft.Maui.IImageSource? imageSource, Microsoft.Maui.IImageSourceServiceProvider? provider) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Platform.ViewExtensions.UpdateBorder(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateClip(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateClipsToBounds(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateFlowDirection(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateHeight(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateInputTransparent(this object! nativeView, Microsoft.Maui.IViewHandler! handler, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateIsEnabled(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateMaximumHeight(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateMaximumWidth(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateMinimumHeight(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateMinimumWidth(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateOpacity(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateRotation(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateRotationX(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateRotationY(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateScale(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateSemantics(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateShadow(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateTranslationX(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateTranslationY(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateVisibility(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Platform.ViewExtensions.UpdateWidth(this object! platformView, Microsoft.Maui.IView! view) -> void +static Microsoft.Maui.Primitives.Dimension.IsExplicitSet(double value) -> bool +static Microsoft.Maui.Primitives.Dimension.IsMaximumSet(double value) -> bool +static Microsoft.Maui.Primitives.Dimension.IsMinimumSet(double value) -> bool +static Microsoft.Maui.Primitives.Dimension.ResolveMinimum(double value) -> double +static Microsoft.Maui.PropertyMapperExtensions.AppendToMapping(this Microsoft.Maui.IPropertyMapper! propertyMapper, string! key, System.Action! method) -> void +static Microsoft.Maui.PropertyMapperExtensions.ModifyMapping(this Microsoft.Maui.IPropertyMapper! propertyMapper, string! key, System.Action?>! method) -> void +static Microsoft.Maui.PropertyMapperExtensions.PrependToMapping(this Microsoft.Maui.IPropertyMapper! propertyMapper, string! key, System.Action! method) -> void +static Microsoft.Maui.SemanticExtensions.SetSemanticFocus(this Microsoft.Maui.IView! element) -> void +static Microsoft.Maui.SizeRequest.implicit operator Microsoft.Maui.Graphics.Size(Microsoft.Maui.SizeRequest size) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.SizeRequest.implicit operator Microsoft.Maui.SizeRequest(Microsoft.Maui.Graphics.Size size) -> Microsoft.Maui.SizeRequest +static Microsoft.Maui.Thickness.implicit operator Microsoft.Maui.Thickness(double uniformSize) -> Microsoft.Maui.Thickness +static Microsoft.Maui.Thickness.implicit operator Microsoft.Maui.Thickness(Microsoft.Maui.Graphics.Size size) -> Microsoft.Maui.Thickness +static Microsoft.Maui.Thickness.operator !=(Microsoft.Maui.Thickness left, Microsoft.Maui.Thickness right) -> bool +static Microsoft.Maui.Thickness.operator +(Microsoft.Maui.Thickness left, double addend) -> Microsoft.Maui.Thickness +static Microsoft.Maui.Thickness.operator +(Microsoft.Maui.Thickness left, Microsoft.Maui.Thickness right) -> Microsoft.Maui.Thickness +static Microsoft.Maui.Thickness.operator -(Microsoft.Maui.Thickness left, double addend) -> Microsoft.Maui.Thickness +static Microsoft.Maui.Thickness.operator ==(Microsoft.Maui.Thickness left, Microsoft.Maui.Thickness right) -> bool +static Microsoft.Maui.Thickness.Zero -> Microsoft.Maui.Thickness +static Microsoft.Maui.ViewExtensions.CaptureAsync(this Microsoft.Maui.IView! view) -> System.Threading.Tasks.Task! +static Microsoft.Maui.VisualDiagnostics.CaptureAsJpegAsync(Microsoft.Maui.IView! view, int quality = 80) -> System.Threading.Tasks.Task! +static Microsoft.Maui.VisualDiagnostics.CaptureAsJpegAsync(Microsoft.Maui.IWindow! window, int quality = 80) -> System.Threading.Tasks.Task! +static Microsoft.Maui.VisualDiagnostics.CaptureAsPngAsync(Microsoft.Maui.IView! view) -> System.Threading.Tasks.Task! +static Microsoft.Maui.VisualDiagnostics.CaptureAsPngAsync(Microsoft.Maui.IWindow! window) -> System.Threading.Tasks.Task! +static Microsoft.Maui.VisualDiagnostics.GetSourceInfo(object! obj) -> Microsoft.Maui.SourceInfo? +static Microsoft.Maui.VisualDiagnostics.OnChildAdded(Microsoft.Maui.IVisualTreeElement! parent, Microsoft.Maui.IVisualTreeElement! child) -> void +static Microsoft.Maui.VisualDiagnostics.OnChildAdded(Microsoft.Maui.IVisualTreeElement? parent, Microsoft.Maui.IVisualTreeElement! child, int newLogicalIndex) -> void +static Microsoft.Maui.VisualDiagnostics.OnChildRemoved(Microsoft.Maui.IVisualTreeElement! parent, Microsoft.Maui.IVisualTreeElement! child, int oldLogicalIndex) -> void +static Microsoft.Maui.VisualDiagnostics.RegisterSourceInfo(object! target, System.Uri! uri, int lineNumber, int linePosition) -> void +static Microsoft.Maui.VisualDiagnostics.VisualTreeChanged -> System.EventHandler? +static Microsoft.Maui.VisualTreeElementExtensions.GetVisualElementWindow(this Microsoft.Maui.IVisualTreeElement! element) -> Microsoft.Maui.IWindow? +static Microsoft.Maui.VisualTreeElementExtensions.GetVisualTreeDescendants(this Microsoft.Maui.IVisualTreeElement! visualElement) -> System.Collections.Generic.IReadOnlyList! +static Microsoft.Maui.VisualTreeElementExtensions.GetVisualTreeElements(this Microsoft.Maui.IVisualTreeElement! visualElement, double x, double y) -> System.Collections.Generic.IReadOnlyList! +static Microsoft.Maui.VisualTreeElementExtensions.GetVisualTreeElements(this Microsoft.Maui.IVisualTreeElement! visualElement, double x1, double y1, double x2, double y2) -> System.Collections.Generic.IReadOnlyList! +static Microsoft.Maui.VisualTreeElementExtensions.GetVisualTreeElements(this Microsoft.Maui.IVisualTreeElement! visualElement, Microsoft.Maui.Graphics.Point point) -> System.Collections.Generic.IReadOnlyList! +static Microsoft.Maui.VisualTreeElementExtensions.GetVisualTreeElements(this Microsoft.Maui.IVisualTreeElement! visualElement, Microsoft.Maui.Graphics.Rect rectangle) -> System.Collections.Generic.IReadOnlyList! +static Microsoft.Maui.WindowExtensions.CaptureAsync(this Microsoft.Maui.IWindow! window) -> System.Threading.Tasks.Task! +static readonly Microsoft.Maui.Animations.Lerp.Lerps -> System.Collections.Generic.Dictionary! +static readonly Microsoft.Maui.Easing.BounceIn -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.BounceOut -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.CubicIn -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.CubicInOut -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.CubicOut -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.Linear -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.SinIn -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.SinInOut -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.SinOut -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.SpringIn -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.Easing.SpringOut -> Microsoft.Maui.Easing! +static readonly Microsoft.Maui.FontFile.Extensions -> string![]! +static readonly Microsoft.Maui.GridLength.Auto -> Microsoft.Maui.GridLength +static readonly Microsoft.Maui.GridLength.Star -> Microsoft.Maui.GridLength +virtual Microsoft.Maui.Animations.Animation.CreateReverse() -> Microsoft.Maui.Animations.Animation! +virtual Microsoft.Maui.Animations.Animation.Dispose(bool disposing) -> void +virtual Microsoft.Maui.Animations.Animation.OnTick(double millisecondsSinceLastUpdate) -> void +virtual Microsoft.Maui.Animations.Animation.Reset() -> void +virtual Microsoft.Maui.Animations.Animation.Update(double percent) -> void +virtual Microsoft.Maui.Animations.AnimationManager.Dispose(bool disposing) -> void +virtual Microsoft.Maui.Animations.Ticker.IsRunning.get -> bool +virtual Microsoft.Maui.Animations.Ticker.MaxFps.get -> int +virtual Microsoft.Maui.Animations.Ticker.MaxFps.set -> void +virtual Microsoft.Maui.Animations.Ticker.Start() -> void +virtual Microsoft.Maui.Animations.Ticker.Stop() -> void +virtual Microsoft.Maui.Animations.Ticker.SystemEnabled.get -> bool +virtual Microsoft.Maui.CommandMapper.GetCommand(string! key) -> System.Action? +virtual Microsoft.Maui.Handlers.ElementHandler.Invoke(string! command, object? args) -> void +virtual Microsoft.Maui.Handlers.ElementHandler.SetMauiContext(Microsoft.Maui.IMauiContext! mauiContext) -> void +virtual Microsoft.Maui.Handlers.ElementHandler.SetVirtualView(Microsoft.Maui.IElement! view) -> void +virtual Microsoft.Maui.Handlers.ElementHandler.UpdateValue(string! property) -> void +virtual Microsoft.Maui.Handlers.ElementHandler.ConnectHandler(TPlatformView! platformView) -> void +virtual Microsoft.Maui.Handlers.ElementHandler.DisconnectHandler(TPlatformView! platformView) -> void +virtual Microsoft.Maui.Handlers.ViewHandler.NeedsContainer.get -> bool +virtual Microsoft.Maui.Handlers.ViewHandler.ConnectHandler(TPlatformView! platformView) -> void +virtual Microsoft.Maui.Handlers.ViewHandler.DisconnectHandler(TPlatformView! platformView) -> void +virtual Microsoft.Maui.Handlers.ViewHandler.SetVirtualView(Microsoft.Maui.IView! view) -> void +virtual Microsoft.Maui.PropertyMapper.ClearKeyCache() -> void +virtual Microsoft.Maui.PropertyMapper.GetKeys() -> System.Collections.Generic.IEnumerable! +virtual Microsoft.Maui.PropertyMapper.GetProperty(string! key) -> System.Action? +virtual Microsoft.Maui.PropertyMapper.SetPropertyCore(string! key, System.Action! action) -> void +virtual Microsoft.Maui.PropertyMapper.UpdateKeys.get -> System.Collections.Generic.IReadOnlyCollection! +virtual Microsoft.Maui.PropertyMapper.UpdatePropertyCore(string! key, Microsoft.Maui.IElementHandler! viewHandler, Microsoft.Maui.IElement! virtualView) -> void +virtual Microsoft.Maui.RectangleAdorner.Contains(Microsoft.Maui.Graphics.Point point) -> bool +virtual Microsoft.Maui.RectangleAdorner.Draw(Microsoft.Maui.Graphics.ICanvas! canvas, Microsoft.Maui.Graphics.RectF dirtyRect) -> void +virtual Microsoft.Maui.WindowOverlay.AddWindowElement(Microsoft.Maui.IWindowOverlayElement! drawable) -> bool +virtual Microsoft.Maui.WindowOverlay.Deinitialize() -> bool +virtual Microsoft.Maui.WindowOverlay.HandleUIChange() -> void +virtual Microsoft.Maui.WindowOverlay.Initialize() -> bool +virtual Microsoft.Maui.WindowOverlay.RemoveWindowElement(Microsoft.Maui.IWindowOverlayElement! drawable) -> bool +virtual Microsoft.Maui.WindowOverlay.RemoveWindowElements() -> void +~override Microsoft.Maui.Converters.EasingTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.EasingTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.EasingTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.EasingTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.EasingTypeConverter.GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) -> System.ComponentModel.TypeConverter.StandardValuesCollection +~override Microsoft.Maui.Converters.EasingTypeConverter.GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Converters.EasingTypeConverter.GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Converters.FlexAlignContentTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.FlexAlignContentTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.FlexAlignContentTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.FlexAlignContentTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.FlexAlignItemsTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.FlexAlignItemsTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.FlexAlignItemsTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.FlexAlignItemsTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.FlexAlignSelfTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.FlexAlignSelfTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.FlexAlignSelfTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.FlexAlignSelfTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.FlexBasisTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.FlexBasisTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.FlexBasisTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.FlexBasisTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.FlexDirectionTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.FlexDirectionTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.FlexDirectionTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.FlexDirectionTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.FlexJustifyTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.FlexJustifyTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.FlexJustifyTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.FlexJustifyTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.FlexWrapTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.FlexWrapTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.FlexWrapTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.FlexWrapTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Converters.ThicknessTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Converters.ThicknessTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Converters.ThicknessTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Converters.ThicknessTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object diff --git a/src/Core/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..3f3cd2bfa0a0 --- /dev/null +++ b/src/Core/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1,11 @@ +#nullable enable +Microsoft.Maui.Handlers.IMenuFlyoutSeparatorHandler +Microsoft.Maui.Handlers.IMenuFlyoutSeparatorHandler.PlatformView.get -> object! +Microsoft.Maui.Handlers.IMenuFlyoutSeparatorHandler.VirtualView.get -> Microsoft.Maui.IMenuFlyoutSeparator! +Microsoft.Maui.Handlers.MenuFlyoutSeparatorHandler +Microsoft.Maui.Handlers.MenuFlyoutSeparatorHandler.MenuFlyoutSeparatorHandler() -> void +Microsoft.Maui.Handlers.MenuFlyoutSeparatorHandler.MenuFlyoutSeparatorHandler(Microsoft.Maui.IPropertyMapper! mapper, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.IMenuFlyoutSeparator +override Microsoft.Maui.Handlers.MenuFlyoutSeparatorHandler.CreatePlatformElement() -> object! +static Microsoft.Maui.Handlers.MenuFlyoutSeparatorHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Handlers.MenuFlyoutSeparatorHandler.Mapper -> Microsoft.Maui.IPropertyMapper! diff --git a/src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..d189a5cc7fb5 --- /dev/null +++ b/src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1,1187 @@ +#nullable enable +abstract Microsoft.Maui.ApplicationModel.Permissions.BasePermission.EnsureDeclared() -> void +abstract Microsoft.Maui.ApplicationModel.Permissions.BasePermission.ShouldShowRationale() -> bool +Microsoft.Maui.Accessibility.ISemanticScreenReader +Microsoft.Maui.Accessibility.ISemanticScreenReader.Announce(string! text) -> void +Microsoft.Maui.Accessibility.SemanticScreenReader +Microsoft.Maui.ApplicationModel.AppAction +Microsoft.Maui.ApplicationModel.AppAction.AppAction(string! id, string! title, string? subtitle = null, string? icon = null) -> void +Microsoft.Maui.ApplicationModel.AppAction.Id.get -> string! +Microsoft.Maui.ApplicationModel.AppAction.Id.set -> void +Microsoft.Maui.ApplicationModel.AppAction.Subtitle.get -> string? +Microsoft.Maui.ApplicationModel.AppAction.Subtitle.set -> void +Microsoft.Maui.ApplicationModel.AppAction.Title.get -> string! +Microsoft.Maui.ApplicationModel.AppAction.Title.set -> void +Microsoft.Maui.ApplicationModel.AppActionEventArgs +Microsoft.Maui.ApplicationModel.AppActionEventArgs.AppAction.get -> Microsoft.Maui.ApplicationModel.AppAction! +Microsoft.Maui.ApplicationModel.AppActionEventArgs.AppActionEventArgs(Microsoft.Maui.ApplicationModel.AppAction! appAction) -> void +Microsoft.Maui.ApplicationModel.AppActions +Microsoft.Maui.ApplicationModel.AppActionsExtensions +Microsoft.Maui.ApplicationModel.AppInfo +Microsoft.Maui.ApplicationModel.AppPackagingModel +Microsoft.Maui.ApplicationModel.AppPackagingModel.Packaged = 0 -> Microsoft.Maui.ApplicationModel.AppPackagingModel +Microsoft.Maui.ApplicationModel.AppPackagingModel.Unpackaged = 1 -> Microsoft.Maui.ApplicationModel.AppPackagingModel +Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.ApplicationModel.AppTheme.Dark = 2 -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.ApplicationModel.AppTheme.Light = 1 -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.ApplicationModel.AppTheme.Unspecified = 0 -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.ApplicationModel.Browser +Microsoft.Maui.ApplicationModel.BrowserExtensions +Microsoft.Maui.ApplicationModel.BrowserLaunchFlags +Microsoft.Maui.ApplicationModel.BrowserLaunchFlags.LaunchAdjacent = 1 -> Microsoft.Maui.ApplicationModel.BrowserLaunchFlags +Microsoft.Maui.ApplicationModel.BrowserLaunchFlags.None = 0 -> Microsoft.Maui.ApplicationModel.BrowserLaunchFlags +Microsoft.Maui.ApplicationModel.BrowserLaunchFlags.PresentAsFormSheet = 4 -> Microsoft.Maui.ApplicationModel.BrowserLaunchFlags +Microsoft.Maui.ApplicationModel.BrowserLaunchFlags.PresentAsPageSheet = 2 -> Microsoft.Maui.ApplicationModel.BrowserLaunchFlags +Microsoft.Maui.ApplicationModel.BrowserLaunchMode +Microsoft.Maui.ApplicationModel.BrowserLaunchMode.External = 1 -> Microsoft.Maui.ApplicationModel.BrowserLaunchMode +Microsoft.Maui.ApplicationModel.BrowserLaunchMode.SystemPreferred = 0 -> Microsoft.Maui.ApplicationModel.BrowserLaunchMode +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.BrowserLaunchOptions() -> void +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.Flags.get -> Microsoft.Maui.ApplicationModel.BrowserLaunchFlags +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.Flags.set -> void +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.LaunchMode.get -> Microsoft.Maui.ApplicationModel.BrowserLaunchMode +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.LaunchMode.set -> void +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.PreferredControlColor.get -> Microsoft.Maui.Graphics.Color? +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.PreferredControlColor.set -> void +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.PreferredToolbarColor.get -> Microsoft.Maui.Graphics.Color? +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.PreferredToolbarColor.set -> void +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.TitleMode.get -> Microsoft.Maui.ApplicationModel.BrowserTitleMode +Microsoft.Maui.ApplicationModel.BrowserLaunchOptions.TitleMode.set -> void +Microsoft.Maui.ApplicationModel.BrowserTitleMode +Microsoft.Maui.ApplicationModel.BrowserTitleMode.Default = 0 -> Microsoft.Maui.ApplicationModel.BrowserTitleMode +Microsoft.Maui.ApplicationModel.BrowserTitleMode.Hide = 2 -> Microsoft.Maui.ApplicationModel.BrowserTitleMode +Microsoft.Maui.ApplicationModel.BrowserTitleMode.Show = 1 -> Microsoft.Maui.ApplicationModel.BrowserTitleMode +Microsoft.Maui.ApplicationModel.Communication.Contact +Microsoft.Maui.ApplicationModel.Communication.Contact.Contact() -> void +Microsoft.Maui.ApplicationModel.Communication.ContactEmail +Microsoft.Maui.ApplicationModel.Communication.ContactEmail.ContactEmail() -> void +Microsoft.Maui.ApplicationModel.Communication.ContactPhone +Microsoft.Maui.ApplicationModel.Communication.ContactPhone.ContactPhone() -> void +Microsoft.Maui.ApplicationModel.Communication.Contacts +Microsoft.Maui.ApplicationModel.Communication.Email +Microsoft.Maui.ApplicationModel.Communication.EmailAttachment +Microsoft.Maui.ApplicationModel.Communication.EmailAttachment.EmailAttachment(Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.ApplicationModel.Communication.EmailAttachment.EmailAttachment(string! fullPath) -> void +Microsoft.Maui.ApplicationModel.Communication.EmailAttachment.EmailAttachment(string! fullPath, string! contentType) -> void +Microsoft.Maui.ApplicationModel.Communication.EmailBodyFormat +Microsoft.Maui.ApplicationModel.Communication.EmailBodyFormat.Html = 1 -> Microsoft.Maui.ApplicationModel.Communication.EmailBodyFormat +Microsoft.Maui.ApplicationModel.Communication.EmailBodyFormat.PlainText = 0 -> Microsoft.Maui.ApplicationModel.Communication.EmailBodyFormat +Microsoft.Maui.ApplicationModel.Communication.EmailExtensions +Microsoft.Maui.ApplicationModel.Communication.EmailMessage +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Attachments.get -> System.Collections.Generic.List? +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Attachments.set -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Bcc.get -> System.Collections.Generic.List? +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Bcc.set -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Body.get -> string? +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Body.set -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.BodyFormat.get -> Microsoft.Maui.ApplicationModel.Communication.EmailBodyFormat +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.BodyFormat.set -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Cc.get -> System.Collections.Generic.List? +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Cc.set -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.EmailMessage() -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.EmailMessage(string! subject, string! body, params string![]! to) -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Subject.get -> string? +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.Subject.set -> void +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.To.get -> System.Collections.Generic.List? +Microsoft.Maui.ApplicationModel.Communication.EmailMessage.To.set -> void +Microsoft.Maui.ApplicationModel.Communication.IContacts +Microsoft.Maui.ApplicationModel.Communication.IContacts.GetAllAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Microsoft.Maui.ApplicationModel.Communication.IContacts.PickContactAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.Communication.IEmail +Microsoft.Maui.ApplicationModel.Communication.IEmail.ComposeAsync(Microsoft.Maui.ApplicationModel.Communication.EmailMessage? message) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.Communication.IEmail.IsComposeSupported.get -> bool +Microsoft.Maui.ApplicationModel.Communication.IPhoneDialer +Microsoft.Maui.ApplicationModel.Communication.IPhoneDialer.IsSupported.get -> bool +Microsoft.Maui.ApplicationModel.Communication.IPhoneDialer.Open(string! number) -> void +Microsoft.Maui.ApplicationModel.Communication.ISms +Microsoft.Maui.ApplicationModel.Communication.ISms.ComposeAsync(Microsoft.Maui.ApplicationModel.Communication.SmsMessage? message) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.Communication.ISms.IsComposeSupported.get -> bool +Microsoft.Maui.ApplicationModel.Communication.PhoneDialer +Microsoft.Maui.ApplicationModel.Communication.Sms +Microsoft.Maui.ApplicationModel.Communication.SmsMessage +Microsoft.Maui.ApplicationModel.Communication.SmsMessage.Body.get -> string? +Microsoft.Maui.ApplicationModel.Communication.SmsMessage.Body.set -> void +Microsoft.Maui.ApplicationModel.Communication.SmsMessage.Recipients.get -> System.Collections.Generic.List! +Microsoft.Maui.ApplicationModel.Communication.SmsMessage.Recipients.set -> void +Microsoft.Maui.ApplicationModel.Communication.SmsMessage.SmsMessage() -> void +Microsoft.Maui.ApplicationModel.Communication.SmsMessage.SmsMessage(string! body, string? recipient) -> void +Microsoft.Maui.ApplicationModel.Communication.SmsMessage.SmsMessage(string! body, System.Collections.Generic.IEnumerable? recipients) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.Clipboard +Microsoft.Maui.ApplicationModel.DataTransfer.IClipboard +Microsoft.Maui.ApplicationModel.DataTransfer.IClipboard.ClipboardContentChanged -> System.EventHandler! +Microsoft.Maui.ApplicationModel.DataTransfer.IClipboard.GetTextAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.DataTransfer.IClipboard.HasText.get -> bool +Microsoft.Maui.ApplicationModel.DataTransfer.IClipboard.SetTextAsync(string? text) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.DataTransfer.IShare +Microsoft.Maui.ApplicationModel.DataTransfer.IShare.RequestAsync(Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest! request) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.DataTransfer.IShare.RequestAsync(Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest! request) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.DataTransfer.IShare.RequestAsync(Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest! request) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.DataTransfer.Share +Microsoft.Maui.ApplicationModel.DataTransfer.ShareExtensions +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFile +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFile.ShareFile(Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFile.ShareFile(string! fullPath) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFile.ShareFile(string! fullPath, string! contentType) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest.File.get -> Microsoft.Maui.ApplicationModel.DataTransfer.ShareFile? +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest.File.set -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest.ShareFileRequest() -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest.ShareFileRequest(Microsoft.Maui.ApplicationModel.DataTransfer.ShareFile! file) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest.ShareFileRequest(Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest.ShareFileRequest(string! title, Microsoft.Maui.ApplicationModel.DataTransfer.ShareFile! file) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest.ShareFileRequest(string! title, Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.Files.get -> System.Collections.Generic.List? +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.Files.set -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.ShareMultipleFilesRequest() -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.ShareMultipleFilesRequest(string! title, System.Collections.Generic.IEnumerable! files) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.ShareMultipleFilesRequest(string! title, System.Collections.Generic.IEnumerable! files) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.ShareMultipleFilesRequest(System.Collections.Generic.IEnumerable! files) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.ShareMultipleFilesRequest(System.Collections.Generic.IEnumerable! files) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareRequestBase +Microsoft.Maui.ApplicationModel.DataTransfer.ShareRequestBase.PresentationSourceBounds.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.ApplicationModel.DataTransfer.ShareRequestBase.PresentationSourceBounds.set -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareRequestBase.ShareRequestBase() -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareRequestBase.Title.get -> string? +Microsoft.Maui.ApplicationModel.DataTransfer.ShareRequestBase.Title.set -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.ShareTextRequest() -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.ShareTextRequest(string! text) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.ShareTextRequest(string! text, string! title) -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.Subject.get -> string? +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.Subject.set -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.Text.get -> string? +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.Text.set -> void +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.Uri.get -> string? +Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest.Uri.set -> void +Microsoft.Maui.ApplicationModel.FeatureNotEnabledException +Microsoft.Maui.ApplicationModel.FeatureNotEnabledException.FeatureNotEnabledException() -> void +Microsoft.Maui.ApplicationModel.FeatureNotSupportedException +Microsoft.Maui.ApplicationModel.FeatureNotSupportedException.FeatureNotSupportedException() -> void +Microsoft.Maui.ApplicationModel.IAppActions +Microsoft.Maui.ApplicationModel.IAppActions.AppActionActivated -> System.EventHandler? +Microsoft.Maui.ApplicationModel.IAppActions.GetAsync() -> System.Threading.Tasks.Task!>! +Microsoft.Maui.ApplicationModel.IAppActions.IsSupported.get -> bool +Microsoft.Maui.ApplicationModel.IAppActions.SetAsync(System.Collections.Generic.IEnumerable! actions) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.IAppInfo +Microsoft.Maui.ApplicationModel.IAppInfo.BuildString.get -> string! +Microsoft.Maui.ApplicationModel.IAppInfo.Name.get -> string! +Microsoft.Maui.ApplicationModel.IAppInfo.PackageName.get -> string! +Microsoft.Maui.ApplicationModel.IAppInfo.PackagingModel.get -> Microsoft.Maui.ApplicationModel.AppPackagingModel +Microsoft.Maui.ApplicationModel.IAppInfo.RequestedLayoutDirection.get -> Microsoft.Maui.ApplicationModel.LayoutDirection +Microsoft.Maui.ApplicationModel.IAppInfo.RequestedTheme.get -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.ApplicationModel.IAppInfo.ShowSettingsUI() -> void +Microsoft.Maui.ApplicationModel.IAppInfo.Version.get -> System.Version! +Microsoft.Maui.ApplicationModel.IAppInfo.VersionString.get -> string! +Microsoft.Maui.ApplicationModel.IBrowser +Microsoft.Maui.ApplicationModel.IBrowser.OpenAsync(System.Uri! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchOptions! options) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.ILauncher +Microsoft.Maui.ApplicationModel.ILauncher.CanOpenAsync(System.Uri! uri) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.ILauncher.OpenAsync(Microsoft.Maui.ApplicationModel.OpenFileRequest! request) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.ILauncher.OpenAsync(System.Uri! uri) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.ILauncher.TryOpenAsync(System.Uri! uri) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.IMap +Microsoft.Maui.ApplicationModel.IMap.OpenAsync(double latitude, double longitude, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.IMap.OpenAsync(Microsoft.Maui.Devices.Sensors.Placemark! placemark, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.IMap.TryOpenAsync(double latitude, double longitude, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.IMap.TryOpenAsync(Microsoft.Maui.Devices.Sensors.Placemark! placemark, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +Microsoft.Maui.ApplicationModel.IPlatformAppActions +Microsoft.Maui.ApplicationModel.IVersionTracking +Microsoft.Maui.ApplicationModel.IVersionTracking.BuildHistory.get -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.ApplicationModel.IVersionTracking.CurrentBuild.get -> string! +Microsoft.Maui.ApplicationModel.IVersionTracking.CurrentVersion.get -> string! +Microsoft.Maui.ApplicationModel.IVersionTracking.FirstInstalledBuild.get -> string? +Microsoft.Maui.ApplicationModel.IVersionTracking.FirstInstalledVersion.get -> string? +Microsoft.Maui.ApplicationModel.IVersionTracking.IsFirstLaunchEver.get -> bool +Microsoft.Maui.ApplicationModel.IVersionTracking.IsFirstLaunchForBuild(string! build) -> bool +Microsoft.Maui.ApplicationModel.IVersionTracking.IsFirstLaunchForCurrentBuild.get -> bool +Microsoft.Maui.ApplicationModel.IVersionTracking.IsFirstLaunchForCurrentVersion.get -> bool +Microsoft.Maui.ApplicationModel.IVersionTracking.IsFirstLaunchForVersion(string! version) -> bool +Microsoft.Maui.ApplicationModel.IVersionTracking.PreviousBuild.get -> string? +Microsoft.Maui.ApplicationModel.IVersionTracking.PreviousVersion.get -> string? +Microsoft.Maui.ApplicationModel.IVersionTracking.Track() -> void +Microsoft.Maui.ApplicationModel.IVersionTracking.VersionHistory.get -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.ApplicationModel.Launcher +Microsoft.Maui.ApplicationModel.LauncherExtensions +Microsoft.Maui.ApplicationModel.LayoutDirection +Microsoft.Maui.ApplicationModel.LayoutDirection.LeftToRight = 1 -> Microsoft.Maui.ApplicationModel.LayoutDirection +Microsoft.Maui.ApplicationModel.LayoutDirection.RightToLeft = 2 -> Microsoft.Maui.ApplicationModel.LayoutDirection +Microsoft.Maui.ApplicationModel.LayoutDirection.Unknown = 0 -> Microsoft.Maui.ApplicationModel.LayoutDirection +Microsoft.Maui.ApplicationModel.MainThread +Microsoft.Maui.ApplicationModel.Map +Microsoft.Maui.ApplicationModel.MapExtensions +Microsoft.Maui.ApplicationModel.MapLaunchOptions +Microsoft.Maui.ApplicationModel.MapLaunchOptions.MapLaunchOptions() -> void +Microsoft.Maui.ApplicationModel.MapLaunchOptions.NavigationMode.get -> Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.MapLaunchOptions.NavigationMode.set -> void +Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.NavigationMode.Bicycling = 2 -> Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.NavigationMode.Default = 1 -> Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.NavigationMode.Driving = 3 -> Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.NavigationMode.None = 0 -> Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.NavigationMode.Transit = 4 -> Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.NavigationMode.Walking = 5 -> Microsoft.Maui.ApplicationModel.NavigationMode +Microsoft.Maui.ApplicationModel.OpenFileRequest +Microsoft.Maui.ApplicationModel.OpenFileRequest.File.get -> Microsoft.Maui.Storage.ReadOnlyFile? +Microsoft.Maui.ApplicationModel.OpenFileRequest.File.set -> void +Microsoft.Maui.ApplicationModel.OpenFileRequest.OpenFileRequest() -> void +Microsoft.Maui.ApplicationModel.OpenFileRequest.OpenFileRequest(string! title, Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.ApplicationModel.OpenFileRequest.OpenFileRequest(string! title, Microsoft.Maui.Storage.ReadOnlyFile! file) -> void +Microsoft.Maui.ApplicationModel.OpenFileRequest.PresentationSourceBounds.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.ApplicationModel.OpenFileRequest.PresentationSourceBounds.set -> void +Microsoft.Maui.ApplicationModel.OpenFileRequest.Title.get -> string? +Microsoft.Maui.ApplicationModel.OpenFileRequest.Title.set -> void +Microsoft.Maui.ApplicationModel.PermissionException +Microsoft.Maui.ApplicationModel.Permissions +Microsoft.Maui.ApplicationModel.Permissions.BasePermission +Microsoft.Maui.ApplicationModel.Permissions.BasePermission.BasePermission() -> void +Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission +Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission.BasePlatformPermission() -> void +Microsoft.Maui.ApplicationModel.Permissions.Battery +Microsoft.Maui.ApplicationModel.Permissions.Battery.Battery() -> void +Microsoft.Maui.ApplicationModel.Permissions.CalendarRead +Microsoft.Maui.ApplicationModel.Permissions.CalendarRead.CalendarRead() -> void +Microsoft.Maui.ApplicationModel.Permissions.CalendarWrite +Microsoft.Maui.ApplicationModel.Permissions.CalendarWrite.CalendarWrite() -> void +Microsoft.Maui.ApplicationModel.Permissions.Camera +Microsoft.Maui.ApplicationModel.Permissions.Camera.Camera() -> void +Microsoft.Maui.ApplicationModel.Permissions.ContactsRead +Microsoft.Maui.ApplicationModel.Permissions.ContactsRead.ContactsRead() -> void +Microsoft.Maui.ApplicationModel.Permissions.ContactsWrite +Microsoft.Maui.ApplicationModel.Permissions.ContactsWrite.ContactsWrite() -> void +Microsoft.Maui.ApplicationModel.Permissions.Flashlight +Microsoft.Maui.ApplicationModel.Permissions.Flashlight.Flashlight() -> void +Microsoft.Maui.ApplicationModel.Permissions.LaunchApp +Microsoft.Maui.ApplicationModel.Permissions.LaunchApp.LaunchApp() -> void +Microsoft.Maui.ApplicationModel.Permissions.LocationAlways +Microsoft.Maui.ApplicationModel.Permissions.LocationAlways.LocationAlways() -> void +Microsoft.Maui.ApplicationModel.Permissions.LocationWhenInUse +Microsoft.Maui.ApplicationModel.Permissions.LocationWhenInUse.LocationWhenInUse() -> void +Microsoft.Maui.ApplicationModel.Permissions.Maps +Microsoft.Maui.ApplicationModel.Permissions.Maps.Maps() -> void +Microsoft.Maui.ApplicationModel.Permissions.Media +Microsoft.Maui.ApplicationModel.Permissions.Media.Media() -> void +Microsoft.Maui.ApplicationModel.Permissions.Microphone +Microsoft.Maui.ApplicationModel.Permissions.Microphone.Microphone() -> void +Microsoft.Maui.ApplicationModel.Permissions.NetworkState +Microsoft.Maui.ApplicationModel.Permissions.NetworkState.NetworkState() -> void +Microsoft.Maui.ApplicationModel.Permissions.Phone +Microsoft.Maui.ApplicationModel.Permissions.Phone.Phone() -> void +Microsoft.Maui.ApplicationModel.Permissions.Photos +Microsoft.Maui.ApplicationModel.Permissions.Photos.Photos() -> void +Microsoft.Maui.ApplicationModel.Permissions.PhotosAddOnly +Microsoft.Maui.ApplicationModel.Permissions.PhotosAddOnly.PhotosAddOnly() -> void +Microsoft.Maui.ApplicationModel.Permissions.Reminders +Microsoft.Maui.ApplicationModel.Permissions.Reminders.Reminders() -> void +Microsoft.Maui.ApplicationModel.Permissions.Sensors +Microsoft.Maui.ApplicationModel.Permissions.Sensors.Sensors() -> void +Microsoft.Maui.ApplicationModel.Permissions.Sms +Microsoft.Maui.ApplicationModel.Permissions.Sms.Sms() -> void +Microsoft.Maui.ApplicationModel.Permissions.Speech +Microsoft.Maui.ApplicationModel.Permissions.Speech.Speech() -> void +Microsoft.Maui.ApplicationModel.Permissions.StorageRead +Microsoft.Maui.ApplicationModel.Permissions.StorageRead.StorageRead() -> void +Microsoft.Maui.ApplicationModel.Permissions.StorageWrite +Microsoft.Maui.ApplicationModel.Permissions.StorageWrite.StorageWrite() -> void +Microsoft.Maui.ApplicationModel.Permissions.Vibrate +Microsoft.Maui.ApplicationModel.Permissions.Vibrate.Vibrate() -> void +Microsoft.Maui.ApplicationModel.PermissionStatus +Microsoft.Maui.ApplicationModel.PermissionStatus.Denied = 1 -> Microsoft.Maui.ApplicationModel.PermissionStatus +Microsoft.Maui.ApplicationModel.PermissionStatus.Disabled = 2 -> Microsoft.Maui.ApplicationModel.PermissionStatus +Microsoft.Maui.ApplicationModel.PermissionStatus.Granted = 3 -> Microsoft.Maui.ApplicationModel.PermissionStatus +Microsoft.Maui.ApplicationModel.PermissionStatus.Limited = 5 -> Microsoft.Maui.ApplicationModel.PermissionStatus +Microsoft.Maui.ApplicationModel.PermissionStatus.Restricted = 4 -> Microsoft.Maui.ApplicationModel.PermissionStatus +Microsoft.Maui.ApplicationModel.PermissionStatus.Unknown = 0 -> Microsoft.Maui.ApplicationModel.PermissionStatus +Microsoft.Maui.ApplicationModel.Platform +Microsoft.Maui.ApplicationModel.VersionTracking +Microsoft.Maui.Authentication.AppleSignInAuthenticator +Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options +Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options.IncludeEmailScope.get -> bool +Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options.IncludeEmailScope.set -> void +Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options.IncludeFullNameScope.get -> bool +Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options.IncludeFullNameScope.set -> void +Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options.Options() -> void +Microsoft.Maui.Authentication.IAppleSignInAuthenticator +Microsoft.Maui.Authentication.IAppleSignInAuthenticator.AuthenticateAsync(Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options? options = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Authentication.IPlatformWebAuthenticatorCallback +Microsoft.Maui.Authentication.IWebAuthenticator +Microsoft.Maui.Authentication.IWebAuthenticator.AuthenticateAsync(Microsoft.Maui.Authentication.WebAuthenticatorOptions! webAuthenticatorOptions) -> System.Threading.Tasks.Task! +Microsoft.Maui.Authentication.WebAuthenticator +Microsoft.Maui.Authentication.WebAuthenticatorExtensions +Microsoft.Maui.Authentication.WebAuthenticatorOptions +Microsoft.Maui.Authentication.WebAuthenticatorOptions.CallbackUrl.get -> System.Uri? +Microsoft.Maui.Authentication.WebAuthenticatorOptions.CallbackUrl.set -> void +Microsoft.Maui.Authentication.WebAuthenticatorOptions.PrefersEphemeralWebBrowserSession.get -> bool +Microsoft.Maui.Authentication.WebAuthenticatorOptions.PrefersEphemeralWebBrowserSession.set -> void +Microsoft.Maui.Authentication.WebAuthenticatorOptions.Url.get -> System.Uri? +Microsoft.Maui.Authentication.WebAuthenticatorOptions.Url.set -> void +Microsoft.Maui.Authentication.WebAuthenticatorOptions.WebAuthenticatorOptions() -> void +Microsoft.Maui.Authentication.WebAuthenticatorResult +Microsoft.Maui.Authentication.WebAuthenticatorResult.ExpiresIn.get -> System.DateTimeOffset? +Microsoft.Maui.Authentication.WebAuthenticatorResult.RefreshTokenExpiresIn.get -> System.DateTimeOffset? +Microsoft.Maui.Authentication.WebAuthenticatorResult.Timestamp.get -> System.DateTimeOffset +Microsoft.Maui.Authentication.WebAuthenticatorResult.Timestamp.set -> void +Microsoft.Maui.Authentication.WebAuthenticatorResult.WebAuthenticatorResult() -> void +Microsoft.Maui.Devices.Battery +Microsoft.Maui.Devices.BatteryInfoChangedEventArgs +Microsoft.Maui.Devices.BatteryInfoChangedEventArgs.BatteryInfoChangedEventArgs(double level, Microsoft.Maui.Devices.BatteryState state, Microsoft.Maui.Devices.BatteryPowerSource source) -> void +Microsoft.Maui.Devices.BatteryInfoChangedEventArgs.ChargeLevel.get -> double +Microsoft.Maui.Devices.BatteryInfoChangedEventArgs.PowerSource.get -> Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.BatteryInfoChangedEventArgs.State.get -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.BatteryPowerSource.AC = 2 -> Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.BatteryPowerSource.Battery = 1 -> Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.BatteryPowerSource.Unknown = 0 -> Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.BatteryPowerSource.Usb = 3 -> Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.BatteryPowerSource.Wireless = 4 -> Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.BatteryState.Charging = 1 -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.BatteryState.Discharging = 2 -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.BatteryState.Full = 3 -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.BatteryState.NotCharging = 4 -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.BatteryState.NotPresent = 5 -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.BatteryState.Unknown = 0 -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.DeviceDisplay +Microsoft.Maui.Devices.DeviceIdiom +Microsoft.Maui.Devices.DeviceIdiom.DeviceIdiom() -> void +Microsoft.Maui.Devices.DeviceIdiom.Equals(Microsoft.Maui.Devices.DeviceIdiom other) -> bool +Microsoft.Maui.Devices.DeviceInfo +Microsoft.Maui.Devices.DevicePlatform +Microsoft.Maui.Devices.DevicePlatform.DevicePlatform() -> void +Microsoft.Maui.Devices.DevicePlatform.Equals(Microsoft.Maui.Devices.DevicePlatform other) -> bool +Microsoft.Maui.Devices.DeviceType +Microsoft.Maui.Devices.DeviceType.Physical = 1 -> Microsoft.Maui.Devices.DeviceType +Microsoft.Maui.Devices.DeviceType.Unknown = 0 -> Microsoft.Maui.Devices.DeviceType +Microsoft.Maui.Devices.DeviceType.Virtual = 2 -> Microsoft.Maui.Devices.DeviceType +Microsoft.Maui.Devices.DisplayInfo +Microsoft.Maui.Devices.DisplayInfo.Density.get -> double +Microsoft.Maui.Devices.DisplayInfo.DisplayInfo() -> void +Microsoft.Maui.Devices.DisplayInfo.DisplayInfo(double width, double height, double density, Microsoft.Maui.Devices.DisplayOrientation orientation, Microsoft.Maui.Devices.DisplayRotation rotation) -> void +Microsoft.Maui.Devices.DisplayInfo.DisplayInfo(double width, double height, double density, Microsoft.Maui.Devices.DisplayOrientation orientation, Microsoft.Maui.Devices.DisplayRotation rotation, float rate) -> void +Microsoft.Maui.Devices.DisplayInfo.Equals(Microsoft.Maui.Devices.DisplayInfo other) -> bool +Microsoft.Maui.Devices.DisplayInfo.Height.get -> double +Microsoft.Maui.Devices.DisplayInfo.Orientation.get -> Microsoft.Maui.Devices.DisplayOrientation +Microsoft.Maui.Devices.DisplayInfo.RefreshRate.get -> float +Microsoft.Maui.Devices.DisplayInfo.Rotation.get -> Microsoft.Maui.Devices.DisplayRotation +Microsoft.Maui.Devices.DisplayInfo.Width.get -> double +Microsoft.Maui.Devices.DisplayInfoChangedEventArgs +Microsoft.Maui.Devices.DisplayInfoChangedEventArgs.DisplayInfo.get -> Microsoft.Maui.Devices.DisplayInfo +Microsoft.Maui.Devices.DisplayInfoChangedEventArgs.DisplayInfoChangedEventArgs(Microsoft.Maui.Devices.DisplayInfo displayInfo) -> void +Microsoft.Maui.Devices.DisplayOrientation +Microsoft.Maui.Devices.DisplayOrientation.Landscape = 2 -> Microsoft.Maui.Devices.DisplayOrientation +Microsoft.Maui.Devices.DisplayOrientation.Portrait = 1 -> Microsoft.Maui.Devices.DisplayOrientation +Microsoft.Maui.Devices.DisplayOrientation.Unknown = 0 -> Microsoft.Maui.Devices.DisplayOrientation +Microsoft.Maui.Devices.DisplayRotation +Microsoft.Maui.Devices.DisplayRotation.Rotation0 = 1 -> Microsoft.Maui.Devices.DisplayRotation +Microsoft.Maui.Devices.DisplayRotation.Rotation180 = 3 -> Microsoft.Maui.Devices.DisplayRotation +Microsoft.Maui.Devices.DisplayRotation.Rotation270 = 4 -> Microsoft.Maui.Devices.DisplayRotation +Microsoft.Maui.Devices.DisplayRotation.Rotation90 = 2 -> Microsoft.Maui.Devices.DisplayRotation +Microsoft.Maui.Devices.DisplayRotation.Unknown = 0 -> Microsoft.Maui.Devices.DisplayRotation +Microsoft.Maui.Devices.EnergySaverStatus +Microsoft.Maui.Devices.EnergySaverStatus.Off = 2 -> Microsoft.Maui.Devices.EnergySaverStatus +Microsoft.Maui.Devices.EnergySaverStatus.On = 1 -> Microsoft.Maui.Devices.EnergySaverStatus +Microsoft.Maui.Devices.EnergySaverStatus.Unknown = 0 -> Microsoft.Maui.Devices.EnergySaverStatus +Microsoft.Maui.Devices.EnergySaverStatusChangedEventArgs +Microsoft.Maui.Devices.EnergySaverStatusChangedEventArgs.EnergySaverStatus.get -> Microsoft.Maui.Devices.EnergySaverStatus +Microsoft.Maui.Devices.EnergySaverStatusChangedEventArgs.EnergySaverStatusChangedEventArgs(Microsoft.Maui.Devices.EnergySaverStatus saverStatus) -> void +Microsoft.Maui.Devices.Flashlight +Microsoft.Maui.Devices.HapticFeedback +Microsoft.Maui.Devices.HapticFeedbackType +Microsoft.Maui.Devices.HapticFeedbackType.Click = 0 -> Microsoft.Maui.Devices.HapticFeedbackType +Microsoft.Maui.Devices.HapticFeedbackType.LongPress = 1 -> Microsoft.Maui.Devices.HapticFeedbackType +Microsoft.Maui.Devices.IBattery +Microsoft.Maui.Devices.IBattery.BatteryInfoChanged -> System.EventHandler! +Microsoft.Maui.Devices.IBattery.ChargeLevel.get -> double +Microsoft.Maui.Devices.IBattery.EnergySaverStatus.get -> Microsoft.Maui.Devices.EnergySaverStatus +Microsoft.Maui.Devices.IBattery.EnergySaverStatusChanged -> System.EventHandler! +Microsoft.Maui.Devices.IBattery.PowerSource.get -> Microsoft.Maui.Devices.BatteryPowerSource +Microsoft.Maui.Devices.IBattery.State.get -> Microsoft.Maui.Devices.BatteryState +Microsoft.Maui.Devices.IDeviceDisplay +Microsoft.Maui.Devices.IDeviceDisplay.KeepScreenOn.get -> bool +Microsoft.Maui.Devices.IDeviceDisplay.KeepScreenOn.set -> void +Microsoft.Maui.Devices.IDeviceDisplay.MainDisplayInfo.get -> Microsoft.Maui.Devices.DisplayInfo +Microsoft.Maui.Devices.IDeviceDisplay.MainDisplayInfoChanged -> System.EventHandler! +Microsoft.Maui.Devices.IDeviceInfo +Microsoft.Maui.Devices.IDeviceInfo.DeviceType.get -> Microsoft.Maui.Devices.DeviceType +Microsoft.Maui.Devices.IDeviceInfo.Idiom.get -> Microsoft.Maui.Devices.DeviceIdiom +Microsoft.Maui.Devices.IDeviceInfo.Manufacturer.get -> string! +Microsoft.Maui.Devices.IDeviceInfo.Model.get -> string! +Microsoft.Maui.Devices.IDeviceInfo.Name.get -> string! +Microsoft.Maui.Devices.IDeviceInfo.Platform.get -> Microsoft.Maui.Devices.DevicePlatform +Microsoft.Maui.Devices.IDeviceInfo.Version.get -> System.Version! +Microsoft.Maui.Devices.IDeviceInfo.VersionString.get -> string! +Microsoft.Maui.Devices.IFlashlight +Microsoft.Maui.Devices.IFlashlight.TurnOffAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.Devices.IFlashlight.TurnOnAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.Devices.IHapticFeedback +Microsoft.Maui.Devices.IHapticFeedback.IsSupported.get -> bool +Microsoft.Maui.Devices.IHapticFeedback.Perform(Microsoft.Maui.Devices.HapticFeedbackType type) -> void +Microsoft.Maui.Devices.IVibration +Microsoft.Maui.Devices.IVibration.Cancel() -> void +Microsoft.Maui.Devices.IVibration.IsSupported.get -> bool +Microsoft.Maui.Devices.IVibration.Vibrate() -> void +Microsoft.Maui.Devices.IVibration.Vibrate(System.TimeSpan duration) -> void +Microsoft.Maui.Devices.Sensors.Accelerometer +Microsoft.Maui.Devices.Sensors.AccelerometerChangedEventArgs +Microsoft.Maui.Devices.Sensors.AccelerometerChangedEventArgs.AccelerometerChangedEventArgs(Microsoft.Maui.Devices.Sensors.AccelerometerData reading) -> void +Microsoft.Maui.Devices.Sensors.AccelerometerChangedEventArgs.Reading.get -> Microsoft.Maui.Devices.Sensors.AccelerometerData +Microsoft.Maui.Devices.Sensors.AccelerometerData +Microsoft.Maui.Devices.Sensors.AccelerometerData.Acceleration.get -> System.Numerics.Vector3 +Microsoft.Maui.Devices.Sensors.AccelerometerData.AccelerometerData() -> void +Microsoft.Maui.Devices.Sensors.AccelerometerData.AccelerometerData(double x, double y, double z) -> void +Microsoft.Maui.Devices.Sensors.AccelerometerData.AccelerometerData(float x, float y, float z) -> void +Microsoft.Maui.Devices.Sensors.AccelerometerData.Equals(Microsoft.Maui.Devices.Sensors.AccelerometerData other) -> bool +Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem +Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem.Ellipsoid = 2 -> Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem +Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem.Geoid = 3 -> Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem +Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem.Surface = 4 -> Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem +Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem.Terrain = 1 -> Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem +Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem.Unspecified = 0 -> Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem +Microsoft.Maui.Devices.Sensors.Barometer +Microsoft.Maui.Devices.Sensors.BarometerChangedEventArgs +Microsoft.Maui.Devices.Sensors.BarometerChangedEventArgs.BarometerChangedEventArgs(Microsoft.Maui.Devices.Sensors.BarometerData reading) -> void +Microsoft.Maui.Devices.Sensors.BarometerChangedEventArgs.Reading.get -> Microsoft.Maui.Devices.Sensors.BarometerData +Microsoft.Maui.Devices.Sensors.BarometerData +Microsoft.Maui.Devices.Sensors.BarometerData.BarometerData() -> void +Microsoft.Maui.Devices.Sensors.BarometerData.BarometerData(double pressure) -> void +Microsoft.Maui.Devices.Sensors.BarometerData.Equals(Microsoft.Maui.Devices.Sensors.BarometerData other) -> bool +Microsoft.Maui.Devices.Sensors.BarometerData.PressureInHectopascals.get -> double +Microsoft.Maui.Devices.Sensors.Compass +Microsoft.Maui.Devices.Sensors.CompassChangedEventArgs +Microsoft.Maui.Devices.Sensors.CompassChangedEventArgs.CompassChangedEventArgs(Microsoft.Maui.Devices.Sensors.CompassData reading) -> void +Microsoft.Maui.Devices.Sensors.CompassChangedEventArgs.Reading.get -> Microsoft.Maui.Devices.Sensors.CompassData +Microsoft.Maui.Devices.Sensors.CompassData +Microsoft.Maui.Devices.Sensors.CompassData.CompassData() -> void +Microsoft.Maui.Devices.Sensors.CompassData.CompassData(double headingMagneticNorth) -> void +Microsoft.Maui.Devices.Sensors.CompassData.Equals(Microsoft.Maui.Devices.Sensors.CompassData other) -> bool +Microsoft.Maui.Devices.Sensors.CompassData.HeadingMagneticNorth.get -> double +Microsoft.Maui.Devices.Sensors.CompassExtensions +Microsoft.Maui.Devices.Sensors.DistanceUnits +Microsoft.Maui.Devices.Sensors.DistanceUnits.Kilometers = 0 -> Microsoft.Maui.Devices.Sensors.DistanceUnits +Microsoft.Maui.Devices.Sensors.DistanceUnits.Miles = 1 -> Microsoft.Maui.Devices.Sensors.DistanceUnits +Microsoft.Maui.Devices.Sensors.Geocoding +Microsoft.Maui.Devices.Sensors.GeocodingExtensions +Microsoft.Maui.Devices.Sensors.Geolocation +Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationAccuracy.Best = 5 -> Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationAccuracy.Default = 0 -> Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationAccuracy.High = 4 -> Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationAccuracy.Low = 2 -> Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationAccuracy.Lowest = 1 -> Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationAccuracy.Medium = 3 -> Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationExtensions +Microsoft.Maui.Devices.Sensors.GeolocationRequest +Microsoft.Maui.Devices.Sensors.GeolocationRequest.DesiredAccuracy.get -> Microsoft.Maui.Devices.Sensors.GeolocationAccuracy +Microsoft.Maui.Devices.Sensors.GeolocationRequest.DesiredAccuracy.set -> void +Microsoft.Maui.Devices.Sensors.GeolocationRequest.GeolocationRequest() -> void +Microsoft.Maui.Devices.Sensors.GeolocationRequest.GeolocationRequest(Microsoft.Maui.Devices.Sensors.GeolocationAccuracy accuracy) -> void +Microsoft.Maui.Devices.Sensors.GeolocationRequest.GeolocationRequest(Microsoft.Maui.Devices.Sensors.GeolocationAccuracy accuracy, System.TimeSpan timeout) -> void +Microsoft.Maui.Devices.Sensors.GeolocationRequest.RequestFullAccuracy.get -> bool +Microsoft.Maui.Devices.Sensors.GeolocationRequest.RequestFullAccuracy.set -> void +Microsoft.Maui.Devices.Sensors.GeolocationRequest.Timeout.get -> System.TimeSpan +Microsoft.Maui.Devices.Sensors.GeolocationRequest.Timeout.set -> void +Microsoft.Maui.Devices.Sensors.Gyroscope +Microsoft.Maui.Devices.Sensors.GyroscopeChangedEventArgs +Microsoft.Maui.Devices.Sensors.GyroscopeChangedEventArgs.GyroscopeChangedEventArgs(Microsoft.Maui.Devices.Sensors.GyroscopeData reading) -> void +Microsoft.Maui.Devices.Sensors.GyroscopeChangedEventArgs.Reading.get -> Microsoft.Maui.Devices.Sensors.GyroscopeData +Microsoft.Maui.Devices.Sensors.GyroscopeData +Microsoft.Maui.Devices.Sensors.GyroscopeData.AngularVelocity.get -> System.Numerics.Vector3 +Microsoft.Maui.Devices.Sensors.GyroscopeData.Equals(Microsoft.Maui.Devices.Sensors.GyroscopeData other) -> bool +Microsoft.Maui.Devices.Sensors.GyroscopeData.GyroscopeData() -> void +Microsoft.Maui.Devices.Sensors.GyroscopeData.GyroscopeData(double x, double y, double z) -> void +Microsoft.Maui.Devices.Sensors.GyroscopeData.GyroscopeData(float x, float y, float z) -> void +Microsoft.Maui.Devices.Sensors.IAccelerometer +Microsoft.Maui.Devices.Sensors.IAccelerometer.IsMonitoring.get -> bool +Microsoft.Maui.Devices.Sensors.IAccelerometer.IsSupported.get -> bool +Microsoft.Maui.Devices.Sensors.IAccelerometer.ReadingChanged -> System.EventHandler? +Microsoft.Maui.Devices.Sensors.IAccelerometer.ShakeDetected -> System.EventHandler? +Microsoft.Maui.Devices.Sensors.IAccelerometer.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +Microsoft.Maui.Devices.Sensors.IAccelerometer.Stop() -> void +Microsoft.Maui.Devices.Sensors.IBarometer +Microsoft.Maui.Devices.Sensors.IBarometer.IsMonitoring.get -> bool +Microsoft.Maui.Devices.Sensors.IBarometer.IsSupported.get -> bool +Microsoft.Maui.Devices.Sensors.IBarometer.ReadingChanged -> System.EventHandler? +Microsoft.Maui.Devices.Sensors.IBarometer.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +Microsoft.Maui.Devices.Sensors.IBarometer.Stop() -> void +Microsoft.Maui.Devices.Sensors.ICompass +Microsoft.Maui.Devices.Sensors.ICompass.IsMonitoring.get -> bool +Microsoft.Maui.Devices.Sensors.ICompass.IsSupported.get -> bool +Microsoft.Maui.Devices.Sensors.ICompass.ReadingChanged -> System.EventHandler! +Microsoft.Maui.Devices.Sensors.ICompass.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +Microsoft.Maui.Devices.Sensors.ICompass.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed, bool applyLowPassFilter) -> void +Microsoft.Maui.Devices.Sensors.ICompass.Stop() -> void +Microsoft.Maui.Devices.Sensors.IGeocoding +Microsoft.Maui.Devices.Sensors.IGeocoding.GetLocationsAsync(string! address) -> System.Threading.Tasks.Task!>! +Microsoft.Maui.Devices.Sensors.IGeocoding.GetPlacemarksAsync(double latitude, double longitude) -> System.Threading.Tasks.Task!>! +Microsoft.Maui.Devices.Sensors.IGeolocation +Microsoft.Maui.Devices.Sensors.IGeolocation.GetLastKnownLocationAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.Devices.Sensors.IGeolocation.GetLocationAsync(Microsoft.Maui.Devices.Sensors.GeolocationRequest! request, System.Threading.CancellationToken cancelToken) -> System.Threading.Tasks.Task! +Microsoft.Maui.Devices.Sensors.IGyroscope +Microsoft.Maui.Devices.Sensors.IGyroscope.IsMonitoring.get -> bool +Microsoft.Maui.Devices.Sensors.IGyroscope.IsSupported.get -> bool +Microsoft.Maui.Devices.Sensors.IGyroscope.ReadingChanged -> System.EventHandler! +Microsoft.Maui.Devices.Sensors.IGyroscope.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +Microsoft.Maui.Devices.Sensors.IGyroscope.Stop() -> void +Microsoft.Maui.Devices.Sensors.IMagnetometer +Microsoft.Maui.Devices.Sensors.IMagnetometer.IsMonitoring.get -> bool +Microsoft.Maui.Devices.Sensors.IMagnetometer.IsSupported.get -> bool +Microsoft.Maui.Devices.Sensors.IMagnetometer.ReadingChanged -> System.EventHandler! +Microsoft.Maui.Devices.Sensors.IMagnetometer.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +Microsoft.Maui.Devices.Sensors.IMagnetometer.Stop() -> void +Microsoft.Maui.Devices.Sensors.IOrientationSensor +Microsoft.Maui.Devices.Sensors.IOrientationSensor.IsMonitoring.get -> bool +Microsoft.Maui.Devices.Sensors.IOrientationSensor.IsSupported.get -> bool +Microsoft.Maui.Devices.Sensors.IOrientationSensor.ReadingChanged -> System.EventHandler! +Microsoft.Maui.Devices.Sensors.IOrientationSensor.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +Microsoft.Maui.Devices.Sensors.IOrientationSensor.Stop() -> void +Microsoft.Maui.Devices.Sensors.IPlatformCompass +Microsoft.Maui.Devices.Sensors.IPlatformGeocoding +Microsoft.Maui.Devices.Sensors.Location +Microsoft.Maui.Devices.Sensors.Location.Accuracy.get -> double? +Microsoft.Maui.Devices.Sensors.Location.Accuracy.set -> void +Microsoft.Maui.Devices.Sensors.Location.Altitude.get -> double? +Microsoft.Maui.Devices.Sensors.Location.Altitude.set -> void +Microsoft.Maui.Devices.Sensors.Location.AltitudeReferenceSystem.get -> Microsoft.Maui.Devices.Sensors.AltitudeReferenceSystem +Microsoft.Maui.Devices.Sensors.Location.AltitudeReferenceSystem.set -> void +Microsoft.Maui.Devices.Sensors.Location.Course.get -> double? +Microsoft.Maui.Devices.Sensors.Location.Course.set -> void +Microsoft.Maui.Devices.Sensors.Location.IsFromMockProvider.get -> bool +Microsoft.Maui.Devices.Sensors.Location.IsFromMockProvider.set -> void +Microsoft.Maui.Devices.Sensors.Location.Latitude.get -> double +Microsoft.Maui.Devices.Sensors.Location.Latitude.set -> void +Microsoft.Maui.Devices.Sensors.Location.Location() -> void +Microsoft.Maui.Devices.Sensors.Location.Location(double latitude, double longitude) -> void +Microsoft.Maui.Devices.Sensors.Location.Location(double latitude, double longitude, double altitude) -> void +Microsoft.Maui.Devices.Sensors.Location.Location(double latitude, double longitude, System.DateTimeOffset timestamp) -> void +Microsoft.Maui.Devices.Sensors.Location.Longitude.get -> double +Microsoft.Maui.Devices.Sensors.Location.Longitude.set -> void +Microsoft.Maui.Devices.Sensors.Location.ReducedAccuracy.get -> bool +Microsoft.Maui.Devices.Sensors.Location.ReducedAccuracy.set -> void +Microsoft.Maui.Devices.Sensors.Location.Speed.get -> double? +Microsoft.Maui.Devices.Sensors.Location.Speed.set -> void +Microsoft.Maui.Devices.Sensors.Location.Timestamp.get -> System.DateTimeOffset +Microsoft.Maui.Devices.Sensors.Location.Timestamp.set -> void +Microsoft.Maui.Devices.Sensors.Location.VerticalAccuracy.get -> double? +Microsoft.Maui.Devices.Sensors.Location.VerticalAccuracy.set -> void +Microsoft.Maui.Devices.Sensors.LocationExtensions +Microsoft.Maui.Devices.Sensors.Magnetometer +Microsoft.Maui.Devices.Sensors.MagnetometerChangedEventArgs +Microsoft.Maui.Devices.Sensors.MagnetometerChangedEventArgs.MagnetometerChangedEventArgs(Microsoft.Maui.Devices.Sensors.MagnetometerData reading) -> void +Microsoft.Maui.Devices.Sensors.MagnetometerChangedEventArgs.Reading.get -> Microsoft.Maui.Devices.Sensors.MagnetometerData +Microsoft.Maui.Devices.Sensors.MagnetometerData +Microsoft.Maui.Devices.Sensors.MagnetometerData.Equals(Microsoft.Maui.Devices.Sensors.MagnetometerData other) -> bool +Microsoft.Maui.Devices.Sensors.MagnetometerData.MagneticField.get -> System.Numerics.Vector3 +Microsoft.Maui.Devices.Sensors.MagnetometerData.MagnetometerData() -> void +Microsoft.Maui.Devices.Sensors.MagnetometerData.MagnetometerData(double x, double y, double z) -> void +Microsoft.Maui.Devices.Sensors.MagnetometerData.MagnetometerData(float x, float y, float z) -> void +Microsoft.Maui.Devices.Sensors.OrientationSensor +Microsoft.Maui.Devices.Sensors.OrientationSensorChangedEventArgs +Microsoft.Maui.Devices.Sensors.OrientationSensorChangedEventArgs.OrientationSensorChangedEventArgs(Microsoft.Maui.Devices.Sensors.OrientationSensorData reading) -> void +Microsoft.Maui.Devices.Sensors.OrientationSensorChangedEventArgs.Reading.get -> Microsoft.Maui.Devices.Sensors.OrientationSensorData +Microsoft.Maui.Devices.Sensors.OrientationSensorData +Microsoft.Maui.Devices.Sensors.OrientationSensorData.Equals(Microsoft.Maui.Devices.Sensors.OrientationSensorData other) -> bool +Microsoft.Maui.Devices.Sensors.OrientationSensorData.Orientation.get -> System.Numerics.Quaternion +Microsoft.Maui.Devices.Sensors.OrientationSensorData.OrientationSensorData() -> void +Microsoft.Maui.Devices.Sensors.OrientationSensorData.OrientationSensorData(double x, double y, double z, double w) -> void +Microsoft.Maui.Devices.Sensors.OrientationSensorData.OrientationSensorData(float x, float y, float z, float w) -> void +Microsoft.Maui.Devices.Sensors.OrientationSensorImplementation +Microsoft.Maui.Devices.Sensors.OrientationSensorImplementation.IsMonitoring.get -> bool +Microsoft.Maui.Devices.Sensors.OrientationSensorImplementation.IsSupported.get -> bool +Microsoft.Maui.Devices.Sensors.OrientationSensorImplementation.OrientationSensorImplementation() -> void +Microsoft.Maui.Devices.Sensors.OrientationSensorImplementation.ReadingChanged -> System.EventHandler? +Microsoft.Maui.Devices.Sensors.OrientationSensorImplementation.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +Microsoft.Maui.Devices.Sensors.OrientationSensorImplementation.Stop() -> void +Microsoft.Maui.Devices.Sensors.Placemark +Microsoft.Maui.Devices.Sensors.Placemark.Placemark() -> void +Microsoft.Maui.Devices.Sensors.PlacemarkExtensions +Microsoft.Maui.Devices.Sensors.SensorSpeed +Microsoft.Maui.Devices.Sensors.SensorSpeed.Default = 0 -> Microsoft.Maui.Devices.Sensors.SensorSpeed +Microsoft.Maui.Devices.Sensors.SensorSpeed.Fastest = 3 -> Microsoft.Maui.Devices.Sensors.SensorSpeed +Microsoft.Maui.Devices.Sensors.SensorSpeed.Game = 2 -> Microsoft.Maui.Devices.Sensors.SensorSpeed +Microsoft.Maui.Devices.Sensors.SensorSpeed.UI = 1 -> Microsoft.Maui.Devices.Sensors.SensorSpeed +Microsoft.Maui.Devices.Vibration +Microsoft.Maui.Devices.VibrationExtensions +Microsoft.Maui.Media.IMediaPicker +Microsoft.Maui.Media.IMediaPicker.CapturePhotoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.IMediaPicker.CaptureVideoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.IMediaPicker.IsCaptureSupported.get -> bool +Microsoft.Maui.Media.IMediaPicker.PickPhotoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.IMediaPicker.PickVideoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.IPlatformScreenshot +Microsoft.Maui.Media.IScreenshot +Microsoft.Maui.Media.IScreenshot.CaptureAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.ScreenshotExtensions.CaptureAsync(this Microsoft.Maui.Media.IScreenshot! screenshot, Gtk.Window! window) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.ScreenshotExtensions.CaptureAsync(this Microsoft.Maui.Media.IScreenshot! screenshot, Gtk.Widget! view) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.IScreenshot.IsCaptureSupported.get -> bool +Microsoft.Maui.Media.IScreenshotResult +Microsoft.Maui.Media.IScreenshotResult.CopyToAsync(System.IO.Stream! destination, Microsoft.Maui.Media.ScreenshotFormat format = Microsoft.Maui.Media.ScreenshotFormat.Png, int quality = 100) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.IScreenshotResult.Height.get -> int +Microsoft.Maui.Media.IScreenshotResult.OpenReadAsync(Microsoft.Maui.Media.ScreenshotFormat format = Microsoft.Maui.Media.ScreenshotFormat.Png, int quality = 100) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.IScreenshotResult.Width.get -> int +Microsoft.Maui.Media.ITextToSpeech +Microsoft.Maui.Media.ITextToSpeech.GetLocalesAsync() -> System.Threading.Tasks.Task!>! +Microsoft.Maui.Media.ITextToSpeech.SpeakAsync(string! text, Microsoft.Maui.Media.SpeechOptions? options = null, System.Threading.CancellationToken cancelToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Microsoft.Maui.Media.Locale +Microsoft.Maui.Media.Locale.Country.get -> string! +Microsoft.Maui.Media.Locale.Id.get -> string! +Microsoft.Maui.Media.Locale.Language.get -> string! +Microsoft.Maui.Media.Locale.Name.get -> string! +Microsoft.Maui.Media.MediaPicker +Microsoft.Maui.Media.MediaPickerOptions +Microsoft.Maui.Media.MediaPickerOptions.MediaPickerOptions() -> void +Microsoft.Maui.Media.MediaPickerOptions.Title.get -> string? +Microsoft.Maui.Media.MediaPickerOptions.Title.set -> void +Microsoft.Maui.Media.Screenshot +Microsoft.Maui.Media.ScreenshotExtensions +Microsoft.Maui.Media.ScreenshotFormat +Microsoft.Maui.Media.ScreenshotFormat.Jpeg = 1 -> Microsoft.Maui.Media.ScreenshotFormat +Microsoft.Maui.Media.ScreenshotFormat.Png = 0 -> Microsoft.Maui.Media.ScreenshotFormat +Microsoft.Maui.Media.SpeechOptions +Microsoft.Maui.Media.SpeechOptions.Locale.get -> Microsoft.Maui.Media.Locale? +Microsoft.Maui.Media.SpeechOptions.Locale.set -> void +Microsoft.Maui.Media.SpeechOptions.Pitch.get -> float? +Microsoft.Maui.Media.SpeechOptions.Pitch.set -> void +Microsoft.Maui.Media.SpeechOptions.SpeechOptions() -> void +Microsoft.Maui.Media.SpeechOptions.Volume.get -> float? +Microsoft.Maui.Media.SpeechOptions.Volume.set -> void +Microsoft.Maui.Media.TextToSpeech +Microsoft.Maui.Media.UnitConverters +Microsoft.Maui.Networking.ConnectionProfile +Microsoft.Maui.Networking.ConnectionProfile.Bluetooth = 1 -> Microsoft.Maui.Networking.ConnectionProfile +Microsoft.Maui.Networking.ConnectionProfile.Cellular = 2 -> Microsoft.Maui.Networking.ConnectionProfile +Microsoft.Maui.Networking.ConnectionProfile.Ethernet = 3 -> Microsoft.Maui.Networking.ConnectionProfile +Microsoft.Maui.Networking.ConnectionProfile.Unknown = 0 -> Microsoft.Maui.Networking.ConnectionProfile +Microsoft.Maui.Networking.ConnectionProfile.WiFi = 4 -> Microsoft.Maui.Networking.ConnectionProfile +Microsoft.Maui.Networking.Connectivity +Microsoft.Maui.Networking.ConnectivityChangedEventArgs +Microsoft.Maui.Networking.ConnectivityChangedEventArgs.NetworkAccess.get -> Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Networking.IConnectivity +Microsoft.Maui.Networking.IConnectivity.ConnectivityChanged -> System.EventHandler +Microsoft.Maui.Networking.IConnectivity.NetworkAccess.get -> Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Networking.NetworkAccess.ConstrainedInternet = 3 -> Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Networking.NetworkAccess.Internet = 4 -> Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Networking.NetworkAccess.Local = 2 -> Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Networking.NetworkAccess.None = 1 -> Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Networking.NetworkAccess.Unknown = 0 -> Microsoft.Maui.Networking.NetworkAccess +Microsoft.Maui.Storage.FileBase +Microsoft.Maui.Storage.FileBase.ContentType.get -> string! +Microsoft.Maui.Storage.FileBase.ContentType.set -> void +Microsoft.Maui.Storage.FileBase.FileBase(Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.Storage.FileBase.FileName.get -> string! +Microsoft.Maui.Storage.FileBase.FileName.set -> void +Microsoft.Maui.Storage.FileBase.FullPath.get -> string! +Microsoft.Maui.Storage.FileBase.OpenReadAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.FilePicker +Microsoft.Maui.Storage.FilePickerFileType +Microsoft.Maui.Storage.FilePickerFileType.FilePickerFileType() -> void +Microsoft.Maui.Storage.FilePickerFileType.FilePickerFileType(System.Collections.Generic.IDictionary!>! fileTypes) -> void +Microsoft.Maui.Storage.FilePickerFileType.Value.get -> System.Collections.Generic.IEnumerable! +Microsoft.Maui.Storage.FileResult +Microsoft.Maui.Storage.FileResult.FileResult(Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.Storage.FileResult.FileResult(string! fullPath) -> void +Microsoft.Maui.Storage.FileResult.FileResult(string! fullPath, string! contentType) -> void +Microsoft.Maui.Storage.FileSystem +Microsoft.Maui.Storage.FileSystemImplementation +Microsoft.Maui.Storage.FileSystemImplementation.AppDataDirectory.get -> string! +Microsoft.Maui.Storage.FileSystemImplementation.AppPackageFileExistsAsync(string! filename) -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.FileSystemImplementation.CacheDirectory.get -> string! +Microsoft.Maui.Storage.FileSystemImplementation.FileSystemImplementation() -> void +Microsoft.Maui.Storage.FileSystemImplementation.OpenAppPackageFileAsync(string! filename) -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.IFilePicker +Microsoft.Maui.Storage.IFilePicker.PickAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.IFilePicker.PickMultipleAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task!>! +Microsoft.Maui.Storage.IFileSystem +Microsoft.Maui.Storage.IFileSystem.AppDataDirectory.get -> string! +Microsoft.Maui.Storage.IFileSystem.AppPackageFileExistsAsync(string! filename) -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.IFileSystem.CacheDirectory.get -> string! +Microsoft.Maui.Storage.IFileSystem.OpenAppPackageFileAsync(string! filename) -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.IPlatformSecureStorage +Microsoft.Maui.Storage.IPreferences +Microsoft.Maui.Storage.IPreferences.Clear(string? sharedName = null) -> void +Microsoft.Maui.Storage.IPreferences.ContainsKey(string! key, string? sharedName = null) -> bool +Microsoft.Maui.Storage.IPreferences.Get(string! key, T defaultValue, string? sharedName = null) -> T +Microsoft.Maui.Storage.IPreferences.Remove(string! key, string? sharedName = null) -> void +Microsoft.Maui.Storage.IPreferences.Set(string! key, T value, string? sharedName = null) -> void +Microsoft.Maui.Storage.ISecureStorage +Microsoft.Maui.Storage.ISecureStorage.GetAsync(string! key) -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.ISecureStorage.Remove(string! key) -> bool +Microsoft.Maui.Storage.ISecureStorage.RemoveAll() -> void +Microsoft.Maui.Storage.ISecureStorage.SetAsync(string! key, string! value) -> System.Threading.Tasks.Task! +Microsoft.Maui.Storage.PickOptions +Microsoft.Maui.Storage.PickOptions.FileTypes.get -> Microsoft.Maui.Storage.FilePickerFileType? +Microsoft.Maui.Storage.PickOptions.FileTypes.set -> void +Microsoft.Maui.Storage.PickOptions.PickerTitle.get -> string? +Microsoft.Maui.Storage.PickOptions.PickerTitle.set -> void +Microsoft.Maui.Storage.PickOptions.PickOptions() -> void +Microsoft.Maui.Storage.Preferences +Microsoft.Maui.Storage.ReadOnlyFile +Microsoft.Maui.Storage.ReadOnlyFile.ReadOnlyFile(Microsoft.Maui.Storage.FileBase! file) -> void +Microsoft.Maui.Storage.ReadOnlyFile.ReadOnlyFile(string! fullPath) -> void +Microsoft.Maui.Storage.ReadOnlyFile.ReadOnlyFile(string! fullPath, string! contentType) -> void +Microsoft.Maui.Storage.SecureStorage +Microsoft.Maui.Storage.SecureStorageExtensions +override Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission.EnsureDeclared() -> void +override Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission.ShouldShowRationale() -> bool +override Microsoft.Maui.Devices.BatteryInfoChangedEventArgs.ToString() -> string! +override Microsoft.Maui.Devices.DeviceIdiom.GetHashCode() -> int +override Microsoft.Maui.Devices.DevicePlatform.GetHashCode() -> int +override Microsoft.Maui.Devices.DisplayInfo.GetHashCode() -> int +override Microsoft.Maui.Devices.EnergySaverStatusChangedEventArgs.ToString() -> string! +override Microsoft.Maui.Devices.Sensors.AccelerometerData.Equals(object? obj) -> bool +override Microsoft.Maui.Devices.Sensors.AccelerometerData.GetHashCode() -> int +override Microsoft.Maui.Devices.Sensors.AccelerometerData.ToString() -> string! +override Microsoft.Maui.Devices.Sensors.BarometerData.Equals(object? obj) -> bool +override Microsoft.Maui.Devices.Sensors.BarometerData.GetHashCode() -> int +override Microsoft.Maui.Devices.Sensors.BarometerData.ToString() -> string! +override Microsoft.Maui.Devices.Sensors.CompassData.Equals(object? obj) -> bool +override Microsoft.Maui.Devices.Sensors.CompassData.GetHashCode() -> int +override Microsoft.Maui.Devices.Sensors.CompassData.ToString() -> string! +override Microsoft.Maui.Devices.Sensors.GyroscopeData.Equals(object? obj) -> bool +override Microsoft.Maui.Devices.Sensors.GyroscopeData.GetHashCode() -> int +override Microsoft.Maui.Devices.Sensors.GyroscopeData.ToString() -> string! +override Microsoft.Maui.Devices.Sensors.MagnetometerData.Equals(object? obj) -> bool +override Microsoft.Maui.Devices.Sensors.MagnetometerData.GetHashCode() -> int +override Microsoft.Maui.Devices.Sensors.MagnetometerData.ToString() -> string! +override Microsoft.Maui.Devices.Sensors.OrientationSensorData.Equals(object? obj) -> bool +override Microsoft.Maui.Devices.Sensors.OrientationSensorData.GetHashCode() -> int +override Microsoft.Maui.Devices.Sensors.OrientationSensorData.ToString() -> string! +static Microsoft.Maui.Accessibility.SemanticScreenReader.Announce(string! text) -> void +static Microsoft.Maui.Accessibility.SemanticScreenReader.Default.get -> Microsoft.Maui.Accessibility.ISemanticScreenReader! +static Microsoft.Maui.ApplicationModel.AppActions.Current.get -> Microsoft.Maui.ApplicationModel.IAppActions! +static Microsoft.Maui.ApplicationModel.AppActions.GetAsync() -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.ApplicationModel.AppActions.IsSupported.get -> bool +static Microsoft.Maui.ApplicationModel.AppActions.OnAppAction -> System.EventHandler? +static Microsoft.Maui.ApplicationModel.AppActions.SetAsync(params Microsoft.Maui.ApplicationModel.AppAction![]! actions) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.AppActions.SetAsync(System.Collections.Generic.IEnumerable! actions) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.AppInfo.BuildString.get -> string! +static Microsoft.Maui.ApplicationModel.AppInfo.Current.get -> Microsoft.Maui.ApplicationModel.IAppInfo! +static Microsoft.Maui.ApplicationModel.AppInfo.Name.get -> string! +static Microsoft.Maui.ApplicationModel.AppInfo.PackageName.get -> string! +static Microsoft.Maui.ApplicationModel.AppInfo.PackagingModel.get -> Microsoft.Maui.ApplicationModel.AppPackagingModel +static Microsoft.Maui.ApplicationModel.AppInfo.RequestedLayoutDirection.get -> Microsoft.Maui.ApplicationModel.LayoutDirection +static Microsoft.Maui.ApplicationModel.AppInfo.RequestedTheme.get -> Microsoft.Maui.ApplicationModel.AppTheme +static Microsoft.Maui.ApplicationModel.AppInfo.ShowSettingsUI() -> void +static Microsoft.Maui.ApplicationModel.AppInfo.Version.get -> System.Version! +static Microsoft.Maui.ApplicationModel.AppInfo.VersionString.get -> string! +static Microsoft.Maui.ApplicationModel.Browser.Default.get -> Microsoft.Maui.ApplicationModel.IBrowser! +static Microsoft.Maui.ApplicationModel.Browser.OpenAsync(string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Browser.OpenAsync(string! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchMode launchMode) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Browser.OpenAsync(string! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Browser.OpenAsync(System.Uri! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Browser.OpenAsync(System.Uri! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchMode launchMode) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Browser.OpenAsync(System.Uri! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.BrowserExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IBrowser! browser, string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.BrowserExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IBrowser! browser, string! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchMode launchMode) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.BrowserExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IBrowser! browser, string! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.BrowserExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IBrowser! browser, System.Uri! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.BrowserExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IBrowser! browser, System.Uri! uri, Microsoft.Maui.ApplicationModel.BrowserLaunchMode launchMode) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.Contacts.Default.get -> Microsoft.Maui.ApplicationModel.Communication.IContacts! +static Microsoft.Maui.ApplicationModel.Communication.Contacts.GetAllAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.ApplicationModel.Communication.Contacts.PickContactAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.Email.ComposeAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.Email.ComposeAsync(Microsoft.Maui.ApplicationModel.Communication.EmailMessage! message) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.Email.ComposeAsync(string! subject, string! body, params string![]! to) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.Email.Default.get -> Microsoft.Maui.ApplicationModel.Communication.IEmail! +static Microsoft.Maui.ApplicationModel.Communication.EmailExtensions.ComposeAsync(this Microsoft.Maui.ApplicationModel.Communication.IEmail! email) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.EmailExtensions.ComposeAsync(this Microsoft.Maui.ApplicationModel.Communication.IEmail! email, string! subject, string! body, params string![]! to) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.PhoneDialer.Current.get -> Microsoft.Maui.ApplicationModel.Communication.IPhoneDialer! +static Microsoft.Maui.ApplicationModel.Communication.PhoneDialer.Default.get -> Microsoft.Maui.ApplicationModel.Communication.IPhoneDialer! +static Microsoft.Maui.ApplicationModel.Communication.PhoneDialer.IsSupported.get -> bool +static Microsoft.Maui.ApplicationModel.Communication.PhoneDialer.Open(string! number) -> void +static Microsoft.Maui.ApplicationModel.Communication.Sms.ComposeAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.Sms.ComposeAsync(Microsoft.Maui.ApplicationModel.Communication.SmsMessage? message) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Communication.Sms.Default.get -> Microsoft.Maui.ApplicationModel.Communication.ISms! +static Microsoft.Maui.ApplicationModel.DataTransfer.Clipboard.ClipboardContentChanged -> System.EventHandler! +static Microsoft.Maui.ApplicationModel.DataTransfer.Clipboard.Default.get -> Microsoft.Maui.ApplicationModel.DataTransfer.IClipboard! +static Microsoft.Maui.ApplicationModel.DataTransfer.Clipboard.GetTextAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.Clipboard.HasText.get -> bool +static Microsoft.Maui.ApplicationModel.DataTransfer.Clipboard.SetTextAsync(string? text) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.Share.Default.get -> Microsoft.Maui.ApplicationModel.DataTransfer.IShare! +static Microsoft.Maui.ApplicationModel.DataTransfer.Share.RequestAsync(Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest! request) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.Share.RequestAsync(Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest! request) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.Share.RequestAsync(Microsoft.Maui.ApplicationModel.DataTransfer.ShareTextRequest! request) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.Share.RequestAsync(string! text) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.Share.RequestAsync(string! text, string! title) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.ShareExtensions.RequestAsync(this Microsoft.Maui.ApplicationModel.DataTransfer.IShare! share, string! text) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.ShareExtensions.RequestAsync(this Microsoft.Maui.ApplicationModel.DataTransfer.IShare! share, string! text, string! title) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest.explicit operator Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest!(Microsoft.Maui.ApplicationModel.DataTransfer.ShareFileRequest! request) -> Microsoft.Maui.ApplicationModel.DataTransfer.ShareMultipleFilesRequest! +static Microsoft.Maui.ApplicationModel.Launcher.CanOpenAsync(string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Launcher.CanOpenAsync(System.Uri! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Launcher.Default.get -> Microsoft.Maui.ApplicationModel.ILauncher! +static Microsoft.Maui.ApplicationModel.Launcher.OpenAsync(Microsoft.Maui.ApplicationModel.OpenFileRequest! request) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Launcher.OpenAsync(string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Launcher.OpenAsync(System.Uri! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Launcher.TryOpenAsync(string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Launcher.TryOpenAsync(System.Uri! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.LauncherExtensions.CanOpenAsync(this Microsoft.Maui.ApplicationModel.ILauncher! launcher, string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.LauncherExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.ILauncher! launcher, string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.LauncherExtensions.TryOpenAsync(this Microsoft.Maui.ApplicationModel.ILauncher! launcher, string! uri) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MainThread.IsMainThread.get -> bool +static Microsoft.Maui.ApplicationModel.Map.Default.get -> Microsoft.Maui.ApplicationModel.IMap! +static Microsoft.Maui.ApplicationModel.Map.OpenAsync(double latitude, double longitude) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.OpenAsync(double latitude, double longitude, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.OpenAsync(Microsoft.Maui.Devices.Sensors.Location! location) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.OpenAsync(Microsoft.Maui.Devices.Sensors.Location! location, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.OpenAsync(Microsoft.Maui.Devices.Sensors.Placemark! placemark) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.OpenAsync(Microsoft.Maui.Devices.Sensors.Placemark! placemark, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.TryOpenAsync(double latitude, double longitude) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.TryOpenAsync(double latitude, double longitude, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.TryOpenAsync(Microsoft.Maui.Devices.Sensors.Location! location) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.TryOpenAsync(Microsoft.Maui.Devices.Sensors.Location! location, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.TryOpenAsync(Microsoft.Maui.Devices.Sensors.Placemark! placemark) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.Map.TryOpenAsync(Microsoft.Maui.Devices.Sensors.Placemark! placemark, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, double latitude, double longitude) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, Microsoft.Maui.Devices.Sensors.Location! location) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, Microsoft.Maui.Devices.Sensors.Location! location, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.OpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, Microsoft.Maui.Devices.Sensors.Placemark! placemark) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.TryOpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, double latitude, double longitude) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.TryOpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, Microsoft.Maui.Devices.Sensors.Location! location) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.TryOpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, Microsoft.Maui.Devices.Sensors.Location! location, Microsoft.Maui.ApplicationModel.MapLaunchOptions! options) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.MapExtensions.TryOpenAsync(this Microsoft.Maui.ApplicationModel.IMap! map, Microsoft.Maui.Devices.Sensors.Placemark! placemark) -> System.Threading.Tasks.Task! +static Microsoft.Maui.ApplicationModel.VersionTracking.BuildHistory.get -> System.Collections.Generic.IEnumerable! +static Microsoft.Maui.ApplicationModel.VersionTracking.CurrentBuild.get -> string! +static Microsoft.Maui.ApplicationModel.VersionTracking.CurrentVersion.get -> string! +static Microsoft.Maui.ApplicationModel.VersionTracking.Default.get -> Microsoft.Maui.ApplicationModel.IVersionTracking! +static Microsoft.Maui.ApplicationModel.VersionTracking.FirstInstalledBuild.get -> string? +static Microsoft.Maui.ApplicationModel.VersionTracking.FirstInstalledVersion.get -> string? +static Microsoft.Maui.ApplicationModel.VersionTracking.IsFirstLaunchEver.get -> bool +static Microsoft.Maui.ApplicationModel.VersionTracking.IsFirstLaunchForBuild(string! build) -> bool +static Microsoft.Maui.ApplicationModel.VersionTracking.IsFirstLaunchForCurrentBuild.get -> bool +static Microsoft.Maui.ApplicationModel.VersionTracking.IsFirstLaunchForCurrentVersion.get -> bool +static Microsoft.Maui.ApplicationModel.VersionTracking.IsFirstLaunchForVersion(string! version) -> bool +static Microsoft.Maui.ApplicationModel.VersionTracking.PreviousBuild.get -> string? +static Microsoft.Maui.ApplicationModel.VersionTracking.PreviousVersion.get -> string? +static Microsoft.Maui.ApplicationModel.VersionTracking.Track() -> void +static Microsoft.Maui.ApplicationModel.VersionTracking.VersionHistory.get -> System.Collections.Generic.IEnumerable! +static Microsoft.Maui.Authentication.AppleSignInAuthenticator.AuthenticateAsync(Microsoft.Maui.Authentication.AppleSignInAuthenticator.Options? options = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Authentication.AppleSignInAuthenticator.Default.get -> Microsoft.Maui.Authentication.IAppleSignInAuthenticator! +static Microsoft.Maui.Authentication.WebAuthenticator.AuthenticateAsync(Microsoft.Maui.Authentication.WebAuthenticatorOptions! webAuthenticatorOptions) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Authentication.WebAuthenticator.AuthenticateAsync(System.Uri! url, System.Uri! callbackUrl) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Authentication.WebAuthenticator.Default.get -> Microsoft.Maui.Authentication.IWebAuthenticator! +static Microsoft.Maui.Authentication.WebAuthenticatorExtensions.AuthenticateAsync(this Microsoft.Maui.Authentication.IWebAuthenticator! webAuthenticator, System.Uri! url, System.Uri! callbackUrl) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Battery.BatteryInfoChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Battery.ChargeLevel.get -> double +static Microsoft.Maui.Devices.Battery.Default.get -> Microsoft.Maui.Devices.IBattery! +static Microsoft.Maui.Devices.Battery.EnergySaverStatus.get -> Microsoft.Maui.Devices.EnergySaverStatus +static Microsoft.Maui.Devices.Battery.EnergySaverStatusChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Battery.PowerSource.get -> Microsoft.Maui.Devices.BatteryPowerSource +static Microsoft.Maui.Devices.Battery.State.get -> Microsoft.Maui.Devices.BatteryState +static Microsoft.Maui.Devices.DeviceDisplay.Current.get -> Microsoft.Maui.Devices.IDeviceDisplay! +static Microsoft.Maui.Devices.DeviceDisplay.KeepScreenOn.get -> bool +static Microsoft.Maui.Devices.DeviceDisplay.KeepScreenOn.set -> void +static Microsoft.Maui.Devices.DeviceDisplay.MainDisplayInfo.get -> Microsoft.Maui.Devices.DisplayInfo +static Microsoft.Maui.Devices.DeviceDisplay.MainDisplayInfoChanged -> System.EventHandler! +static Microsoft.Maui.Devices.DeviceIdiom.Desktop.get -> Microsoft.Maui.Devices.DeviceIdiom +static Microsoft.Maui.Devices.DeviceIdiom.operator !=(Microsoft.Maui.Devices.DeviceIdiom left, Microsoft.Maui.Devices.DeviceIdiom right) -> bool +static Microsoft.Maui.Devices.DeviceIdiom.operator ==(Microsoft.Maui.Devices.DeviceIdiom left, Microsoft.Maui.Devices.DeviceIdiom right) -> bool +static Microsoft.Maui.Devices.DeviceIdiom.Phone.get -> Microsoft.Maui.Devices.DeviceIdiom +static Microsoft.Maui.Devices.DeviceIdiom.Tablet.get -> Microsoft.Maui.Devices.DeviceIdiom +static Microsoft.Maui.Devices.DeviceIdiom.TV.get -> Microsoft.Maui.Devices.DeviceIdiom +static Microsoft.Maui.Devices.DeviceIdiom.Unknown.get -> Microsoft.Maui.Devices.DeviceIdiom +static Microsoft.Maui.Devices.DeviceIdiom.Watch.get -> Microsoft.Maui.Devices.DeviceIdiom +static Microsoft.Maui.Devices.DeviceInfo.Current.get -> Microsoft.Maui.Devices.IDeviceInfo! +static Microsoft.Maui.Devices.DeviceInfo.DeviceType.get -> Microsoft.Maui.Devices.DeviceType +static Microsoft.Maui.Devices.DeviceInfo.Idiom.get -> Microsoft.Maui.Devices.DeviceIdiom +static Microsoft.Maui.Devices.DeviceInfo.Manufacturer.get -> string! +static Microsoft.Maui.Devices.DeviceInfo.Model.get -> string! +static Microsoft.Maui.Devices.DeviceInfo.Name.get -> string! +static Microsoft.Maui.Devices.DeviceInfo.Platform.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DeviceInfo.Version.get -> System.Version! +static Microsoft.Maui.Devices.DeviceInfo.VersionString.get -> string! +static Microsoft.Maui.Devices.DevicePlatform.Android.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.iOS.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.MacCatalyst.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.macOS.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.operator !=(Microsoft.Maui.Devices.DevicePlatform left, Microsoft.Maui.Devices.DevicePlatform right) -> bool +static Microsoft.Maui.Devices.DevicePlatform.operator ==(Microsoft.Maui.Devices.DevicePlatform left, Microsoft.Maui.Devices.DevicePlatform right) -> bool +static Microsoft.Maui.Devices.DevicePlatform.Tizen.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.tvOS.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.Unknown.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.UWP.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.watchOS.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DevicePlatform.WinUI.get -> Microsoft.Maui.Devices.DevicePlatform +static Microsoft.Maui.Devices.DisplayInfo.operator !=(Microsoft.Maui.Devices.DisplayInfo left, Microsoft.Maui.Devices.DisplayInfo right) -> bool +static Microsoft.Maui.Devices.DisplayInfo.operator ==(Microsoft.Maui.Devices.DisplayInfo left, Microsoft.Maui.Devices.DisplayInfo right) -> bool +static Microsoft.Maui.Devices.Flashlight.Default.get -> Microsoft.Maui.Devices.IFlashlight! +static Microsoft.Maui.Devices.Flashlight.TurnOffAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Flashlight.TurnOnAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.HapticFeedback.Default.get -> Microsoft.Maui.Devices.IHapticFeedback! +static Microsoft.Maui.Devices.HapticFeedback.Perform(Microsoft.Maui.Devices.HapticFeedbackType type = Microsoft.Maui.Devices.HapticFeedbackType.Click) -> void +static Microsoft.Maui.Devices.Sensors.Accelerometer.Default.get -> Microsoft.Maui.Devices.Sensors.IAccelerometer! +static Microsoft.Maui.Devices.Sensors.Accelerometer.IsMonitoring.get -> bool +static Microsoft.Maui.Devices.Sensors.Accelerometer.IsSupported.get -> bool +static Microsoft.Maui.Devices.Sensors.Accelerometer.ReadingChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Sensors.Accelerometer.ShakeDetected -> System.EventHandler! +static Microsoft.Maui.Devices.Sensors.Accelerometer.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +static Microsoft.Maui.Devices.Sensors.Accelerometer.Stop() -> void +static Microsoft.Maui.Devices.Sensors.AccelerometerData.operator !=(Microsoft.Maui.Devices.Sensors.AccelerometerData left, Microsoft.Maui.Devices.Sensors.AccelerometerData right) -> bool +static Microsoft.Maui.Devices.Sensors.AccelerometerData.operator ==(Microsoft.Maui.Devices.Sensors.AccelerometerData left, Microsoft.Maui.Devices.Sensors.AccelerometerData right) -> bool +static Microsoft.Maui.Devices.Sensors.Barometer.Default.get -> Microsoft.Maui.Devices.Sensors.IBarometer! +static Microsoft.Maui.Devices.Sensors.Barometer.IsMonitoring.get -> bool +static Microsoft.Maui.Devices.Sensors.Barometer.IsSupported.get -> bool +static Microsoft.Maui.Devices.Sensors.Barometer.ReadingChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Sensors.Barometer.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +static Microsoft.Maui.Devices.Sensors.Barometer.Stop() -> void +static Microsoft.Maui.Devices.Sensors.BarometerData.operator !=(Microsoft.Maui.Devices.Sensors.BarometerData left, Microsoft.Maui.Devices.Sensors.BarometerData right) -> bool +static Microsoft.Maui.Devices.Sensors.BarometerData.operator ==(Microsoft.Maui.Devices.Sensors.BarometerData left, Microsoft.Maui.Devices.Sensors.BarometerData right) -> bool +static Microsoft.Maui.Devices.Sensors.Compass.Default.get -> Microsoft.Maui.Devices.Sensors.ICompass! +static Microsoft.Maui.Devices.Sensors.Compass.IsMonitoring.get -> bool +static Microsoft.Maui.Devices.Sensors.Compass.IsSupported.get -> bool +static Microsoft.Maui.Devices.Sensors.Compass.ReadingChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Sensors.Compass.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +static Microsoft.Maui.Devices.Sensors.Compass.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed, bool applyLowPassFilter) -> void +static Microsoft.Maui.Devices.Sensors.Compass.Stop() -> void +static Microsoft.Maui.Devices.Sensors.CompassData.operator !=(Microsoft.Maui.Devices.Sensors.CompassData left, Microsoft.Maui.Devices.Sensors.CompassData right) -> bool +static Microsoft.Maui.Devices.Sensors.CompassData.operator ==(Microsoft.Maui.Devices.Sensors.CompassData left, Microsoft.Maui.Devices.Sensors.CompassData right) -> bool +static Microsoft.Maui.Devices.Sensors.Geocoding.Default.get -> Microsoft.Maui.Devices.Sensors.IGeocoding! +static Microsoft.Maui.Devices.Sensors.Geocoding.GetLocationsAsync(string! address) -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.Devices.Sensors.Geocoding.GetPlacemarksAsync(double latitude, double longitude) -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.Devices.Sensors.Geocoding.GetPlacemarksAsync(Microsoft.Maui.Devices.Sensors.Location! location) -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.Devices.Sensors.GeocodingExtensions.GetPlacemarksAsync(this Microsoft.Maui.Devices.Sensors.IGeocoding! geocoding, Microsoft.Maui.Devices.Sensors.Location! location) -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.Devices.Sensors.Geolocation.Default.get -> Microsoft.Maui.Devices.Sensors.IGeolocation! +static Microsoft.Maui.Devices.Sensors.Geolocation.GetLastKnownLocationAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Sensors.Geolocation.GetLocationAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Sensors.Geolocation.GetLocationAsync(Microsoft.Maui.Devices.Sensors.GeolocationRequest! request) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Sensors.Geolocation.GetLocationAsync(Microsoft.Maui.Devices.Sensors.GeolocationRequest! request, System.Threading.CancellationToken cancelToken) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Sensors.GeolocationExtensions.GetLocationAsync(this Microsoft.Maui.Devices.Sensors.IGeolocation! geolocation) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Sensors.GeolocationExtensions.GetLocationAsync(this Microsoft.Maui.Devices.Sensors.IGeolocation! geolocation, Microsoft.Maui.Devices.Sensors.GeolocationRequest! request) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Devices.Sensors.Gyroscope.Default.get -> Microsoft.Maui.Devices.Sensors.IGyroscope! +static Microsoft.Maui.Devices.Sensors.Gyroscope.IsMonitoring.get -> bool +static Microsoft.Maui.Devices.Sensors.Gyroscope.IsSupported.get -> bool +static Microsoft.Maui.Devices.Sensors.Gyroscope.ReadingChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Sensors.Gyroscope.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +static Microsoft.Maui.Devices.Sensors.Gyroscope.Stop() -> void +static Microsoft.Maui.Devices.Sensors.GyroscopeData.operator !=(Microsoft.Maui.Devices.Sensors.GyroscopeData left, Microsoft.Maui.Devices.Sensors.GyroscopeData right) -> bool +static Microsoft.Maui.Devices.Sensors.GyroscopeData.operator ==(Microsoft.Maui.Devices.Sensors.GyroscopeData left, Microsoft.Maui.Devices.Sensors.GyroscopeData right) -> bool +static Microsoft.Maui.Devices.Sensors.Location.CalculateDistance(double latitudeStart, double longitudeStart, double latitudeEnd, double longitudeEnd, Microsoft.Maui.Devices.Sensors.DistanceUnits units) -> double +static Microsoft.Maui.Devices.Sensors.Magnetometer.Default.get -> Microsoft.Maui.Devices.Sensors.IMagnetometer! +static Microsoft.Maui.Devices.Sensors.Magnetometer.IsMonitoring.get -> bool +static Microsoft.Maui.Devices.Sensors.Magnetometer.IsSupported.get -> bool +static Microsoft.Maui.Devices.Sensors.Magnetometer.ReadingChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Sensors.Magnetometer.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +static Microsoft.Maui.Devices.Sensors.Magnetometer.Stop() -> void +static Microsoft.Maui.Devices.Sensors.MagnetometerData.operator !=(Microsoft.Maui.Devices.Sensors.MagnetometerData left, Microsoft.Maui.Devices.Sensors.MagnetometerData right) -> bool +static Microsoft.Maui.Devices.Sensors.MagnetometerData.operator ==(Microsoft.Maui.Devices.Sensors.MagnetometerData left, Microsoft.Maui.Devices.Sensors.MagnetometerData right) -> bool +static Microsoft.Maui.Devices.Sensors.OrientationSensor.Default.get -> Microsoft.Maui.Devices.Sensors.IOrientationSensor! +static Microsoft.Maui.Devices.Sensors.OrientationSensor.IsMonitoring.get -> bool +static Microsoft.Maui.Devices.Sensors.OrientationSensor.IsSupported.get -> bool +static Microsoft.Maui.Devices.Sensors.OrientationSensor.ReadingChanged -> System.EventHandler! +static Microsoft.Maui.Devices.Sensors.OrientationSensor.Start(Microsoft.Maui.Devices.Sensors.SensorSpeed sensorSpeed) -> void +static Microsoft.Maui.Devices.Sensors.OrientationSensor.Stop() -> void +static Microsoft.Maui.Devices.Sensors.OrientationSensorData.operator !=(Microsoft.Maui.Devices.Sensors.OrientationSensorData left, Microsoft.Maui.Devices.Sensors.OrientationSensorData right) -> bool +static Microsoft.Maui.Devices.Sensors.OrientationSensorData.operator ==(Microsoft.Maui.Devices.Sensors.OrientationSensorData left, Microsoft.Maui.Devices.Sensors.OrientationSensorData right) -> bool +static Microsoft.Maui.Devices.Vibration.Cancel() -> void +static Microsoft.Maui.Devices.Vibration.Default.get -> Microsoft.Maui.Devices.IVibration! +static Microsoft.Maui.Devices.Vibration.Vibrate() -> void +static Microsoft.Maui.Devices.Vibration.Vibrate(double duration) -> void +static Microsoft.Maui.Devices.Vibration.Vibrate(System.TimeSpan duration) -> void +static Microsoft.Maui.Devices.VibrationExtensions.Vibrate(this Microsoft.Maui.Devices.IVibration! vibration, double duration) -> void +static Microsoft.Maui.Media.MediaPicker.CapturePhotoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.MediaPicker.CaptureVideoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.MediaPicker.Default.get -> Microsoft.Maui.Media.IMediaPicker! +static Microsoft.Maui.Media.MediaPicker.IsCaptureSupported.get -> bool +static Microsoft.Maui.Media.MediaPicker.PickPhotoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.MediaPicker.PickVideoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.Screenshot.CaptureAsync() -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.Screenshot.Default.get -> Microsoft.Maui.Media.IScreenshot! +static Microsoft.Maui.Media.Screenshot.IsCaptureSupported.get -> bool +static Microsoft.Maui.Media.TextToSpeech.Default.get -> Microsoft.Maui.Media.ITextToSpeech! +static Microsoft.Maui.Media.TextToSpeech.GetLocalesAsync() -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.Media.TextToSpeech.SpeakAsync(string! text, Microsoft.Maui.Media.SpeechOptions? options, System.Threading.CancellationToken cancelToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.TextToSpeech.SpeakAsync(string! text, System.Threading.CancellationToken cancelToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Media.UnitConverters.AtmospheresToPascals(double atm) -> double +static Microsoft.Maui.Media.UnitConverters.CelsiusToFahrenheit(double celsius) -> double +static Microsoft.Maui.Media.UnitConverters.CelsiusToKelvin(double celsius) -> double +static Microsoft.Maui.Media.UnitConverters.CoordinatesToKilometers(double lat1, double lon1, double lat2, double lon2) -> double +static Microsoft.Maui.Media.UnitConverters.CoordinatesToMiles(double lat1, double lon1, double lat2, double lon2) -> double +static Microsoft.Maui.Media.UnitConverters.DegreesPerSecondToHertz(double degrees) -> double +static Microsoft.Maui.Media.UnitConverters.DegreesPerSecondToRadiansPerSecond(double degrees) -> double +static Microsoft.Maui.Media.UnitConverters.DegreesToRadians(double degrees) -> double +static Microsoft.Maui.Media.UnitConverters.FahrenheitToCelsius(double fahrenheit) -> double +static Microsoft.Maui.Media.UnitConverters.HectopascalsToKilopascals(double hpa) -> double +static Microsoft.Maui.Media.UnitConverters.HectopascalsToPascals(double hpa) -> double +static Microsoft.Maui.Media.UnitConverters.HertzToDegreesPerSecond(double hertz) -> double +static Microsoft.Maui.Media.UnitConverters.HertzToRadiansPerSecond(double hertz) -> double +static Microsoft.Maui.Media.UnitConverters.InternationalFeetToMeters(double internationalFeet) -> double +static Microsoft.Maui.Media.UnitConverters.KelvinToCelsius(double kelvin) -> double +static Microsoft.Maui.Media.UnitConverters.KilogramsToPounds(double kilograms) -> double +static Microsoft.Maui.Media.UnitConverters.KilometersToMiles(double kilometers) -> double +static Microsoft.Maui.Media.UnitConverters.KilopascalsToHectopascals(double kpa) -> double +static Microsoft.Maui.Media.UnitConverters.KilopascalsToPascals(double kpa) -> double +static Microsoft.Maui.Media.UnitConverters.MetersToInternationalFeet(double meters) -> double +static Microsoft.Maui.Media.UnitConverters.MetersToUSSurveyFeet(double meters) -> double +static Microsoft.Maui.Media.UnitConverters.MilesToKilometers(double miles) -> double +static Microsoft.Maui.Media.UnitConverters.MilesToMeters(double miles) -> double +static Microsoft.Maui.Media.UnitConverters.PascalsToAtmospheres(double pascals) -> double +static Microsoft.Maui.Media.UnitConverters.PoundsToKilograms(double pounds) -> double +static Microsoft.Maui.Media.UnitConverters.PoundsToStones(double pounds) -> double +static Microsoft.Maui.Media.UnitConverters.RadiansPerSecondToDegreesPerSecond(double radians) -> double +static Microsoft.Maui.Media.UnitConverters.RadiansPerSecondToHertz(double radians) -> double +static Microsoft.Maui.Media.UnitConverters.RadiansToDegrees(double radians) -> double +static Microsoft.Maui.Media.UnitConverters.StonesToPounds(double stones) -> double +static Microsoft.Maui.Media.UnitConverters.USSurveyFeetToMeters(double usFeet) -> double +static Microsoft.Maui.Networking.Connectivity.ConnectionProfiles.get -> System.Collections.Generic.IEnumerable! +static Microsoft.Maui.Networking.Connectivity.ConnectivityChanged -> System.EventHandler! +static Microsoft.Maui.Networking.Connectivity.Current.get -> Microsoft.Maui.Networking.IConnectivity! +static Microsoft.Maui.Networking.Connectivity.NetworkAccess.get -> Microsoft.Maui.Networking.NetworkAccess +static Microsoft.Maui.Storage.FilePicker.Default.get -> Microsoft.Maui.Storage.IFilePicker! +static Microsoft.Maui.Storage.FilePicker.PickAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Storage.FilePicker.PickMultipleAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task!>! +static Microsoft.Maui.Storage.FileSystem.AppDataDirectory.get -> string! +static Microsoft.Maui.Storage.FileSystem.AppPackageFileExistsAsync(string! filename) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Storage.FileSystem.CacheDirectory.get -> string! +static Microsoft.Maui.Storage.FileSystem.Current.get -> Microsoft.Maui.Storage.IFileSystem! +static Microsoft.Maui.Storage.FileSystem.OpenAppPackageFileAsync(string! filename) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Storage.PickOptions.Default.get -> Microsoft.Maui.Storage.PickOptions! +static Microsoft.Maui.Storage.PickOptions.Images.get -> Microsoft.Maui.Storage.PickOptions! +static Microsoft.Maui.Storage.Preferences.Clear() -> void +static Microsoft.Maui.Storage.Preferences.Clear(string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.ContainsKey(string! key) -> bool +static Microsoft.Maui.Storage.Preferences.ContainsKey(string! key, string? sharedName) -> bool +static Microsoft.Maui.Storage.Preferences.Default.get -> Microsoft.Maui.Storage.IPreferences! +static Microsoft.Maui.Storage.Preferences.Get(string! key, bool defaultValue) -> bool +static Microsoft.Maui.Storage.Preferences.Get(string! key, bool defaultValue, string? sharedName) -> bool +static Microsoft.Maui.Storage.Preferences.Get(string! key, double defaultValue) -> double +static Microsoft.Maui.Storage.Preferences.Get(string! key, double defaultValue, string? sharedName) -> double +static Microsoft.Maui.Storage.Preferences.Get(string! key, float defaultValue) -> float +static Microsoft.Maui.Storage.Preferences.Get(string! key, float defaultValue, string? sharedName) -> float +static Microsoft.Maui.Storage.Preferences.Get(string! key, int defaultValue) -> int +static Microsoft.Maui.Storage.Preferences.Get(string! key, int defaultValue, string? sharedName) -> int +static Microsoft.Maui.Storage.Preferences.Get(string! key, long defaultValue) -> long +static Microsoft.Maui.Storage.Preferences.Get(string! key, long defaultValue, string? sharedName) -> long +static Microsoft.Maui.Storage.Preferences.Get(string! key, string? defaultValue) -> string? +static Microsoft.Maui.Storage.Preferences.Get(string! key, string? defaultValue, string? sharedName) -> string? +static Microsoft.Maui.Storage.Preferences.Get(string! key, System.DateTime defaultValue) -> System.DateTime +static Microsoft.Maui.Storage.Preferences.Get(string! key, System.DateTime defaultValue, string? sharedName) -> System.DateTime +static Microsoft.Maui.Storage.Preferences.Remove(string! key) -> void +static Microsoft.Maui.Storage.Preferences.Remove(string! key, string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, bool value) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, bool value, string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, double value) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, double value, string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, float value) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, float value, string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, int value) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, int value, string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, long value) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, long value, string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, string? value) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, string? value, string? sharedName) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, System.DateTime value) -> void +static Microsoft.Maui.Storage.Preferences.Set(string! key, System.DateTime value, string? sharedName) -> void +static Microsoft.Maui.Storage.SecureStorage.Default.get -> Microsoft.Maui.Storage.ISecureStorage! +static Microsoft.Maui.Storage.SecureStorage.GetAsync(string! key) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Storage.SecureStorage.Remove(string! key) -> bool +static Microsoft.Maui.Storage.SecureStorage.RemoveAll() -> void +static Microsoft.Maui.Storage.SecureStorage.SetAsync(string! key, string! value) -> System.Threading.Tasks.Task! +static readonly Microsoft.Maui.Storage.FilePickerFileType.Images -> Microsoft.Maui.Storage.FilePickerFileType! +static readonly Microsoft.Maui.Storage.FilePickerFileType.Jpeg -> Microsoft.Maui.Storage.FilePickerFileType! +static readonly Microsoft.Maui.Storage.FilePickerFileType.Pdf -> Microsoft.Maui.Storage.FilePickerFileType! +static readonly Microsoft.Maui.Storage.FilePickerFileType.Png -> Microsoft.Maui.Storage.FilePickerFileType! +static readonly Microsoft.Maui.Storage.FilePickerFileType.Videos -> Microsoft.Maui.Storage.FilePickerFileType! +virtual Microsoft.Maui.Storage.FilePickerFileType.GetPlatformFileType(Microsoft.Maui.Devices.DevicePlatform platform) -> System.Collections.Generic.IEnumerable! +~abstract Microsoft.Maui.ApplicationModel.Permissions.BasePermission.CheckStatusAsync() -> System.Threading.Tasks.Task +~abstract Microsoft.Maui.ApplicationModel.Permissions.BasePermission.RequestAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.ApplicationModel.Communication.Contact.Contact(string id, string namePrefix, string givenName, string middleName, string familyName, string nameSuffix, System.Collections.Generic.IEnumerable phones, System.Collections.Generic.IEnumerable email, string displayName = null) -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.DisplayName.get -> string +~Microsoft.Maui.ApplicationModel.Communication.Contact.Emails.get -> System.Collections.Generic.List +~Microsoft.Maui.ApplicationModel.Communication.Contact.Emails.set -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.FamilyName.get -> string +~Microsoft.Maui.ApplicationModel.Communication.Contact.FamilyName.set -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.GivenName.get -> string +~Microsoft.Maui.ApplicationModel.Communication.Contact.GivenName.set -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.Id.get -> string +~Microsoft.Maui.ApplicationModel.Communication.Contact.Id.set -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.MiddleName.get -> string +~Microsoft.Maui.ApplicationModel.Communication.Contact.MiddleName.set -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.NamePrefix.get -> string +~Microsoft.Maui.ApplicationModel.Communication.Contact.NamePrefix.set -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.NameSuffix.get -> string +~Microsoft.Maui.ApplicationModel.Communication.Contact.NameSuffix.set -> void +~Microsoft.Maui.ApplicationModel.Communication.Contact.Phones.get -> System.Collections.Generic.List +~Microsoft.Maui.ApplicationModel.Communication.Contact.Phones.set -> void +~Microsoft.Maui.ApplicationModel.Communication.ContactEmail.ContactEmail(string emailAddress) -> void +~Microsoft.Maui.ApplicationModel.Communication.ContactEmail.EmailAddress.get -> string +~Microsoft.Maui.ApplicationModel.Communication.ContactEmail.EmailAddress.set -> void +~Microsoft.Maui.ApplicationModel.Communication.ContactPhone.ContactPhone(string phoneNumber) -> void +~Microsoft.Maui.ApplicationModel.Communication.ContactPhone.PhoneNumber.get -> string +~Microsoft.Maui.ApplicationModel.Communication.ContactPhone.PhoneNumber.set -> void +~Microsoft.Maui.ApplicationModel.FeatureNotEnabledException.FeatureNotEnabledException(string message) -> void +~Microsoft.Maui.ApplicationModel.FeatureNotEnabledException.FeatureNotEnabledException(string message, System.Exception innerException) -> void +~Microsoft.Maui.ApplicationModel.FeatureNotSupportedException.FeatureNotSupportedException(string message) -> void +~Microsoft.Maui.ApplicationModel.FeatureNotSupportedException.FeatureNotSupportedException(string message, System.Exception innerException) -> void +~Microsoft.Maui.ApplicationModel.MapLaunchOptions.Name.get -> string +~Microsoft.Maui.ApplicationModel.MapLaunchOptions.Name.set -> void +~Microsoft.Maui.ApplicationModel.PermissionException.PermissionException(string message) -> void +~Microsoft.Maui.Authentication.WebAuthenticatorResult.AccessToken.get -> string +~Microsoft.Maui.Authentication.WebAuthenticatorResult.Get(string key) -> string +~Microsoft.Maui.Authentication.WebAuthenticatorResult.IdToken.get -> string +~Microsoft.Maui.Authentication.WebAuthenticatorResult.Properties.get -> System.Collections.Generic.Dictionary +~Microsoft.Maui.Authentication.WebAuthenticatorResult.Properties.set -> void +~Microsoft.Maui.Authentication.WebAuthenticatorResult.Put(string key, string value) -> void +~Microsoft.Maui.Authentication.WebAuthenticatorResult.RefreshToken.get -> string +~Microsoft.Maui.Authentication.WebAuthenticatorResult.WebAuthenticatorResult(System.Collections.Generic.IDictionary properties) -> void +~Microsoft.Maui.Authentication.WebAuthenticatorResult.WebAuthenticatorResult(System.Uri uri) -> void +~Microsoft.Maui.Devices.Sensors.Location.Location(Microsoft.Maui.Devices.Sensors.Location point) -> void +~Microsoft.Maui.Devices.Sensors.Placemark.AdminArea.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.AdminArea.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.CountryCode.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.CountryCode.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.CountryName.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.CountryName.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.FeatureName.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.FeatureName.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.Locality.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.Locality.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.Location.get -> Microsoft.Maui.Devices.Sensors.Location +~Microsoft.Maui.Devices.Sensors.Placemark.Location.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.Placemark(Microsoft.Maui.Devices.Sensors.Placemark placemark) -> void +~Microsoft.Maui.Devices.Sensors.Placemark.PostalCode.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.PostalCode.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.SubAdminArea.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.SubAdminArea.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.SubLocality.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.SubLocality.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.SubThoroughfare.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.SubThoroughfare.set -> void +~Microsoft.Maui.Devices.Sensors.Placemark.Thoroughfare.get -> string +~Microsoft.Maui.Devices.Sensors.Placemark.Thoroughfare.set -> void +~Microsoft.Maui.Networking.ConnectivityChangedEventArgs.ConnectionProfiles.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Networking.ConnectivityChangedEventArgs.ConnectivityChangedEventArgs(Microsoft.Maui.Networking.NetworkAccess access, System.Collections.Generic.IEnumerable connectionProfiles) -> void +~Microsoft.Maui.Networking.IConnectivity.ConnectionProfiles.get -> System.Collections.Generic.IEnumerable +~override Microsoft.Maui.ApplicationModel.Communication.Contact.ToString() -> string +~override Microsoft.Maui.ApplicationModel.Communication.ContactEmail.ToString() -> string +~override Microsoft.Maui.ApplicationModel.Communication.ContactPhone.ToString() -> string +~override Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission.CheckStatusAsync() -> System.Threading.Tasks.Task +~override Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission.RequestAsync() -> System.Threading.Tasks.Task +~override Microsoft.Maui.Devices.DeviceIdiom.Equals(object obj) -> bool +~override Microsoft.Maui.Devices.DeviceIdiom.ToString() -> string +~override Microsoft.Maui.Devices.DevicePlatform.Equals(object obj) -> bool +~override Microsoft.Maui.Devices.DevicePlatform.ToString() -> string +~override Microsoft.Maui.Devices.DisplayInfo.Equals(object obj) -> bool +~override Microsoft.Maui.Devices.DisplayInfo.ToString() -> string +~override Microsoft.Maui.Devices.Sensors.GeolocationRequest.ToString() -> string +~override Microsoft.Maui.Devices.Sensors.Location.ToString() -> string +~override Microsoft.Maui.Devices.Sensors.Placemark.ToString() -> string +~override Microsoft.Maui.Networking.ConnectivityChangedEventArgs.ToString() -> string +~static Microsoft.Maui.ApplicationModel.MainThread.BeginInvokeOnMainThread(System.Action action) -> void +~static Microsoft.Maui.ApplicationModel.MainThread.GetMainThreadSynchronizationContextAsync() -> System.Threading.Tasks.Task +~static Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync(System.Action action) -> System.Threading.Tasks.Task +~static Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync(System.Func funcTask) -> System.Threading.Tasks.Task +~static Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync(System.Func> funcTask) -> System.Threading.Tasks.Task +~static Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync(System.Func func) -> System.Threading.Tasks.Task +~static Microsoft.Maui.ApplicationModel.Permissions.CheckStatusAsync() -> System.Threading.Tasks.Task +~static Microsoft.Maui.ApplicationModel.Permissions.RequestAsync() -> System.Threading.Tasks.Task +~static Microsoft.Maui.ApplicationModel.Permissions.ShouldShowRationale() -> bool +~static Microsoft.Maui.Devices.DeviceIdiom.Create(string deviceIdiom) -> Microsoft.Maui.Devices.DeviceIdiom +~static Microsoft.Maui.Devices.DevicePlatform.Create(string devicePlatform) -> Microsoft.Maui.Devices.DevicePlatform +~static Microsoft.Maui.Devices.Sensors.Location.CalculateDistance(double latitudeStart, double longitudeStart, Microsoft.Maui.Devices.Sensors.Location locationEnd, Microsoft.Maui.Devices.Sensors.DistanceUnits units) -> double +~static Microsoft.Maui.Devices.Sensors.Location.CalculateDistance(Microsoft.Maui.Devices.Sensors.Location locationStart, double latitudeEnd, double longitudeEnd, Microsoft.Maui.Devices.Sensors.DistanceUnits units) -> double +~static Microsoft.Maui.Devices.Sensors.Location.CalculateDistance(Microsoft.Maui.Devices.Sensors.Location locationStart, Microsoft.Maui.Devices.Sensors.Location locationEnd, Microsoft.Maui.Devices.Sensors.DistanceUnits units) -> double +~static Microsoft.Maui.Devices.Sensors.LocationExtensions.CalculateDistance(this Microsoft.Maui.Devices.Sensors.Location locationStart, double latitudeEnd, double longitudeEnd, Microsoft.Maui.Devices.Sensors.DistanceUnits units) -> double +~static Microsoft.Maui.Devices.Sensors.LocationExtensions.CalculateDistance(this Microsoft.Maui.Devices.Sensors.Location locationStart, Microsoft.Maui.Devices.Sensors.Location locationEnd, Microsoft.Maui.Devices.Sensors.DistanceUnits units) -> double +~static Microsoft.Maui.Devices.Sensors.LocationExtensions.OpenMapsAsync(this Microsoft.Maui.Devices.Sensors.Location location) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Devices.Sensors.LocationExtensions.OpenMapsAsync(this Microsoft.Maui.Devices.Sensors.Location location, Microsoft.Maui.ApplicationModel.MapLaunchOptions options) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Devices.Sensors.PlacemarkExtensions.OpenMapsAsync(this Microsoft.Maui.Devices.Sensors.Placemark placemark) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Devices.Sensors.PlacemarkExtensions.OpenMapsAsync(this Microsoft.Maui.Devices.Sensors.Placemark placemark, Microsoft.Maui.ApplicationModel.MapLaunchOptions options) -> System.Threading.Tasks.Task diff --git a/src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..ab058de62d44 --- /dev/null +++ b/src/Essentials/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable From 44f7cf30fcc4ce1e66d91d886239cd90e533feb0 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 14:36:42 +0200 Subject: [PATCH 167/425] [Gtk] Core.csproj: track api changes II --- .../ActivityIndicatorHandler.Gtk.cs | 6 +- .../Application/ApplicationHandler.Gtk.cs | 11 ++++ .../Application/ApplicationHandler.cs | 2 + .../src/Handlers/Border/BorderHandler.Gtk.cs | 15 +++++ src/Core/src/Handlers/Border/BorderHandler.cs | 2 + .../src/Handlers/Border/IBorderHandler.cs | 2 + .../src/Handlers/Button/ButtonHandler.Gtk.cs | 10 +-- .../Handlers/CheckBox/CheckBoxHandler.Gtk.cs | 6 +- .../src/Handlers/CheckBox/CheckBoxHandler.cs | 2 + .../src/Handlers/CheckBox/ICheckboxHandler.cs | 2 + .../ContentView/ContentViewHandler.Gtk.cs | 28 +++++++++ .../ContentView/ContentViewHandler.cs | 2 + .../ContentView/IContentViewHandler.cs | 2 + .../DatePicker/DatePickerHandler.Gtk.cs | 8 +-- .../src/Handlers/Editor/EditorHandler.Gtk.cs | 12 ++-- .../src/Handlers/ElementHandlerExtensions.cs | 2 + .../src/Handlers/Entry/EntryHandler.Gtk.cs | 38 +++++------ .../FlyoutView/FlyoutViewHandler.Gtk.cs | 12 ++++ .../GraphicsView/GraphicsViewHandler.Gtk.cs | 11 +++- .../GraphicsView/GraphicsViewHandler.cs | 2 +- .../GraphicsView/IGraphicsViewHandler.cs | 2 +- src/Core/src/Handlers/Image/IImageHandler.cs | 2 + .../src/Handlers/Image/ImageHandler.Gtk.cs | 18 +++--- src/Core/src/Handlers/Image/ImageHandler.cs | 2 + .../ImageButton/IImageButtonHandler.cs | 2 + .../ImageButton/ImageButtonHandler.Gtk.cs | 19 ++++++ .../ImageButton/ImageButtonHandler.cs | 4 ++ .../IndicatorView/IIndicatorViewHandler.cs | 2 + .../IndicatorView/IndicatorViewHandler.Gtk.cs | 19 ++++++ .../IndicatorView/IndicatorViewHandler.cs | 2 + .../src/Handlers/Label/LabelHandler.Gtk.cs | 31 ++++----- .../src/Handlers/Layout/ILayoutHandler.cs | 2 + .../src/Handlers/Layout/LayoutHandler.Gtk.cs | 63 ++++++++++--------- src/Core/src/Handlers/Layout/LayoutHandler.cs | 2 + .../src/Handlers/MenuBar/IMenuBarHandler.cs | 2 + .../Handlers/MenuBar/MenuBarHandler.Gtk.cs | 28 +++++++++ .../src/Handlers/MenuBar/MenuBarHandler.cs | 2 + .../MenuBarItem/IMenuBarItemHandler.cs | 2 + .../MenuBarItem/MenuBarItemHandler.Gtk.cs | 28 +++++++++ .../MenuBarItem/MenuBarItemHandler.cs | 2 + .../MenuFlyoutItem/IMenuFlyoutItemHandler.cs | 2 + .../MenuFlyoutItem/MenuFlyoutItemHandler.cs | 2 + .../IMenuFlyoutSeparatorHandler.cs | 2 + .../MenuFlyoutSeparatorHandler.cs | 4 +- .../IMenuFlyoutSubItemHandler.cs | 2 + .../MenuFlyoutSubItemHandler.Gtk.cs | 28 +++++++++ .../MenuFlyoutSubItemHandler.cs | 2 + .../NavigationPage/INavigationViewHandler.cs | 2 + ...er.Gtk.cs => NavigationViewHandler.Gtk.cs} | 15 ++--- .../NavigationPage/NavigationViewHandler.cs | 2 + src/Core/src/Handlers/Page/PageHandler.Gtk.cs | 25 +++----- .../src/Handlers/Picker/PickerHandler.Gtk.cs | 24 +++---- .../ProgressBar/ProgressBarHandler.Gtk.cs | 4 +- .../RadioButton/IRadioButtonHandler.cs | 2 + .../RadioButton/RadioButtonHandler.Gtk.cs | 19 ++++++ .../RadioButton/RadioButtonHandler.cs | 2 + .../RefreshView/RefreshViewHandler.Gtk.cs | 4 +- .../Handlers/ScrollView/IScrollViewHandler.cs | 2 + .../ScrollView/ScrollViewHandler.Gtk.cs | 18 +++--- .../Handlers/ScrollView/ScrollViewHandler.cs | 2 + .../Handlers/SearchBar/ISearchBarHandler.cs | 3 + .../SearchBar/SearchBarHandler.Gtk.cs | 54 +++++++++------- .../Handlers/SearchBar/SearchBarHandler.cs | 2 + .../ShapeView/ShapeViewHandler.Gtk.cs | 22 +++---- .../src/Handlers/Slider/SliderHandler.Gtk.cs | 16 ++--- .../src/Handlers/Stepper/IStepperHandler.cs | 2 + .../Handlers/Stepper/StepperHandler.Gtk.cs | 14 ++--- .../src/Handlers/Stepper/StepperHandler.cs | 2 + .../ISwipeItemMenuItemHandler.cs | 2 + .../SwipeItemMenuItemHandler.Gtk.cs | 31 +++++++++ .../SwipeItemMenuItemHandler.cs | 2 + .../SwipeItemView/ISwipeItemViewHandler.cs | 2 + .../SwipeItemView/SwipeItemViewHandler.Gtk.cs | 20 ++++++ .../SwipeItemView/SwipeItemViewHandler.cs | 2 + .../Handlers/SwipeView/ISwipeViewHandler.cs | 2 + .../SwipeView/SwipeViewHandler.Gtk.cs | 46 ++++++++++++++ .../Handlers/SwipeView/SwipeViewHandler.cs | 2 + .../src/Handlers/Switch/SwitchHandler.Gtk.cs | 6 +- .../Handlers/TabbedView/TabbedViewHandler.cs | 2 + .../TimePicker/TimePickerHandler.Gtk.cs | 8 +-- .../src/Handlers/Toolbar/IToolbarHandler.cs | 2 + .../Handlers/Toolbar/ToolbarHandler.Gtk.cs | 13 ++++ .../src/Handlers/Toolbar/ToolbarHandler.cs | 2 + src/Core/src/Handlers/View/ViewHandler.Gtk.cs | 2 +- .../src/Handlers/View/ViewHandlerOfT.Gtk.cs | 2 +- .../src/Handlers/WebView/IWebViewHandler.cs | 2 + .../Handlers/WebView/WebViewHandler.Gtk.cs | 17 +++++ .../src/Handlers/WebView/WebViewHandler.cs | 2 + .../src/Handlers/Window/IWindowHandler.cs | 2 + .../src/Handlers/Window/WindowHandler.Gtk.cs | 12 ++-- src/Core/src/Platform/Gtk/ContentView.cs | 41 ++++++++++++ .../src/Platform/Gtk/DatePickerExtensions.cs | 2 +- .../src/Platform/Gtk/HandlerExtensions.cs | 2 +- src/Core/src/Platform/Gtk/ImageView.cs | 2 +- .../src/Platform/Gtk/ImageViewExtensions.cs | 2 +- src/Core/src/Platform/Gtk/LabelView.cs | 2 +- src/Core/src/Platform/Gtk/LayoutView.cs | 4 +- .../src/Platform/Gtk/LayoutViewExtensions.cs | 9 +++ src/Core/src/Platform/Gtk/MauiDatePicker.cs | 2 +- .../src/Platform/Gtk/MauiGtkApplication.cs | 5 -- src/Core/src/Platform/Gtk/MauiImageButton.cs | 4 ++ src/Core/src/Platform/Gtk/MauiSearchBar.cs | 2 +- src/Core/src/Platform/Gtk/MauiShapeView.cs | 2 +- src/Core/src/Platform/Gtk/MauiTimePicker.cs | 2 +- src/Core/src/Platform/Gtk/MauiWindow.cs | 2 +- src/Core/src/Platform/Gtk/NavigationView.cs | 2 +- src/Core/src/Platform/Gtk/PageView.cs | 36 +---------- .../Platform/Gtk/PlatformTouchGraphicsView.cs | 4 ++ src/Core/src/Platform/Gtk/RefreshView.cs | 2 +- src/Core/src/Platform/Gtk/ScrollView.cs | 2 +- .../src/Platform/Gtk/ShapeViewExtensions.cs | 2 +- .../src/Platform/Gtk/TimePickerExtensions.cs | 2 +- src/Core/src/Platform/MauiContext.Gtk.cs | 3 +- .../VisualDiagnosticsOverlay.Gtk.cs | 19 ++++++ .../src/WindowOverlay/WindowOverlay.Gtk.cs | 26 ++++++++ src/Core/src/WindowOverlay/WindowOverlay.cs | 2 + 116 files changed, 781 insertions(+), 270 deletions(-) create mode 100644 src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/Border/BorderHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.Gtk.cs rename src/Core/src/Handlers/NavigationPage/{NavigationPageHandler.Gtk.cs => NavigationViewHandler.Gtk.cs} (56%) create mode 100644 src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs create mode 100644 src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/ContentView.cs create mode 100644 src/Core/src/Platform/Gtk/LayoutViewExtensions.cs create mode 100644 src/Core/src/Platform/Gtk/MauiImageButton.cs create mode 100644 src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs create mode 100644 src/Core/src/VisualDiagnostics/VisualDiagnosticsOverlay.Gtk.cs create mode 100644 src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs index 018409141773..7bce47d4e7d2 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs @@ -4,20 +4,20 @@ namespace Microsoft.Maui.Handlers { public partial class ActivityIndicatorHandler : ViewHandler { - protected override Spinner CreateNativeView() + protected override Spinner CreatePlatformView() { return new(); } public static void MapIsRunning(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { - handler.NativeView?.UpdateIsRunning(activityIndicator); + handler.PlatformView?.UpdateIsRunning(activityIndicator); } public static void MapColor(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { - handler.NativeView?.SetForegroundColor(activityIndicator.Color); + handler.PlatformView?.SetForegroundColor(activityIndicator.Color); } } diff --git a/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs b/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs new file mode 100644 index 000000000000..6284dd9d7f27 --- /dev/null +++ b/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs @@ -0,0 +1,11 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class ApplicationHandler : ElementHandler + { + public static void MapTerminate(ApplicationHandler handler, IApplication application, object? args) { } + public static void MapOpenWindow(ApplicationHandler handler, IApplication application, object? args) { } + public static void MapCloseWindow(ApplicationHandler handler, IApplication application, object? args) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Application/ApplicationHandler.cs b/src/Core/src/Handlers/Application/ApplicationHandler.cs index 7635fae11e2d..4133e15200bc 100644 --- a/src/Core/src/Handlers/Application/ApplicationHandler.cs +++ b/src/Core/src/Handlers/Application/ApplicationHandler.cs @@ -10,6 +10,8 @@ using PlatformView = Microsoft.UI.Xaml.Application; #elif TIZEN using PlatformView = Tizen.Applications.CoreApplication; +#elif GTK +using PlatformView = Gtk.Application; #endif namespace Microsoft.Maui.Handlers diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs new file mode 100644 index 000000000000..e9157d42b6f6 --- /dev/null +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -0,0 +1,15 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class BorderHandler : ViewHandler + { + [MissingMapper] + protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + + [MissingMapper] + public static void MapContent(IBorderHandler handler, IBorderView border) + { + } + } +} diff --git a/src/Core/src/Handlers/Border/BorderHandler.cs b/src/Core/src/Handlers/Border/BorderHandler.cs index 0c632dd5ad51..45882e244a63 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.Maui.Platform.ContentPanel; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.BorderView; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Border/IBorderHandler.cs b/src/Core/src/Handlers/Border/IBorderHandler.cs index a7531b142a7d..631dff9631a0 100644 --- a/src/Core/src/Handlers/Border/IBorderHandler.cs +++ b/src/Core/src/Handlers/Border/IBorderHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.Maui.Platform.ContentPanel; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.BorderView; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index e1ba6d3cdb19..d439abc06abb 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -10,7 +10,7 @@ namespace Microsoft.Maui.Handlers public partial class ButtonHandler : ViewHandler { - protected override Button CreateNativeView() + protected override Button CreatePlatformView() { return Button.NewWithLabel(string.Empty); } @@ -31,17 +31,17 @@ protected override void DisconnectHandler(Button nativeView) public static void MapText(ButtonHandler handler, IButton button) { - handler.NativeView?.UpdateText(button); + handler.PlatformView?.UpdateText(button); } public static void MapTextColor(ButtonHandler handler, IButton button) { - handler.NativeView?.UpdateTextColor(button.TextColor); + handler.PlatformView?.UpdateTextColor(button.TextColor); } public static void MapCharacterSpacing(ButtonHandler handler, IButton button) { - if (handler.NativeView.Child is Label nativeView) + if (handler.PlatformView.Child is Label nativeView) { nativeView.Attributes = nativeView.Attributes.AttrListFor(button.CharacterSpacing); } @@ -57,7 +57,7 @@ public static void MapFont(ButtonHandler handler, IButton button) public static void MapPadding(ButtonHandler handler, IButton button) { - handler.NativeView.WithPadding(button.Padding); + handler.PlatformView.WithPadding(button.Padding); } void OnButtonPressEvent(object? o, ButtonPressEventArgs args) diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs index 85e34c4bf03e..670f4f31c440 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs @@ -9,11 +9,11 @@ namespace Microsoft.Maui.Handlers public partial class CheckBoxHandler : ViewHandler { - protected override CheckButton CreateNativeView() => new(); + protected override CheckButton CreatePlatformView() => new(); public static void MapIsChecked(CheckBoxHandler handler, ICheckBox check) { - handler.NativeView?.UpdateIsChecked(check); + handler.PlatformView?.UpdateIsChecked(check); } protected override void ConnectHandler(CheckButton nativeView) @@ -35,7 +35,7 @@ protected void OnToggledEvent(object? sender, EventArgs e) public static void MapForeground(CheckBoxHandler handler, ICheckBox check) { - handler.NativeView?.UpdateForeground(check.Foreground); + handler.PlatformView?.UpdateForeground(check.Foreground); } } diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.cs index cf9441e84a9f..f8142836824e 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.CheckBox; #elif TIZEN using PlatformView = ElmSharp.Check; +#elif GTK +using PlatformView = Gtk.CheckButton; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/CheckBox/ICheckboxHandler.cs b/src/Core/src/Handlers/CheckBox/ICheckboxHandler.cs index 186a44ea9b48..466340a5f3fc 100644 --- a/src/Core/src/Handlers/CheckBox/ICheckboxHandler.cs +++ b/src/Core/src/Handlers/CheckBox/ICheckboxHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.CheckBox; #elif TIZEN using PlatformView = ElmSharp.Check; +#elif GTK +using PlatformView = Gtk.CheckButton; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs new file mode 100644 index 000000000000..8aa8faa058b1 --- /dev/null +++ b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs @@ -0,0 +1,28 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class ContentViewHandler : ViewHandler + { + [MissingMapper] + protected override ContentView CreatePlatformView() => throw new NotImplementedException(); + + void UpdateContent() + { + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + + if (VirtualView is { Content: IView view }) + PlatformView.Content = view.ToPlatform(MauiContext); + } + + public static void MapContent(IContentViewHandler handler, IContentView page) + { + if (handler is ContentViewHandler contentViewHandler) + { + contentViewHandler.UpdateContent(); + } + } + } +} diff --git a/src/Core/src/Handlers/ContentView/ContentViewHandler.cs b/src/Core/src/Handlers/ContentView/ContentViewHandler.cs index f1d02fad254f..48f21aad74da 100644 --- a/src/Core/src/Handlers/ContentView/ContentViewHandler.cs +++ b/src/Core/src/Handlers/ContentView/ContentViewHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.Maui.Platform.ContentPanel; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.ContentCanvas; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.ContentView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ContentView/IContentViewHandler.cs b/src/Core/src/Handlers/ContentView/IContentViewHandler.cs index dc3504e9900b..d6506b4d641b 100644 --- a/src/Core/src/Handlers/ContentView/IContentViewHandler.cs +++ b/src/Core/src/Handlers/ContentView/IContentViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.Maui.Platform.ContentPanel; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.ContentCanvas; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.ContentView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs index 669093222af5..5312c5108dbd 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs @@ -1,10 +1,10 @@ -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { public partial class DatePickerHandler : ViewHandler { - protected override MauiDatePicker CreateNativeView() + protected override MauiDatePicker CreatePlatformView() { return new MauiDatePicker(); } @@ -12,13 +12,13 @@ protected override MauiDatePicker CreateNativeView() [MissingMapper] public static void MapFormat(DatePickerHandler handler, IDatePicker datePicker) { - handler.NativeView?.UpdateFormat(datePicker); + handler.PlatformView?.UpdateFormat(datePicker); } [MissingMapper] public static void MapDate(DatePickerHandler handler, IDatePicker datePicker) { - handler.NativeView?.UpdateDate(datePicker); + handler.PlatformView?.UpdateDate(datePicker); } [MissingMapper] diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index 2ef8fb65aa13..49564de66bbe 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -10,7 +10,7 @@ namespace Microsoft.Maui.Handlers public partial class EditorHandler : ViewHandler { - protected override TextView CreateNativeView() + protected override TextView CreatePlatformView() { return new() { WrapMode = WrapMode.WordChar }; } @@ -27,7 +27,7 @@ protected override void DisconnectHandler(TextView nativeView) public override Size GetDesiredSize(double widthConstraint, double heightConstraint) { - if (NativeView is not { } nativeView) + if (PlatformView is not { } nativeView) return Size.Zero; var res = base.GetDesiredSize(widthConstraint, heightConstraint); @@ -48,7 +48,7 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra protected void OnNativeTextChanged(object? sender, EventArgs e) { - if (NativeView is not { } nativeView || VirtualView is not { } virtualView) + if (PlatformView is not { } nativeView || VirtualView is not { } virtualView) return; if (sender != nativeView.Buffer) return; @@ -61,7 +61,7 @@ protected void OnNativeTextChanged(object? sender, EventArgs e) public static void MapText(EditorHandler handler, IEditor editor) { - handler.NativeView?.UpdateText(editor); + handler.PlatformView?.UpdateText(editor); } public static void MapFont(EditorHandler handler, IEditor editor) @@ -71,13 +71,13 @@ public static void MapFont(EditorHandler handler, IEditor editor) public static void MapIsReadOnly(EditorHandler handler, IEditor editor) { - if (handler.NativeView is { } nativeView) + if (handler.PlatformView is { } nativeView) nativeView.Editable = !editor.IsReadOnly; } public static void MapTextColor(EditorHandler handler, IEditor editor) { - handler.NativeView?.UpdateTextColor(editor.TextColor); + handler.PlatformView?.UpdateTextColor(editor.TextColor); } [MissingMapper] diff --git a/src/Core/src/Handlers/ElementHandlerExtensions.cs b/src/Core/src/Handlers/ElementHandlerExtensions.cs index 9288667b0619..2ca62694a9e3 100644 --- a/src/Core/src/Handlers/ElementHandlerExtensions.cs +++ b/src/Core/src/Handlers/ElementHandlerExtensions.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index 1b4c30003e0f..1df4135b3e5d 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -10,7 +10,7 @@ namespace Microsoft.Maui.Handlers public partial class EntryHandler : ViewHandler { - protected override Entry CreateNativeView() + protected override Entry CreatePlatformView() { return new(); } @@ -38,7 +38,7 @@ protected override void DisconnectHandler(Entry nativeView) void HandleSelectionChanged() { - if (NativeView is not { } nativeView || VirtualView is not { } virtualView) + if (PlatformView is not { } nativeView || VirtualView is not { } virtualView) return; var actual = nativeView.GetSelection(); @@ -52,16 +52,16 @@ void HandleSelectionChanged() void OnNativeViewCursorMoved(object sender, MoveCursorArgs args) { - if (sender != NativeView) + if (sender != PlatformView) return; - NativeView.OnCursorPositionChanged(VirtualView); + PlatformView.OnCursorPositionChanged(VirtualView); HandleSelectionChanged(); } void OnNativeViewMotionNotified(object sender, MotionNotifyEventArgs args) { - if (sender != NativeView) + if (sender != PlatformView) return; if (_isMouseSelection) @@ -71,7 +71,7 @@ void OnNativeViewMotionNotified(object sender, MotionNotifyEventArgs args) void OnNativeViewOnButtonPressed(object sender, Gtk.ButtonPressEventArgs args) { - if (sender != NativeView) + if (sender != PlatformView) return; if (args.Event.Button == 1) @@ -92,26 +92,26 @@ void OnNativeViewOnButtonReleased(object o, Gtk.ButtonReleaseEventArgs args) protected void OnNativeViewChanged(object? sender, EventArgs e) { - if (sender != NativeView) + if (sender != PlatformView) return; - if (NativeView?.OnTextChanged(VirtualView) ?? false) + if (PlatformView?.OnTextChanged(VirtualView) ?? false) HandleSelectionChanged(); } public static void MapText(EntryHandler handler, IEntry entry) { - handler.NativeView?.UpdateText(entry); + handler.PlatformView?.UpdateText(entry); } public static void MapTextColor(EntryHandler handler, IEntry entry) { - handler.NativeView?.UpdateTextColor(entry.TextColor); + handler.PlatformView?.UpdateTextColor(entry.TextColor); } public static void MapIsPassword(EntryHandler handler, IEntry entry) { - if (handler.NativeView is { } nativeView) + if (handler.PlatformView is { } nativeView) { nativeView.Visibility = !entry.IsPassword; } @@ -119,7 +119,7 @@ public static void MapIsPassword(EntryHandler handler, IEntry entry) public static void MapHorizontalTextAlignment(EntryHandler handler, IEntry entry) { - if (handler.NativeView is { } nativeView) + if (handler.PlatformView is { } nativeView) nativeView.Alignment = entry.HorizontalTextAlignment.ToXyAlign(); } @@ -132,18 +132,18 @@ public static void MapIsTextPredictionEnabled(EntryHandler handler, IEntry entry public static void MapMaxLength(EntryHandler handler, IEntry entry) { - if (handler.NativeView is { } nativeView) + if (handler.PlatformView is { } nativeView) nativeView.MaxLength = entry.MaxLength; } public static void MapPlaceholder(EntryHandler handler, IEntry entry) { - handler.NativeView?.UpdatePlaceholder(entry); + handler.PlatformView?.UpdatePlaceholder(entry); } public static void MapIsReadOnly(EntryHandler handler, IEntry entry) { - handler.NativeView?.UpdateIsReadOnly(entry); + handler.PlatformView?.UpdateIsReadOnly(entry); } public static void MapFont(EntryHandler handler, IEntry entry) @@ -153,12 +153,12 @@ public static void MapFont(EntryHandler handler, IEntry entry) public static void MapCursorPosition(EntryHandler handler, IEntry entry) { - handler.NativeView?.UpdateCursorPosition(entry); + handler.PlatformView?.UpdateCursorPosition(entry); } public static void MapSelectionLength(EntryHandler handler, IEntry entry) { - handler.NativeView?.UpdateSelectionLength(entry); + handler.PlatformView?.UpdateSelectionLength(entry); } [MissingMapper] @@ -169,7 +169,7 @@ public static void MapClearButtonVisibility(EntryHandler handler, IEntry entry) public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; nativeView.Attributes = nativeView.Attributes.AttrListFor(entry.CharacterSpacing); @@ -178,7 +178,7 @@ public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) [MissingMapper] public static void MapKeyboard(EntryHandler handler, IEntry entry) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; // https://docs.gtk.org/gtk3/method.Entry.set_input_purpose.html diff --git a/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs b/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs new file mode 100644 index 000000000000..3825359186b1 --- /dev/null +++ b/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs @@ -0,0 +1,12 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class FlyoutViewHandler : ViewHandler + { + protected override Gtk.Widget CreatePlatformView() + { + throw new System.NotImplementedException(); + } + } +} diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs index 444079f6ae9c..1673a39d54f5 100644 --- a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs @@ -3,19 +3,24 @@ namespace Microsoft.Maui.Handlers { - public partial class GraphicsViewHandler : ViewHandler + public partial class GraphicsViewHandler : ViewHandler { - protected override Microsoft.Maui.Graphics.Platform.Gtk.GtkGraphicsView CreateNativeView() => new(); + protected override PlatformTouchGraphicsView CreatePlatformView() => new(); public static void MapDrawable(GraphicsViewHandler handler, IGraphicsView graphicsView) { - if (handler.NativeView is { } nativeView) + if (handler.PlatformView is { } nativeView) { nativeView.Drawable = graphicsView.Drawable; } } + [MissingMapper] + public static void MapFlowDirection(IGraphicsViewHandler handler, IGraphicsView graphicsView) { } + + [MissingMapper] + public static void MapInvalidate(IGraphicsViewHandler handler, IGraphicsView graphicsView, object? arg) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.cs index 926b5ad758b6..232187395b21 100644 --- a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.cs +++ b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.cs @@ -1,5 +1,5 @@ #nullable enable -#if __IOS__ || MACCATALYST || MONOANDROID || WINDOWS || TIZEN +#if __IOS__ || MACCATALYST || MONOANDROID || WINDOWS || TIZEN || GTK #define PLATFORM using PlatformView = Microsoft.Maui.Platform.PlatformTouchGraphicsView; #else diff --git a/src/Core/src/Handlers/GraphicsView/IGraphicsViewHandler.cs b/src/Core/src/Handlers/GraphicsView/IGraphicsViewHandler.cs index 88a52002e730..0a6309320976 100644 --- a/src/Core/src/Handlers/GraphicsView/IGraphicsViewHandler.cs +++ b/src/Core/src/Handlers/GraphicsView/IGraphicsViewHandler.cs @@ -1,4 +1,4 @@ -#if __IOS__ || MACCATALYST || MONOANDROID || WINDOWS || TIZEN +#if __IOS__ || MACCATALYST || MONOANDROID || WINDOWS || TIZEN || GTK using PlatformView = Microsoft.Maui.Platform.PlatformTouchGraphicsView; #else using PlatformView = System.Object; diff --git a/src/Core/src/Handlers/Image/IImageHandler.cs b/src/Core/src/Handlers/Image/IImageHandler.cs index ce73d2324cf4..0162925b9cb8 100644 --- a/src/Core/src/Handlers/Image/IImageHandler.cs +++ b/src/Core/src/Handlers/Image/IImageHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Image; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Image; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.ImageView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs index 4707f2af4f6b..99c3eac93113 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs @@ -1,7 +1,7 @@ #nullable enable using System; using System.Threading.Tasks; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { @@ -9,7 +9,7 @@ namespace Microsoft.Maui.Handlers public partial class ImageHandler : ViewHandler { - protected override ImageView CreateNativeView() + protected override ImageView CreatePlatformView() { var img = new ImageView(); @@ -17,27 +17,29 @@ protected override ImageView CreateNativeView() } [MissingMapper] - public static void MapAspect(ImageHandler handler, IImage image) { } + public static void MapAspect(IImageHandler handler, IImage image) { } [MissingMapper] - public static void MapIsAnimationPlaying(ImageHandler handler, IImage image) { } + public static void MapIsAnimationPlaying(IImageHandler handler, IImage image) { } - public static void MapSource(ImageHandler handler, IImage image) => + public static void MapSource(IImageHandler handler, IImage image) => MapSourceAsync(handler, image).FireAndForget(handler); - public static async Task MapSourceAsync(ImageHandler handler, IImage image) + public static async Task MapSourceAsync(IImageHandler handler, IImage image) { - if (handler.NativeView == null) + if (handler.PlatformView == null) return; var token = handler._sourceManager.BeginLoad(); var provider = handler.GetRequiredService(); - var result = await handler.NativeView.UpdateSourceAsync(image, provider, token); + var result = await handler.PlatformView.UpdateSourceAsync(image, provider, token); handler._sourceManager.CompleteLoad(result); } + [MissingMapper] + void OnSetImageSource(object? obj) => throw new NotImplementedException(); } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Image/ImageHandler.cs b/src/Core/src/Handlers/Image/ImageHandler.cs index f4b675b784f3..c7a28d88696c 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.cs @@ -8,6 +8,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Image; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Image; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.ImageView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ImageButton/IImageButtonHandler.cs b/src/Core/src/Handlers/ImageButton/IImageButtonHandler.cs index 49bb417a8bde..fa7d5be22816 100644 --- a/src/Core/src/Handlers/ImageButton/IImageButtonHandler.cs +++ b/src/Core/src/Handlers/ImageButton/IImageButtonHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Button; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.MauiImageButton; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiImageButton; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs new file mode 100644 index 000000000000..2d5cb07f0b66 --- /dev/null +++ b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs @@ -0,0 +1,19 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class ImageButtonHandler : ViewHandler + { + protected override MauiImageButton CreatePlatformView() => throw new NotImplementedException(); + + public static void MapStrokeColor(IImageButtonHandler handler, IButtonStroke buttonStroke) { } + public static void MapStrokeThickness(IImageButtonHandler handler, IButtonStroke buttonStroke) { } + public static void MapCornerRadius(IImageButtonHandler handler, IButtonStroke buttonStroke) { } + public static void MapPadding(IImageButtonHandler handler, IImageButton imageButton) { } + + void OnSetImageSource(object? obj) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs index 0533319e3806..1d6f213a3138 100644 --- a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs +++ b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs @@ -15,6 +15,10 @@ using PlatformImage = Tizen.UIExtensions.ElmSharp.Image; using PlatformImageView = Tizen.UIExtensions.ElmSharp.Image; using PlatformView = Microsoft.Maui.Platform.MauiImageButton; +#elif GTK +using PlatformImage = Gtk.Image; +using PlatformImageView = Microsoft.Maui.Platform.ImageView; +using PlatformView = Microsoft.Maui.Platform.MauiImageButton; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformImage = System.Object; using PlatformImageView = System.Object; diff --git a/src/Core/src/Handlers/IndicatorView/IIndicatorViewHandler.cs b/src/Core/src/Handlers/IndicatorView/IIndicatorViewHandler.cs index d3f52a1b7eb8..9b18f2b28066 100644 --- a/src/Core/src/Handlers/IndicatorView/IIndicatorViewHandler.cs +++ b/src/Core/src/Handlers/IndicatorView/IIndicatorViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.Maui.Platform.MauiPageControl; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.IndicatorView; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs new file mode 100644 index 000000000000..4c024043ee41 --- /dev/null +++ b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs @@ -0,0 +1,19 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + [MissingMapper] + public partial class IndicatorViewHandler : ViewHandler + { + protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + + public static void MapCount(IIndicatorViewHandler handler, IIndicatorView indicator) { } + public static void MapPosition(IIndicatorViewHandler handler, IIndicatorView indicator) { } + public static void MapHideSingle(IIndicatorViewHandler handler, IIndicatorView indicator) { } + public static void MapMaximumVisible(IIndicatorViewHandler handler, IIndicatorView indicator) { } + public static void MapIndicatorSize(IIndicatorViewHandler handler, IIndicatorView indicator) { } + public static void MapIndicatorColor(IIndicatorViewHandler handler, IIndicatorView indicator) { } + public static void MapSelectedIndicatorColor(IIndicatorViewHandler handler, IIndicatorView indicator) { } + public static void MapIndicatorShape(IIndicatorViewHandler handler, IIndicatorView indicator) { } + } +} diff --git a/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.cs b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.cs index 5932c9763dca..859c73aca48d 100644 --- a/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.cs +++ b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.Maui.Platform.MauiPageControl; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.IndicatorView; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index cbb6c36f3da3..1e506d122ab3 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -2,7 +2,7 @@ using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Platform.Gtk; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { @@ -11,12 +11,15 @@ public partial class LabelHandler : ViewHandler { private static Microsoft.Maui.Graphics.Platform.Gtk.TextLayout? _textLayout; + static PlatformStringSizeService? _stringSizeService; + PlatformStringSizeService stringSizeService => _stringSizeService ??= new(); + public Microsoft.Maui.Graphics.Platform.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Platform.Gtk.TextLayout( - Microsoft.Maui.Graphics.Platform.Gtk.NativeGraphicsService.Instance.SharedContext) { HeightForWidth = true }; + stringSizeService.SharedContext) { HeightForWidth = true }; // https://docs.gtk.org/gtk3/class.Label.html - protected override LabelView CreateNativeView() + protected override LabelView CreatePlatformView() { return new() { @@ -28,7 +31,7 @@ protected override LabelView CreateNativeView() public override Size GetDesiredSize(double widthConstraint, double heightConstraint) { - if (NativeView is not { } nativeView) + if (PlatformView is not { } nativeView) return default; if (VirtualView is not { } virtualView) @@ -112,12 +115,12 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra public static void MapText(LabelHandler handler, ILabel label) { - handler.NativeView?.UpdateText(label); + handler.PlatformView?.UpdateText(label); } public static void MapTextColor(LabelHandler handler, ILabel label) { - handler.NativeView?.UpdateTextColor(label.TextColor); + handler.PlatformView?.UpdateTextColor(label.TextColor); } public static void MapFont(LabelHandler handler, ILabel label) @@ -127,33 +130,33 @@ public static void MapFont(LabelHandler handler, ILabel label) public static void MapHorizontalTextAlignment(LabelHandler handler, ILabel label) { - handler.NativeView?.UpdateHorizontalTextAlignment(label); + handler.PlatformView?.UpdateHorizontalTextAlignment(label); } public static void MapVerticalTextAlignment(LabelHandler handler, ILabel label) { - handler.NativeView?.UpdateVerticalTextAlignment(label); + handler.PlatformView?.UpdateVerticalTextAlignment(label); } public static void MapLineBreakMode(LabelHandler handler, ILabel label) { - handler.NativeView?.UpdateLineBreakMode(label); + handler.PlatformView?.UpdateLineBreakMode(label); } public static void MapMaxLines(LabelHandler handler, ILabel label) { - handler.NativeView?.UpdateMaxLines(label); + handler.PlatformView?.UpdateMaxLines(label); } public static void MapPadding(LabelHandler handler, ILabel label) { - handler.NativeView.WithPadding(label.Padding); + handler.PlatformView.WithPadding(label.Padding); } public static void MapCharacterSpacing(LabelHandler handler, ILabel label) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; nativeView.Attributes = nativeView.Attributes.AttrListFor(label.TextDecorations, label.CharacterSpacing); @@ -161,7 +164,7 @@ public static void MapCharacterSpacing(LabelHandler handler, ILabel label) public static void MapTextDecorations(LabelHandler handler, ILabel label) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; nativeView.Attributes = nativeView.Attributes.AttrListFor(label.TextDecorations, label.CharacterSpacing); @@ -169,7 +172,7 @@ public static void MapTextDecorations(LabelHandler handler, ILabel label) public static void MapLineHeight(LabelHandler handler, ILabel label) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; if (handler.VirtualView is not { } virtualView) diff --git a/src/Core/src/Handlers/Layout/ILayoutHandler.cs b/src/Core/src/Handlers/Layout/ILayoutHandler.cs index e8e53a58a89b..1edfb0604685 100644 --- a/src/Core/src/Handlers/Layout/ILayoutHandler.cs +++ b/src/Core/src/Handlers/Layout/ILayoutHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.Maui.Platform.LayoutPanel; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.LayoutCanvas; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.LayoutView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 4e8a9e51c3e1..002bbd93dbef 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -2,7 +2,7 @@ using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Layouts; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { @@ -10,7 +10,7 @@ namespace Microsoft.Maui.Handlers public partial class LayoutHandler : ViewHandler { - protected override LayoutView CreateNativeView() + protected override LayoutView CreatePlatformView() { if (VirtualView == null) { @@ -28,95 +28,95 @@ public override void SetVirtualView(IView view) { base.SetVirtualView(view); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - NativeView.CrossPlatformVirtualView = () => VirtualView; + PlatformView.CrossPlatformVirtualView = () => VirtualView; - NativeView.ClearChildren(); + PlatformView.ClearChildren(); foreach (var child in VirtualView) { - if (child.ToNative(MauiContext) is { } nativeChild) - NativeView.Add(child, nativeChild); + if (child.ToPlatform(MauiContext) is { } nativeChild) + PlatformView.Add(child, nativeChild); } - NativeView.QueueAllocate(); - NativeView.QueueResize(); + PlatformView.QueueAllocate(); + PlatformView.QueueResize(); } protected override void DisconnectHandler(LayoutView nativeView) { base.DisconnectHandler(nativeView); - NativeView.ClearChildren(); + PlatformView.ClearChildren(); } public void Add(IView child) { - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - if (child.ToNative(MauiContext) is { } nativeChild) - NativeView.Add(child, nativeChild); + if (child.ToPlatform(MauiContext) is { } nativeChild) + PlatformView.Add(child, nativeChild); - NativeView.QueueAllocate(); + PlatformView.QueueAllocate(); } public void Remove(IView child) { - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - if (child.ToNative(MauiContext) is { } nativeChild) - NativeView.Remove(nativeChild); + if (child.ToPlatform(MauiContext) is { } nativeChild) + PlatformView.Remove(nativeChild); - NativeView.QueueAllocate(); + PlatformView.QueueAllocate(); } public void Clear() { - NativeView?.ClearChildren(); + PlatformView?.ClearChildren(); } public void Insert(int index, IView child) { - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - if (child.ToNative(MauiContext) is { } nativeChild) - NativeView.Insert(child, nativeChild, index); + if (child.ToPlatform(MauiContext) is { } nativeChild) + PlatformView.Insert(child, nativeChild, index); - NativeView.QueueAllocate(); + PlatformView.QueueAllocate(); } public void Update(int index, IView child) { - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - if (child.ToNative(MauiContext) is { } nativeChild) - NativeView.Update(child, nativeChild, index); + if (child.ToPlatform(MauiContext) is { } nativeChild) + PlatformView.Update(child, nativeChild, index); - NativeView.QueueAllocate(); + PlatformView.QueueAllocate(); } #if DEBUG - public override void NativeArrange(Rectangle rect) + public override void PlatformArrange(Rect rect) { - NativeView?.Arrange(rect); + PlatformView?.Arrange(rect); } public override Size GetDesiredSize(double widthConstraint, double heightConstraint) { - if (NativeView is not { } nativeView) + if (PlatformView is not { } nativeView) return Size.Zero; return nativeView.GetDesiredSize(widthConstraint, heightConstraint); @@ -124,6 +124,9 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra #endif + [MissingMapper] + public void UpdateZIndex(IView view) => throw new NotImplementedException(); + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.cs b/src/Core/src/Handlers/Layout/LayoutHandler.cs index 1023b76898a0..b41d4389d2bf 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.Maui.Platform.LayoutPanel; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.LayoutCanvas; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.LayoutView; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuBar/IMenuBarHandler.cs b/src/Core/src/Handlers/MenuBar/IMenuBarHandler.cs index fc8fa4f50931..b148ffacc553 100644 --- a/src/Core/src/Handlers/MenuBar/IMenuBarHandler.cs +++ b/src/Core/src/Handlers/MenuBar/IMenuBarHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuBar; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs b/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs new file mode 100644 index 000000000000..1383795fc251 --- /dev/null +++ b/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs @@ -0,0 +1,28 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class MenuBarHandler : ElementHandler, IMenuBarHandler + { + protected override Gtk.Widget CreatePlatformElement() + { + throw new NotImplementedException(); + } + + public void Add(IMenuBarItem view) + { + } + + public void Remove(IMenuBarItem view) + { + } + + public void Clear() + { + } + + public void Insert(int index, IMenuBarItem view) + { + } + } +} diff --git a/src/Core/src/Handlers/MenuBar/MenuBarHandler.cs b/src/Core/src/Handlers/MenuBar/MenuBarHandler.cs index 5097878488b6..ebee0631618b 100644 --- a/src/Core/src/Handlers/MenuBar/MenuBarHandler.cs +++ b/src/Core/src/Handlers/MenuBar/MenuBarHandler.cs @@ -9,6 +9,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuBar; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuBarItem/IMenuBarItemHandler.cs b/src/Core/src/Handlers/MenuBarItem/IMenuBarItemHandler.cs index a055df6e8c6f..aaee3f6dd080 100644 --- a/src/Core/src/Handlers/MenuBarItem/IMenuBarItemHandler.cs +++ b/src/Core/src/Handlers/MenuBarItem/IMenuBarItemHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuBarItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs new file mode 100644 index 000000000000..2454fa548b04 --- /dev/null +++ b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs @@ -0,0 +1,28 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class MenuBarItemHandler : ElementHandler, IMenuBarItemHandler + { + protected override Gtk.Widget CreatePlatformElement() + { + throw new NotImplementedException(); + } + + public void Add(IMenuElement view) + { + } + + public void Remove(IMenuElement view) + { + } + + public void Clear() + { + } + + public void Insert(int index, IMenuElement view) + { + } + } +} diff --git a/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.cs b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.cs index ac934dfc2dcc..51c45d298cdc 100644 --- a/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.cs +++ b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.cs @@ -9,6 +9,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuBarItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuFlyoutItem/IMenuFlyoutItemHandler.cs b/src/Core/src/Handlers/MenuFlyoutItem/IMenuFlyoutItemHandler.cs index fa8bebc0f704..423fa5271ff9 100644 --- a/src/Core/src/Handlers/MenuFlyoutItem/IMenuFlyoutItemHandler.cs +++ b/src/Core/src/Handlers/MenuFlyoutItem/IMenuFlyoutItemHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuFlyoutItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuFlyoutItem/MenuFlyoutItemHandler.cs b/src/Core/src/Handlers/MenuFlyoutItem/MenuFlyoutItemHandler.cs index 620a6693d9cd..c8b260f2bd0c 100644 --- a/src/Core/src/Handlers/MenuFlyoutItem/MenuFlyoutItemHandler.cs +++ b/src/Core/src/Handlers/MenuFlyoutItem/MenuFlyoutItemHandler.cs @@ -9,6 +9,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuFlyoutItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuFlyoutSeparator/IMenuFlyoutSeparatorHandler.cs b/src/Core/src/Handlers/MenuFlyoutSeparator/IMenuFlyoutSeparatorHandler.cs index dc1b6dcfce0c..a0fdb039bb08 100644 --- a/src/Core/src/Handlers/MenuFlyoutSeparator/IMenuFlyoutSeparatorHandler.cs +++ b/src/Core/src/Handlers/MenuFlyoutSeparator/IMenuFlyoutSeparatorHandler.cs @@ -2,6 +2,8 @@ using PlatformView = UIKit.UIMenu; #elif WINDOWS using PlatformView = Microsoft.UI.Xaml.Controls.MenuFlyoutSeparator; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuFlyoutSeparator/MenuFlyoutSeparatorHandler.cs b/src/Core/src/Handlers/MenuFlyoutSeparator/MenuFlyoutSeparatorHandler.cs index edb089e47741..ba78c17cf8e2 100644 --- a/src/Core/src/Handlers/MenuFlyoutSeparator/MenuFlyoutSeparatorHandler.cs +++ b/src/Core/src/Handlers/MenuFlyoutSeparator/MenuFlyoutSeparatorHandler.cs @@ -2,6 +2,8 @@ using PlatformView = UIKit.UIMenu; #elif WINDOWS using PlatformView = Microsoft.UI.Xaml.Controls.MenuFlyoutSeparator; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS) using System; using PlatformView = System.Object; @@ -38,7 +40,7 @@ public MenuFlyoutSeparatorHandler(IPropertyMapper mapper, CommandMapper? command #if !WINDOWS && !IOS protected override PlatformView CreatePlatformElement() { - throw new NotImplementedException(); + throw new System.NotImplementedException(); } #endif diff --git a/src/Core/src/Handlers/MenuFlyoutSubItem/IMenuFlyoutSubItemHandler.cs b/src/Core/src/Handlers/MenuFlyoutSubItem/IMenuFlyoutSubItemHandler.cs index d63c3b06e140..4693bcb70f49 100644 --- a/src/Core/src/Handlers/MenuFlyoutSubItem/IMenuFlyoutSubItemHandler.cs +++ b/src/Core/src/Handlers/MenuFlyoutSubItem/IMenuFlyoutSubItemHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuFlyoutSubItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.Gtk.cs b/src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.Gtk.cs new file mode 100644 index 000000000000..d7fde26f732b --- /dev/null +++ b/src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.Gtk.cs @@ -0,0 +1,28 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class MenuFlyoutSubItemHandler + { + protected override Gtk.Widget CreatePlatformElement() + { + throw new NotImplementedException(); + } + + public void Add(IMenuElement view) + { + } + + public void Remove(IMenuElement view) + { + } + + public void Clear() + { + } + + public void Insert(int index, IMenuElement view) + { + } + } +} diff --git a/src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.cs b/src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.cs index 2fd1e6cece70..67a7ee9bdf02 100644 --- a/src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.cs +++ b/src/Core/src/Handlers/MenuFlyoutSubItem/MenuFlyoutSubItemHandler.cs @@ -9,6 +9,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.MenuFlyoutSubItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/NavigationPage/INavigationViewHandler.cs b/src/Core/src/Handlers/NavigationPage/INavigationViewHandler.cs index 2b5a8f34990b..3e6905802335 100644 --- a/src/Core/src/Handlers/NavigationPage/INavigationViewHandler.cs +++ b/src/Core/src/Handlers/NavigationPage/INavigationViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Frame; #elif TIZEN using PlatformView = ElmSharp.Naviframe; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.NavigationView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs similarity index 56% rename from src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs rename to src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs index d7b36c3ffd1b..a13e897b3acb 100644 --- a/src/Core/src/Handlers/NavigationPage/NavigationPageHandler.Gtk.cs +++ b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs @@ -3,15 +3,15 @@ using System.Collections.Specialized; using System.Text; using Microsoft.Maui.Handlers; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { - internal partial class NavigationPageHandler : ViewHandler + public partial class NavigationViewHandler : ViewHandler { - protected override NavigationView CreateNativeView() + protected override NavigationView CreatePlatformView() { return new(); } @@ -31,18 +31,11 @@ protected override void DisconnectHandler(NavigationView nativeView) var virtualView = VirtualView; } - - - private static void PushAsyncTo(NavigationPageHandler arg1, INavigationView arg2, object? arg3) - { - throw new NotImplementedException(); - } - private static void PopAsyncTo(NavigationPageHandler arg1, INavigationView arg2, object? arg3) + public static void RequestNavigation(INavigationViewHandler arg1, IStackNavigation arg2, object? arg3) { throw new NotImplementedException(); } - } } \ No newline at end of file diff --git a/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.cs b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.cs index 203e286ab6c2..bb35f6b934fc 100644 --- a/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.cs +++ b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Frame; #elif TIZEN using PlatformView = ElmSharp.Naviframe; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.NavigationView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs index f73905e2a6b1..38cb12b2041e 100644 --- a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs @@ -1,37 +1,27 @@ using System; using Gtk; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { - public partial class PageHandler : ViewHandler + public partial class PageHandler : ContentViewHandler { public override void SetVirtualView(IView view) { base.SetVirtualView(view); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - NativeView.CrossPlatformMeasure = VirtualView.Measure; - NativeView.CrossPlatformArrange = VirtualView.Arrange; + PlatformView.CrossPlatformMeasure = VirtualView.Measure; + PlatformView.CrossPlatformArrange = VirtualView.Arrange; } - void UpdateContent() - { - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); - _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); - - if (VirtualView is IContentView { Content: { } view }) - NativeView.Content = view.ToNative(MauiContext); - } - - protected override PageView CreateNativeView() + protected override ContentView CreatePlatformView() { if (VirtualView == null) { @@ -53,8 +43,7 @@ public static void MapContent(PageHandler handler, IView page) } [MissingMapper] - public static void MapTitle(PageHandler handler, IView page) - { } + public static void MapTitle(IPageHandler handler, IContentView page) { } } diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs index e23b1f102f81..630257eafea5 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs @@ -9,7 +9,7 @@ namespace Microsoft.Maui.Handlers public partial class PickerHandler : ViewHandler { - protected override ComboBox CreateNativeView() + protected override ComboBox CreatePlatformView() { var model = new ListStore(typeof(string)); var cell = new CellRendererText(); @@ -25,19 +25,19 @@ public override void SetVirtualView(IView view) { base.SetVirtualView(view); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); - SetValues(NativeView, VirtualView); + SetValues(PlatformView, VirtualView); } protected override void ConnectHandler(ComboBox nativeView) { base.ConnectHandler(nativeView); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); - NativeView.Changed += OnNativeViewChanged; + PlatformView.Changed += OnNativeViewChanged; } void OnNativeViewChanged(object? sender, EventArgs args) @@ -52,9 +52,9 @@ protected override void DisconnectHandler(ComboBox nativeView) { base.DisconnectHandler(nativeView); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); - NativeView.Changed -= OnNativeViewChanged; + PlatformView.Changed -= OnNativeViewChanged; } public static void SetValues(ComboBox nativeView, IPicker virtualView) @@ -76,7 +76,7 @@ public static void SetValues(ComboBox nativeView, IPicker virtualView) public static void MapSelectedIndex(PickerHandler handler, IPicker view) { - if (handler.NativeView is { } nativeView) + if (handler.PlatformView is { } nativeView) { nativeView.Active = view.SelectedIndex; } @@ -84,7 +84,7 @@ public static void MapSelectedIndex(PickerHandler handler, IPicker view) public static void MapReload(PickerHandler handler, IPicker picker, object? args) { - var nativeView = handler.NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + var nativeView = handler.PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = picker ?? throw new InvalidOperationException($"{nameof(picker)} should have been set by base class."); SetValues(nativeView, picker); @@ -99,7 +99,7 @@ public static void MapFont(PickerHandler handler, IPicker view) public static void MapCharacterSpacing(PickerHandler handler, IPicker view) { - handler.NativeView.UpdateCharacterSpacing(view.CharacterSpacing); + handler.PlatformView.UpdateCharacterSpacing(view.CharacterSpacing); } [MissingMapper] @@ -107,12 +107,12 @@ public static void MapTitle(PickerHandler handler, IPicker view) { } public static void MapTextColor(PickerHandler handler, IPicker view) { - handler.NativeView.UpdateTextColor(view?.TextColor); + handler.PlatformView.UpdateTextColor(view?.TextColor); } public static void MapHorizontalTextAlignment(PickerHandler handler, IPicker view) { - handler.NativeView.UpdateHorizontalTextAlignment(view.HorizontalTextAlignment); + handler.PlatformView.UpdateHorizontalTextAlignment(view.HorizontalTextAlignment); } [MissingMapper] diff --git a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs index 1562e70bf130..536330c4662c 100644 --- a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs @@ -5,14 +5,14 @@ namespace Microsoft.Maui.Handlers // https://docs.gtk.org/gtk3/class.ProgressBar.html public partial class ProgressBarHandler : ViewHandler { - protected override ProgressBar CreateNativeView() + protected override ProgressBar CreatePlatformView() { return new ProgressBar(); } public static void MapProgress(ProgressBarHandler handler, IProgress progress) { - handler.NativeView?.UpdateProgress(progress); + handler.PlatformView?.UpdateProgress(progress); } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/RadioButton/IRadioButtonHandler.cs b/src/Core/src/Handlers/RadioButton/IRadioButtonHandler.cs index b6d467cfa86d..75efd7e8db4f 100644 --- a/src/Core/src/Handlers/RadioButton/IRadioButtonHandler.cs +++ b/src/Core/src/Handlers/RadioButton/IRadioButtonHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.RadioButton; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.MauiRadioButton; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs new file mode 100644 index 000000000000..0b7b7488a850 --- /dev/null +++ b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs @@ -0,0 +1,19 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class RadioButtonHandler : ViewHandler + { + protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + + public static void MapBackground(IRadioButtonHandler handler, IRadioButton radioButton) { } + public static void MapIsChecked(IRadioButtonHandler handler, IRadioButton radioButton) { } + public static void MapContent(IRadioButtonHandler handler, IRadioButton radioButton) { } + public static void MapTextColor(IRadioButtonHandler handler, ITextStyle textStyle) { } + public static void MapCharacterSpacing(IRadioButtonHandler handler, ITextStyle textStyle) { } + public static void MapFont(IRadioButtonHandler handler, ITextStyle textStyle) { } + public static void MapStrokeColor(IRadioButtonHandler handler, IRadioButton radioButton) { } + public static void MapStrokeThickness(IRadioButtonHandler handler, IRadioButton radioButton) { } + public static void MapCornerRadius(IRadioButtonHandler handler, IRadioButton radioButton) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/RadioButton/RadioButtonHandler.cs b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.cs index 5bb606d9d183..cff747276f5c 100644 --- a/src/Core/src/Handlers/RadioButton/RadioButtonHandler.cs +++ b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.RadioButton; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.MauiRadioButton; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs index 437df7b0286d..43299b444f60 100644 --- a/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs @@ -1,13 +1,13 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { public partial class RefreshViewHandler : ViewHandler { - protected override RefreshView CreateNativeView() + protected override RefreshView CreatePlatformView() { return new RefreshView(); } diff --git a/src/Core/src/Handlers/ScrollView/IScrollViewHandler.cs b/src/Core/src/Handlers/ScrollView/IScrollViewHandler.cs index 8a912592cebe..32e755c689b1 100644 --- a/src/Core/src/Handlers/ScrollView/IScrollViewHandler.cs +++ b/src/Core/src/Handlers/ScrollView/IScrollViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ScrollViewer; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.ScrollView; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.ScrollView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index abe641cbe0d9..388f5151e852 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -1,7 +1,7 @@ using System; using Gdk; using Gtk; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; using Point = Microsoft.Maui.Graphics.Point; namespace Microsoft.Maui.Handlers @@ -12,7 +12,7 @@ namespace Microsoft.Maui.Handlers public partial class ScrollViewHandler : ViewHandler { - protected override ScrollView CreateNativeView() + protected override ScrollView CreatePlatformView() { var s = new ScrollView(); @@ -23,7 +23,7 @@ public override void SetVirtualView(IView view) { base.SetVirtualView(view); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); @@ -36,7 +36,7 @@ public static void MapContent(ScrollViewHandler handler, IScrollView scrollView) return; } - if (handler?.NativeView is not { } nativeView) + if (handler?.PlatformView is not { } nativeView) return; var nativeContent = scrollView.Content.ToNative(handler.MauiContext); @@ -175,7 +175,7 @@ void OnNativeViewButtonReleaseEvent(object o, ButtonReleaseEventArgs args) protected virtual void OnNativeViewValueChanged(object? sender, EventArgs e) { - if (NativeView is not { } nativeView || VirtualView is not { } virtualView || sender is not Adjustment adjustment) + if (PlatformView is not { } nativeView || VirtualView is not { } virtualView || sender is not Adjustment adjustment) return; if (nativeView.Vadjustment == adjustment && adjustment.Value != virtualView.HorizontalOffset) @@ -212,7 +212,7 @@ protected virtual void OnScrollFinished() public static void MapRequestScrollTo(ScrollViewHandler handler, IScrollView scrollView, object? args) { - if (handler?.NativeView is not { } nativeView) + if (handler?.PlatformView is not { } nativeView) return; if (args is ScrollToRequest request) @@ -228,7 +228,7 @@ public static void MapRequestScrollTo(ScrollViewHandler handler, IScrollView scr public static void MapOrientation(ScrollViewHandler handler, IScrollView view) { - if (handler?.NativeView is not { } nativeView) + if (handler?.PlatformView is not { } nativeView) return; switch (view.Orientation) @@ -275,7 +275,7 @@ public static void MapOrientation(ScrollViewHandler handler, IScrollView view) public static void MapHorizontalScrollBarVisibility(ScrollViewHandler handler, IScrollView view) { - if (handler?.NativeView is not { } nativeView) + if (handler?.PlatformView is not { } nativeView) return; nativeView.HscrollbarPolicy = view.HorizontalScrollBarVisibility.ToNative(); @@ -284,7 +284,7 @@ public static void MapHorizontalScrollBarVisibility(ScrollViewHandler handler, I public static void MapVerticalScrollBarVisibility(ScrollViewHandler handler, IScrollView view) { - if (handler?.NativeView is not { } nativeView) + if (handler?.PlatformView is not { } nativeView) return; nativeView.VscrollbarPolicy = view.VerticalScrollBarVisibility.ToNative(); diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.cs index 1aea52f62b02..9c7a27e0e20b 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.cs @@ -8,6 +8,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ScrollViewer; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.ScrollView; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.ScrollView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/SearchBar/ISearchBarHandler.cs b/src/Core/src/Handlers/SearchBar/ISearchBarHandler.cs index a7a51fecc79f..4895dd67c530 100644 --- a/src/Core/src/Handlers/SearchBar/ISearchBarHandler.cs +++ b/src/Core/src/Handlers/SearchBar/ISearchBarHandler.cs @@ -11,6 +11,9 @@ #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.SearchBar; using QueryEditor = Tizen.UIExtensions.ElmSharp.EditfieldEntry; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiSearchBar; +using QueryEditor = Gtk.Entry; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; using QueryEditor = System.Object; diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs index 06552f71ffa5..868e547b6b27 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs @@ -1,7 +1,7 @@ using System; using Gtk; using Microsoft.Maui.Graphics.Platform.Gtk; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { @@ -9,7 +9,7 @@ namespace Microsoft.Maui.Handlers public partial class SearchBarHandler : ViewHandler { - protected override MauiSearchBar CreateNativeView() + protected override MauiSearchBar CreatePlatformView() { return new MauiSearchBar(); } @@ -26,60 +26,72 @@ protected override void DisconnectHandler(MauiSearchBar nativeView) protected void OnNativeViewChanged(object? sender, EventArgs e) { - if (sender != NativeView) + if (sender != PlatformView) return; - NativeView?.Entry.OnTextChanged(VirtualView); + PlatformView?.Entry.OnTextChanged(VirtualView); } - public static void MapText(SearchBarHandler handler, ISearchBar searchBar) + public static void MapText(ISearchBarHandler handler, ISearchBar searchBar) { - handler.NativeView?.Entry.UpdateText(searchBar); + handler.PlatformView?.Entry.UpdateText(searchBar); } - public static void MapPlaceholder(SearchBarHandler handler, ISearchBar searchBar) + public static void MapPlaceholder(ISearchBarHandler handler, ISearchBar searchBar) { - handler.NativeView?.Entry.UpdatePlaceholder(searchBar); + handler.PlatformView?.Entry.UpdatePlaceholder(searchBar); } - public static void MapIsReadOnly(SearchBarHandler handler, ISearchBar searchBar) + public static void MapIsReadOnly(ISearchBarHandler handler, ISearchBar searchBar) { - handler.NativeView?.Entry.UpdateIsReadOnly(searchBar); + handler.PlatformView?.Entry.UpdateIsReadOnly(searchBar); } - public static void MapFont(SearchBarHandler handler, ISearchBar searchBar) + public Gtk.Entry? QueryEditor => PlatformView?.Entry; + + public static void MapFont(ISearchBarHandler handler, ISearchBar searchBar) { - handler.MapFont(handler.NativeView?.Entry, searchBar); + var fontManager = handler.GetRequiredService(); + + handler.PlatformView?.UpdateFont(searchBar, fontManager); } - public static void MapHorizontalTextAlignment(SearchBarHandler handler, ISearchBar searchBar) + public static void MapHorizontalTextAlignment(ISearchBarHandler handler, ISearchBar searchBar) { - if (handler.NativeView?.Entry is { } nativeView) + if (handler.PlatformView?.Entry is { } nativeView) nativeView.Alignment = searchBar.HorizontalTextAlignment.ToXyAlign(); } - public static void MapTextColor(SearchBarHandler handler, ISearchBar searchBar) + [MissingMapper] + public static void MapVerticalTextAlignment(ISearchBarHandler handler, ISearchBar searchBar) + { + } + + public static void MapTextColor(ISearchBarHandler handler, ISearchBar searchBar) { - handler.NativeView?.Entry?.UpdateTextColor(searchBar.TextColor); + handler.PlatformView?.Entry?.UpdateTextColor(searchBar.TextColor); } - public static void MapMaxLength(SearchBarHandler handler, ISearchBar searchBar) + [MissingMapper] + public static void MapPlaceholderColor(IViewHandler handler, ISearchBar searchBar) { } + + public static void MapMaxLength(ISearchBarHandler handler, ISearchBar searchBar) { - if (handler.NativeView?.Entry is { } nativeView) + if (handler.PlatformView?.Entry is { } nativeView) nativeView.MaxLength = searchBar.MaxLength; } - public static void MapCharacterSpacing(SearchBarHandler handler, ISearchBar searchBar) + public static void MapCharacterSpacing(ISearchBarHandler handler, ISearchBar searchBar) { - if (handler.NativeView?.Entry is { } nativeView) + if (handler.PlatformView?.Entry is { } nativeView) nativeView.Attributes = nativeView.Attributes.AttrListFor(searchBar.CharacterSpacing); } [MissingMapper] - public static void MapIsTextPredictionEnabled(SearchBarHandler handler, ISearchBar searchBar) { } + public static void MapIsTextPredictionEnabled(ISearchBarHandler handler, ISearchBar searchBar) { } [MissingMapper] public static void MapCancelButtonColor(IViewHandler handler, ISearchBar searchBar) { } diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.cs index ee2d22438dbf..226167dd4e50 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.AutoSuggestBox; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.SearchBar; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiSearchBar; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs index fbac3d521b35..5637f0d6569e 100644 --- a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs @@ -1,58 +1,58 @@ using Microsoft.Maui.Graphics; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { public partial class ShapeViewHandler : ViewHandler { - protected override MauiShapeView CreateNativeView() + protected override MauiShapeView CreatePlatformView() { return new MauiShapeView(); } public static void MapShape(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.UpdateShape(shapeView); + handler.PlatformView?.UpdateShape(shapeView); } public static void MapAspect(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } public static void MapFill(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } public static void MapStroke(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } public static void MapStrokeThickness(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } public static void MapStrokeDashPattern(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } public static void MapStrokeLineCap(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } public static void MapStrokeLineJoin(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } public static void MapStrokeMiterLimit(ShapeViewHandler handler, IShapeView shapeView) { - handler.NativeView?.InvalidateShape(shapeView); + handler.PlatformView?.InvalidateShape(shapeView); } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs index 25e46f344701..ba9c4f639eff 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs @@ -10,7 +10,7 @@ namespace Microsoft.Maui.Handlers public partial class SliderHandler : ViewHandler { - protected override Scale CreateNativeView() + protected override Scale CreatePlatformView() { return new Scale(Orientation.Horizontal, 0, 1, .1); } @@ -19,7 +19,7 @@ protected override void ConnectHandler(Scale nativeView) { base.ConnectHandler(nativeView); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); nativeView.ValueChanged += OnNativeViewValueChanged; } @@ -28,7 +28,7 @@ protected override void DisconnectHandler(Scale nativeView) { base.DisconnectHandler(nativeView); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); nativeView.ValueChanged -= OnNativeViewValueChanged; @@ -45,17 +45,17 @@ void OnNativeViewValueChanged(object? sender, EventArgs e) public static void MapMinimum(SliderHandler handler, ISlider slider) { - handler.NativeView?.UpdateRange(slider); + handler.PlatformView?.UpdateRange(slider); } public static void MapMaximum(SliderHandler handler, ISlider slider) { - handler.NativeView?.UpdateRange(slider); + handler.PlatformView?.UpdateRange(slider); } public static void MapValue(SliderHandler handler, ISlider slider) { - handler.NativeView?.UpdateValue(slider); + handler.PlatformView?.UpdateValue(slider); } [MissingMapper] @@ -66,7 +66,7 @@ public static void MapMaximumTrackColor(SliderHandler handler, ISlider slider) { public static void MapThumbColor(SliderHandler handler, ISlider slider) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; nativeView.SetColor(slider.ThumbColor, "background-color", "contents > trough > slider"); @@ -86,7 +86,7 @@ static void SetImage(Widget w, string? image) public static void MapThumbImageSource(SliderHandler handler, ISlider slider) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; var img = slider.ThumbImageSource; diff --git a/src/Core/src/Handlers/Stepper/IStepperHandler.cs b/src/Core/src/Handlers/Stepper/IStepperHandler.cs index 5564d1d81b3d..fa7962cd143d 100644 --- a/src/Core/src/Handlers/Stepper/IStepperHandler.cs +++ b/src/Core/src/Handlers/Stepper/IStepperHandler.cs @@ -4,6 +4,8 @@ using PlatformView = Microsoft.Maui.Platform.MauiStepper; #elif WINDOWS using PlatformView = Microsoft.Maui.Platform.MauiStepper; +#elif GTK +using PlatformView = Gtk.SpinButton; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs b/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs index 88f562a70b1f..0876c5043599 100644 --- a/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs +++ b/src/Core/src/Handlers/Stepper/StepperHandler.Gtk.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui.Handlers // https://docs.gtk.org/gtk3/class.SpinButton.html public partial class StepperHandler : ViewHandler { - protected override SpinButton CreateNativeView() + protected override SpinButton CreatePlatformView() { // var adjustment = new Adjustment(0, 0, 1, 1, 1, 1); // return new SpinButton(adjustment, 1, 1); @@ -18,7 +18,7 @@ protected override void ConnectHandler(SpinButton nativeView) { base.ConnectHandler(nativeView); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); nativeView.ValueChanged += OnNativeViewValueChanged; @@ -29,7 +29,7 @@ protected override void DisconnectHandler(SpinButton nativeView) { base.DisconnectHandler(nativeView); - _ = NativeView ?? throw new InvalidOperationException($"{nameof(NativeView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); nativeView.ValueChanged += OnNativeViewValueChanged; } @@ -44,25 +44,25 @@ void OnNativeViewValueChanged(object? sender, EventArgs e) public static void MapMinimum(StepperHandler handler, IStepper stepper) { - handler.NativeView?.UpdateRange(stepper); + handler.PlatformView?.UpdateRange(stepper); } public static void MapMaximum(StepperHandler handler, IStepper stepper) { - handler.NativeView?.UpdateRange(stepper); + handler.PlatformView?.UpdateRange(stepper); } public static void MapIncrement(StepperHandler handler, IStepper stepper) { - handler.NativeView?.UpdateIncrement(stepper); + handler.PlatformView?.UpdateIncrement(stepper); } public static void MapValue(StepperHandler handler, IStepper stepper) { - handler.NativeView?.UpdateValue(stepper); + handler.PlatformView?.UpdateValue(stepper); } } diff --git a/src/Core/src/Handlers/Stepper/StepperHandler.cs b/src/Core/src/Handlers/Stepper/StepperHandler.cs index 4b371f9785a3..393b7d7c054f 100644 --- a/src/Core/src/Handlers/Stepper/StepperHandler.cs +++ b/src/Core/src/Handlers/Stepper/StepperHandler.cs @@ -4,6 +4,8 @@ using PlatformView = Microsoft.Maui.Platform.MauiStepper; #elif WINDOWS using PlatformView = Microsoft.Maui.Platform.MauiStepper; +#elif GTK +using PlatformView = Gtk.SpinButton; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/SwipeItemMenuItem/ISwipeItemMenuItemHandler.cs b/src/Core/src/Handlers/SwipeItemMenuItem/ISwipeItemMenuItemHandler.cs index 3c959d14fe08..f55eb82577bf 100644 --- a/src/Core/src/Handlers/SwipeItemMenuItem/ISwipeItemMenuItemHandler.cs +++ b/src/Core/src/Handlers/SwipeItemMenuItem/ISwipeItemMenuItemHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.SwipeItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs new file mode 100644 index 000000000000..5fa3ce6fbd97 --- /dev/null +++ b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Maui.Handlers +{ + public partial class SwipeItemMenuItemHandler : ElementHandler + { + protected override Gtk.Widget CreatePlatformElement() + { + throw new NotImplementedException(); + } + + public static void MapTextColor(ISwipeItemMenuItemHandler handler, ITextStyle view) { } + + public static void MapCharacterSpacing(ISwipeItemMenuItemHandler handler, ITextStyle view) { } + + public static void MapFont(ISwipeItemMenuItemHandler handler, ITextStyle view) { } + + public static void MapText(ISwipeItemMenuItemHandler handler, ISwipeItemMenuItem view) { } + + public static void MapBackground(ISwipeItemMenuItemHandler handler, ISwipeItemMenuItem view) { } + + public static void MapVisibility(ISwipeItemMenuItemHandler handler, ISwipeItemMenuItem view) { } + + void OnSetImageSource(object? obj) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.cs b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.cs index a69ea4d77a25..47e8cd8adfa1 100644 --- a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.cs +++ b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.SwipeItem; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/SwipeItemView/ISwipeItemViewHandler.cs b/src/Core/src/Handlers/SwipeItemView/ISwipeItemViewHandler.cs index 7f720d1f94a0..1edb20737dca 100644 --- a/src/Core/src/Handlers/SwipeItemView/ISwipeItemViewHandler.cs +++ b/src/Core/src/Handlers/SwipeItemView/ISwipeItemViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.ContentCanvas; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs new file mode 100644 index 000000000000..aedfcd15b5e5 --- /dev/null +++ b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs @@ -0,0 +1,20 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class SwipeItemViewHandler : ViewHandler, ISwipeItemViewHandler + { + protected override Gtk.Widget CreatePlatformView() + { + throw new NotImplementedException(); + } + + public static void MapContent(ISwipeItemViewHandler handler, ISwipeItemView page) + { + } + + public static void MapVisibility(ISwipeItemViewHandler handler, ISwipeItemView view) + { + } + } +} diff --git a/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.cs b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.cs index b69d582d008b..cb3a10ecb1dc 100644 --- a/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.cs +++ b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.ContentCanvas; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/SwipeView/ISwipeViewHandler.cs b/src/Core/src/Handlers/SwipeView/ISwipeViewHandler.cs index 4d6e67797523..cc667ef929ba 100644 --- a/src/Core/src/Handlers/SwipeView/ISwipeViewHandler.cs +++ b/src/Core/src/Handlers/SwipeView/ISwipeViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.SwipeControl; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs new file mode 100644 index 000000000000..60915e083817 --- /dev/null +++ b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs @@ -0,0 +1,46 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class SwipeViewHandler : ViewHandler + { + protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + + public static void MapContent(ISwipeViewHandler handler, ISwipeView view) + { + } + + public static void MapSwipeTransitionMode(ISwipeViewHandler handler, ISwipeView swipeView) + { + } + + public static void MapRequestOpen(ISwipeViewHandler handler, ISwipeView swipeView, object? args) + { + if (args is not SwipeViewOpenRequest request) + { + return; + } + } + + public static void MapRequestClose(ISwipeViewHandler handler, ISwipeView swipeView, object? args) + { + if (args is not SwipeViewCloseRequest request) + { + return; + } + } + + public static void MapLeftItems(ISwipeViewHandler handler, ISwipeView view) + { + } + public static void MapTopItems(ISwipeViewHandler handler, ISwipeView view) + { + } + public static void MapRightItems(ISwipeViewHandler handler, ISwipeView view) + { + } + public static void MapBottomItems(ISwipeViewHandler handler, ISwipeView view) + { + } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/SwipeView/SwipeViewHandler.cs b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.cs index d8ae7e7ee6f7..28ec1b112c97 100644 --- a/src/Core/src/Handlers/SwipeView/SwipeViewHandler.cs +++ b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.SwipeControl; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs index ae57214b768d..f3e0909b612a 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs @@ -8,14 +8,14 @@ namespace Microsoft.Maui.Handlers public partial class SwitchHandler : ViewHandler { // - protected override Switch CreateNativeView() + protected override Switch CreatePlatformView() { return new Switch(); } public static void MapIsOn(SwitchHandler handler, ISwitch view) { - handler.NativeView?.UpdateIsOn(view); + handler.PlatformView?.UpdateIsOn(view); } [MissingMapper] @@ -23,7 +23,7 @@ public static void MapTrackColor(SwitchHandler handler, ISwitch view) { } public static void MapThumbColor(SwitchHandler handler, ISwitch view) { - if (handler.NativeView is not { } nativeView) + if (handler.PlatformView is not { } nativeView) return; nativeView.SetColor(view.ThumbColor, "color", "slider"); diff --git a/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs b/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs index 4e8eeb0e7ca6..bbb874f916c7 100644 --- a/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs +++ b/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs @@ -9,6 +9,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs index 2d156836edc5..1067bed8ca47 100644 --- a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs @@ -1,10 +1,10 @@ -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers { public partial class TimePickerHandler : ViewHandler { - protected override MauiTimePicker CreateNativeView() + protected override MauiTimePicker CreatePlatformView() { return new MauiTimePicker(); } @@ -12,13 +12,13 @@ protected override MauiTimePicker CreateNativeView() [MissingMapper] public static void MapFormat(TimePickerHandler handler, ITimePicker view) { - handler.NativeView?.UpdateFormat(view); + handler.PlatformView?.UpdateFormat(view); } [MissingMapper] public static void MapTime(TimePickerHandler handler, ITimePicker view) { - handler.NativeView?.UpdateTime(view); + handler.PlatformView?.UpdateTime(view); } [MissingMapper] diff --git a/src/Core/src/Handlers/Toolbar/IToolbarHandler.cs b/src/Core/src/Handlers/Toolbar/IToolbarHandler.cs index 0ebe73b80733..b26e6228b11d 100644 --- a/src/Core/src/Handlers/Toolbar/IToolbarHandler.cs +++ b/src/Core/src/Handlers/Toolbar/IToolbarHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.Maui.Platform.MauiToolbar; #elif TIZEN using PlatformView =ElmSharp.Toolbar; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs b/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs new file mode 100644 index 000000000000..a457e2b4cbf1 --- /dev/null +++ b/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs @@ -0,0 +1,13 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class ToolbarHandler : ElementHandler + { + protected override Gtk.Widget CreatePlatformElement() => throw new NotImplementedException(); + + public static void MapTitle(IToolbarHandler arg1, IToolbar arg2) + { + } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Toolbar/ToolbarHandler.cs b/src/Core/src/Handlers/Toolbar/ToolbarHandler.cs index 29b23477bc7b..7fd944000c04 100644 --- a/src/Core/src/Handlers/Toolbar/ToolbarHandler.cs +++ b/src/Core/src/Handlers/Toolbar/ToolbarHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.Maui.Platform.MauiToolbar; #elif TIZEN using PlatformView =ElmSharp.Toolbar; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs index 5e3e878c44a0..394a0ed4c3e4 100644 --- a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs @@ -13,7 +13,7 @@ public static void MapTranslationY(ViewHandler handler, IView view) { } [MissingMapper] public static void MapScale(ViewHandler handler, IView view) { - //handler.NativeView.UpdateScale(view.Scale); + //handler.PlatformView.UpdateScale(view.Scale); } [MissingMapper] diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs index e940798cf4ec..f032c9179f23 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs @@ -11,7 +11,7 @@ public partial class ViewHandler : IPlatformViewHan Gtk.Widget? IPlatformViewHandler.PlatformView => (Gtk.Widget?)base.PlatformView; - public override void NativeArrange(Rect rect) + public override void PlatformArrange(Rect rect) { PlatformView?.Arrange(rect); } diff --git a/src/Core/src/Handlers/WebView/IWebViewHandler.cs b/src/Core/src/Handlers/WebView/IWebViewHandler.cs index 2be1cb754902..b965d256aeae 100644 --- a/src/Core/src/Handlers/WebView/IWebViewHandler.cs +++ b/src/Core/src/Handlers/WebView/IWebViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.WebView2; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.MauiWebView; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs new file mode 100644 index 000000000000..0feebd21e688 --- /dev/null +++ b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs @@ -0,0 +1,17 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class WebViewHandler : ViewHandler + { + protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + + public static void MapSource(IWebViewHandler handler, IWebView webView) { } + + public static void MapGoBack(IWebViewHandler handler, IWebView webView, object? arg) { } + public static void MapGoForward(IWebViewHandler handler, IWebView webView, object? arg) { } + public static void MapReload(IWebViewHandler handler, IWebView webView, object? arg) { } + public static void MapEval(IWebViewHandler handler, IWebView webView, object? arg) { } + public static void MapEvaluateJavaScriptAsync(IWebViewHandler handler, IWebView webView, object? arg) { } + } +} \ No newline at end of file diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.cs b/src/Core/src/Handlers/WebView/WebViewHandler.cs index 6e769cea6492..f78989528f4a 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.WebView2; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.MauiWebView; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Window/IWindowHandler.cs b/src/Core/src/Handlers/Window/IWindowHandler.cs index e86376db3ae6..dc1d6c90e0b5 100644 --- a/src/Core/src/Handlers/Window/IWindowHandler.cs +++ b/src/Core/src/Handlers/Window/IWindowHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Window; #elif TIZEN using PlatformView = ElmSharp.Window; +#elif GTK +using PlatformView = Gtk.Window; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs index fa47f1ea02c5..5667f79bac6e 100644 --- a/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs +++ b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs @@ -6,18 +6,20 @@ namespace Microsoft.Maui.Handlers public partial class WindowHandler : ElementHandler { - public static void MapTitle(WindowHandler handler, IWindow window) => - handler.NativeView.UpdateTitle(window); + public static void MapTitle(IWindowHandler handler, IWindow window) => + handler.PlatformView.UpdateTitle(window); - public static void MapContent(WindowHandler handler, IWindow window) + public static void MapContent(IWindowHandler handler, IWindow window) { _ = handler.MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - var nativeContent = window.Content.ToNative(handler.MauiContext); + var nativeContent = window.Content.ToPlatform(handler.MauiContext); - handler.NativeView.Child = nativeContent; + handler.PlatformView.Child = nativeContent; } + [MissingMapper] + public static void MapRequestDisplayDensity(IWindowHandler handler, IWindow window, object? args) { } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ContentView.cs b/src/Core/src/Platform/Gtk/ContentView.cs new file mode 100644 index 000000000000..1af8361a3309 --- /dev/null +++ b/src/Core/src/Platform/Gtk/ContentView.cs @@ -0,0 +1,41 @@ +using System; +using Gtk; +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui.Platform +{ + + public class ContentView : Gtk.Box + { + + public ContentView() : base(Orientation.Horizontal, 0) { } + + internal Func? CrossPlatformMeasure { get; set; } + + internal Func? CrossPlatformArrange { get; set; } + + Widget? _content; + + public Widget? Content + { + get => _content; + set + { + if (_content != null && value != null) + { + this.ReplaceChild(_content, value); + + } + else if (value != null) + { + PackStart(value, true, true, 0); + } + + _content = value; + + } + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/DatePickerExtensions.cs b/src/Core/src/Platform/Gtk/DatePickerExtensions.cs index a4d5d54d9cd4..d65389f44c1e 100644 --- a/src/Core/src/Platform/Gtk/DatePickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/DatePickerExtensions.cs @@ -1,4 +1,4 @@ -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/HandlerExtensions.cs b/src/Core/src/Platform/Gtk/HandlerExtensions.cs index 1eff0fc0a6ba..1e5daa7a1fe3 100644 --- a/src/Core/src/Platform/Gtk/HandlerExtensions.cs +++ b/src/Core/src/Platform/Gtk/HandlerExtensions.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui public static class HandlerExtensions { - public static Widget ToNative(this IView view, IMauiContext context) + public static Widget ToPlatform(this IView view, IMauiContext context) { _ = view ?? throw new ArgumentNullException(nameof(view)); _ = context ?? throw new ArgumentNullException(nameof(context)); diff --git a/src/Core/src/Platform/Gtk/ImageView.cs b/src/Core/src/Platform/Gtk/ImageView.cs index 7ff8e0a1d9e7..bfcf85df4dfb 100644 --- a/src/Core/src/Platform/Gtk/ImageView.cs +++ b/src/Core/src/Platform/Gtk/ImageView.cs @@ -1,4 +1,4 @@ -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { // https://docs.gtk.org/gtk3/class.Imgage.html diff --git a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs index 6e48b32bf99a..41285ec351c1 100644 --- a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Platform.Gtk; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs index 000203b9407a..984eafadb45c 100644 --- a/src/Core/src/Platform/Gtk/LabelView.cs +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -1,7 +1,7 @@ using Cairo; using Gtk; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class LabelView : Label diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index d5cdf3313bd9..be2ca34d876f 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -11,7 +11,7 @@ using Size = Microsoft.Maui.Graphics.Size; using Point = Microsoft.Maui.Graphics.Point; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { // refactored from: https://github.com/mono/xwt/blob/501f6b529fca632655295169094f637627c74c47/Xwt.Gtk/Xwt.GtkBackend/BoxBackend.cs @@ -427,7 +427,7 @@ public void Arrange(Rectangle rect) if (rect.IsEmpty) return; - if (rect == Allocation.ToRectangle()) return; + if (rect == Allocation.ToRect()) return; if (IsSizeAllocating) { diff --git a/src/Core/src/Platform/Gtk/LayoutViewExtensions.cs b/src/Core/src/Platform/Gtk/LayoutViewExtensions.cs new file mode 100644 index 000000000000..967574d6d84f --- /dev/null +++ b/src/Core/src/Platform/Gtk/LayoutViewExtensions.cs @@ -0,0 +1,9 @@ +namespace Microsoft.Maui.Platform; + +public static class LayoutViewExtensions +{ + public static void UpdateClipsToBounds(this LayoutView layoutCanvas, ILayout layout) + { + //TODO: Need to impl + } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/MauiDatePicker.cs b/src/Core/src/Platform/Gtk/MauiDatePicker.cs index 75cc4a1e26b6..d4b185ca7cfe 100644 --- a/src/Core/src/Platform/Gtk/MauiDatePicker.cs +++ b/src/Core/src/Platform/Gtk/MauiDatePicker.cs @@ -1,7 +1,7 @@ using System; using System.Runtime.Serialization; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class MauiDatePicker : Gtk.Label { diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index e13b9e00f2ae..89a694b6b702 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -151,11 +151,6 @@ protected void Launch(EventArgs args) } - protected void ConfigureNativeServices(HostBuilderContext ctx, IServiceCollection services) - { - //future use: there will be a need of GtkNativeServices, eg. for WebView - } - public static void DispatchPendingEvents() { // The loop is limited to 1000 iterations as a workaround for an issue that some users diff --git a/src/Core/src/Platform/Gtk/MauiImageButton.cs b/src/Core/src/Platform/Gtk/MauiImageButton.cs new file mode 100644 index 000000000000..23ddf488bc40 --- /dev/null +++ b/src/Core/src/Platform/Gtk/MauiImageButton.cs @@ -0,0 +1,4 @@ +namespace Microsoft.Maui.Platform; + +public class MauiImageButton : Gtk.Button +{ } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/MauiSearchBar.cs b/src/Core/src/Platform/Gtk/MauiSearchBar.cs index 30c1899f9594..df1128edda39 100644 --- a/src/Core/src/Platform/Gtk/MauiSearchBar.cs +++ b/src/Core/src/Platform/Gtk/MauiSearchBar.cs @@ -1,7 +1,7 @@ using System; using Gtk; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class MauiSearchBar : Gtk.SearchBar diff --git a/src/Core/src/Platform/Gtk/MauiShapeView.cs b/src/Core/src/Platform/Gtk/MauiShapeView.cs index e0ac3c19872d..1a078fbc6d93 100644 --- a/src/Core/src/Platform/Gtk/MauiShapeView.cs +++ b/src/Core/src/Platform/Gtk/MauiShapeView.cs @@ -1,6 +1,6 @@ using Microsoft.Maui.Graphics.Platform.Gtk; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class MauiShapeView : GtkGraphicsView { diff --git a/src/Core/src/Platform/Gtk/MauiTimePicker.cs b/src/Core/src/Platform/Gtk/MauiTimePicker.cs index 31dfe6ab84e8..7066d94e443c 100644 --- a/src/Core/src/Platform/Gtk/MauiTimePicker.cs +++ b/src/Core/src/Platform/Gtk/MauiTimePicker.cs @@ -1,6 +1,6 @@ using System; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class MauiTimePicker : Gtk.Label { diff --git a/src/Core/src/Platform/Gtk/MauiWindow.cs b/src/Core/src/Platform/Gtk/MauiWindow.cs index bde10c700da5..99fa31f8d138 100644 --- a/src/Core/src/Platform/Gtk/MauiWindow.cs +++ b/src/Core/src/Platform/Gtk/MauiWindow.cs @@ -3,7 +3,7 @@ using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { [Obsolete("use MauiGtkApplication")] diff --git a/src/Core/src/Platform/Gtk/NavigationView.cs b/src/Core/src/Platform/Gtk/NavigationView.cs index 15f4db42dd20..1f4792297d41 100644 --- a/src/Core/src/Platform/Gtk/NavigationView.cs +++ b/src/Core/src/Platform/Gtk/NavigationView.cs @@ -1,4 +1,4 @@ -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class NavigationView : Gtk.Box diff --git a/src/Core/src/Platform/Gtk/PageView.cs b/src/Core/src/Platform/Gtk/PageView.cs index 9edb071fbf6c..916f7ad58b31 100644 --- a/src/Core/src/Platform/Gtk/PageView.cs +++ b/src/Core/src/Platform/Gtk/PageView.cs @@ -2,40 +2,10 @@ using Gtk; using Microsoft.Maui.Graphics; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { - public class PageView : Gtk.Box - { - - public PageView() : base(Orientation.Horizontal, 0) { } - - internal Func? CrossPlatformMeasure { get; set; } - - internal Func? CrossPlatformArrange { get; set; } - - Widget? _content; - - public Widget? Content - { - get => _content; - set - { - if (_content != null && value != null) - { - this.ReplaceChild(_content, value); - - } - else if (value != null) - { - PackStart(value, true, true, 0); - } - - _content = value; - - } - } - - } + public class PageView : ContentView + { } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs new file mode 100644 index 000000000000..bd19109b9da9 --- /dev/null +++ b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs @@ -0,0 +1,4 @@ +namespace Microsoft.Maui.Platform; + +public class PlatformTouchGraphicsView : Microsoft.Maui.Graphics.Platform.Gtk.GtkGraphicsView +{ } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/RefreshView.cs b/src/Core/src/Platform/Gtk/RefreshView.cs index 328ceb1b601a..636b8c0f75c8 100644 --- a/src/Core/src/Platform/Gtk/RefreshView.cs +++ b/src/Core/src/Platform/Gtk/RefreshView.cs @@ -1,4 +1,4 @@ -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class RefreshView : Gtk.Box diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index 3807a6c95ae3..19a71d03cda2 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -1,6 +1,6 @@ using System; -namespace Microsoft.Maui.Native +namespace Microsoft.Maui.Platform { public class ScrollView : Gtk.ScrolledWindow diff --git a/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs b/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs index 43e40a93a064..7710f424e218 100644 --- a/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ShapeViewExtensions.cs @@ -1,5 +1,5 @@ using Microsoft.Maui.Graphics; -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/Gtk/TimePickerExtensions.cs b/src/Core/src/Platform/Gtk/TimePickerExtensions.cs index 5ed99950324a..eb0bbf44f443 100644 --- a/src/Core/src/Platform/Gtk/TimePickerExtensions.cs +++ b/src/Core/src/Platform/Gtk/TimePickerExtensions.cs @@ -1,4 +1,4 @@ -using Microsoft.Maui.Native; +using Microsoft.Maui.Platform; namespace Microsoft.Maui { diff --git a/src/Core/src/Platform/MauiContext.Gtk.cs b/src/Core/src/Platform/MauiContext.Gtk.cs index 52a1046f645f..49686cba7296 100644 --- a/src/Core/src/Platform/MauiContext.Gtk.cs +++ b/src/Core/src/Platform/MauiContext.Gtk.cs @@ -4,8 +4,7 @@ namespace Microsoft.Maui { - public partial class MauiContext_ : IMauiContext - { + public partial class MauiContext_ { public Gtk.Window? Window { get; internal set; } diff --git a/src/Core/src/VisualDiagnostics/VisualDiagnosticsOverlay.Gtk.cs b/src/Core/src/VisualDiagnostics/VisualDiagnosticsOverlay.Gtk.cs new file mode 100644 index 000000000000..8f7265472fba --- /dev/null +++ b/src/Core/src/VisualDiagnostics/VisualDiagnosticsOverlay.Gtk.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace Microsoft.Maui +{ + public partial class VisualDiagnosticsOverlay + { + readonly Dictionary _scrollViews = new(); + + /// + public void AddScrollableElementHandler(IScrollView scrollBar) + { + } + + /// + public void RemoveScrollableElementHandler() + { + } + } +} \ No newline at end of file diff --git a/src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs b/src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs new file mode 100644 index 000000000000..6bf6bafdd7eb --- /dev/null +++ b/src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs @@ -0,0 +1,26 @@ +namespace Microsoft.Maui +{ + public partial class WindowOverlay + { + Gtk.Widget? _graphicsView = null; + + /// + public void Invalidate() + { + } + + /// + public virtual bool Initialize() + { + return IsPlatformViewInitialized = true; + } + + /// + /// Deinitializes the native event hooks and handlers used to drive the overlay. + /// + void DeinitializePlatformDependencies() + { + IsPlatformViewInitialized = false; + } + } +} \ No newline at end of file diff --git a/src/Core/src/WindowOverlay/WindowOverlay.cs b/src/Core/src/WindowOverlay/WindowOverlay.cs index aeef6094c979..bb9010175b4b 100644 --- a/src/Core/src/WindowOverlay/WindowOverlay.cs +++ b/src/Core/src/WindowOverlay/WindowOverlay.cs @@ -11,6 +11,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif From 889ba542303a2a67dac8ea2e838d23edbc15fe46 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 14:37:37 +0200 Subject: [PATCH 168/425] [Graphics.Gtk] PlatformStringSizeService & TextLayout: change to public --- src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs | 2 +- src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs index b374caf7bba7..085aacd07900 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformStringSizeService.cs @@ -3,7 +3,7 @@ public class PlatformStringSizeService : IStringSizeService { Cairo.Context? _sharedContext; - internal Cairo.Context SharedContext { + public Cairo.Context SharedContext { get { if (_sharedContext == null) { using var sf = new Cairo.ImageSurface (Cairo.Format.ARGB32, 1, 1); diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs index 812d423dd009..76352eed623b 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs @@ -10,7 +10,7 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; /// https://developer.gnome.org/pango/1.46/pango-Layout-Objects.html /// https://developer.gnome.org/gdk3/stable/gdk3-Pango-Interaction.html /// -internal class TextLayout : IDisposable { +public class TextLayout : IDisposable { private Context _context; From a238a5da18ac667d965bd3bce76e33138b799bf2 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 14:38:22 +0200 Subject: [PATCH 169/425] [Gtk] Controls.Sample.Gtk.csproj: adjust TargetFrameworks --- Microsoft.Maui.sln | 7 +++++++ .../samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index 22d67befc940..aa5d912e1526 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -256,6 +256,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsTester.Skia.Gtk", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Controls.Core.Design.UnitTests", "src\Controls\tests\Core.Design.UnitTests\Controls.Core.Design.UnitTests.csproj", "{F68932B0-81A2-4CC3-A4F7-28091EE91B23}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Gtk", "src\Controls\samples\Controls.Sample.Gtk\Controls.Sample.Gtk.csproj", "{E3FD165E-E0BE-4263-AC0E-260BA6713AD3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -642,6 +644,10 @@ Global {624D161D-762C-45F7-9CBC-9929BA5D13EF}.Debug|Any CPU.Build.0 = Debug|Any CPU {624D161D-762C-45F7-9CBC-9929BA5D13EF}.Release|Any CPU.ActiveCfg = Release|Any CPU {624D161D-762C-45F7-9CBC-9929BA5D13EF}.Release|Any CPU.Build.0 = Release|Any CPU + {E3FD165E-E0BE-4263-AC0E-260BA6713AD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3FD165E-E0BE-4263-AC0E-260BA6713AD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3FD165E-E0BE-4263-AC0E-260BA6713AD3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3FD165E-E0BE-4263-AC0E-260BA6713AD3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -761,6 +767,7 @@ Global {F68932B0-81A2-4CC3-A4F7-28091EE91B23} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E} {4EDE89FC-7C84-4855-8DD8-D7C8B128A974} = {42AB9AE1-631D-4AD4-85B7-910FF0940BDB} {624D161D-762C-45F7-9CBC-9929BA5D13EF} = {1BA0121E-0B83-4C8F-81BE-C293E7E35DCE} + {E3FD165E-E0BE-4263-AC0E-260BA6713AD3} = {E1082E26-D700-4127-9329-66D673FD2D55} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50} diff --git a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj index 16c4f6fbdd21..eb8910d0a970 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj +++ b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj @@ -2,7 +2,7 @@ WinExe - $(MauiGtkTargets) + $(MauiPlatforms);$(_MauiDotNetTfm) false Maui From f761c4f06cb724606af771fffe3d3361a9769020 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 14:42:04 +0200 Subject: [PATCH 170/425] [Gtk] Controls.Core.csproj ShellHandler.Gtk.cs: track api changes --- src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs index 3aa9f50347c4..d61b9d946f6b 100644 --- a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs @@ -9,7 +9,7 @@ namespace Microsoft.Maui.Controls.Handlers { public partial class ShellHandler : ViewHandler { - protected override Gtk.Widget CreateNativeView() + protected override Gtk.Widget CreatePlatformView() { throw new NotImplementedException(); } From e8b75908140ec53a01bd71952c7f41279d76354e Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 16:44:56 +0200 Subject: [PATCH 171/425] [Gtk] [Gtk] Core.csproj: track api changes III --- src/Core/src/Graphics/PaintExtensions.Gtk.cs | 2 +- .../ActivityIndicatorHandler.Gtk.cs | 4 +-- .../ActivityIndicatorHandler.cs | 2 ++ .../IActivityIndicatorHandler.cs | 2 ++ .../src/Handlers/Button/ButtonHandler.Gtk.cs | 12 +++---- src/Core/src/Handlers/Button/ButtonHandler.cs | 2 ++ .../src/Handlers/Button/IButtonHandler.cs | 2 ++ .../Handlers/CheckBox/CheckBoxHandler.Gtk.cs | 4 +-- .../ContentView/ContentViewHandler.Gtk.cs | 2 +- .../DatePicker/DatePickerHandler.Gtk.cs | 14 ++++---- .../Handlers/DatePicker/DatePickerHandler.cs | 2 ++ .../Handlers/DatePicker/IDatePickerHandler.cs | 2 ++ .../src/Handlers/Editor/EditorHandler.Gtk.cs | 20 ++++++------ src/Core/src/Handlers/Editor/EditorHandler.cs | 2 ++ .../src/Handlers/Editor/IEditorHandler.cs | 2 ++ .../src/Handlers/Entry/EntryHandler.Gtk.cs | 32 +++++++++---------- src/Core/src/Handlers/Entry/EntryHandler.cs | 2 ++ src/Core/src/Handlers/Entry/IEntryHandler.cs | 2 ++ src/Core/src/Handlers/Label/ILabelHandler.cs | 2 ++ .../src/Handlers/Label/LabelHandler.Gtk.cs | 22 ++++++------- src/Core/src/Handlers/Label/LabelHandler.cs | 2 ++ .../RefreshView/RefreshViewHandler.Gtk.cs | 8 ++--- .../ScrollView/ScrollViewHandler.Gtk.cs | 10 +++--- .../Handlers/ShapeView/IShapeViewHandler.cs | 2 ++ .../ShapeView/ShapeViewHandler.Gtk.cs | 18 +++++------ .../Handlers/ShapeView/ShapeViewHandler.cs | 2 ++ .../src/Handlers/Slider/ISliderHandler.cs | 2 ++ .../src/Handlers/Slider/SliderHandler.Gtk.cs | 14 ++++---- src/Core/src/Handlers/Slider/SliderHandler.cs | 2 ++ .../src/Handlers/Switch/ISwitchHandler.cs | 2 ++ .../src/Handlers/Switch/SwitchHandler.Gtk.cs | 6 ++-- src/Core/src/Handlers/Switch/SwitchHandler.cs | 2 ++ .../Handlers/TimePicker/ITimePickerHandler.cs | 2 ++ .../TimePicker/TimePickerHandler.Gtk.cs | 10 +++--- .../Handlers/TimePicker/TimePickerHandler.cs | 2 ++ src/Core/src/Handlers/View/ViewHandler.Gtk.cs | 20 ++++++------ src/Core/src/Platform/ElementExtensions.cs | 5 +++ src/Core/src/Platform/Gtk/ViewExtensions.cs | 28 ++++++++++++++++ src/Core/src/Platform/ViewExtensions.cs | 3 ++ src/Core/src/ViewExtensions.cs | 3 ++ 40 files changed, 178 insertions(+), 99 deletions(-) diff --git a/src/Core/src/Graphics/PaintExtensions.Gtk.cs b/src/Core/src/Graphics/PaintExtensions.Gtk.cs index adb9fd182347..e9c09dd95780 100644 --- a/src/Core/src/Graphics/PaintExtensions.Gtk.cs +++ b/src/Core/src/Graphics/PaintExtensions.Gtk.cs @@ -32,7 +32,7 @@ public static partial class PaintExtensions var pixbuf = patternPaint.GetPatternBitmap(1); owned = true; - // todo: create a cairo.pattern & store it in pixbuf + // TODO: create a cairo.pattern & store it in pixbuf return pixbuf; } diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs index 7bce47d4e7d2..0f99dc0150e9 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs @@ -9,13 +9,13 @@ protected override Spinner CreatePlatformView() return new(); } - public static void MapIsRunning(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) + public static void MapIsRunning(IActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { handler.PlatformView?.UpdateIsRunning(activityIndicator); } - public static void MapColor(ActivityIndicatorHandler handler, IActivityIndicator activityIndicator) + public static void MapColor(IActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { handler.PlatformView?.SetForegroundColor(activityIndicator.Color); diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.cs index 586468529a61..839b0292f671 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ProgressRing; #elif TIZEN using PlatformView = ElmSharp.ProgressBar; +#elif GTK +using PlatformView = Gtk.Spinner; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ActivityIndicator/IActivityIndicatorHandler.cs b/src/Core/src/Handlers/ActivityIndicator/IActivityIndicatorHandler.cs index 4ea085a36d09..e25c7e925e65 100644 --- a/src/Core/src/Handlers/ActivityIndicator/IActivityIndicatorHandler.cs +++ b/src/Core/src/Handlers/ActivityIndicator/IActivityIndicatorHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ProgressRing; #elif TIZEN using PlatformView = ElmSharp.ProgressBar; +#elif GTK +using PlatformView = Gtk.Spinner; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index d439abc06abb..b081ab64d873 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -29,17 +29,17 @@ protected override void DisconnectHandler(Button nativeView) nativeView.ButtonReleaseEvent -= OnButtonReleaseEvent; } - public static void MapText(ButtonHandler handler, IButton button) + public static void MapText(IButtonHandler handler, IButton button) { handler.PlatformView?.UpdateText(button); } - public static void MapTextColor(ButtonHandler handler, IButton button) + public static void MapTextColor(IButtonHandler handler, IButton button) { handler.PlatformView?.UpdateTextColor(button.TextColor); } - public static void MapCharacterSpacing(ButtonHandler handler, IButton button) + public static void MapCharacterSpacing(IButtonHandler handler, IButton button) { if (handler.PlatformView.Child is Label nativeView) { @@ -48,14 +48,14 @@ public static void MapCharacterSpacing(ButtonHandler handler, IButton button) } [MissingMapper] - public static void MapImageSource(ButtonHandler handler, IButton image) { } + public static void MapImageSource(IButtonHandler handler, IImage image) { } - public static void MapFont(ButtonHandler handler, IButton button) + public static void MapFont(IButtonHandler handler, IButton button) { handler.MapFont(button); } - public static void MapPadding(ButtonHandler handler, IButton button) + public static void MapPadding(IButtonHandler handler, IButton button) { handler.PlatformView.WithPadding(button.Padding); } diff --git a/src/Core/src/Handlers/Button/ButtonHandler.cs b/src/Core/src/Handlers/Button/ButtonHandler.cs index 26e8d679e144..c6e8ace53138 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Button; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Button; +#elif GTK +using PlatformView = Gtk.Button; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Button/IButtonHandler.cs b/src/Core/src/Handlers/Button/IButtonHandler.cs index be507ce3798f..d93bc574719e 100644 --- a/src/Core/src/Handlers/Button/IButtonHandler.cs +++ b/src/Core/src/Handlers/Button/IButtonHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Button; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Button; +#elif GTK +using PlatformView = Gtk.Button; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs index 670f4f31c440..382a2ac54a15 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs @@ -11,7 +11,7 @@ public partial class CheckBoxHandler : ViewHandler protected override CheckButton CreatePlatformView() => new(); - public static void MapIsChecked(CheckBoxHandler handler, ICheckBox check) + public static void MapIsChecked(ICheckBoxHandler handler, ICheckBox check) { handler.PlatformView?.UpdateIsChecked(check); } @@ -33,7 +33,7 @@ protected void OnToggledEvent(object? sender, EventArgs e) } - public static void MapForeground(CheckBoxHandler handler, ICheckBox check) + public static void MapForeground(ICheckBoxHandler handler, ICheckBox check) { handler.PlatformView?.UpdateForeground(check.Foreground); } diff --git a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs index 8aa8faa058b1..376d2c0ea2d1 100644 --- a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs @@ -7,7 +7,7 @@ public partial class ContentViewHandler : ViewHandler [MissingMapper] protected override ContentView CreatePlatformView() => throw new NotImplementedException(); - void UpdateContent() + public void UpdateContent() { _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs index 5312c5108dbd..b90ce7c14ae3 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs @@ -10,32 +10,32 @@ protected override MauiDatePicker CreatePlatformView() } [MissingMapper] - public static void MapFormat(DatePickerHandler handler, IDatePicker datePicker) + public static void MapFormat(IDatePickerHandler handler, IDatePicker datePicker) { handler.PlatformView?.UpdateFormat(datePicker); } [MissingMapper] - public static void MapDate(DatePickerHandler handler, IDatePicker datePicker) + public static void MapDate(IDatePickerHandler handler, IDatePicker datePicker) { handler.PlatformView?.UpdateDate(datePicker); } [MissingMapper] - public static void MapMinimumDate(DatePickerHandler handler, IDatePicker datePicker) { } + public static void MapMinimumDate(IDatePickerHandler handler, IDatePicker datePicker) { } [MissingMapper] - public static void MapMaximumDate(DatePickerHandler handler, IDatePicker datePicker) { } + public static void MapMaximumDate(IDatePickerHandler handler, IDatePicker datePicker) { } [MissingMapper] - public static void MapCharacterSpacing(DatePickerHandler handler, IDatePicker datePicker) { } + public static void MapCharacterSpacing(IDatePickerHandler handler, IDatePicker datePicker) { } - public static void MapFont(DatePickerHandler handler, IDatePicker datePicker) + public static void MapFont(IDatePickerHandler handler, IDatePicker datePicker) { handler.MapFont(datePicker); } [MissingMapper] - public static void MapTextColor(DatePickerHandler handler, IDatePicker datePicker) { } + public static void MapTextColor(IDatePickerHandler handler, IDatePicker datePicker) { } } } diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.cs index cf1b639cd7bc..00cdc2eed3d5 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.cs @@ -8,6 +8,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.CalendarDatePicker; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiDatePicker; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/DatePicker/IDatePickerHandler.cs b/src/Core/src/Handlers/DatePicker/IDatePickerHandler.cs index 70baf027ac46..ad421b9ee393 100644 --- a/src/Core/src/Handlers/DatePicker/IDatePickerHandler.cs +++ b/src/Core/src/Handlers/DatePicker/IDatePickerHandler.cs @@ -8,6 +8,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.CalendarDatePicker; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiDatePicker; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index 49564de66bbe..99fd89001c75 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -59,47 +59,47 @@ protected void OnNativeTextChanged(object? sender, EventArgs e) virtualView.Text = text; } - public static void MapText(EditorHandler handler, IEditor editor) + public static void MapText(IEditorHandler handler, IEditor editor) { handler.PlatformView?.UpdateText(editor); } - public static void MapFont(EditorHandler handler, IEditor editor) + public static void MapFont(IEditorHandler handler, IEditor editor) { handler.MapFont(editor); } - public static void MapIsReadOnly(EditorHandler handler, IEditor editor) + public static void MapIsReadOnly(IEditorHandler handler, IEditor editor) { if (handler.PlatformView is { } nativeView) nativeView.Editable = !editor.IsReadOnly; } - public static void MapTextColor(EditorHandler handler, IEditor editor) + public static void MapTextColor(IEditorHandler handler, IEditor editor) { handler.PlatformView?.UpdateTextColor(editor.TextColor); } [MissingMapper] - public static void MapPlaceholder(EditorHandler handler, IEditor editor) { } + public static void MapPlaceholder(IEditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapPlaceholderColor(EditorHandler handler, IEditor editor) { } + public static void MapPlaceholderColor(IEditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapCharacterSpacing(EditorHandler handler, IEditor editor) + public static void MapCharacterSpacing(IEditorHandler handler, IEditor editor) { // see: https://docs.gtk.org/gtk3/property.TextTag.letter-spacing.html } [MissingMapper] - public static void MapMaxLength(EditorHandler handler, IEditor editor) { } + public static void MapMaxLength(IEditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapIsTextPredictionEnabled(EditorHandler handler, IEditor editor) { } + public static void MapIsTextPredictionEnabled(IEditorHandler handler, IEditor editor) { } [MissingMapper] - public static void MapKeyboard(EditorHandler handler, IEditor editor) { } + public static void MapKeyboard(IEditorHandler handler, IEditor editor) { } } diff --git a/src/Core/src/Handlers/Editor/EditorHandler.cs b/src/Core/src/Handlers/Editor/EditorHandler.cs index cf6658077751..bff9a3aada30 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TextBox; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Gtk.TextView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Editor/IEditorHandler.cs b/src/Core/src/Handlers/Editor/IEditorHandler.cs index c45f9e04bd0a..50064efe3841 100644 --- a/src/Core/src/Handlers/Editor/IEditorHandler.cs +++ b/src/Core/src/Handlers/Editor/IEditorHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TextBox; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Gtk.TextView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index 1df4135b3e5d..8b5897f5e483 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -99,17 +99,17 @@ protected void OnNativeViewChanged(object? sender, EventArgs e) HandleSelectionChanged(); } - public static void MapText(EntryHandler handler, IEntry entry) + public static void MapText(IEntryHandler handler, IEntry entry) { handler.PlatformView?.UpdateText(entry); } - public static void MapTextColor(EntryHandler handler, IEntry entry) + public static void MapTextColor(IEntryHandler handler, IEntry entry) { handler.PlatformView?.UpdateTextColor(entry.TextColor); } - public static void MapIsPassword(EntryHandler handler, IEntry entry) + public static void MapIsPassword(IEntryHandler handler, IEntry entry) { if (handler.PlatformView is { } nativeView) { @@ -117,57 +117,57 @@ public static void MapIsPassword(EntryHandler handler, IEntry entry) } } - public static void MapHorizontalTextAlignment(EntryHandler handler, IEntry entry) + public static void MapHorizontalTextAlignment(IEntryHandler handler, IEntry entry) { if (handler.PlatformView is { } nativeView) nativeView.Alignment = entry.HorizontalTextAlignment.ToXyAlign(); } [MissingMapper] - public static void MapVerticalTextAlignment(EntryHandler handler, IEntry entry) + public static void MapVerticalTextAlignment(IEntryHandler handler, IEntry entry) { } [MissingMapper] - public static void MapIsTextPredictionEnabled(EntryHandler handler, IEntry entry) { } + public static void MapIsTextPredictionEnabled(IEntryHandler handler, IEntry entry) { } - public static void MapMaxLength(EntryHandler handler, IEntry entry) + public static void MapMaxLength(IEntryHandler handler, IEntry entry) { if (handler.PlatformView is { } nativeView) nativeView.MaxLength = entry.MaxLength; } - public static void MapPlaceholder(EntryHandler handler, IEntry entry) + public static void MapPlaceholder(IEntryHandler handler, IEntry entry) { handler.PlatformView?.UpdatePlaceholder(entry); } - public static void MapIsReadOnly(EntryHandler handler, IEntry entry) + public static void MapIsReadOnly(IEntryHandler handler, IEntry entry) { handler.PlatformView?.UpdateIsReadOnly(entry); } - public static void MapFont(EntryHandler handler, IEntry entry) + public static void MapFont(IEntryHandler handler, IEntry entry) { handler.MapFont(entry); } - public static void MapCursorPosition(EntryHandler handler, IEntry entry) + public static void MapCursorPosition(IEntryHandler handler, IEntry entry) { handler.PlatformView?.UpdateCursorPosition(entry); } - public static void MapSelectionLength(EntryHandler handler, IEntry entry) + public static void MapSelectionLength(IEntryHandler handler, IEntry entry) { handler.PlatformView?.UpdateSelectionLength(entry); } [MissingMapper] - public static void MapReturnType(EntryHandler handler, IEntry entry) { } + public static void MapReturnType(IEntryHandler handler, IEntry entry) { } [MissingMapper] - public static void MapClearButtonVisibility(EntryHandler handler, IEntry entry) { } + public static void MapClearButtonVisibility(IEntryHandler handler, IEntry entry) { } - public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) + public static void MapCharacterSpacing(IEntryHandler handler, IEntry entry) { if (handler.PlatformView is not { } nativeView) return; @@ -176,7 +176,7 @@ public static void MapCharacterSpacing(EntryHandler handler, IEntry entry) } [MissingMapper] - public static void MapKeyboard(EntryHandler handler, IEntry entry) + public static void MapKeyboard(IEntryHandler handler, IEntry entry) { if (handler.PlatformView is not { } nativeView) return; diff --git a/src/Core/src/Handlers/Entry/EntryHandler.cs b/src/Core/src/Handlers/Entry/EntryHandler.cs index 866d0f333fee..8e94021f4211 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TextBox; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Gtk.Entry; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Entry/IEntryHandler.cs b/src/Core/src/Handlers/Entry/IEntryHandler.cs index c9ca0163418c..84c3f7e38c7e 100644 --- a/src/Core/src/Handlers/Entry/IEntryHandler.cs +++ b/src/Core/src/Handlers/Entry/IEntryHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TextBox; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Gtk.Entry; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Label/ILabelHandler.cs b/src/Core/src/Handlers/Label/ILabelHandler.cs index fe1c9932900a..aafa4b3c0aac 100644 --- a/src/Core/src/Handlers/Label/ILabelHandler.cs +++ b/src/Core/src/Handlers/Label/ILabelHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TextBlock; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Label; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.LabelView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index 1e506d122ab3..38d8fa97566f 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -113,48 +113,48 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra } - public static void MapText(LabelHandler handler, ILabel label) + public static void MapText(ILabelHandler handler, ILabel label) { handler.PlatformView?.UpdateText(label); } - public static void MapTextColor(LabelHandler handler, ILabel label) + public static void MapTextColor(ILabelHandler handler, ILabel label) { handler.PlatformView?.UpdateTextColor(label.TextColor); } - public static void MapFont(LabelHandler handler, ILabel label) + public static void MapFont(ILabelHandler handler, ILabel label) { handler.MapFont(label); } - public static void MapHorizontalTextAlignment(LabelHandler handler, ILabel label) + public static void MapHorizontalTextAlignment(ILabelHandler handler, ILabel label) { handler.PlatformView?.UpdateHorizontalTextAlignment(label); } - public static void MapVerticalTextAlignment(LabelHandler handler, ILabel label) + public static void MapVerticalTextAlignment(ILabelHandler handler, ILabel label) { handler.PlatformView?.UpdateVerticalTextAlignment(label); } - public static void MapLineBreakMode(LabelHandler handler, ILabel label) + public static void MapLineBreakMode(ILabelHandler handler, ILabel label) { handler.PlatformView?.UpdateLineBreakMode(label); } - public static void MapMaxLines(LabelHandler handler, ILabel label) + public static void MapMaxLines(ILabelHandler handler, ILabel label) { handler.PlatformView?.UpdateMaxLines(label); } - public static void MapPadding(LabelHandler handler, ILabel label) + public static void MapPadding(ILabelHandler handler, ILabel label) { handler.PlatformView.WithPadding(label.Padding); } - public static void MapCharacterSpacing(LabelHandler handler, ILabel label) + public static void MapCharacterSpacing(ILabelHandler handler, ILabel label) { if (handler.PlatformView is not { } nativeView) return; @@ -162,7 +162,7 @@ public static void MapCharacterSpacing(LabelHandler handler, ILabel label) nativeView.Attributes = nativeView.Attributes.AttrListFor(label.TextDecorations, label.CharacterSpacing); } - public static void MapTextDecorations(LabelHandler handler, ILabel label) + public static void MapTextDecorations(ILabelHandler handler, ILabel label) { if (handler.PlatformView is not { } nativeView) return; @@ -170,7 +170,7 @@ public static void MapTextDecorations(LabelHandler handler, ILabel label) nativeView.Attributes = nativeView.Attributes.AttrListFor(label.TextDecorations, label.CharacterSpacing); } - public static void MapLineHeight(LabelHandler handler, ILabel label) + public static void MapLineHeight(ILabelHandler handler, ILabel label) { if (handler.PlatformView is not { } nativeView) return; diff --git a/src/Core/src/Handlers/Label/LabelHandler.cs b/src/Core/src/Handlers/Label/LabelHandler.cs index 13bef46f8849..7744a641568a 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TextBlock; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Label; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.LabelView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs index 43299b444f60..ec2bade0c72f 100644 --- a/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs @@ -13,22 +13,22 @@ protected override RefreshView CreatePlatformView() } [MissingMapper] - public static void MapIsRefreshing(RefreshViewHandler handler, IRefreshView refreshView) + public static void MapIsRefreshing(IRefreshViewHandler handler, IRefreshView refreshView) { } [MissingMapper] - public static void MapContent(RefreshViewHandler handler, IRefreshView refreshView) + public static void MapContent(IRefreshViewHandler handler, IRefreshView refreshView) { } [MissingMapper] - public static void MapRefreshColor(RefreshViewHandler handler, IRefreshView refreshView) + public static void MapRefreshColor(IRefreshViewHandler handler, IRefreshView refreshView) { } [MissingMapper] - public static void MapRefreshViewBackground(RefreshViewHandler handler, IView view) + public static void MapRefreshViewBackground(IRefreshViewHandler handler, IView view) { } } diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 388f5151e852..4cc20e110ac9 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -29,7 +29,7 @@ public override void SetVirtualView(IView view) } - public static void MapContent(ScrollViewHandler handler, IScrollView scrollView) + public static void MapContent(IScrollViewHandler handler, IScrollView scrollView) { if (handler.MauiContext == null || scrollView.Content == null) { @@ -210,7 +210,7 @@ protected virtual void OnScrollFinished() } - public static void MapRequestScrollTo(ScrollViewHandler handler, IScrollView scrollView, object? args) + public static void MapRequestScrollTo(IScrollViewHandler handler, IScrollView scrollView, object? args) { if (handler?.PlatformView is not { } nativeView) return; @@ -226,7 +226,7 @@ public static void MapRequestScrollTo(ScrollViewHandler handler, IScrollView scr } } - public static void MapOrientation(ScrollViewHandler handler, IScrollView view) + public static void MapOrientation(IScrollViewHandler handler, IScrollView view) { if (handler?.PlatformView is not { } nativeView) return; @@ -273,7 +273,7 @@ public static void MapOrientation(ScrollViewHandler handler, IScrollView view) nativeView.ScrollOrientation = view.Orientation; } - public static void MapHorizontalScrollBarVisibility(ScrollViewHandler handler, IScrollView view) + public static void MapHorizontalScrollBarVisibility(IScrollViewHandler handler, IScrollView view) { if (handler?.PlatformView is not { } nativeView) return; @@ -282,7 +282,7 @@ public static void MapHorizontalScrollBarVisibility(ScrollViewHandler handler, I } - public static void MapVerticalScrollBarVisibility(ScrollViewHandler handler, IScrollView view) + public static void MapVerticalScrollBarVisibility(IScrollViewHandler handler, IScrollView view) { if (handler?.PlatformView is not { } nativeView) return; diff --git a/src/Core/src/Handlers/ShapeView/IShapeViewHandler.cs b/src/Core/src/Handlers/ShapeView/IShapeViewHandler.cs index 938e220189fc..dd0dd6c65e18 100644 --- a/src/Core/src/Handlers/ShapeView/IShapeViewHandler.cs +++ b/src/Core/src/Handlers/ShapeView/IShapeViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.Maui.Graphics.Win2D.W2DGraphicsView; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.MauiShapeView; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiShapeView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs index 5637f0d6569e..ec3a3ac8cfb3 100644 --- a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs @@ -10,47 +10,47 @@ protected override MauiShapeView CreatePlatformView() return new MauiShapeView(); } - public static void MapShape(ShapeViewHandler handler, IShapeView shapeView) + public static void MapShape(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.UpdateShape(shapeView); } - public static void MapAspect(ShapeViewHandler handler, IShapeView shapeView) + public static void MapAspect(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } - public static void MapFill(ShapeViewHandler handler, IShapeView shapeView) + public static void MapFill(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } - public static void MapStroke(ShapeViewHandler handler, IShapeView shapeView) + public static void MapStroke(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } - public static void MapStrokeThickness(ShapeViewHandler handler, IShapeView shapeView) + public static void MapStrokeThickness(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } - public static void MapStrokeDashPattern(ShapeViewHandler handler, IShapeView shapeView) + public static void MapStrokeDashPattern(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } - public static void MapStrokeLineCap(ShapeViewHandler handler, IShapeView shapeView) + public static void MapStrokeLineCap(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } - public static void MapStrokeLineJoin(ShapeViewHandler handler, IShapeView shapeView) + public static void MapStrokeLineJoin(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } - public static void MapStrokeMiterLimit(ShapeViewHandler handler, IShapeView shapeView) + public static void MapStrokeMiterLimit(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); } diff --git a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.cs b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.cs index 9dee9345c3e5..0f01f591e595 100644 --- a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.cs +++ b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.Maui.Graphics.Win2D.W2DGraphicsView; #elif TIZEN using PlatformView = Microsoft.Maui.Platform.MauiShapeView; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiShapeView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Slider/ISliderHandler.cs b/src/Core/src/Handlers/Slider/ISliderHandler.cs index a2ee0decfd7d..99ce875142e1 100644 --- a/src/Core/src/Handlers/Slider/ISliderHandler.cs +++ b/src/Core/src/Handlers/Slider/ISliderHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Slider; #elif TIZEN using PlatformView = ElmSharp.Slider; +#elif GTK +using PlatformView = Gtk.Scale; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs index ba9c4f639eff..1d09f8751ac6 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.Gtk.cs @@ -43,28 +43,28 @@ void OnNativeViewValueChanged(object? sender, EventArgs e) } - public static void MapMinimum(SliderHandler handler, ISlider slider) + public static void MapMinimum(ISliderHandler handler, ISlider slider) { handler.PlatformView?.UpdateRange(slider); } - public static void MapMaximum(SliderHandler handler, ISlider slider) + public static void MapMaximum(ISliderHandler handler, ISlider slider) { handler.PlatformView?.UpdateRange(slider); } - public static void MapValue(SliderHandler handler, ISlider slider) + public static void MapValue(ISliderHandler handler, ISlider slider) { handler.PlatformView?.UpdateValue(slider); } [MissingMapper] - public static void MapMinimumTrackColor(SliderHandler handler, ISlider slider) { } + public static void MapMinimumTrackColor(ISliderHandler handler, ISlider slider) { } [MissingMapper] - public static void MapMaximumTrackColor(SliderHandler handler, ISlider slider) { } + public static void MapMaximumTrackColor(ISliderHandler handler, ISlider slider) { } - public static void MapThumbColor(SliderHandler handler, ISlider slider) + public static void MapThumbColor(ISliderHandler handler, ISlider slider) { if (handler.PlatformView is not { } nativeView) return; @@ -83,7 +83,7 @@ static void SetImage(Widget w, string? image) w.SetStyleValue("contain", "background-size", "contents > trough > slider"); } - public static void MapThumbImageSource(SliderHandler handler, ISlider slider) + public static void MapThumbImageSource(ISliderHandler handler, ISlider slider) { if (handler.PlatformView is not { } nativeView) diff --git a/src/Core/src/Handlers/Slider/SliderHandler.cs b/src/Core/src/Handlers/Slider/SliderHandler.cs index 1ec9bb25a0b5..98a750ea887f 100644 --- a/src/Core/src/Handlers/Slider/SliderHandler.cs +++ b/src/Core/src/Handlers/Slider/SliderHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.Slider; #elif TIZEN using PlatformView = ElmSharp.Slider; +#elif GTK +using PlatformView = Gtk.Scale; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Switch/ISwitchHandler.cs b/src/Core/src/Handlers/Switch/ISwitchHandler.cs index bafc8bb48532..118715a248ac 100644 --- a/src/Core/src/Handlers/Switch/ISwitchHandler.cs +++ b/src/Core/src/Handlers/Switch/ISwitchHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ToggleSwitch; #elif TIZEN using PlatformView = ElmSharp.Check; +#elif GTK +using PlatformView = Gtk.Switch; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs index f3e0909b612a..516628f747b3 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.Gtk.cs @@ -13,15 +13,15 @@ protected override Switch CreatePlatformView() return new Switch(); } - public static void MapIsOn(SwitchHandler handler, ISwitch view) + public static void MapIsOn(ISwitchHandler handler, ISwitch view) { handler.PlatformView?.UpdateIsOn(view); } [MissingMapper] - public static void MapTrackColor(SwitchHandler handler, ISwitch view) { } + public static void MapTrackColor(ISwitchHandler handler, ISwitch view) { } - public static void MapThumbColor(SwitchHandler handler, ISwitch view) + public static void MapThumbColor(ISwitchHandler handler, ISwitch view) { if (handler.PlatformView is not { } nativeView) return; diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.cs b/src/Core/src/Handlers/Switch/SwitchHandler.cs index 7b386186c6be..2e7fdb2fe165 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ToggleSwitch; #elif TIZEN using PlatformView = ElmSharp.Check; +#elif GTK +using PlatformView = Gtk.Switch; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/TimePicker/ITimePickerHandler.cs b/src/Core/src/Handlers/TimePicker/ITimePickerHandler.cs index 9e4c8cabdbda..fc37ea96c066 100644 --- a/src/Core/src/Handlers/TimePicker/ITimePickerHandler.cs +++ b/src/Core/src/Handlers/TimePicker/ITimePickerHandler.cs @@ -8,6 +8,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TimePicker; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiTimePicker; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs index 1067bed8ca47..0d1fef4f0d41 100644 --- a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs @@ -10,27 +10,27 @@ protected override MauiTimePicker CreatePlatformView() } [MissingMapper] - public static void MapFormat(TimePickerHandler handler, ITimePicker view) + public static void MapFormat(ITimePickerHandler handler, ITimePicker view) { handler.PlatformView?.UpdateFormat(view); } [MissingMapper] - public static void MapTime(TimePickerHandler handler, ITimePicker view) + public static void MapTime(ITimePickerHandler handler, ITimePicker view) { handler.PlatformView?.UpdateTime(view); } [MissingMapper] - public static void MapCharacterSpacing(TimePickerHandler handler, ITimePicker view) { } + public static void MapCharacterSpacing(ITimePickerHandler handler, ITimePicker view) { } - public static void MapFont(TimePickerHandler handler, ITimePicker view) + public static void MapFont(ITimePickerHandler handler, ITimePicker view) { handler.MapFont(view); } [MissingMapper] - public static void MapTextColor(TimePickerHandler handler, ITimePicker timePicker) { } + public static void MapTextColor(ITimePickerHandler handler, ITimePicker timePicker) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.cs index 518b30b2fed6..cf2289db2c7e 100644 --- a/src/Core/src/Handlers/TimePicker/TimePickerHandler.cs +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.cs @@ -8,6 +8,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.TimePicker; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.MauiTimePicker; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs index 394a0ed4c3e4..93da88832b17 100644 --- a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs @@ -5,37 +5,37 @@ public partial class ViewHandler { [MissingMapper] - public static void MapTranslationX(ViewHandler handler, IView view) { } + public static void MapTranslationX(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapTranslationY(ViewHandler handler, IView view) { } + public static void MapTranslationY(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapScale(ViewHandler handler, IView view) + public static void MapScale(IViewHandler handler, IView view) { //handler.PlatformView.UpdateScale(view.Scale); } [MissingMapper] - public static void MapScaleX(ViewHandler handler, IView view) { } + public static void MapScaleX(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapScaleY(ViewHandler handler, IView view) { } + public static void MapScaleY(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapRotation(ViewHandler handler, IView view) { } + public static void MapRotation(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapRotationX(ViewHandler handler, IView view) { } + public static void MapRotationX(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapRotationY(ViewHandler handler, IView view) { } + public static void MapRotationY(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapAnchorX(ViewHandler handler, IView view) { } + public static void MapAnchorX(IViewHandler handler, IView view) { } [MissingMapper] - public static void MapAnchorY(ViewHandler handler, IView view) { } + public static void MapAnchorY(IViewHandler handler, IView view) { } [MissingMapper] public virtual bool NeedsContainer => false; diff --git a/src/Core/src/Platform/ElementExtensions.cs b/src/Core/src/Platform/ElementExtensions.cs index 75223488036d..432c24a85269 100644 --- a/src/Core/src/Platform/ElementExtensions.cs +++ b/src/Core/src/Platform/ElementExtensions.cs @@ -20,6 +20,11 @@ using BasePlatformType = System.Object; using PlatformWindow = ElmSharp.Window; using PlatformApplication = Tizen.Applications.CoreUIApplication; +#elif GTK +using PlatformView = Gtk.Widget; +using BasePlatformType = System.Object; +using PlatformWindow = Gtk.Window; +using PlatformApplication = Gtk.Application; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; using BasePlatformType = System.Object; diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index f60bd953a0ae..7d6e0e66be40 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -143,6 +143,34 @@ public static void UpdateClip(this Widget nativeView, IView view) public static void UpdateFlowDirection(this Widget nativeView, IView view) { } + internal static Rect GetBoundingBox(this IView view) + => view.ToPlatform().GetBoundingBox(); + + internal static Graphics.Rect GetPlatformViewBounds(this IView view) + { + var w = view.ToPlatform(); + + if (w.Toplevel is not { } tl) + return w.GetBoundingBox(); + + w.TranslateCoordinates(tl, 0, 0, out var x, out var y); + + return new Rect(x, y, w.AllocatedWidth, w.AllocatedHeight); + + } + + internal static Rect GetBoundingBox(this Gtk.Widget? platformView) + { + if (platformView == null) + return new Rect(); + + return platformView.Allocation.ToRect(); + } + + internal static Widget? GetParent(this Widget? view) + { + return view?.Parent; + } } } \ No newline at end of file diff --git a/src/Core/src/Platform/ViewExtensions.cs b/src/Core/src/Platform/ViewExtensions.cs index 89797e9f37e3..9ac8d467a234 100644 --- a/src/Core/src/Platform/ViewExtensions.cs +++ b/src/Core/src/Platform/ViewExtensions.cs @@ -20,6 +20,9 @@ #elif TIZEN using PlatformView = ElmSharp.EvasObject; using ParentView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; +using ParentView = Gtk.Widget; #else using PlatformView = System.Object; using ParentView = System.Object; diff --git a/src/Core/src/ViewExtensions.cs b/src/Core/src/ViewExtensions.cs index e8aacab9c7e4..e1eb9c3c9683 100644 --- a/src/Core/src/ViewExtensions.cs +++ b/src/Core/src/ViewExtensions.cs @@ -17,6 +17,9 @@ #elif TIZEN using PlatformView = ElmSharp.EvasObject; using ParentView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; +using ParentView = Gtk.Widget; #else using PlatformView = System.Object; using ParentView = System.Object; From e5b6f62f77a4bffcf76cc90dc7a277b23963dd65 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 20:31:48 +0200 Subject: [PATCH 172/425] [Gtk] Core.csproj: track api changes IV --- .../src/Handlers/Button/ButtonHandler.Gtk.cs | 22 ++++-- .../ContentView/ContentViewHandler.Gtk.cs | 11 +-- .../DatePicker/DatePickerHandler.Gtk.cs | 10 ++- .../src/Handlers/Editor/EditorHandler.Gtk.cs | 16 ++++- .../src/Handlers/Entry/EntryHandler.Gtk.cs | 7 +- .../GraphicsView/GraphicsViewHandler.Gtk.cs | 2 +- .../src/Handlers/Label/LabelHandler.Gtk.cs | 10 +-- .../src/Handlers/Picker/IPickerHandler.cs | 2 + .../src/Handlers/Picker/PickerHandler.Gtk.cs | 8 +++ src/Core/src/Handlers/Picker/PickerHandler.cs | 2 + .../ProgressBar/ProgressBarHandler.Gtk.cs | 4 ++ .../ScrollView/ScrollViewHandler.Gtk.cs | 15 +++-- .../ShapeView/ShapeViewHandler.Gtk.cs | 5 ++ .../TimePicker/TimePickerHandler.Gtk.cs | 3 +- src/Core/src/Platform/Gtk/ButtonExtensions.cs | 2 +- src/Core/src/Platform/Gtk/LabelExtensions.cs | 9 ++- .../Platform/Gtk/PlatformTouchGraphicsView.cs | 8 ++- src/Core/src/Platform/Gtk/ViewExtensions.cs | 67 +++++++++++++++++-- 18 files changed, 165 insertions(+), 38 deletions(-) diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index b081ab64d873..af74c403dbef 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -29,17 +29,17 @@ protected override void DisconnectHandler(Button nativeView) nativeView.ButtonReleaseEvent -= OnButtonReleaseEvent; } - public static void MapText(IButtonHandler handler, IButton button) + public static void MapText(IButtonHandler handler, ITextButton button) { handler.PlatformView?.UpdateText(button); } - public static void MapTextColor(IButtonHandler handler, IButton button) + public static void MapTextColor(IButtonHandler handler, ITextStyle button) { handler.PlatformView?.UpdateTextColor(button.TextColor); } - public static void MapCharacterSpacing(IButtonHandler handler, IButton button) + public static void MapCharacterSpacing(IButtonHandler handler, ITextStyle button) { if (handler.PlatformView.Child is Label nativeView) { @@ -50,16 +50,23 @@ public static void MapCharacterSpacing(IButtonHandler handler, IButton button) [MissingMapper] public static void MapImageSource(IButtonHandler handler, IImage image) { } - public static void MapFont(IButtonHandler handler, IButton button) - { - handler.MapFont(button); - } + [MissingMapper] + public static void MapFont(IButtonHandler handler, IButton button) { } public static void MapPadding(IButtonHandler handler, IButton button) { handler.PlatformView.WithPadding(button.Padding); } + [MissingMapper] + public static void MapStrokeColor(IButtonHandler handler, IButtonStroke buttonStroke) { } + + [MissingMapper] + public static void MapStrokeThickness(IButtonHandler handler, IButtonStroke buttonStroke) { } + + [MissingMapper] + public static void MapCornerRadius(IButtonHandler handler, IButtonStroke buttonStroke) { } + void OnButtonPressEvent(object? o, ButtonPressEventArgs args) { InvokeEvent(() => VirtualView?.Pressed()); @@ -75,6 +82,7 @@ void OnButtonClicked(object? sender, EventArgs e) InvokeEvent(() => VirtualView?.Clicked()); } + void OnSetImageSource(object? obj) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs index 376d2c0ea2d1..5cc5ff5e21dc 100644 --- a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs @@ -2,10 +2,11 @@ namespace Microsoft.Maui.Handlers { + public partial class ContentViewHandler : ViewHandler { - [MissingMapper] - protected override ContentView CreatePlatformView() => throw new NotImplementedException(); + + protected override ContentView CreatePlatformView() => new(); public void UpdateContent() { @@ -16,7 +17,7 @@ public void UpdateContent() if (VirtualView is { Content: IView view }) PlatformView.Content = view.ToPlatform(MauiContext); } - + public static void MapContent(IContentViewHandler handler, IContentView page) { if (handler is ContentViewHandler contentViewHandler) @@ -24,5 +25,7 @@ public static void MapContent(IContentViewHandler handler, IContentView page) contentViewHandler.UpdateContent(); } } + } -} + +} \ No newline at end of file diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs index b90ce7c14ae3..fb023fa5e7a2 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs @@ -2,8 +2,10 @@ namespace Microsoft.Maui.Handlers { + public partial class DatePickerHandler : ViewHandler { + protected override MauiDatePicker CreatePlatformView() { return new MauiDatePicker(); @@ -32,10 +34,14 @@ public static void MapCharacterSpacing(IDatePickerHandler handler, IDatePicker d public static void MapFont(IDatePickerHandler handler, IDatePicker datePicker) { - handler.MapFont(datePicker); + var fontManager = handler.GetRequiredService(); + + handler.PlatformView?.UpdateFont(datePicker, fontManager); } [MissingMapper] public static void MapTextColor(IDatePickerHandler handler, IDatePicker datePicker) { } + } -} + +} \ No newline at end of file diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index 99fd89001c75..e543551014b9 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -66,7 +66,9 @@ public static void MapText(IEditorHandler handler, IEditor editor) public static void MapFont(IEditorHandler handler, IEditor editor) { - handler.MapFont(editor); + var fontManager = handler.GetRequiredService(); + + handler.PlatformView?.UpdateFont(editor, fontManager); } public static void MapIsReadOnly(IEditorHandler handler, IEditor editor) @@ -101,6 +103,18 @@ public static void MapIsTextPredictionEnabled(IEditorHandler handler, IEditor ed [MissingMapper] public static void MapKeyboard(IEditorHandler handler, IEditor editor) { } + [MissingMapper] + public static void MapHorizontalTextAlignment(IEditorHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapVerticalTextAlignment(IEditorHandler handler, IEditor editor) { } + + [MissingMapper] + public static void MapCursorPosition(IEditorHandler handler, ITextInput editor) { } + + [MissingMapper] + public static void MapSelectionLength(IEditorHandler handler, ITextInput editor) { } + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index 8b5897f5e483..323321efdac2 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -141,6 +141,9 @@ public static void MapPlaceholder(IEntryHandler handler, IEntry entry) handler.PlatformView?.UpdatePlaceholder(entry); } + [MissingMapper] + public static void MapPlaceholderColor(IEntryHandler handler, IEntry entry) { } + public static void MapIsReadOnly(IEntryHandler handler, IEntry entry) { handler.PlatformView?.UpdateIsReadOnly(entry); @@ -148,7 +151,9 @@ public static void MapIsReadOnly(IEntryHandler handler, IEntry entry) public static void MapFont(IEntryHandler handler, IEntry entry) { - handler.MapFont(entry); + var fontManager = handler.GetRequiredService(); + + handler.PlatformView?.UpdateFont(entry, fontManager); } public static void MapCursorPosition(IEntryHandler handler, IEntry entry) diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs index 1673a39d54f5..488be696034e 100644 --- a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs @@ -8,7 +8,7 @@ public partial class GraphicsViewHandler : ViewHandler new(); - public static void MapDrawable(GraphicsViewHandler handler, IGraphicsView graphicsView) + public static void MapDrawable(IGraphicsViewHandler handler, IGraphicsView graphicsView) { if (handler.PlatformView is { } nativeView) { diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index 38d8fa97566f..365b5c86086a 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -14,7 +14,7 @@ public partial class LabelHandler : ViewHandler static PlatformStringSizeService? _stringSizeService; PlatformStringSizeService stringSizeService => _stringSizeService ??= new(); - + public Microsoft.Maui.Graphics.Platform.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Platform.Gtk.TextLayout( stringSizeService.SharedContext) { HeightForWidth = true }; @@ -56,7 +56,7 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra SharedTextLayout.HorizontalAlignment = virtualView.HorizontalTextAlignment.GetHorizontalAlignment(); SharedTextLayout.VerticalAlignment = virtualView.VerticalTextAlignment.GetVerticalAlignment(); - SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); + // SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); var heightForWidth = !heightConstrained; @@ -125,7 +125,9 @@ public static void MapTextColor(ILabelHandler handler, ILabel label) public static void MapFont(ILabelHandler handler, ILabel label) { - handler.MapFont(label); + var fontManager = handler.GetRequiredService(); + + handler.PlatformView?.UpdateFont(label, fontManager); } public static void MapHorizontalTextAlignment(ILabelHandler handler, ILabel label) @@ -182,7 +184,7 @@ public static void MapLineHeight(ILabelHandler handler, ILabel label) { // there is no LineHeight for label in gtk3: // https://gitlab.gnome.org/GNOME/gtk/-/issues/2379 - + // try to set it over css: not working: exception thrown: 'line-height' is not a valid property name // nativeView.SetStyleValue($"{(int)label.LineHeight}","line-height"); diff --git a/src/Core/src/Handlers/Picker/IPickerHandler.cs b/src/Core/src/Handlers/Picker/IPickerHandler.cs index 4ad631382aeb..7b9704e11e6a 100644 --- a/src/Core/src/Handlers/Picker/IPickerHandler.cs +++ b/src/Core/src/Handlers/Picker/IPickerHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ComboBox; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Gtk.ComboBox; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs index 630257eafea5..9953e4c505df 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.Gtk.cs @@ -74,6 +74,11 @@ public static void SetValues(ComboBox nativeView, IPicker virtualView) nativeView.Active = virtualView.SelectedIndex; } + internal static void MapItems(IPickerHandler handler, IPicker picker) + { + SetValues(handler.PlatformView,picker); + } + public static void MapSelectedIndex(PickerHandler handler, IPicker view) { if (handler.PlatformView is { } nativeView) @@ -118,6 +123,9 @@ public static void MapHorizontalTextAlignment(PickerHandler handler, IPicker vie [MissingMapper] public static void MapTitleColor(PickerHandler handler, IPicker view) { } + [MissingMapper] + public static void MapVerticalTextAlignment(IPickerHandler handler, IPicker view) { } + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Picker/PickerHandler.cs b/src/Core/src/Handlers/Picker/PickerHandler.cs index aed23bfde6ce..8a1984c996f3 100644 --- a/src/Core/src/Handlers/Picker/PickerHandler.cs +++ b/src/Core/src/Handlers/Picker/PickerHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.Controls.ComboBox; #elif TIZEN using PlatformView = Tizen.UIExtensions.ElmSharp.Entry; +#elif GTK +using PlatformView = Gtk.ComboBox; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs index 536330c4662c..d41dd4f39578 100644 --- a/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/ProgressBar/ProgressBarHandler.Gtk.cs @@ -14,5 +14,9 @@ public static void MapProgress(ProgressBarHandler handler, IProgress progress) { handler.PlatformView?.UpdateProgress(progress); } + + [MissingMapper] + public static void MapProgressColor(IProgressBarHandler handler, IProgress progress) { } + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 4cc20e110ac9..bf37203e48e2 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -36,21 +36,24 @@ public static void MapContent(IScrollViewHandler handler, IScrollView scrollView return; } - if (handler?.PlatformView is not { } nativeView) + if (handler?.PlatformView is not { } platformView) + return; + + if (scrollView.Content is not IView contentView) return; - var nativeContent = scrollView.Content.ToNative(handler.MauiContext); - var child = nativeView.Child; + var platformContent = contentView.ToPlatform(handler.MauiContext); + var child = platformView.Child; // check if nativeContent is set as child of Viewport: - if (child is Gtk.Viewport vp && vp != nativeContent) + if (child is Gtk.Viewport vp && vp != platformContent) { child = vp.Child; } - if (child != nativeContent) + if (child != platformContent) { - nativeView.Child = nativeContent; + platformView.Child = platformContent; } } diff --git a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs index ec3a3ac8cfb3..c329d66ca016 100644 --- a/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ShapeView/ShapeViewHandler.Gtk.cs @@ -40,6 +40,11 @@ public static void MapStrokeDashPattern(IShapeViewHandler handler, IShapeView sh handler.PlatformView?.InvalidateShape(shapeView); } + public static void MapStrokeDashOffset(IShapeViewHandler handler, IShapeView shapeView) + { + handler.PlatformView?.InvalidateShape(shapeView); + } + public static void MapStrokeLineCap(IShapeViewHandler handler, IShapeView shapeView) { handler.PlatformView?.InvalidateShape(shapeView); diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs index 0d1fef4f0d41..35b49c587d79 100644 --- a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Gtk.cs @@ -26,8 +26,9 @@ public static void MapCharacterSpacing(ITimePickerHandler handler, ITimePicker v public static void MapFont(ITimePickerHandler handler, ITimePicker view) { - handler.MapFont(view); + var fontManager = handler.GetRequiredService(); + handler.PlatformView?.UpdateFont(view, fontManager); } [MissingMapper] diff --git a/src/Core/src/Platform/Gtk/ButtonExtensions.cs b/src/Core/src/Platform/Gtk/ButtonExtensions.cs index d565f74faab8..a04b617a71e6 100644 --- a/src/Core/src/Platform/Gtk/ButtonExtensions.cs +++ b/src/Core/src/Platform/Gtk/ButtonExtensions.cs @@ -6,7 +6,7 @@ namespace Microsoft.Maui public static class ButtonExtensions { - public static void UpdateText(this Button nativeButton, IButton button) + public static void UpdateText(this Button nativeButton, ITextButton button) { // need to attach Attributes after setting text again, so get it ... var attrs = (nativeButton.Child as Label)?.Attributes; diff --git a/src/Core/src/Platform/Gtk/LabelExtensions.cs b/src/Core/src/Platform/Gtk/LabelExtensions.cs index 3c769c8d1c90..c98ea18820b3 100644 --- a/src/Core/src/Platform/Gtk/LabelExtensions.cs +++ b/src/Core/src/Platform/Gtk/LabelExtensions.cs @@ -34,7 +34,7 @@ public static string HtmlToPangoMarkup(string text) public static void UpdateMaxLines(this Label nativeLabel, ILabel label) { - nativeLabel.Lines = label.MaxLines; + // nativeLabel.Lines = label.MaxLines; nativeLabel.AdjustMaxLines(); } @@ -111,10 +111,13 @@ public static Microsoft.Maui.Graphics.Platform.Gtk.LineBreakMode GetLineBreakMod public static void UpdateLineBreakMode(this Label nativeLabel, ILabel label) { - switch (label.LineBreakMode) + var labelLineBreakMode = LineBreakMode.CharacterWrap; + var labelMaxLines = 0; + + switch (labelLineBreakMode) { case LineBreakMode.NoWrap: - nativeLabel.LineWrap = label.MaxLines > 0; + nativeLabel.LineWrap = labelMaxLines > 0; nativeLabel.Ellipsize = Pango.EllipsizeMode.None; break; diff --git a/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs index bd19109b9da9..0399b858f218 100644 --- a/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs +++ b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs @@ -1,4 +1,10 @@ namespace Microsoft.Maui.Platform; public class PlatformTouchGraphicsView : Microsoft.Maui.Graphics.Platform.Gtk.GtkGraphicsView -{ } \ No newline at end of file +{ + + public void Connect(IGraphicsView graphicsView) { } + + public void Disconnect() { } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 7d6e0e66be40..ecba0dbebf29 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -1,7 +1,10 @@ using System; +using System.Numerics; +using System.Threading.Tasks; using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Platform.Gtk; +using Action = System.Action; namespace Microsoft.Maui.Platform { @@ -69,6 +72,10 @@ public static void UpdateBackground(this Widget nativeView, IView view) pixbuf?.Dispose(); } + [MissingMapper] + public static Task UpdateBackgroundImageSourceAsync(this Widget platformView, IImageSource? imageSource, IImageSourceServiceProvider? provider) + => Task.CompletedTask; + public static void UpdateForeground(this Widget nativeView, Paint? paint) { if (paint == null) @@ -150,27 +157,75 @@ internal static Graphics.Rect GetPlatformViewBounds(this IView view) { var w = view.ToPlatform(); - if (w.Toplevel is not { } tl) - return w.GetBoundingBox(); + return w.GetPlatformViewBounds(); - w.TranslateCoordinates(tl, 0, 0, out var x, out var y); + } - return new Rect(x, y, w.AllocatedWidth, w.AllocatedHeight); + internal static Rect GetPlatformViewBounds(this Gtk.Widget? platformView) + { + if (platformView?.Toplevel is not { } tl) + return platformView.GetBoundingBox(); + platformView.TranslateCoordinates(tl, 0, 0, out var x, out var y); + + return new Rect(x, y, platformView.AllocatedWidth, platformView.AllocatedHeight); } internal static Rect GetBoundingBox(this Gtk.Widget? platformView) + => platformView is not { } ? new Rect() : platformView.Allocation.ToRect(); + + internal static Matrix4x4 GetViewTransform(this IView view) { + var platformView = view?.ToPlatform(); + if (platformView == null) - return new Rect(); + return new Matrix4x4(); - return platformView.Allocation.ToRect(); + return platformView.GetViewTransform(); + } + + internal static Matrix4x4 GetViewTransform(this Widget view) + { + if (view == null) + return new Matrix4x4(); + + var bounds = view.GetPlatformViewBounds(); + var scale = view.ScaleFactor; + + return new Matrix4x4() + { + // TODO: add scale + Translation = new Vector3((float)bounds.X, (float)bounds.X, 0) + }; } internal static Widget? GetParent(this Widget? view) { return view?.Parent; } + + public static void UpdateShadow(this Widget? platformView, IView view) { } + + public static void UpdateBorder(this Widget? platformView, IView view) { } + + public static void Focus(this Widget? platformView, FocusRequest request) { } + + public static void Unfocus(this Widget? platformView, IView view) { } + + public static void UpdateInputTransparent(this Widget? nativeView, IViewHandler handler, IView view) { } + + [MissingMapper] + internal static IDisposable OnLoaded(this Widget? platformView, Action action) + { + throw new NotImplementedException(); + } + + [MissingMapper] + internal static IDisposable OnUnloaded(this Widget? platformView, Action action) + { + throw new NotImplementedException(); + } + } } \ No newline at end of file From aa559724564340d9fcf5a5e6784a5f3f105d314a Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 23 Aug 2022 20:32:34 +0200 Subject: [PATCH 173/425] [Gtk] Core.csproj: track api changes IV + StrokeExtensions --- src/Core/src/Platform/Gtk/StrokeExtensions.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/Core/src/Platform/Gtk/StrokeExtensions.cs diff --git a/src/Core/src/Platform/Gtk/StrokeExtensions.cs b/src/Core/src/Platform/Gtk/StrokeExtensions.cs new file mode 100644 index 000000000000..d5da7428064a --- /dev/null +++ b/src/Core/src/Platform/Gtk/StrokeExtensions.cs @@ -0,0 +1,21 @@ +namespace Microsoft.Maui.Platform +{ + public static class StrokeExtensions + { + public static void UpdateStrokeShape(this Gtk.Widget platformView, IBorderStroke border) { } + + public static void UpdateStroke(this Gtk.Widget platformView, IBorderStroke border) { } + + public static void UpdateStrokeThickness(this Gtk.Widget platformView, IBorderStroke border) { } + + public static void UpdateStrokeDashPattern(this Gtk.Widget platformView, IBorderStroke border) { } + + public static void UpdateStrokeDashOffset(this Gtk.Widget platformView, IBorderStroke border) { } + + public static void UpdateStrokeMiterLimit(this Gtk.Widget platformView, IBorderStroke border) { } + + public static void UpdateStrokeLineCap(this Gtk.Widget platformView, IBorderStroke border) { } + + public static void UpdateStrokeLineJoin(this Gtk.Widget platformView, IBorderStroke border) { } + } +} From fc38f1370a3f3f4cad123a3ff26474a093a4068e Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 24 Aug 2022 00:11:03 +0200 Subject: [PATCH 174/425] [Gtk] Core.csproj: track api changes V --- ...iveTicker.Gtk.cs => PlatformTicker.Gtk.cs} | 2 +- src/Core/src/Dispatching/Dispatcher.Gtk.cs | 153 ++++++++++++++++++ src/Core/src/Fonts/FontManager.Gtk.cs | 2 +- .../src/Handlers/View/ViewHandlerOfT.Gtk.cs | 3 +- src/Core/src/MauiContextExtensions.cs | 3 + .../src/Platform/Gtk/ApplicationExtensions.cs | 38 +++++ .../src/Platform/Gtk/MauiGtkApplication.cs | 68 +------- src/Core/src/Platform/Gtk/WindowExtensions.cs | 4 +- .../{ => Gtk/[Obsolete]}/MauiContext.Gtk.cs | 0 9 files changed, 208 insertions(+), 65 deletions(-) rename src/Core/src/Animations/{NativeTicker.Gtk.cs => PlatformTicker.Gtk.cs} (55%) create mode 100644 src/Core/src/Dispatching/Dispatcher.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/ApplicationExtensions.cs rename src/Core/src/Platform/{ => Gtk/[Obsolete]}/MauiContext.Gtk.cs (100%) diff --git a/src/Core/src/Animations/NativeTicker.Gtk.cs b/src/Core/src/Animations/PlatformTicker.Gtk.cs similarity index 55% rename from src/Core/src/Animations/NativeTicker.Gtk.cs rename to src/Core/src/Animations/PlatformTicker.Gtk.cs index 6c7a3c750c5d..de29e389e3df 100644 --- a/src/Core/src/Animations/NativeTicker.Gtk.cs +++ b/src/Core/src/Animations/PlatformTicker.Gtk.cs @@ -1,6 +1,6 @@ namespace Microsoft.Maui.Animations { - public class NativeTicker : Ticker + public class PlatformTicker : Ticker { } } \ No newline at end of file diff --git a/src/Core/src/Dispatching/Dispatcher.Gtk.cs b/src/Core/src/Dispatching/Dispatcher.Gtk.cs new file mode 100644 index 000000000000..c369b4801789 --- /dev/null +++ b/src/Core/src/Dispatching/Dispatcher.Gtk.cs @@ -0,0 +1,153 @@ +using System; +using System.Threading; + +namespace Microsoft.Maui.Dispatching +{ + + public partial class Dispatcher : IDispatcher + { + + readonly SynchronizationContext _context; + + internal Dispatcher(SynchronizationContext context) + { + _context = context; + } + + bool IsDispatchRequiredImplementation() => + _context != SynchronizationContext.Current; + + bool DispatchImplementation(Action action) + { + _context.Post((o) => action(), null); + + return true; + } + + bool DispatchDelayedImplementation(TimeSpan delay, Action action) + { + Timer? timer = null; + + TimerCallback onTimeout = o => + { + _context.Post((o) => action(), null); + timer?.Dispose(); + }; + + timer = new Timer(onTimeout, null, Timeout.Infinite, Timeout.Infinite); + timer?.Change(delay, delay); + + return true; + } + + IDispatcherTimer CreateTimerImplementation() + { + return new DispatcherTimer(_context); + } + + public static void DispatchPendingEvents() + { + // The loop is limited to 1000 iterations as a workaround for an issue that some users + // have experienced. Sometimes EventsPending starts return 'true' for all iterations, + // causing the loop to never end. + + int n = 1000; +#pragma warning disable 612 + Gdk.Threads.Enter(); +#pragma warning restore 612 + + while (Gtk.Application.EventsPending() && --n > 0) + { + Gtk.Application.RunIteration(false); + } + +#pragma warning disable 612 + Gdk.Threads.Leave(); +#pragma warning restore 612 + } + + public static void Invoke(System.Action action) + { + if (action == null) + throw new ArgumentNullException(nameof(action)); + + // Switch to no Invoke(Action) once a gtk# release is done. + Gtk.Application.Invoke((o, args) => + { + action(); + }); + } + + } + + partial class DispatcherTimer : IDispatcherTimer + { + + readonly SynchronizationContext _context; + readonly Timer _timer; + + public DispatcherTimer(SynchronizationContext context) + { + _context = context; + _timer = new Timer((object? state) => _context.Post(OnTimerTick, null), null, Timeout.Infinite, Timeout.Infinite); + } + + public TimeSpan Interval { get; set; } + + public bool IsRepeating { get; set; } + + public bool IsRunning { get; private set; } + + public event EventHandler? Tick; + + public void Start() + { + if (IsRunning) + return; + + IsRunning = true; + // set interval separarately to prevent calling callback before `timer' is assigned + _timer.Change(Interval, Interval); + } + + public void Stop() + { + if (!IsRunning) + return; + + IsRunning = false; + + _timer.Change(Timeout.Infinite, Timeout.Infinite); + } + + void OnTimerTick(object? state) + { + if (!IsRunning) + return; + + Tick?.Invoke(this, EventArgs.Empty); + + if (!IsRepeating) + { + _timer.Change(Timeout.Infinite, Timeout.Infinite); + } + } + + } + + public partial class DispatcherProvider + { + + static IDispatcher? GetForCurrentThreadImplementation() + { + var context = SynchronizationContext.Current; + + if (context == null) + return null; + + return new Dispatcher(context); + } + + } + +} \ No newline at end of file diff --git a/src/Core/src/Fonts/FontManager.Gtk.cs b/src/Core/src/Fonts/FontManager.Gtk.cs index b2130c5f9eca..6b99c2e8e40f 100644 --- a/src/Core/src/Fonts/FontManager.Gtk.cs +++ b/src/Core/src/Fonts/FontManager.Gtk.cs @@ -69,7 +69,7 @@ public class FontManager : IFontManager Pango.Context SystemContext => _systemContext ??= Gdk.PangoHelper.ContextGet(); - public FontManager(IFontRegistrar fontRegistrar, ILogger? logger = null) + public FontManager(IFontRegistrar fontRegistrar, IServiceProvider? serviceProvider = null) { _fontRegistrar = fontRegistrar; } diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs index f032c9179f23..422caad2d78d 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using Microsoft.Maui.Dispatching; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Platform.Gtk; @@ -27,7 +28,7 @@ protected override void RemoveContainer() protected void InvokeEvent(Action action) { - MauiGtkApplication.Invoke(action); + Dispatcher.Invoke(action); } public void MapFont(ITextStyle textStyle) diff --git a/src/Core/src/MauiContextExtensions.cs b/src/Core/src/MauiContextExtensions.cs index 5532ec41776b..fa01ba5431b1 100644 --- a/src/Core/src/MauiContextExtensions.cs +++ b/src/Core/src/MauiContextExtensions.cs @@ -17,6 +17,9 @@ #elif TIZEN using NativeApplication = Tizen.Applications.CoreApplication; using NativeWindow = ElmSharp.Window; +#elif GTK +using NativeApplication = Gtk.Application; +using NativeWindow = Gtk.Window; #else using NativeApplication = System.Object; using NativeWindow = System.Object; diff --git a/src/Core/src/Platform/Gtk/ApplicationExtensions.cs b/src/Core/src/Platform/Gtk/ApplicationExtensions.cs new file mode 100644 index 000000000000..6cb9a7fdc6f7 --- /dev/null +++ b/src/Core/src/Platform/Gtk/ApplicationExtensions.cs @@ -0,0 +1,38 @@ +using System; +using Microsoft.Maui.LifecycleEvents; + +namespace Microsoft.Maui.Platform; + +public static class ApplicationExtensions +{ + + public static void CreatePlatformWindow(this Gtk.Application platformApplication, IApplication application, IPersistedState? state) => + platformApplication.CreatePlatformWindow(application, new OpenWindowRequest(state)); + + public static void CreatePlatformWindow(this Gtk.Application platformApplication, IApplication application, OpenWindowRequest? args) + { + if (application.Handler?.MauiContext is not { } applicationContext) + return; + + var mainWindow = new MauiGtkMainWindow(); + platformApplication.AddWindow(mainWindow); + + var mauiContext = applicationContext!.MakeWindowScope(mainWindow, out var windowScope); + + applicationContext.Services.InvokeLifecycleEvents(del => del(mauiContext)); + + var activationState = args?.State is not null ? new ActivationState(mauiContext, args.State) : new ActivationState(mauiContext, args?.State ?? new PersistedState()); + + var window = application.CreateWindow(activationState); + + mainWindow.SetWindowHandler(window, mauiContext); + + applicationContext.Services.InvokeLifecycleEvents(del => del(mainWindow, EventArgs.Empty)); + + mainWindow.QueueDraw(); + mainWindow.ShowAll(); + + mainWindow.Present(); + } + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index 89a694b6b702..ef7c2b65f8d7 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -1,23 +1,21 @@ using System; -using System.Diagnostics; -using Gdk; using Microsoft.Extensions.DependencyInjection; using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; using Gtk; -using Microsoft.Maui.Graphics; +using Microsoft.Maui.Dispatching; namespace Microsoft.Maui { - public abstract class MauiGtkApplication + public abstract class MauiGtkApplication : IPlatformApplication { protected abstract MauiApp CreateMauiApp(); // https://docs.gtk.org/gio/type_func.Application.id_is_valid.html // TODO: find a better algo for id - public virtual string ApplicationId => $"{typeof(MauiGtkApplication).Namespace}.{typeof(MauiGtkApplication).Name}.{Name}".PadRight(255, ' ').Substring(0, 255).Trim(); + public virtual string ApplicationId => $"{typeof(MauiGtkApplication).Namespace}.{nameof(MauiGtkApplication)}.{Name}".PadRight(255, ' ').Substring(0, 255).Trim(); string? _name; @@ -78,7 +76,7 @@ protected void OnShutdown(object sender, EventArgs args) { Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); - DispatchPendingEvents(); + Dispatcher.DispatchPendingEvents(); } @@ -99,6 +97,8 @@ protected void OnWindowAdded(object o, WindowAddedArgs args) protected void StartupLauch(object sender, EventArgs args) { + IPlatformApplication.Current = this; + var startup = CreateMauiApp(); Services = startup.Services; @@ -107,34 +107,15 @@ protected void StartupLauch(object sender, EventArgs args) var mauiContext = new MauiContext(Services); Services.InvokeLifecycleEvents(del => del(mauiContext)); - var activationState = new ActivationState(mauiContext); - Application = Services.GetRequiredService(); - var window = Application.CreateWindow(activationState); - - CreateMainWindow(window, mauiContext); - - MainWindow.QueueDraw(); - MainWindow.ShowAll(); + CurrentGtkApplication.SetApplicationHandler(Application, mauiContext); - MainWindow.Present(); + CurrentGtkApplication.CreatePlatformWindow(Application, new PersistedState()); Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); } - void CreateMainWindow(IWindow window, MauiContext context) - { - MainWindow = new MauiGtkMainWindow(); - CurrentGtkApplication.AddWindow(MainWindow); - - context.Window = MainWindow; - - MainWindow.SetWindow(window, context); - Services.InvokeLifecycleEvents(del => del(MainWindow, EventArgs.Empty)); - - } - protected void Launch(EventArgs args) { @@ -151,39 +132,6 @@ protected void Launch(EventArgs args) } - public static void DispatchPendingEvents() - { - // The loop is limited to 1000 iterations as a workaround for an issue that some users - // have experienced. Sometimes EventsPending starts return 'true' for all iterations, - // causing the loop to never end. - - int n = 1000; -#pragma warning disable 612 - Gdk.Threads.Enter(); -#pragma warning restore 612 - - while (Gtk.Application.EventsPending() && --n > 0) - { - Gtk.Application.RunIteration(false); - } - -#pragma warning disable 612 - Gdk.Threads.Leave(); -#pragma warning restore 612 - } - - public static void Invoke(System.Action action) - { - if (action == null) - throw new ArgumentNullException(nameof(action)); - - // Switch to no Invoke(Action) once a gtk# release is done. - Gtk.Application.Invoke((o, args) => - { - action(); - }); - } - } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/WindowExtensions.cs b/src/Core/src/Platform/Gtk/WindowExtensions.cs index 157137a77c63..4d6338313161 100644 --- a/src/Core/src/Platform/Gtk/WindowExtensions.cs +++ b/src/Core/src/Platform/Gtk/WindowExtensions.cs @@ -20,9 +20,9 @@ public static IWindow GetWindow(this Gtk.Window nativeWindow) throw new InvalidOperationException("Window Not Found"); } - public static void SetWindow(this Gtk.Window nativeWindow, IWindow window, IMauiContext context) + public static void SetWindow(this Gtk.Window platformWindow, IWindow window, IMauiContext context) { - _ = nativeWindow ?? throw new ArgumentNullException(nameof(nativeWindow)); + _ = platformWindow ?? throw new ArgumentNullException(nameof(platformWindow)); _ = window ?? throw new ArgumentNullException(nameof(window)); _ = context ?? throw new ArgumentNullException(nameof(context)); diff --git a/src/Core/src/Platform/MauiContext.Gtk.cs b/src/Core/src/Platform/Gtk/[Obsolete]/MauiContext.Gtk.cs similarity index 100% rename from src/Core/src/Platform/MauiContext.Gtk.cs rename to src/Core/src/Platform/Gtk/[Obsolete]/MauiContext.Gtk.cs From e67d02182654b334cb6a91b138d2925be71693ff Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 24 Aug 2022 01:45:08 +0200 Subject: [PATCH 175/425] [Core.Gtk] Core.csproj: track api changes VI --- src/Core/src/Graphics/PaintExtensions.Gtk.cs | 2 +- src/Core/src/Handlers/Image/ImageHandler.Gtk.cs | 10 ++++------ .../src/Handlers/ImageButton/ImageButtonHandler.cs | 2 +- .../FileImageSourceService.Gtk.cs | 12 ++---------- src/Core/src/Platform/Gtk/LayoutView.cs | 10 +++++----- src/Core/src/Platform/Gtk/MauiImageButton.cs | 6 +++++- src/Core/src/Platform/ImageSourcePartLoader.cs | 3 +++ 7 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/Core/src/Graphics/PaintExtensions.Gtk.cs b/src/Core/src/Graphics/PaintExtensions.Gtk.cs index e9c09dd95780..0f1b3dadb9ce 100644 --- a/src/Core/src/Graphics/PaintExtensions.Gtk.cs +++ b/src/Core/src/Graphics/PaintExtensions.Gtk.cs @@ -50,7 +50,7 @@ public static partial class PaintExtensions if (paint.IsNullOrEmpty()) return null; - string Stops(GradientStop[] sorted) + string Stops(PaintGradientStop[] sorted) { #if NET48 var max = sorted[sorted.Length-1].Offset; diff --git a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs index 99c3eac93113..4c5abd7a3a77 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs @@ -1,6 +1,7 @@ #nullable enable using System; using System.Threading.Tasks; +using Gdk; using Microsoft.Maui.Platform; namespace Microsoft.Maui.Handlers @@ -30,16 +31,13 @@ public static async Task MapSourceAsync(IImageHandler handler, IImage image) if (handler.PlatformView == null) return; - var token = handler._sourceManager.BeginLoad(); + await handler.SourceLoader.UpdateImageSourceAsync(); - var provider = handler.GetRequiredService(); - var result = await handler.PlatformView.UpdateSourceAsync(image, provider, token); - - handler._sourceManager.CompleteLoad(result); } [MissingMapper] - void OnSetImageSource(object? obj) => throw new NotImplementedException(); + void OnSetImageSource(Pixbuf? obj) => throw new NotImplementedException(); + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs index 1d6f213a3138..f7397891b759 100644 --- a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs +++ b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs @@ -63,7 +63,7 @@ public ImageButtonHandler(IPropertyMapper mapper) : base(mapper ?? Mapper) IImage IImageHandler.VirtualView => VirtualView; PlatformImageView IImageHandler.PlatformView => -#if __IOS__ || TIZEN +#if __IOS__ || TIZEN || GTK PlatformView.ImageView; #elif WINDOWS PlatformView.GetContent() ?? throw new InvalidOperationException("ImageButton did not contain an Image element."); diff --git a/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs b/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs index 25587fad73fe..c54e5252ad05 100644 --- a/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs +++ b/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs @@ -51,26 +51,18 @@ public partial class FileImageSourceService try { - var imageDirectory = Configuration?.GetImageDirectory(); var image = TryLoadFile(filename); - if (image == null && imageDirectory != null) - { - image = TryLoadFile(Path.Combine(imageDirectory, filename)); - } - - var isResource = false; - if (image == null) { image = TryLoadResource(filename); - isResource = true; + } if (image == null) throw new InvalidOperationException("Unable to load image file."); - var result = new ImageSourceServiceResult(image, () => image.Dispose()) { IsResource = isResource }; + var result = new ImageSourceServiceResult(image, () => image.Dispose()) { }; return FromResult(result); } diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index be2ca34d876f..2ff10fcd1add 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -166,10 +166,10 @@ protected void AllocateChildren(Rectangle allocation) protected void ArrangeAllocation(Rectangle allocation) { - if (VirtualView is not { LayoutManager: { } layoutManager } virtualView) + if (VirtualView is not { } virtualView) return; - layoutManager.ArrangeChildren(allocation); + VirtualView.CrossPlatformArrange(allocation); } @@ -294,7 +294,7 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest bool CanBeCached() => !double.IsPositiveInfinity(widthConstraint) && !double.IsPositiveInfinity(heightConstraint); - if (VirtualView is not { LayoutManager: { } layoutManager } virtualView) + if (VirtualView is not { } virtualView) return Size.Zero; var key = (widthConstraint, heightConstraint, mode); @@ -312,7 +312,7 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest } - var measured = layoutManager.Measure(widthConstraint, heightConstraint); + var measured = VirtualView.CrossPlatformMeasure(widthConstraint, heightConstraint); #if TRACE_ALLOCATION if (_checkCacheHitFailed && cacheHit && measured != cached) @@ -357,7 +357,7 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min return; } - if (VirtualView is not { LayoutManager: { } layoutManager } virtualView) + if (VirtualView is not { } virtualView) return; var measuredMinimum = MeasureMinimum(); diff --git a/src/Core/src/Platform/Gtk/MauiImageButton.cs b/src/Core/src/Platform/Gtk/MauiImageButton.cs index 23ddf488bc40..5797eaee02bb 100644 --- a/src/Core/src/Platform/Gtk/MauiImageButton.cs +++ b/src/Core/src/Platform/Gtk/MauiImageButton.cs @@ -1,4 +1,8 @@ namespace Microsoft.Maui.Platform; public class MauiImageButton : Gtk.Button -{ } \ No newline at end of file +{ + + public ImageView ImageView { get; set; } = null!; + +} \ No newline at end of file diff --git a/src/Core/src/Platform/ImageSourcePartLoader.cs b/src/Core/src/Platform/ImageSourcePartLoader.cs index fbd2c1d7bff6..3cf47dcd2182 100644 --- a/src/Core/src/Platform/ImageSourcePartLoader.cs +++ b/src/Core/src/Platform/ImageSourcePartLoader.cs @@ -14,6 +14,9 @@ #elif TIZEN using PlatformImage = Tizen.UIExtensions.ElmSharp.Image; using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformImage = Gdk.Pixbuf; +using PlatformView = Gtk.Image; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformImage = System.Object; using PlatformView = System.Object; From 8b4e1cf5604f9cf7fc85ceb3cd6a95b3ca6cb76b Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 24 Aug 2022 01:45:38 +0200 Subject: [PATCH 176/425] [Graphics.Gtk] PaintExtensions: make public --- src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs index 6c970aff35a5..a85568da88b4 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PaintExtensions.cs @@ -2,7 +2,7 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; -internal static class PaintExtensions { +public static class PaintExtensions { public static Cairo.Context? PaintToSurface(this PatternPaint? it, Cairo.Surface? surface, float scale) { if (surface == null || it == null) From e7690e3c7d1954b26e5fcf77009753c2b98b0052 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 24 Aug 2022 04:05:12 +0200 Subject: [PATCH 177/425] [Controls.Gtk] PlatformConfigurationExtensions.cs: add Gtk & draft CarouselViewHandler.Gtk --- src/Controls/src/Core/Controls.Core.csproj | 2 +- .../src/Core/Platform/PlatformConfigurationExtensions.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Controls/src/Core/Controls.Core.csproj b/src/Controls/src/Core/Controls.Core.csproj index 69c0f1afe34d..2c9f1ed45ab4 100644 --- a/src/Controls/src/Core/Controls.Core.csproj +++ b/src/Controls/src/Core/Controls.Core.csproj @@ -53,6 +53,6 @@ - + diff --git a/src/Controls/src/Core/Platform/PlatformConfigurationExtensions.cs b/src/Controls/src/Core/Platform/PlatformConfigurationExtensions.cs index a0883e8b5de8..51847cfe7799 100644 --- a/src/Controls/src/Core/Platform/PlatformConfigurationExtensions.cs +++ b/src/Controls/src/Core/Platform/PlatformConfigurationExtensions.cs @@ -6,6 +6,8 @@ using CurrentPlatform = Microsoft.Maui.Controls.PlatformConfiguration.Windows; #elif TIZEN using CurrentPlatform = Microsoft.Maui.Controls.PlatformConfiguration.Tizen; +#elif GTK +using CurrentPlatform = Microsoft.Maui.Controls.PlatformConfiguration.GTK; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif From e10d2bb93d28f9dbcd63ef85332ca4392156bc4d Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 24 Aug 2022 22:46:25 +0200 Subject: [PATCH 178/425] [Controls.Gtk] track api changes I --- .../src/Core/HandlerImpl/Label/Label.Gtk.cs | 4 +- .../Handlers/Items/CarouselViewHandler.Gtk.cs | 14 +++++ .../Items/CollectionViewHandler.Gtk.cs | 6 +++ .../Items/GroupableItemsViewHandler.Gtk.cs | 9 ++++ .../Handlers/Items/ItemsViewHandler.Gtk.cs | 51 +++++++++++++++++++ .../Items/ReorderableItemsViewHandler.Gtk.cs | 12 +++++ .../Items/SelectableItemsViewHandler.Gtk.cs | 20 ++++++++ .../Items/StructuredItemsViewHandler.Gtk.cs | 23 +++++++++ .../src/Core/Properties/AssemblyInfo.cs | 6 +-- 9 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Items/CollectionViewHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs diff --git a/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs index 3a16f220e02c..28c371aca1af 100644 --- a/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs +++ b/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs @@ -8,12 +8,12 @@ public partial class Label public static void MapTextType(LabelHandler handler, Label label) { - handler.NativeView?.UpdateText(label, label.TextType); + handler.PlatformView?.UpdateText(label, label.TextType); } public static void MapText(LabelHandler handler, Label label) { - handler.NativeView?.UpdateText(label, label.TextType); + handler.PlatformView?.UpdateText(label, label.TextType); } } diff --git a/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs new file mode 100644 index 000000000000..688b58da5a64 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs @@ -0,0 +1,14 @@ +using System; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public partial class CarouselViewHandler : ItemsViewHandler + { + public static void MapCurrentItem(CarouselViewHandler handler, CarouselView carouselView) { } + public static void MapPosition(CarouselViewHandler handler, CarouselView carouselView) { } + public static void MapIsBounceEnabled(CarouselViewHandler handler, CarouselView carouselView) { } + public static void MapIsSwipeEnabled(CarouselViewHandler handler, CarouselView carouselView) { } + public static void MapPeekAreaInsets(CarouselViewHandler handler, CarouselView carouselView) { } + public static void MapLoop(CarouselViewHandler handler, CarouselView carouselView) { } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/CollectionViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/CollectionViewHandler.Gtk.cs new file mode 100644 index 000000000000..1dd9e7e8c8b3 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/CollectionViewHandler.Gtk.cs @@ -0,0 +1,6 @@ +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public partial class CollectionViewHandler : ReorderableItemsViewHandler + { + } +} diff --git a/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs new file mode 100644 index 000000000000..ccbc69c5ddcc --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs @@ -0,0 +1,9 @@ +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public partial class GroupableItemsViewHandler : SelectableItemsViewHandler where TItemsView : GroupableItemsView + { + public static void MapIsGrouped(GroupableItemsViewHandler handler, GroupableItemsView itemsView) + { + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs new file mode 100644 index 000000000000..642adb16cd15 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public abstract partial class ItemsViewHandler : ViewHandler where TItemsView : ItemsView + { + protected override Gtk.Container CreatePlatformView() + { + throw new NotImplementedException(); + } + + public static void MapItemsSource(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapHorizontalScrollBarVisibility(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapVerticalScrollBarVisibility(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapItemTemplate(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapEmptyView(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapEmptyViewTemplate(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapFlowDirection(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapIsVisible(ItemsViewHandler handler, ItemsView itemsView) + { + } + + public static void MapItemsUpdatingScrollMode(ItemsViewHandler handler, ItemsView itemsView) + { + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs new file mode 100644 index 000000000000..a1ae82bece13 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs @@ -0,0 +1,12 @@ +using System; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public partial class ReorderableItemsViewHandler : GroupableItemsViewHandler where TItemsView : ReorderableItemsView + { + public static void MapCanReorderItems(ReorderableItemsViewHandler handler, ReorderableItemsView itemsView) + { + //TODO : Need to impl + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs new file mode 100644 index 000000000000..bca90e8e787b --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs @@ -0,0 +1,20 @@ +using Microsoft.Maui.Controls.Platform; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + + public partial class SelectableItemsViewHandler : StructuredItemsViewHandler where TItemsView : SelectableItemsView + { + + public static void MapSelectedItem(SelectableItemsViewHandler handler, SelectableItemsView itemsView) + { } + + public static void MapSelectedItems(SelectableItemsViewHandler handler, SelectableItemsView itemsView) + { } + + public static void MapSelectionMode(SelectableItemsViewHandler handler, SelectableItemsView itemsView) + { } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs new file mode 100644 index 000000000000..305b09f7aac4 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs @@ -0,0 +1,23 @@ +using Microsoft.Maui.Controls.Platform; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public partial class StructuredItemsViewHandler : ItemsViewHandler where TItemsView : StructuredItemsView + { + public static void MapHeaderTemplate(StructuredItemsViewHandler handler, StructuredItemsView itemsView) + { + } + + public static void MapFooterTemplate(StructuredItemsViewHandler handler, StructuredItemsView itemsView) + { + } + + public static void MapItemsLayout(StructuredItemsViewHandler handler, StructuredItemsView itemsView) + { + } + + public static void MapItemSizingStrategy(StructuredItemsViewHandler handler, StructuredItemsView itemsView) + { + } + } +} diff --git a/src/Controls/src/Core/Properties/AssemblyInfo.cs b/src/Controls/src/Core/Properties/AssemblyInfo.cs index 1595f94401ae..10a8a57108df 100644 --- a/src/Controls/src/Core/Properties/AssemblyInfo.cs +++ b/src/Controls/src/Core/Properties/AssemblyInfo.cs @@ -139,9 +139,9 @@ [assembly: StyleProperty("-maui-max-length", typeof(InputView), nameof(InputView.MaxLengthProperty))] [assembly: StyleProperty("-maui-bar-background-color", typeof(IBarElement), nameof(BarElement.BarBackgroundColorProperty))] [assembly: StyleProperty("-maui-bar-text-color", typeof(IBarElement), nameof(BarElement.BarTextColorProperty))] -[assembly: StyleProperty("-maui-orientation", typeof(ScrollView), nameof(ScrollView.OrientationProperty))] -[assembly: StyleProperty("-maui-horizontal-scroll-bar-visibility", typeof(ScrollView), nameof(ScrollView.HorizontalScrollBarVisibilityProperty))] -[assembly: StyleProperty("-maui-vertical-scroll-bar-visibility", typeof(ScrollView), nameof(ScrollView.VerticalScrollBarVisibilityProperty))] +[assembly: StyleProperty("-maui-orientation", typeof(Microsoft.Maui.Controls.ScrollView), nameof(Microsoft.Maui.Controls.ScrollView.OrientationProperty))] +[assembly: StyleProperty("-maui-horizontal-scroll-bar-visibility", typeof(Microsoft.Maui.Controls.ScrollView), nameof(Microsoft.Maui.Controls.ScrollView.HorizontalScrollBarVisibilityProperty))] +[assembly: StyleProperty("-maui-vertical-scroll-bar-visibility", typeof(Microsoft.Maui.Controls.ScrollView), nameof(Microsoft.Maui.Controls.ScrollView.VerticalScrollBarVisibilityProperty))] [assembly: StyleProperty("-maui-min-track-color", typeof(Slider), nameof(Slider.MinimumTrackColorProperty))] [assembly: StyleProperty("-maui-max-track-color", typeof(Slider), nameof(Slider.MaximumTrackColorProperty))] [assembly: StyleProperty("-maui-thumb-color", typeof(Slider), nameof(Slider.ThumbColorProperty))] From 2024872021913601cfc5402ada2bee4b21f19b40 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 1 Sep 2022 12:33:21 +0200 Subject: [PATCH 179/425] [Controls.Gtk] track api changes II --- .../src/Core/HandlerImpl/Button/Button.Gtk.cs | 20 ++++++++ .../src/Core/HandlerImpl/Editor/Editor.Gtk.cs | 10 ++++ .../Core/HandlerImpl/Element/Element.Gtk.cs | 21 ++++++++ .../src/Core/HandlerImpl/Entry/Entry.Gtk.cs | 10 ++++ .../src/Core/HandlerImpl/Label/Label.Gtk.cs | 10 ++++ .../src/Core/HandlerImpl/Layout/Layout.Gtk.cs | 10 ++++ .../HandlerImpl/SearchBar/SearchBar.Gtk.cs | 14 ++++++ .../src/Core/HandlerImpl/Shape/Shape.Gtk.cs | 19 +++++++ .../HandlerImpl/TabbedPage/TabbedPage.Gtk.cs | 50 +++++++++++++++++++ .../VisualElement/VisualElement.Platform.cs | 2 + .../Handlers/Shapes/Line/LineHandler.Gtk.cs | 13 +++++ .../Handlers/Shapes/Path/PathHandler.Gtk.cs | 12 +++++ .../Shapes/Polygon/PolygonHandler.Gtk.cs | 12 +++++ .../Shapes/Polyline/PolylineHandler.Gtk.cs | 12 +++++ .../Shapes/Rectangle/RectangleHandler.Gtk.cs | 10 ++++ .../RoundRectangleHandler.Gtk.cs | 9 ++++ .../Core/Handlers/Shell/ShellHandler.Gtk.cs | 15 +++++- .../Gtk/Extensions/ButtonExtensions.cs | 2 +- src/Core/src/Platform/Gtk/ButtonExtensions.cs | 6 +++ src/Core/src/Platform/Gtk/ViewExtensions.cs | 8 +++ src/Core/src/Platform/Gtk/WindowExtensions.cs | 4 ++ 21 files changed, 267 insertions(+), 2 deletions(-) create mode 100644 src/Controls/src/Core/HandlerImpl/Button/Button.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/Editor/Editor.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/Element/Element.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/Entry/Entry.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/Layout/Layout.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/SearchBar/SearchBar.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/Shape/Shape.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/TabbedPage/TabbedPage.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs diff --git a/src/Controls/src/Core/HandlerImpl/Button/Button.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Button/Button.Gtk.cs new file mode 100644 index 000000000000..2cf031d5a196 --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Button/Button.Gtk.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Controls.Platform; + +namespace Microsoft.Maui.Controls +{ + public partial class Button + { + public static void MapText(ButtonHandler handler, Button button) + { + handler.PlatformView?.UpdateText(button); + } + + public static void MapLineBreakMode(IButtonHandler handler, Button button) + { + handler.PlatformView?.UpdateLineBreakMode(button); + } + } +} diff --git a/src/Controls/src/Core/HandlerImpl/Editor/Editor.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Editor/Editor.Gtk.cs new file mode 100644 index 000000000000..72971cce45ed --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Editor/Editor.Gtk.cs @@ -0,0 +1,10 @@ +namespace Microsoft.Maui.Controls +{ + public partial class Editor + { + public static void MapText(EditorHandler handler, Editor editor) + { + handler.PlatformView?.UpdateText(editor); + } + } +} diff --git a/src/Controls/src/Core/HandlerImpl/Element/Element.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Element/Element.Gtk.cs new file mode 100644 index 000000000000..ab1b890d85d9 --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Element/Element.Gtk.cs @@ -0,0 +1,21 @@ +#nullable enable + +using Microsoft.Maui.Controls.Platform; + +namespace Microsoft.Maui.Controls +{ + + public partial class Element + { + + [MissingMapper] + public static void MapAutomationPropertiesIsInAccessibleTree(IElementHandler handler, Element element) + { } + + [MissingMapper] + public static void MapAutomationPropertiesExcludedWithChildren(IElementHandler handler, Element element) + { } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/HandlerImpl/Entry/Entry.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Entry/Entry.Gtk.cs new file mode 100644 index 000000000000..94ffcc014403 --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Entry/Entry.Gtk.cs @@ -0,0 +1,10 @@ +namespace Microsoft.Maui.Controls +{ + public partial class Entry + { + public static void MapText(EntryHandler handler, Entry entry) + { + handler.PlatformView.UpdateText(entry); + } + } +} diff --git a/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs index 28c371aca1af..f788f312a628 100644 --- a/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs +++ b/src/Controls/src/Core/HandlerImpl/Label/Label.Gtk.cs @@ -16,6 +16,16 @@ public static void MapText(LabelHandler handler, Label label) handler.PlatformView?.UpdateText(label, label.TextType); } + public static void MapLineBreakMode(LabelHandler handler, Label label) + { + handler.PlatformView?.UpdateLineBreakMode(label); + } + + public static void MapMaxLines(LabelHandler handler, Label label) + { + handler.PlatformView?.UpdateText(label, label.TextType); + } + } } \ No newline at end of file diff --git a/src/Controls/src/Core/HandlerImpl/Layout/Layout.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Layout/Layout.Gtk.cs new file mode 100644 index 000000000000..36a8afdca98c --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Layout/Layout.Gtk.cs @@ -0,0 +1,10 @@ +namespace Microsoft.Maui.Controls +{ + public partial class Layout + { + [MissingMapper] + public static void MapInputTransparent(LayoutHandler handler, Layout layout) + { + } + } +} diff --git a/src/Controls/src/Core/HandlerImpl/SearchBar/SearchBar.Gtk.cs b/src/Controls/src/Core/HandlerImpl/SearchBar/SearchBar.Gtk.cs new file mode 100644 index 000000000000..9ebfd2f82644 --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/SearchBar/SearchBar.Gtk.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Maui.Controls +{ + + public partial class SearchBar + { + + public static void MapText(SearchBarHandler handler, SearchBar searchBar) + { + SearchBarHandler.MapText(handler, searchBar); + } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/HandlerImpl/Shape/Shape.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Shape/Shape.Gtk.cs new file mode 100644 index 000000000000..544b95598e68 --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Shape/Shape.Gtk.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Controls.Platform; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Controls.Shapes +{ + + public partial class Shape + { + + [MissingMapper] + public static void MapStrokeDashArray(IShapeViewHandler handler, IShapeView shapeView) { } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/HandlerImpl/TabbedPage/TabbedPage.Gtk.cs b/src/Controls/src/Core/HandlerImpl/TabbedPage/TabbedPage.Gtk.cs new file mode 100644 index 000000000000..cb6b1b8478bc --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/TabbedPage/TabbedPage.Gtk.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Controls +{ + + public partial class TabbedPage + { + + [MissingMapper] + internal static void MapBarBackground(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapBarBackgroundColor(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapBarTextColor(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapUnselectedTabColor(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapSelectedTabColor(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapItemsSource(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapItemTemplate(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapSelectedItem(ITabbedViewHandler handler, TabbedPage view) + { } + + [MissingMapper] + internal static void MapCurrentPage(ITabbedViewHandler handler, TabbedPage view) + { } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/HandlerImpl/VisualElement/VisualElement.Platform.cs b/src/Controls/src/Core/HandlerImpl/VisualElement/VisualElement.Platform.cs index 88058852a141..f604ed3a033a 100644 --- a/src/Controls/src/Core/HandlerImpl/VisualElement/VisualElement.Platform.cs +++ b/src/Controls/src/Core/HandlerImpl/VisualElement/VisualElement.Platform.cs @@ -10,6 +10,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = ElmSharp.EvasObject; +#elif GTK +using PlatformView = Gtk.Widget; #endif namespace Microsoft.Maui.Controls diff --git a/src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs new file mode 100644 index 000000000000..1e44f130545a --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.Maui.Controls.Shapes; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class LineHandler + { + public static void MapX1(IShapeViewHandler handler, Line line) { } + public static void MapY1(IShapeViewHandler handler, Line line) { } + public static void MapX2(IShapeViewHandler handler, Line line) { } + public static void MapY2(IShapeViewHandler handler, Line line) { } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs new file mode 100644 index 000000000000..8e3e8c3f2886 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs @@ -0,0 +1,12 @@ +using System; +using Microsoft.Maui.Controls.Shapes; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class PathHandler + { + public static void MapShape(IShapeViewHandler handler, Path path) { } + public static void MapData(IShapeViewHandler handler, Path path) { } + public static void MapRenderTransform(IShapeViewHandler handler, Path path) { } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs new file mode 100644 index 000000000000..43bfbaec436b --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs @@ -0,0 +1,12 @@ +using System; +using Microsoft.Maui.Controls.Shapes; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class PolygonHandler + { + public static void MapShape(IShapeViewHandler handler, Polygon polygon) { } + public static void MapPoints(IShapeViewHandler handler, Polygon polygon) { } + public static void MapFillRule(IShapeViewHandler handler, Polygon polygon) { } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs new file mode 100644 index 000000000000..78f0857f2b8b --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs @@ -0,0 +1,12 @@ +using System; +using Microsoft.Maui.Controls.Shapes; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class PolylineHandler + { + public static void MapShape(IShapeViewHandler handler, Polyline polyline) { } + public static void MapPoints(IShapeViewHandler handler, Polyline polyline) { } + public static void MapFillRule(IShapeViewHandler handler, Polyline polyline) { } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs new file mode 100644 index 000000000000..2ffeeadff6cc --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs @@ -0,0 +1,10 @@ +using Microsoft.Maui.Controls.Shapes; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class RectangleHandler + { + public static void MapRadiusX(IShapeViewHandler handler, Rectangle rectangle) { } + public static void MapRadiusY(IShapeViewHandler handler, Rectangle rectangle) { } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs new file mode 100644 index 000000000000..7ea663622889 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs @@ -0,0 +1,9 @@ +using Microsoft.Maui.Controls.Shapes; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class RoundRectangleHandler + { + public static void MapCornerRadius(IShapeViewHandler handler, RoundRectangle roundRectangle) { } + } +} diff --git a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs index d61b9d946f6b..92c23cade5d8 100644 --- a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs @@ -7,11 +7,24 @@ namespace Microsoft.Maui.Controls.Handlers { + public partial class ShellHandler : ViewHandler { + + public static PropertyMapper Mapper = + new PropertyMapper(ElementMapper); + + public static CommandMapper CommandMapper = + new CommandMapper(ElementCommandMapper); + + public ShellHandler() : base(Mapper, CommandMapper) + { } + protected override Gtk.Widget CreatePlatformView() { throw new NotImplementedException(); } + } -} + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs b/src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs index c5f2fe1c39b3..860adaceada2 100644 --- a/src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs +++ b/src/Controls/src/Core/Platform/Gtk/Extensions/ButtonExtensions.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui.Controls.Platform public static class ButtonExtensions { [MissingMapper] - public static void UpdateContentLayout(this object nativeButton, Button button) + public static void UpdateContentLayout(this Gtk.Button nativeButton, Button button) { } } diff --git a/src/Core/src/Platform/Gtk/ButtonExtensions.cs b/src/Core/src/Platform/Gtk/ButtonExtensions.cs index a04b617a71e6..3eb48ad90ad4 100644 --- a/src/Core/src/Platform/Gtk/ButtonExtensions.cs +++ b/src/Core/src/Platform/Gtk/ButtonExtensions.cs @@ -21,6 +21,12 @@ public static void UpdateText(this Button nativeButton, ITextButton button) } } + [MissingMapper] + public static void UpdateLineBreakMode(this Button nativeButton, ITextButton button) + { + + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index ecba0dbebf29..3241bf290629 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -226,6 +226,14 @@ internal static IDisposable OnUnloaded(this Widget? platformView, Action action) throw new NotImplementedException(); } + public static bool IsLoaded(this Widget? platformView) + { + if (platformView is not { }) + return false; + + return platformView.IsRealized; + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/WindowExtensions.cs b/src/Core/src/Platform/Gtk/WindowExtensions.cs index 4d6338313161..663d2cd25f83 100644 --- a/src/Core/src/Platform/Gtk/WindowExtensions.cs +++ b/src/Core/src/Platform/Gtk/WindowExtensions.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Maui.Devices; namespace Microsoft.Maui.Platform { @@ -42,6 +43,9 @@ public static void SetWindow(this Gtk.Window platformWindow, IWindow window, IMa handler.SetVirtualView(window); } + internal static DisplayOrientation GetOrientation(this IWindow? window) => + DeviceDisplay.Current.MainDisplayInfo.Orientation; + } } \ No newline at end of file From 6dc07d3836acc41a4fc8e0b8645098ca02fb042b Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 1 Sep 2022 12:42:35 +0200 Subject: [PATCH 180/425] [Controls.Xaml.Gtk] add PublicAPI --- .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 185 ++++++++++++++++++ .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 1 + 2 files changed, 186 insertions(+) create mode 100644 src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Unshipped.txt diff --git a/src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..6faff5e90ef0 --- /dev/null +++ b/src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1,185 @@ +#nullable enable +Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions +Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension +Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.AppThemeBindingExtension() -> void +Microsoft.Maui.Controls.Xaml.ArrayExtension +Microsoft.Maui.Controls.Xaml.ArrayExtension.ArrayExtension() -> void +Microsoft.Maui.Controls.Xaml.BindingExtension +Microsoft.Maui.Controls.Xaml.BindingExtension.BindingExtension() -> void +Microsoft.Maui.Controls.Xaml.BindingExtension.Mode.get -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.Xaml.BindingExtension.Mode.set -> void +Microsoft.Maui.Controls.Xaml.DataTemplateExtension +Microsoft.Maui.Controls.Xaml.DataTemplateExtension.DataTemplateExtension() -> void +Microsoft.Maui.Controls.Xaml.DynamicResourceExtension +Microsoft.Maui.Controls.Xaml.DynamicResourceExtension.DynamicResourceExtension() -> void +Microsoft.Maui.Controls.Xaml.Extensions +Microsoft.Maui.Controls.Xaml.FontImageExtension +Microsoft.Maui.Controls.Xaml.FontImageExtension.FontImageExtension() -> void +Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.get -> double +Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.set -> void +Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider +Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider +Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider() -> void +Microsoft.Maui.Controls.Xaml.Internals.XamlTypeResolver +Microsoft.Maui.Controls.Xaml.Internals.XmlLineInfoProvider +Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver +Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver.XmlNamespaceResolver() -> void +Microsoft.Maui.Controls.Xaml.NullExtension +Microsoft.Maui.Controls.Xaml.NullExtension.NullExtension() -> void +Microsoft.Maui.Controls.Xaml.OnIdiomExtension +Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension() -> void +Microsoft.Maui.Controls.Xaml.OnPlatformExtension +Microsoft.Maui.Controls.Xaml.OnPlatformExtension.OnPlatformExtension() -> void +Microsoft.Maui.Controls.Xaml.ReferenceExtension +Microsoft.Maui.Controls.Xaml.ReferenceExtension.ReferenceExtension() -> void +Microsoft.Maui.Controls.Xaml.RelativeSourceExtension +Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.AncestorLevel.get -> int +Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.AncestorLevel.set -> void +Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.Mode.get -> Microsoft.Maui.Controls.RelativeBindingSourceMode +Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.Mode.set -> void +Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.RelativeSourceExtension() -> void +Microsoft.Maui.Controls.Xaml.StaticExtension +Microsoft.Maui.Controls.Xaml.StaticExtension.StaticExtension() -> void +Microsoft.Maui.Controls.Xaml.StaticResourceExtension +Microsoft.Maui.Controls.Xaml.StaticResourceExtension.StaticResourceExtension() -> void +Microsoft.Maui.Controls.Xaml.StyleSheetExtension +Microsoft.Maui.Controls.Xaml.StyleSheetExtension.StyleSheetExtension() -> void +Microsoft.Maui.Controls.Xaml.TemplateBindingExtension +Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.Mode.get -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.Mode.set -> void +Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.TemplateBindingExtension() -> void +Microsoft.Maui.Controls.Xaml.TypeExtension +Microsoft.Maui.Controls.Xaml.TypeExtension.TypeExtension() -> void +Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute +Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute.XamlCompilationAttribute(Microsoft.Maui.Controls.Xaml.XamlCompilationOptions xamlCompilationOptions) -> void +Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute.XamlCompilationOptions.get -> Microsoft.Maui.Controls.Xaml.XamlCompilationOptions +Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute.XamlCompilationOptions.set -> void +Microsoft.Maui.Controls.Xaml.XamlCompilationOptions +Microsoft.Maui.Controls.Xaml.XamlCompilationOptions.Compile = 2 -> Microsoft.Maui.Controls.Xaml.XamlCompilationOptions +Microsoft.Maui.Controls.Xaml.XamlCompilationOptions.Skip = 1 -> Microsoft.Maui.Controls.Xaml.XamlCompilationOptions +Microsoft.Maui.Controls.Xaml.XamlFilePathAttribute +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Dark.get -> object +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Dark.set -> void +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Default.get -> object +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Default.set -> void +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Light.get -> object +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Light.set -> void +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Value.get -> object +~Microsoft.Maui.Controls.Xaml.ArrayExtension.Items.get -> System.Collections.IList +~Microsoft.Maui.Controls.Xaml.ArrayExtension.ProvideValue(System.IServiceProvider serviceProvider) -> System.Array +~Microsoft.Maui.Controls.Xaml.ArrayExtension.Type.get -> System.Type +~Microsoft.Maui.Controls.Xaml.ArrayExtension.Type.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.Converter.get -> Microsoft.Maui.Controls.IValueConverter +~Microsoft.Maui.Controls.Xaml.BindingExtension.Converter.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.ConverterParameter.get -> object +~Microsoft.Maui.Controls.Xaml.BindingExtension.ConverterParameter.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.FallbackValue.get -> object +~Microsoft.Maui.Controls.Xaml.BindingExtension.FallbackValue.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.Path.get -> string +~Microsoft.Maui.Controls.Xaml.BindingExtension.Path.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.Source.get -> object +~Microsoft.Maui.Controls.Xaml.BindingExtension.Source.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.StringFormat.get -> string +~Microsoft.Maui.Controls.Xaml.BindingExtension.StringFormat.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.TargetNullValue.get -> object +~Microsoft.Maui.Controls.Xaml.BindingExtension.TargetNullValue.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.TypedBinding.get -> Microsoft.Maui.Controls.Internals.TypedBindingBase +~Microsoft.Maui.Controls.Xaml.BindingExtension.TypedBinding.set -> void +~Microsoft.Maui.Controls.Xaml.BindingExtension.UpdateSourceEventName.get -> string +~Microsoft.Maui.Controls.Xaml.BindingExtension.UpdateSourceEventName.set -> void +~Microsoft.Maui.Controls.Xaml.DataTemplateExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Xaml.DataTemplateExtension.TypeName.get -> string +~Microsoft.Maui.Controls.Xaml.DataTemplateExtension.TypeName.set -> void +~Microsoft.Maui.Controls.Xaml.DynamicResourceExtension.Key.get -> string +~Microsoft.Maui.Controls.Xaml.DynamicResourceExtension.Key.set -> void +~Microsoft.Maui.Controls.Xaml.DynamicResourceExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.FontImageExtension.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Xaml.FontImageExtension.Color.set -> void +~Microsoft.Maui.Controls.Xaml.FontImageExtension.FontFamily.get -> string +~Microsoft.Maui.Controls.Xaml.FontImageExtension.FontFamily.set -> void +~Microsoft.Maui.Controls.Xaml.FontImageExtension.Glyph.get -> string +~Microsoft.Maui.Controls.Xaml.FontImageExtension.Glyph.set -> void +~Microsoft.Maui.Controls.Xaml.FontImageExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider.FindByName(string name) -> object +~Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider.SimpleValueTargetProvider(object[] objectAndParents, object targetProperty, Microsoft.Maui.Controls.Internals.INameScope scope) -> void +~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.Add(System.Type type, object service) -> void +~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.GetService(System.Type serviceType) -> object +~Microsoft.Maui.Controls.Xaml.Internals.XamlTypeResolver.XamlTypeResolver(System.Xml.IXmlNamespaceResolver namespaceResolver, System.Reflection.Assembly currentAssembly) -> void +~Microsoft.Maui.Controls.Xaml.Internals.XmlLineInfoProvider.XmlLineInfo.get -> System.Xml.IXmlLineInfo +~Microsoft.Maui.Controls.Xaml.Internals.XmlLineInfoProvider.XmlLineInfoProvider(System.Xml.IXmlLineInfo xmlLineInfo) -> void +~Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver.Add(string prefix, string ns) -> void +~Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver.GetNamespacesInScope(System.Xml.XmlNamespaceScope scope) -> System.Collections.Generic.IDictionary +~Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver.LookupNamespace(string prefix) -> string +~Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver.LookupPrefix(string namespaceName) -> string +~Microsoft.Maui.Controls.Xaml.NullExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Converter.get -> Microsoft.Maui.Controls.IValueConverter +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Converter.set -> void +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.ConverterParameter.get -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.ConverterParameter.set -> void +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Default.get -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Default.set -> void +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Desktop.get -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Desktop.set -> void +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Phone.get -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Phone.set -> void +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Tablet.get -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Tablet.set -> void +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.TV.get -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.TV.set -> void +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Watch.get -> object +~Microsoft.Maui.Controls.Xaml.OnIdiomExtension.Watch.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Android.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Android.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Converter.get -> Microsoft.Maui.Controls.IValueConverter +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Converter.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.ConverterParameter.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.ConverterParameter.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Default.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Default.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.iOS.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.iOS.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.MacCatalyst.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.MacCatalyst.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Tizen.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.Tizen.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.UWP.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.UWP.set -> void +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.WinUI.get -> object +~Microsoft.Maui.Controls.Xaml.OnPlatformExtension.WinUI.set -> void +~Microsoft.Maui.Controls.Xaml.ReferenceExtension.Name.get -> string +~Microsoft.Maui.Controls.Xaml.ReferenceExtension.Name.set -> void +~Microsoft.Maui.Controls.Xaml.ReferenceExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.AncestorType.get -> System.Type +~Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.AncestorType.set -> void +~Microsoft.Maui.Controls.Xaml.RelativeSourceExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.StaticExtension.Member.get -> string +~Microsoft.Maui.Controls.Xaml.StaticExtension.Member.set -> void +~Microsoft.Maui.Controls.Xaml.StaticExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.StaticResourceExtension.Key.get -> string +~Microsoft.Maui.Controls.Xaml.StaticResourceExtension.Key.set -> void +~Microsoft.Maui.Controls.Xaml.StaticResourceExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.StyleSheetExtension.Source.get -> System.Uri +~Microsoft.Maui.Controls.Xaml.StyleSheetExtension.Source.set -> void +~Microsoft.Maui.Controls.Xaml.StyleSheetExtension.Style.get -> string +~Microsoft.Maui.Controls.Xaml.StyleSheetExtension.Style.set -> void +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.Converter.get -> Microsoft.Maui.Controls.IValueConverter +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.Converter.set -> void +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.ConverterParameter.get -> object +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.ConverterParameter.set -> void +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.Path.get -> string +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.Path.set -> void +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.StringFormat.get -> string +~Microsoft.Maui.Controls.Xaml.TemplateBindingExtension.StringFormat.set -> void +~Microsoft.Maui.Controls.Xaml.TypeExtension.ProvideValue(System.IServiceProvider serviceProvider) -> System.Type +~Microsoft.Maui.Controls.Xaml.TypeExtension.TypeName.get -> string +~Microsoft.Maui.Controls.Xaml.TypeExtension.TypeName.set -> void +~Microsoft.Maui.Controls.Xaml.XamlFilePathAttribute.FilePath.get -> string +~Microsoft.Maui.Controls.Xaml.XamlFilePathAttribute.XamlFilePathAttribute(string filePath = "") -> void +~static Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions.AddMauiControlsHandlers(this Microsoft.Maui.Hosting.IMauiHandlersCollection handlersCollection) -> Microsoft.Maui.Hosting.IMauiHandlersCollection +~static Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions.UseMauiApp(this Microsoft.Maui.Hosting.MauiAppBuilder builder) -> Microsoft.Maui.Hosting.MauiAppBuilder +~static Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions.UseMauiApp(this Microsoft.Maui.Hosting.MauiAppBuilder builder, System.Func implementationFactory) -> Microsoft.Maui.Hosting.MauiAppBuilder +~static Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this TXaml view, string xaml) -> TXaml +~static Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this TXaml view, System.Type callingType) -> TXaml diff --git a/src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..ab058de62d44 --- /dev/null +++ b/src/Controls/src/Xaml/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable From 416d9bd9ba8b248c9774766afbbe4d56d09eec00 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 1 Sep 2022 13:30:41 +0200 Subject: [PATCH 181/425] [Controls.Compatibility.Core.Gtk] track api changes I --- .../Core/src/AppHostBuilderExtensions.Gtk.cs | 2 +- .../Core/src/AppHostBuilderExtensions.cs | 13 -- .../Core/src/Gtk/Deserializer.cs | 97 -------------- .../Gtk/Extensions/NativeBindingExtensions.cs | 10 +- src/Compatibility/Core/src/Gtk/Forms.cs | 4 +- .../Core/src/Gtk/GtkPlatformServices.cs | 119 ------------------ .../Core/src/Gtk/ResourcesProvider.cs | 32 ++++- .../Core/src/RendererToHandlerShim.cs | 7 +- 8 files changed, 40 insertions(+), 244 deletions(-) delete mode 100644 src/Compatibility/Core/src/Gtk/Deserializer.cs delete mode 100644 src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs index 321aeff63fde..02a7c7910ae7 100644 --- a/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.Gtk.cs @@ -5,7 +5,7 @@ using System; using Microsoft.Maui.Hosting; -namespace Microsoft.Maui.Controls.Hosting +namespace Microsoft.Maui.Controls.Compatibility.Hosting { public static partial class AppHostBuilderExtensions diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs index 427081fa923b..bb4e25772e2d 100644 --- a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs @@ -51,7 +51,6 @@ using PolylineRenderer = Microsoft.Maui.Controls.Compatibility.Platform.Tizen.SkiaSharp.PolylineRenderer; using RectangleRenderer = Microsoft.Maui.Controls.Compatibility.Platform.Tizen.SkiaSharp.RectangleRenderer; #elif GTK -using Microsoft.Maui.Graphics.Native.Gtk; using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; using Microsoft.Maui.Controls.Handlers; @@ -142,18 +141,6 @@ public static MauiAppBuilder UseMauiCompatibility(this MauiAppBuilder builder) #if IOS || MACCATALYST Internals.Registrar.RegisterEffect("Xamarin", "ShadowEffect", typeof(ShadowEffect)); -#endif -#if GTK - DependencyService.Register(); - DependencyService.Register(); - DependencyService.Register(); - DependencyService.Register(); - DependencyService.Register(); - DependencyService.Register(); - - DependencyService.Register(); - DependencyService.Register(); - #endif // Update the mappings for IView/View to work specifically for Controls diff --git a/src/Compatibility/Core/src/Gtk/Deserializer.cs b/src/Compatibility/Core/src/Gtk/Deserializer.cs deleted file mode 100644 index 0843804f9c07..000000000000 --- a/src/Compatibility/Core/src/Gtk/Deserializer.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO.IsolatedStorage; -using System.Runtime.Serialization; -using System.Threading.Tasks; -using System.Xml; -using Microsoft.Maui.Controls.Internals; - -namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk -{ - internal class Deserializer : IDeserializer - { - const string PropertyStoreFile = "PropertyStore.forms"; - - public Task> DeserializePropertiesAsync() - { - // Deserialize property dictionary to local storage - // Make sure to use Internal - return Task.Run(() => - { - using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (!store.FileExists(PropertyStoreFile)) - return null; - - using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)) - using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max)) - { - if (stream.Length == 0) - return null; - - try - { - var dcs = new DataContractSerializer(typeof(Dictionary)); - return (IDictionary)dcs.ReadObject(reader); - } - catch (Exception e) - { - Debug.WriteLine("Could not deserialize properties: " + e.Message); - Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while reading Application properties: {e}"); - } - } - - } - - return null; - }); - } - - public Task SerializePropertiesAsync(IDictionary properties) - { - properties = new Dictionary(properties); - // Serialize property dictionary to local storage - // Make sure to use Internal - return Task.Run(() => - { - using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) - { - // No need to write 0 properties if no file exists - if (properties.Count == 0 && !store.FileExists(PropertyStoreFile)) - { - return; - } - using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile + ".tmp", System.IO.FileMode.OpenOrCreate)) - using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(stream)) - { - try - { - var dcs = new DataContractSerializer(typeof(Dictionary)); - dcs.WriteObject(writer, properties); - writer.Flush(); - } - catch (Exception e) - { - Debug.WriteLine("Could not serialize properties: " + e.Message); - Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while writing Application properties: {e}"); - return; - } - } - - try - { - if (store.FileExists(PropertyStoreFile)) - store.DeleteFile(PropertyStoreFile); - store.MoveFile(PropertyStoreFile + ".tmp", PropertyStoreFile); - } - catch (Exception e) - { - Debug.WriteLine("Could not move new serialized property file over old: " + e.Message); - Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while writing Application properties: {e}"); - } - } - }); - } - } -} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs b/src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs index e3eb7043f037..54c1a13bac8e 100644 --- a/src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs +++ b/src/Compatibility/Core/src/Gtk/Extensions/NativeBindingExtensions.cs @@ -8,27 +8,27 @@ public static class NativeBindingExtensions { public static void SetBinding(this global::Gtk.Widget view, string propertyName, BindingBase binding, string updateSourceEventName = null) { - NativeBindingHelpers.SetBinding(view, propertyName, binding, updateSourceEventName); + PlatformBindingHelpers.SetBinding(view, propertyName, binding, updateSourceEventName); } public static void SetBinding(this global::Gtk.Widget view, BindableProperty targetProperty, BindingBase binding) { - NativeBindingHelpers.SetBinding(view, targetProperty, binding); + PlatformBindingHelpers.SetBinding(view, targetProperty, binding); } public static void SetValue(this global::Gtk.Widget target, BindableProperty targetProperty, object value) { - NativeBindingHelpers.SetValue(target, targetProperty, value); + PlatformBindingHelpers.SetValue(target, targetProperty, value); } public static void SetBindingContext(this global::Gtk.Widget target, object bindingContext, Func> getChildren = null) { - NativeBindingHelpers.SetBindingContext(target, bindingContext, getChildren); + PlatformBindingHelpers.SetBindingContext(target, bindingContext, getChildren); } internal static void TransferBindablePropertiesToWrapper(this global::Gtk.Widget target, View wrapper) { - NativeBindingHelpers.TransferBindablePropertiesToWrapper(target, wrapper); + PlatformBindingHelpers.TransferBindablePropertiesToWrapper(target, wrapper); } } } \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Forms.cs b/src/Compatibility/Core/src/Gtk/Forms.cs index f93e067d829e..7021a7719194 100644 --- a/src/Compatibility/Core/src/Gtk/Forms.cs +++ b/src/Compatibility/Core/src/Gtk/Forms.cs @@ -9,8 +9,8 @@ public static class Forms public static void Init(IActivationState state) { - var gtkServices = new GtkPlatformServices(); - Device.PlatformServices = gtkServices; + // var gtkServices = new GtkPlatformServices(); + // Device.PlatformServices = gtkServices; } } diff --git a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs deleted file mode 100644 index e69de7e730b6..000000000000 --- a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.IO; -using System.Reflection; -using System.Threading; -using System.Threading.Tasks; -using Gtk; -using Microsoft.Maui.Controls.Internals; -using Microsoft.Maui.Graphics; -using Action = System.Action; - -namespace Microsoft.Maui.Controls.Compatibility -{ - - public class GtkPlatformServices : IPlatformServices - { - - public bool IsInvokeRequired => Thread.CurrentThread.IsBackground; - - public void BeginInvokeOnMainThread(Action action) - { - MauiGtkApplication.Invoke(action); - } - public Assembly[] GetAssemblies() - { - return AppDomain.CurrentDomain.GetAssemblies(); - } - - public string GetHash(string input) - { - return Internals.Crc64.GetHash(input); - } - - public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSizes) - { - switch (size) - { - case NamedSize.Default: - return 11; - case NamedSize.Micro: - case NamedSize.Caption: - return 12; - case NamedSize.Medium: - return 17; - case NamedSize.Large: - return 22; - case NamedSize.Small: - case NamedSize.Body: - return 14; - case NamedSize.Header: - return 46; - case NamedSize.Subtitle: - return 20; - case NamedSize.Title: - return 24; - default: - throw new ArgumentOutOfRangeException(nameof(size)); - } - } - - public Color GetNamedColor(string name) - { - throw new NotImplementedException(); - } - - public OSAppTheme RequestedTheme { get; set; } - - public async Task GetStreamAsync(Uri uri, CancellationToken cancellationToken) - - { - using var client = new System.Net.Http.HttpClient(); - - // Do not remove this await otherwise the client will dispose before - // the stream even starts - var result = await StreamWrapper.GetStreamAsync(uri, cancellationToken, client).ConfigureAwait(false); - - return result; - - } - - public IIsolatedStorageFile GetUserStoreForApplication() - { - throw new NotImplementedException(); - } - - public void OpenUriAction(Uri uri) - { - throw new NotImplementedException(); - } - - public void StartTimer(TimeSpan interval, Func callback) - { - GLib.Timeout.Add((uint)interval.TotalMilliseconds, () => - { - var result = callback(); - - return result; - }); - } - - public string RuntimePlatform => Device.GTK; - - public void QuitApplication() - { - ((GLib.Application)MauiGtkApplication.CurrentGtkApplication).Quit(); - } - - public SizeRequest GetNativeSize(VisualElement view, double widthConstraint, double heightConstraint) - { - if (view.Handler?.NativeView is Widget w) - { - return view.Handler.GetDesiredSize(widthConstraint, heightConstraint); - } - - return new SizeRequest(); - } - - } - -} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs b/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs index d9c53d2c154b..90d1a562c6d3 100644 --- a/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs +++ b/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs @@ -3,8 +3,12 @@ namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk { + +#pragma warning disable CS0612 internal class ResourcesProvider : ISystemResourcesProvider +#pragma warning restore CS0612 { + private const string TitleStyleKey = "HeaderLabelStyle"; private const string SubtitleStyleKey = "SubheaderLabelStyle"; private const string BodyStyleKey = "BodyLabelStyle"; @@ -16,12 +20,15 @@ public IResourceDictionary GetSystemResources() { return new ResourceDictionary { +#pragma warning disable CS0612 [Device.Styles.TitleStyleKey] = GetStyle(TitleStyleKey), [Device.Styles.SubtitleStyleKey] = GetStyle(SubtitleStyleKey), [Device.Styles.BodyStyleKey] = GetStyle(BodyStyleKey), [Device.Styles.CaptionStyleKey] = GetStyle(CaptionStyleKey), [Device.Styles.ListItemDetailTextStyleKey] = GetStyle(ListItemDetailTextStyleKey), [Device.Styles.ListItemTextStyleKey] = GetStyle(ListItemTextStyleKey) +#pragma warning restore CS0612 + }; } @@ -32,13 +39,28 @@ private Style GetStyle(string nativeKey) switch (nativeKey) { case TitleStyleKey: - result.Setters.Add(new Setter { Property = Label.FontSizeProperty, Value = 24 }); + result.Setters.Add(new Setter + { + Property = Label.FontSizeProperty, + Value = 24 + }); + break; case SubtitleStyleKey: - result.Setters.Add(new Setter { Property = Label.FontSizeProperty, Value = 20 }); + result.Setters.Add(new Setter + { + Property = Label.FontSizeProperty, + Value = 20 + }); + break; case BodyStyleKey: - result.Setters.Add(new Setter { Property = Label.TextColorProperty, Value = Colors.Blue }); + result.Setters.Add(new Setter + { + Property = Label.TextColorProperty, + Value = Colors.Blue + }); + break; case CaptionStyleKey: break; @@ -48,5 +70,7 @@ private Style GetStyle(string nativeKey) return result; } + } -} + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/RendererToHandlerShim.cs b/src/Compatibility/Core/src/RendererToHandlerShim.cs index 1150f00ebc24..0831ed13a32b 100644 --- a/src/Compatibility/Core/src/RendererToHandlerShim.cs +++ b/src/Compatibility/Core/src/RendererToHandlerShim.cs @@ -25,12 +25,13 @@ using PlatformView = ElmSharp.EvasObject; using Microsoft.Maui.Controls.Compatibility.Platform.Tizen; using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; +#elif GTK +using PlatformView = Gtk.Widget; +using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; +using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; -#elif GTK -using NativeView = Gtk.Widget; -using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; #elif WINDOWS using ViewHandler = Microsoft.Maui.Handlers.ViewHandler; using PlatformView = Microsoft.UI.Xaml.FrameworkElement; From b07d1dff39d85071a5c12f7acb566c93095bf659 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 1 Sep 2022 13:37:29 +0200 Subject: [PATCH 182/425] [Controls.Compatibility.Core.Gtk] track api changes II --- .../Core/src/Gtk/Deserializer.cs_ | 97 +++++++++++++++ .../Core/src/Gtk/GtkPlatformServices.cs_ | 114 ++++++++++++++++++ .../Core/src/Gtk/Renderers/DefaultRenderer.cs | 42 +++++++ .../Gtk/Renderers/IVisualElementRenderer.cs | 43 +++++++ .../Core/src/RendererToHandlerShim.Gtk.cs | 57 +++++++++ 5 files changed, 353 insertions(+) create mode 100644 src/Compatibility/Core/src/Gtk/Deserializer.cs_ create mode 100644 src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs_ create mode 100644 src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs create mode 100644 src/Compatibility/Core/src/Gtk/Renderers/IVisualElementRenderer.cs create mode 100644 src/Compatibility/Core/src/RendererToHandlerShim.Gtk.cs diff --git a/src/Compatibility/Core/src/Gtk/Deserializer.cs_ b/src/Compatibility/Core/src/Gtk/Deserializer.cs_ new file mode 100644 index 000000000000..0843804f9c07 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Deserializer.cs_ @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO.IsolatedStorage; +using System.Runtime.Serialization; +using System.Threading.Tasks; +using System.Xml; +using Microsoft.Maui.Controls.Internals; + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + internal class Deserializer : IDeserializer + { + const string PropertyStoreFile = "PropertyStore.forms"; + + public Task> DeserializePropertiesAsync() + { + // Deserialize property dictionary to local storage + // Make sure to use Internal + return Task.Run(() => + { + using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) + { + if (!store.FileExists(PropertyStoreFile)) + return null; + + using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)) + using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max)) + { + if (stream.Length == 0) + return null; + + try + { + var dcs = new DataContractSerializer(typeof(Dictionary)); + return (IDictionary)dcs.ReadObject(reader); + } + catch (Exception e) + { + Debug.WriteLine("Could not deserialize properties: " + e.Message); + Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while reading Application properties: {e}"); + } + } + + } + + return null; + }); + } + + public Task SerializePropertiesAsync(IDictionary properties) + { + properties = new Dictionary(properties); + // Serialize property dictionary to local storage + // Make sure to use Internal + return Task.Run(() => + { + using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) + { + // No need to write 0 properties if no file exists + if (properties.Count == 0 && !store.FileExists(PropertyStoreFile)) + { + return; + } + using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile + ".tmp", System.IO.FileMode.OpenOrCreate)) + using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(stream)) + { + try + { + var dcs = new DataContractSerializer(typeof(Dictionary)); + dcs.WriteObject(writer, properties); + writer.Flush(); + } + catch (Exception e) + { + Debug.WriteLine("Could not serialize properties: " + e.Message); + Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while writing Application properties: {e}"); + return; + } + } + + try + { + if (store.FileExists(PropertyStoreFile)) + store.DeleteFile(PropertyStoreFile); + store.MoveFile(PropertyStoreFile + ".tmp", PropertyStoreFile); + } + catch (Exception e) + { + Debug.WriteLine("Could not move new serialized property file over old: " + e.Message); + Log.Warning("Microsoft.Maui.Controls.Compatibility PropertyStore", $"Exception while writing Application properties: {e}"); + } + } + }); + } + } +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs_ b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs_ new file mode 100644 index 000000000000..ec7f37c21398 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/GtkPlatformServices.cs_ @@ -0,0 +1,114 @@ +using System; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Gtk; +using Microsoft.Maui.Controls.Internals; +using Microsoft.Maui.Graphics; +using Action = System.Action; + +namespace Microsoft.Maui.Controls.Compatibility +{ + + public class GtkPlatformServices : IPlatformServices + { + + public bool IsInvokeRequired => Thread.CurrentThread.IsBackground; + + public void BeginInvokeOnMainThread(Action action) + { + MauiGtkApplication.Invoke(action); + } + public Assembly[] GetAssemblies() + { + return AppDomain.CurrentDomain.GetAssemblies(); + } + + public string GetHash(string input) + { + return Internals.Crc64.GetHash(input); + } + + public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSizes) + { + switch (size) + { + case NamedSize.Default: + return 11; + case NamedSize.Micro: + case NamedSize.Caption: + return 12; + case NamedSize.Medium: + return 17; + case NamedSize.Large: + return 22; + case NamedSize.Small: + case NamedSize.Body: + return 14; + case NamedSize.Header: + return 46; + case NamedSize.Subtitle: + return 20; + case NamedSize.Title: + return 24; + default: + throw new ArgumentOutOfRangeException(nameof(size)); + } + } + + public Color GetNamedColor(string name) + { + throw new NotImplementedException(); + } + + public OSAppTheme RequestedTheme { get; set; } + + public async Task GetStreamAsync(Uri uri, CancellationToken cancellationToken) + + { + using var client = new System.Net.Http.HttpClient(); + + // Do not remove this await otherwise the client will dispose before + // the stream even starts + var result = await StreamWrapper.GetStreamAsync(uri, cancellationToken, client).ConfigureAwait(false); + + return result; + + } + + public void OpenUriAction(Uri uri) + { + throw new NotImplementedException(); + } + + public void StartTimer(TimeSpan interval, Func callback) + { + GLib.Timeout.Add((uint)interval.TotalMilliseconds, () => + { + var result = callback(); + + return result; + }); + } + + public string RuntimePlatform => Device.GTK; + + public void QuitApplication() + { + ((GLib.Application)MauiGtkApplication.CurrentGtkApplication).Quit(); + } + + public SizeRequest GetNativeSize(VisualElement view, double widthConstraint, double heightConstraint) + { + if (view.Handler?.NativeView is Widget w) + { + return view.Handler.GetDesiredSize(widthConstraint, heightConstraint); + } + + return new SizeRequest(); + } + + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs b/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs new file mode 100644 index 000000000000..f604adc22588 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs @@ -0,0 +1,42 @@ +using System; +using Microsoft.Maui.Controls.Platform; +using Gtk; + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + + [System.Obsolete] + public sealed class DefaultRenderer : IVisualElementRenderer + { + + public void Dispose() + { + throw new NotImplementedException(); + } + + public VisualElement Element { get; set; } + + public Widget NativeView { get; set; } + + public event EventHandler ElementChanged; + + public void SetElement(VisualElement element) + { + ElementChanged?.Invoke(this, new VisualElementChangedEventArgs(Element, element)); + + Element = element; + } + + public SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint) + { + throw new NotImplementedException(); + } + + public void UpdateLayout() + { + throw new NotImplementedException(); + } + + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Renderers/IVisualElementRenderer.cs b/src/Compatibility/Core/src/Gtk/Renderers/IVisualElementRenderer.cs new file mode 100644 index 000000000000..47ec87b62c27 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/Renderers/IVisualElementRenderer.cs @@ -0,0 +1,43 @@ +using System; +using Gtk; +using Microsoft.Maui.Controls.Platform; + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + /// + /// Base interface for VisualElement renderer. + /// + public interface IVisualElementRenderer : IRegisterable, IDisposable + { + /// + /// Gets the VisualElement associated with this renderer. + /// + /// The VisualElement. + VisualElement Element + { + get; + } + + /// + /// Gets the native view associated with this renderer. + /// + /// The native view. + Widget NativeView + { + get; + } + + event EventHandler ElementChanged; + + /// + /// Sets the VisualElement associated with this renderer. + /// + /// New element. + void SetElement(VisualElement element); + + SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint); + + void UpdateLayout(); + + } +} diff --git a/src/Compatibility/Core/src/RendererToHandlerShim.Gtk.cs b/src/Compatibility/Core/src/RendererToHandlerShim.Gtk.cs new file mode 100644 index 000000000000..70c8109dac38 --- /dev/null +++ b/src/Compatibility/Core/src/RendererToHandlerShim.Gtk.cs @@ -0,0 +1,57 @@ +#pragma warning disable CS0612 // Type or member is obsolete +using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; +#pragma warning disable CS0612 // Type or member is obsolete +using Microsoft.Maui.Graphics; +using Rect = Microsoft.Maui.Graphics.Rect; +using PlatformView = Gtk.Widget; + +namespace Microsoft.Maui.Controls.Compatibility +{ + + public partial class RendererToHandlerShim : IPlatformViewHandler + { + + protected override PlatformView CreatePlatformView() + { + return VisualElementRenderer.NativeView; + } + + IVisualElementRenderer CreateRenderer(IView view) + { + return Internals.Registrar.Registered.GetHandlerForObject(view) ?? new DefaultRenderer(); + } + + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + if (VisualElementRenderer == null) + return Size.Zero; + + widthConstraint = widthConstraint < 0 ? double.PositiveInfinity : widthConstraint; + heightConstraint = heightConstraint < 0 ? double.PositiveInfinity : heightConstraint; + + return VisualElementRenderer.GetDesiredSize(widthConstraint, heightConstraint); + } + + public override void UpdateValue(string property) + { + base.UpdateValue(property); + + if (property == "Frame") + { + PlatformArrange(VisualElementRenderer.Element.Bounds); + } + } + + public override void PlatformArrange(Rect frame) + { + base.PlatformArrange(frame); + VisualElementRenderer.UpdateLayout(); + } + + public void SetRenderer(VisualElement view, IVisualElementRenderer visualElementRenderer) + { + } + + } + +} \ No newline at end of file From 5b539b51e5b67f3d39883bc460ec9fd41437ad22 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 1 Sep 2022 14:54:51 +0200 Subject: [PATCH 183/425] track api changes for https://github.com/dotnet/maui/commit/11069875d2b95df9833c6668c3b0cc26f5b18ac7 --- .../MenuFlyoutHandler.Gtk.cs | 28 ++++++++ .../ScrollView/ScrollViewHandler.Gtk.cs | 2 +- .../src/Platform/Gtk/ImageViewExtensions.cs | 71 ++++++++++++++++--- .../src/Platform/Gtk/MauiContextExtensions.cs | 11 +++ src/Core/src/Platform/Gtk/ViewExtensions.cs | 5 +- src/Essentials/src/Essentials.csproj | 2 +- 6 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 src/Core/src/Handlers/MenuFlyoutHandler/MenuFlyoutHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/MauiContextExtensions.cs diff --git a/src/Core/src/Handlers/MenuFlyoutHandler/MenuFlyoutHandler.Gtk.cs b/src/Core/src/Handlers/MenuFlyoutHandler/MenuFlyoutHandler.Gtk.cs new file mode 100644 index 000000000000..4dd79521bcc4 --- /dev/null +++ b/src/Core/src/Handlers/MenuFlyoutHandler/MenuFlyoutHandler.Gtk.cs @@ -0,0 +1,28 @@ +using System; + +namespace Microsoft.Maui.Handlers +{ + public partial class MenuFlyoutHandler : ElementHandler, IMenuFlyoutHandler + { + protected override object CreatePlatformElement() + { + throw new NotImplementedException(); + } + + public void Add(IMenuElement view) + { + } + + public void Remove(IMenuElement view) + { + } + + public void Clear() + { + } + + public void Insert(int index, IMenuElement view) + { + } + } +} diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index bf37203e48e2..a8ffd9dcfc9e 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -224,7 +224,7 @@ public static void MapRequestScrollTo(IScrollViewHandler handler, IScrollView sc nativeView.Vadjustment.Value = request.VerticalOffset; if (nativeView.HScrollbar?.Visible ?? false) - nativeView.Hadjustment.Value = request.HoriztonalOffset; + nativeView.Hadjustment.Value = request.HorizontalOffset; } } diff --git a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs index 41285ec351c1..b268060a18f5 100644 --- a/src/Core/src/Platform/Gtk/ImageViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ImageViewExtensions.cs @@ -42,28 +42,81 @@ public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSour } - public static async Task?> UpdateImageSourceAsync(this IImageSourcePart? image, float scale, IImageSourceServiceProvider provider, Action onResult, CancellationToken cancellationToken = default) + public static async Task?> UpdateSourceAsync(this IImageSourcePart? part, + Gtk.Image? image, IImageSourceServiceProvider provider, Action onResult, CancellationToken cancellationToken = default) { - if (image == null) + if (part == null) return null; - image.UpdateIsLoading(false); + part.UpdateIsLoading(false); - var imageSource = image.Source; + var imageSource = part.Source; if (imageSource == null) return null; - var events = image as IImageSourcePartEvents; + part.UpdateIsLoading(true); - image.UpdateIsLoading(true); + try + { + var service = provider.GetRequiredImageSourceService(imageSource); + var result = await service.GetImageAsync(imageSource, 1, cancellationToken); + var pixbuf = result?.Value; + var applied = !cancellationToken.IsCancellationRequested && imageSource == part.Source; + + // only set the image if we are still on the same one + if (applied) + { + onResult(pixbuf); + + } + + return result; + } + catch (OperationCanceledException) + { + // no-op + + } +#pragma warning disable CS0168 + catch (Exception ex) +#pragma warning restore CS0168 + { } + finally + { + // only mark as finished if we are still working on the same image + if (imageSource == part.Source) + { + part.UpdateIsLoading(false); + } + } + + return null; + } + + // TODO: merge with UpdateSourceAsync + public static async Task?> UpdateImageSourceAsync(this IImageSourcePart? part, float scale, IImageSourceServiceProvider provider, Action onResult, CancellationToken cancellationToken = default) + { + if (part == null) + return null; + + part.UpdateIsLoading(false); + + var imageSource = part.Source; + + if (imageSource == null) + return null; + + var events = part as IImageSourcePartEvents; + + part.UpdateIsLoading(true); try { var service = provider.GetRequiredImageSourceService(imageSource); var result = await service.GetImageAsync(imageSource, scale, cancellationToken); var pixbuf = result?.Value; - var applied = !cancellationToken.IsCancellationRequested && imageSource == image.Source; + var applied = !cancellationToken.IsCancellationRequested && imageSource == part.Source; // only set the image if we are still on the same one if (applied) @@ -89,9 +142,9 @@ public static void UpdateIsAnimationPlaying(this ImageView imageView, IImageSour finally { // only mark as finished if we are still working on the same image - if (imageSource == image.Source) + if (imageSource == part.Source) { - image.UpdateIsLoading(false); + part.UpdateIsLoading(false); } } diff --git a/src/Core/src/Platform/Gtk/MauiContextExtensions.cs b/src/Core/src/Platform/Gtk/MauiContextExtensions.cs new file mode 100644 index 000000000000..7491f3464ac0 --- /dev/null +++ b/src/Core/src/Platform/Gtk/MauiContextExtensions.cs @@ -0,0 +1,11 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.Maui.Platform; + +internal static partial class MauiContextExtensions +{ + + public static Gtk.Window GetPlatformWindow(this IMauiContext mauiContext) => + mauiContext.Services.GetRequiredService(); + +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 3241bf290629..f11baabbee23 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -212,7 +212,10 @@ public static void Focus(this Widget? platformView, FocusRequest request) { } public static void Unfocus(this Widget? platformView, IView view) { } - public static void UpdateInputTransparent(this Widget? nativeView, IViewHandler handler, IView view) { } + public static void UpdateInputTransparent(this Widget? platformView, IViewHandler handler, IView view) { } + + public static void UpdateToolTip(this Widget? platformView, ToolTip? tooltip) + { } [MissingMapper] internal static IDisposable OnLoaded(this Widget? platformView, Action action) diff --git a/src/Essentials/src/Essentials.csproj b/src/Essentials/src/Essentials.csproj index fa77d283eca2..4e136e2501a2 100644 --- a/src/Essentials/src/Essentials.csproj +++ b/src/Essentials/src/Essentials.csproj @@ -70,5 +70,5 @@ - + From eb0b471b91ac2b46e8b3b97ab18b0694fc67d8e8 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 6 Sep 2022 00:50:30 +0200 Subject: [PATCH 184/425] [Controls.Core.Gtk] stub VisualElementRenderer --- .../Handlers/Gtk/ViewRenderer.cs | 58 ++++++++++++++ .../Handlers/Gtk/VisualElementRenderer.cs | 17 ++++ .../Handlers/VisualElementRenderer.cs | 4 +- src/Core/src/Handlers/IViewHandler.Gtk.cs | 3 + .../src/Handlers/ViewHandlerExtensions.Gtk.cs | 78 +++++++++++++++++++ 5 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 src/Controls/src/Core/Compatibility/Handlers/Gtk/ViewRenderer.cs create mode 100644 src/Controls/src/Core/Compatibility/Handlers/Gtk/VisualElementRenderer.cs create mode 100644 src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs diff --git a/src/Controls/src/Core/Compatibility/Handlers/Gtk/ViewRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/Gtk/ViewRenderer.cs new file mode 100644 index 000000000000..cb920b47d64c --- /dev/null +++ b/src/Controls/src/Core/Compatibility/Handlers/Gtk/ViewRenderer.cs @@ -0,0 +1,58 @@ +#nullable enable +using PlatformView = Gtk.Widget; + +namespace Microsoft.Maui.Controls.Handlers.Compatibility +{ + public abstract partial class ViewRenderer : ViewRenderer + { + protected ViewRenderer() : base() + { + } + } + + public abstract partial class ViewRenderer : VisualElementRenderer, IPlatformViewHandler + where TElement : View, IView + where TPlatformView : PlatformView + { +#pragma warning disable CS0649 + TPlatformView? _nativeView; +#pragma warning restore CS0649 + + public TPlatformView? Control + { + get + { + var value = ((IElementHandler)this).PlatformView as TPlatformView; + if (value != this && value != null) + return value; + + return _nativeView; + } + } + + object? IElementHandler.PlatformView => (_nativeView as object) ?? this; + + public ViewRenderer() : this(VisualElementRendererMapper, VisualElementRendererCommandMapper) + { + + } + + internal ViewRenderer(IPropertyMapper mapper, CommandMapper? commandMapper = null) + : base(mapper, commandMapper) + { + } + + public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint) + { + return + new SizeRequest(this.GetDesiredSizeFromHandler(widthConstraint, heightConstraint), + MinimumSize()); + } + + protected virtual TPlatformView CreateNativeControl() + { + return default(TPlatformView)!; + } + + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Compatibility/Handlers/Gtk/VisualElementRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/Gtk/VisualElementRenderer.cs new file mode 100644 index 000000000000..33919e394d8a --- /dev/null +++ b/src/Controls/src/Core/Compatibility/Handlers/Gtk/VisualElementRenderer.cs @@ -0,0 +1,17 @@ +#nullable enable +using System; +using System.ComponentModel; +using Microsoft.Maui.Controls.Platform; + +namespace Microsoft.Maui.Controls.Handlers.Compatibility +{ + + public abstract partial class VisualElementRenderer : Gtk.Widget, IPlatformViewHandler, IElementHandler + where TElement : Element, IView + { + + object? IElementHandler.PlatformView => this; + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Compatibility/Handlers/VisualElementRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/VisualElementRenderer.cs index 789187f086fb..15709941e350 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/VisualElementRenderer.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/VisualElementRenderer.cs @@ -1,5 +1,5 @@ #nullable enable -#if WINDOWS || ANDROID || IOS || TIZEN +#if WINDOWS || ANDROID || IOS || TIZEN || GTK using System; using System.Collections.Generic; @@ -15,6 +15,8 @@ using PlatformView = UIKit.UIView; #elif TIZEN using PlatformView = Tizen.NUI.BaseComponents.View; +#elif GTK +using PlatformView = Gtk.Widget; #endif namespace Microsoft.Maui.Controls.Handlers.Compatibility diff --git a/src/Core/src/Handlers/IViewHandler.Gtk.cs b/src/Core/src/Handlers/IViewHandler.Gtk.cs index eea738aabf26..4e265560585b 100644 --- a/src/Core/src/Handlers/IViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/IViewHandler.Gtk.cs @@ -3,5 +3,8 @@ public interface IPlatformViewHandler : IViewHandler { new Gtk.Widget? PlatformView { get; } + + new Gtk.Widget? ContainerView { get; } + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs new file mode 100644 index 000000000000..893eb7e1e91e --- /dev/null +++ b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs @@ -0,0 +1,78 @@ +using System; +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui +{ + + internal static partial class ViewHandlerExtensions + { + + internal static Size LayoutVirtualView( + this IPlatformViewHandler viewHandler, Rect frame, + Func? arrangeFunc = null) + { + var virtualView = viewHandler.VirtualView; + var platformView = viewHandler.PlatformView; + + if (virtualView == null || platformView == null) + { + return Size.Zero; + } + + arrangeFunc ??= virtualView.Arrange; + + return arrangeFunc(frame); + } + + internal static Size MeasureVirtualView( + this IPlatformViewHandler viewHandler, + double widthConstraint, + double heightConstraint, + Func? measureFunc = null) + { + var virtualView = viewHandler.VirtualView; + var platformView = viewHandler.PlatformView; + + if (virtualView == null || platformView == null) + { + return Size.Zero; + } + + measureFunc ??= virtualView.Measure; + var measure = measureFunc(widthConstraint, heightConstraint); + + return measure; + } + + internal static Size GetDesiredSizeFromHandler(this IViewHandler viewHandler, double widthConstraint, double heightConstraint) + { + var platformView = viewHandler.ToPlatform(); + var virtualView = viewHandler.VirtualView; + + if (platformView == null || virtualView == null) + { + return virtualView == null || double.IsNaN(virtualView.Width) || double.IsNaN(virtualView.Height) ? Size.Zero : new Size(virtualView.Width, virtualView.Height); + } + + throw new NotImplementedException(); + } + + internal static void PlatformArrangeHandler(this IViewHandler viewHandler, Rect frame) + { + var platformView = viewHandler.ToPlatform(); + + if (platformView == null) + return; + + if (frame.Width < 0 || frame.Height < 0) + { + // This is just some initial Forms value nonsense, nothing is actually laying out yet + return; + } + + viewHandler.Invoke(nameof(IView.Frame), frame); + } + + } + +} \ No newline at end of file From 691e5b6254f2d43075116a7461a4c12e0cc1f0f4 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 6 Sep 2022 00:50:51 +0200 Subject: [PATCH 185/425] [Controls.Compatibility.Core.Gtk] track api changes III --- .../Core/src/Gtk/NativeViewWrapper.cs | 34 +++++++++++++++++++ .../Core/src/Gtk/Renderers/DefaultRenderer.cs | 5 ++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/Compatibility/Core/src/Gtk/NativeViewWrapper.cs diff --git a/src/Compatibility/Core/src/Gtk/NativeViewWrapper.cs b/src/Compatibility/Core/src/Gtk/NativeViewWrapper.cs new file mode 100644 index 000000000000..c7c6eb7f8a02 --- /dev/null +++ b/src/Compatibility/Core/src/Gtk/NativeViewWrapper.cs @@ -0,0 +1,34 @@ +using Gdk; + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk; + +#pragma warning disable CS0618 // Type or member is obsolete +public delegate Size? MeasureDelegate(NativeViewWrapperRenderer renderer, int availableWidth, int availableHeight); + +public class NativeViewWrapper : View +#pragma warning disable CS0618 // Type or member is obsolete +{ + + public NativeViewWrapper(global::Gtk.Widget obj, MeasureDelegate measureDelegate = null) + { + NativeView = obj; + MeasureDelegate = measureDelegate; + + obj.TransferBindablePropertiesToWrapper(this); + } + + public global::Gtk.Widget NativeView + { + get; + private set; + } + + public MeasureDelegate MeasureDelegate { get; } + + protected override void OnBindingContextChanged() + { + NativeView.SetBindingContext(BindingContext); + base.OnBindingContextChanged(); + } + +} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs b/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs index f604adc22588..873b4b67d434 100644 --- a/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs +++ b/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs @@ -6,7 +6,7 @@ namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk { [System.Obsolete] - public sealed class DefaultRenderer : IVisualElementRenderer + public class DefaultRenderer : IVisualElementRenderer { public void Dispose() @@ -39,4 +39,7 @@ public void UpdateLayout() } +#pragma warning disable CS0612 // Type or member is obsolete + public class NativeViewWrapperRenderer : DefaultRenderer { } +#pragma warning restore CS0612 // Type or member is obsolete } \ No newline at end of file From 0ca4b5160df0aad6f501db3cb4673471de82d11a Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 6 Sep 2022 02:06:08 +0200 Subject: [PATCH 186/425] [Controls.Compatibility.Core.Gtk] track api changes IV --- src/Compatibility/Core/src/AppHostBuilderExtensions.cs | 6 ++++++ src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs index 332a25e37886..f2965dd8d8b0 100644 --- a/src/Compatibility/Core/src/AppHostBuilderExtensions.cs +++ b/src/Compatibility/Core/src/AppHostBuilderExtensions.cs @@ -42,6 +42,12 @@ using DefaultRenderer = Microsoft.Maui.Controls.Compatibility.Platform.Tizen.DefaultRenderer; #elif GTK using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; +using OpenGLViewRenderer = Microsoft.Maui.Controls.Compatibility.Platform.Gtk.DefaultRenderer; +using StreamImagesourceHandler = Microsoft.Maui.Controls.Compatibility.Platform.Gtk.DefaultRenderer; +using FileImageSourceHandler = Microsoft.Maui.Controls.Compatibility.Platform.Gtk.DefaultRenderer; +using FontImageSourceHandler = Microsoft.Maui.Controls.Compatibility.Platform.Gtk.DefaultRenderer; +using ImageLoaderSourceHandler = Microsoft.Maui.Controls.Compatibility.Platform.Gtk.DefaultRenderer; +using DefaultRenderer = Microsoft.Maui.Controls.Compatibility.Platform.Gtk.DefaultRenderer; using Microsoft.Maui.Controls.Handlers; #endif diff --git a/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs b/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs index 873b4b67d434..57294ffcb16e 100644 --- a/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs +++ b/src/Compatibility/Core/src/Gtk/Renderers/DefaultRenderer.cs @@ -5,7 +5,6 @@ namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk { - [System.Obsolete] public class DefaultRenderer : IVisualElementRenderer { From bd2e4586b46c59046208b549cd75499f1d0269a6 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 6 Sep 2022 02:09:20 +0200 Subject: [PATCH 187/425] [Controls.Samples.Gtk] track api changes I --- .../samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj | 2 +- .../samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj index eb8910d0a970..9050e249ccef 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj +++ b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj @@ -2,7 +2,7 @@ WinExe - $(MauiPlatforms);$(_MauiDotNetTfm) + $(MauiPlatforms) false Maui diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index a280fe9cefe9..8d96435d7b70 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -811,7 +811,7 @@ View CreateShapes() class TextDrawable : IDrawable { - public void Draw(ICanvas canvas, RectangleF dirtyRect) + public void Draw(ICanvas canvas, RectF dirtyRect) { canvas.SaveState(); canvas.FillColor = Colors.Red; From 424149f0cab1c0edcc9dbe8d70a434d620a07f57 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 7 Sep 2022 15:21:03 +0200 Subject: [PATCH 188/425] [Controls.Maps Gtk] add stubs --- .../maps/src/Handlers/Map/MapHandler.Gtk.cs | 29 +++++ .../MapElement/MapElementHandler.Gtk.cs | 11 ++ .../src/Handlers/MapPin/MapPinHandler.Gtk.cs | 13 ++ .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 1 + .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 115 ++++++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs create mode 100644 src/Core/maps/src/Handlers/MapElement/MapElementHandler.Gtk.cs create mode 100644 src/Core/maps/src/Handlers/MapPin/MapPinHandler.Gtk.cs create mode 100644 src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt diff --git a/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs b/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs new file mode 100644 index 000000000000..2e2057c892dc --- /dev/null +++ b/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs @@ -0,0 +1,29 @@ +using System; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Maps.Handlers +{ + public partial class MapHandler : ViewHandler + { + + protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + + public static void MapMapType(IMapHandler handler, IMap map) => throw new NotImplementedException(); + + public static void MapIsShowingUser(IMapHandler handler, IMap map) => throw new NotImplementedException(); + + public static void MapIsScrollEnabled(IMapHandler handler, IMap map) => throw new NotImplementedException(); + + public static void MapIsTrafficEnabled(IMapHandler handler, IMap map) => throw new NotImplementedException(); + + public static void MapIsZoomEnabled(IMapHandler handler, IMap map) => throw new NotImplementedException(); + + public static void MapMoveToRegion(IMapHandler handler, IMap map, object? arg) => throw new NotImplementedException(); + + public static void MapPins(IMapHandler handler, IMap map) => throw new NotImplementedException(); + + public static void MapElements(IMapHandler handler, IMap map) => throw new NotImplementedException(); + + public void UpdateMapElement(IMapElement element) => throw new NotImplementedException(); + } +} diff --git a/src/Core/maps/src/Handlers/MapElement/MapElementHandler.Gtk.cs b/src/Core/maps/src/Handlers/MapElement/MapElementHandler.Gtk.cs new file mode 100644 index 000000000000..b9fd6d522ce1 --- /dev/null +++ b/src/Core/maps/src/Handlers/MapElement/MapElementHandler.Gtk.cs @@ -0,0 +1,11 @@ +using Microsoft.Maui.Handlers; +namespace Microsoft.Maui.Maps.Handlers +{ + public partial class MapElementHandler : ElementHandler + { + protected override Gtk.Widget CreatePlatformElement() => throw new System.NotImplementedException(); + public static void MapStroke(IMapElementHandler handler, IMapElement mapElement) => throw new System.NotImplementedException(); + public static void MapStrokeThickness(IMapElementHandler handler, IMapElement mapElement) => throw new System.NotImplementedException(); + public static void MapFill(IMapElementHandler handler, IMapElement mapElement) => throw new System.NotImplementedException(); + } +} diff --git a/src/Core/maps/src/Handlers/MapPin/MapPinHandler.Gtk.cs b/src/Core/maps/src/Handlers/MapPin/MapPinHandler.Gtk.cs new file mode 100644 index 000000000000..da2b8bee33aa --- /dev/null +++ b/src/Core/maps/src/Handlers/MapPin/MapPinHandler.Gtk.cs @@ -0,0 +1,13 @@ +using Microsoft.Maui.Handlers; +namespace Microsoft.Maui.Maps.Handlers +{ + public partial class MapPinHandler : ElementHandler + { + protected override Gtk.Widget CreatePlatformElement() => throw new System.NotImplementedException(); + public static void MapLocation(IMapPinHandler handler, IMapPin mapPin) { } + + public static void MapLabel(IMapPinHandler handler, IMapPin mapPin) { } + + public static void MapAddress(IMapPinHandler handler, IMapPin mapPin) { } + } +} diff --git a/src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..ab058de62d44 --- /dev/null +++ b/src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..828a13251025 --- /dev/null +++ b/src/Core/maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1,115 @@ +#nullable enable +Microsoft.Maui.Maps.Distance +Microsoft.Maui.Maps.Distance.Distance() -> void +Microsoft.Maui.Maps.Distance.Distance(double meters) -> void +Microsoft.Maui.Maps.Distance.Equals(Microsoft.Maui.Maps.Distance other) -> bool +Microsoft.Maui.Maps.Distance.Kilometers.get -> double +Microsoft.Maui.Maps.Distance.Meters.get -> double +Microsoft.Maui.Maps.Distance.Miles.get -> double +Microsoft.Maui.Maps.GeographyUtils +Microsoft.Maui.Maps.Handlers.IMapElementHandler +Microsoft.Maui.Maps.Handlers.IMapElementHandler.PlatformView.get -> object! +Microsoft.Maui.Maps.Handlers.IMapElementHandler.VirtualView.get -> Microsoft.Maui.Maps.IMapElement! +Microsoft.Maui.Maps.Handlers.IMapHandler +Microsoft.Maui.Maps.Handlers.IMapHandler.PlatformView.get -> object! +Microsoft.Maui.Maps.Handlers.IMapHandler.UpdateMapElement(Microsoft.Maui.Maps.IMapElement! element) -> void +Microsoft.Maui.Maps.Handlers.IMapHandler.VirtualView.get -> Microsoft.Maui.Maps.IMap! +Microsoft.Maui.Maps.Handlers.IMapPinHandler +Microsoft.Maui.Maps.Handlers.IMapPinHandler.PlatformView.get -> object! +Microsoft.Maui.Maps.Handlers.IMapPinHandler.VirtualView.get -> Microsoft.Maui.Maps.IMapPin! +Microsoft.Maui.Maps.Handlers.MapElementHandler +Microsoft.Maui.Maps.Handlers.MapElementHandler.MapElementHandler() -> void +Microsoft.Maui.Maps.Handlers.MapElementHandler.MapElementHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Maps.Handlers.MapElementHandlerUpdate +Microsoft.Maui.Maps.Handlers.MapElementHandlerUpdate.Index.get -> int +Microsoft.Maui.Maps.Handlers.MapElementHandlerUpdate.Index.init -> void +Microsoft.Maui.Maps.Handlers.MapElementHandlerUpdate.MapElement.get -> Microsoft.Maui.Maps.IMapElement! +Microsoft.Maui.Maps.Handlers.MapElementHandlerUpdate.MapElement.init -> void +Microsoft.Maui.Maps.Handlers.MapElementHandlerUpdate.MapElementHandlerUpdate(int Index, Microsoft.Maui.Maps.IMapElement! MapElement) -> void +Microsoft.Maui.Maps.Handlers.MapHandler +Microsoft.Maui.Maps.Handlers.MapHandler.MapHandler() -> void +Microsoft.Maui.Maps.Handlers.MapHandler.MapHandler(Microsoft.Maui.IPropertyMapper? mapper = null, Microsoft.Maui.CommandMapper? commandMapper = null) -> void +Microsoft.Maui.Maps.Handlers.MapHandler.UpdateMapElement(Microsoft.Maui.Maps.IMapElement! element) -> void +Microsoft.Maui.Maps.Handlers.MapPinHandler +Microsoft.Maui.Maps.Handlers.MapPinHandler.MapPinHandler() -> void +Microsoft.Maui.Maps.Handlers.MapPinHandler.MapPinHandler(Microsoft.Maui.IPropertyMapper? mapper = null) -> void +Microsoft.Maui.Maps.ICircleMapElement +Microsoft.Maui.Maps.ICircleMapElement.Center.get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Maps.ICircleMapElement.Radius.get -> Microsoft.Maui.Maps.Distance +Microsoft.Maui.Maps.IFilledMapElement +Microsoft.Maui.Maps.IFilledMapElement.Fill.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.Maps.IGeoPathMapElement +Microsoft.Maui.Maps.IMap +Microsoft.Maui.Maps.IMap.Clicked(Microsoft.Maui.Devices.Sensors.Location! position) -> void +Microsoft.Maui.Maps.IMap.Elements.get -> System.Collections.Generic.IList! +Microsoft.Maui.Maps.IMap.IsScrollEnabled.get -> bool +Microsoft.Maui.Maps.IMap.IsTrafficEnabled.get -> bool +Microsoft.Maui.Maps.IMap.IsZoomEnabled.get -> bool +Microsoft.Maui.Maps.IMap.IsShowingUser.get -> bool +Microsoft.Maui.Maps.IMap.MapType.get -> Microsoft.Maui.Maps.MapType +Microsoft.Maui.Maps.IMap.MoveToRegion(Microsoft.Maui.Maps.MapSpan! region) -> void +Microsoft.Maui.Maps.IMap.Pins.get -> System.Collections.Generic.IList! +Microsoft.Maui.Maps.IMap.VisibleRegion.get -> Microsoft.Maui.Maps.MapSpan? +Microsoft.Maui.Maps.IMap.VisibleRegion.set -> void +Microsoft.Maui.Maps.IMapElement +Microsoft.Maui.Maps.IMapElement.MapElementId.get -> object? +Microsoft.Maui.Maps.IMapElement.MapElementId.set -> void +Microsoft.Maui.Maps.IMapPin +Microsoft.Maui.Maps.IMapPin.Address.get -> string! +Microsoft.Maui.Maps.IMapPin.Label.get -> string! +Microsoft.Maui.Maps.IMapPin.Location.get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Maps.IMapPin.MarkerId.get -> object? +Microsoft.Maui.Maps.IMapPin.MarkerId.set -> void +Microsoft.Maui.Maps.IMapPin.SendInfoWindowClick() -> bool +Microsoft.Maui.Maps.IMapPin.SendMarkerClick() -> bool +Microsoft.Maui.Maps.MapSpan +Microsoft.Maui.Maps.MapSpan.Center.get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Maps.MapSpan.ClampLatitude(double north, double south) -> Microsoft.Maui.Maps.MapSpan! +Microsoft.Maui.Maps.MapSpan.LatitudeDegrees.get -> double +Microsoft.Maui.Maps.MapSpan.LongitudeDegrees.get -> double +Microsoft.Maui.Maps.MapSpan.MapSpan(Microsoft.Maui.Devices.Sensors.Location! center, double latitudeDegrees, double longitudeDegrees) -> void +Microsoft.Maui.Maps.MapSpan.Radius.get -> Microsoft.Maui.Maps.Distance +Microsoft.Maui.Maps.MapSpan.WithZoom(double zoomFactor) -> Microsoft.Maui.Maps.MapSpan! +Microsoft.Maui.Maps.MapType +Microsoft.Maui.Maps.MapType.Hybrid = 2 -> Microsoft.Maui.Maps.MapType +Microsoft.Maui.Maps.MapType.Satellite = 1 -> Microsoft.Maui.Maps.MapType +Microsoft.Maui.Maps.MapType.Street = 0 -> Microsoft.Maui.Maps.MapType +override Microsoft.Maui.Maps.Distance.Equals(object? obj) -> bool +override Microsoft.Maui.Maps.Distance.GetHashCode() -> int +override Microsoft.Maui.Maps.Handlers.MapElementHandler.CreatePlatformElement() -> Gtk.Widget! +override Microsoft.Maui.Maps.Handlers.MapHandler.CreatePlatformView() -> Gtk.Widget! +override Microsoft.Maui.Maps.Handlers.MapPinHandler.CreatePlatformElement() -> Gtk.Widget! +override Microsoft.Maui.Maps.MapSpan.Equals(object? obj) -> bool +override Microsoft.Maui.Maps.MapSpan.GetHashCode() -> int +override Microsoft.Maui.Maps.MapSpan.ToString() -> string! +static Microsoft.Maui.Maps.Distance.BetweenPositions(Microsoft.Maui.Devices.Sensors.Location! position1, Microsoft.Maui.Devices.Sensors.Location! position2) -> Microsoft.Maui.Maps.Distance +static Microsoft.Maui.Maps.Distance.FromKilometers(double kilometers) -> Microsoft.Maui.Maps.Distance +static Microsoft.Maui.Maps.Distance.FromMeters(double meters) -> Microsoft.Maui.Maps.Distance +static Microsoft.Maui.Maps.Distance.FromMiles(double miles) -> Microsoft.Maui.Maps.Distance +static Microsoft.Maui.Maps.Distance.operator !=(Microsoft.Maui.Maps.Distance left, Microsoft.Maui.Maps.Distance right) -> bool +static Microsoft.Maui.Maps.Distance.operator ==(Microsoft.Maui.Maps.Distance left, Microsoft.Maui.Maps.Distance right) -> bool +static Microsoft.Maui.Maps.GeographyUtils.ToCircumferencePositions(this Microsoft.Maui.Maps.ICircleMapElement! circle) -> System.Collections.Generic.List! +static Microsoft.Maui.Maps.GeographyUtils.ToDegrees(this double radians) -> double +static Microsoft.Maui.Maps.GeographyUtils.ToRadians(this double degrees) -> double +static Microsoft.Maui.Maps.Handlers.MapElementHandler.MapFill(Microsoft.Maui.Maps.Handlers.IMapElementHandler! handler, Microsoft.Maui.Maps.IMapElement! mapElement) -> void +static Microsoft.Maui.Maps.Handlers.MapElementHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Maps.Handlers.MapElementHandler.MapStroke(Microsoft.Maui.Maps.Handlers.IMapElementHandler! handler, Microsoft.Maui.Maps.IMapElement! mapElement) -> void +static Microsoft.Maui.Maps.Handlers.MapElementHandler.MapStrokeThickness(Microsoft.Maui.Maps.Handlers.IMapElementHandler! handler, Microsoft.Maui.Maps.IMapElement! mapElement) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.CommandMapper -> Microsoft.Maui.CommandMapper! +static Microsoft.Maui.Maps.Handlers.MapHandler.MapElements(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.MapIsScrollEnabled(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.MapIsTrafficEnabled(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.MapIsZoomEnabled(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.MapIsShowingUser(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.MapMapType(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.MapMoveToRegion(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map, object? arg) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Maps.Handlers.MapHandler.MapPins(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map) -> void +static Microsoft.Maui.Maps.Handlers.MapHandler.MapUpdateMapElement(Microsoft.Maui.Maps.Handlers.IMapHandler! handler, Microsoft.Maui.Maps.IMap! map, object? arg) -> void +static Microsoft.Maui.Maps.Handlers.MapPinHandler.MapAddress(Microsoft.Maui.Maps.Handlers.IMapPinHandler! handler, Microsoft.Maui.Maps.IMapPin! mapPin) -> void +static Microsoft.Maui.Maps.Handlers.MapPinHandler.MapLabel(Microsoft.Maui.Maps.Handlers.IMapPinHandler! handler, Microsoft.Maui.Maps.IMapPin! mapPin) -> void +static Microsoft.Maui.Maps.Handlers.MapPinHandler.MapLocation(Microsoft.Maui.Maps.Handlers.IMapPinHandler! handler, Microsoft.Maui.Maps.IMapPin! mapPin) -> void +static Microsoft.Maui.Maps.Handlers.MapPinHandler.Mapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Maps.MapSpan.FromCenterAndRadius(Microsoft.Maui.Devices.Sensors.Location! center, Microsoft.Maui.Maps.Distance radius) -> Microsoft.Maui.Maps.MapSpan! +static Microsoft.Maui.Maps.MapSpan.operator !=(Microsoft.Maui.Maps.MapSpan? left, Microsoft.Maui.Maps.MapSpan? right) -> bool +static Microsoft.Maui.Maps.MapSpan.operator ==(Microsoft.Maui.Maps.MapSpan? left, Microsoft.Maui.Maps.MapSpan? right) -> bool \ No newline at end of file From e28af0763a1d745da0bab01936ccc17f5603eb57 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 7 Sep 2022 15:24:45 +0200 Subject: [PATCH 189/425] [BlazorWebView Gtk] add stubs --- .../src/Maui/Gtk/BlazorWebViewHandler.cs | 25 +++++++++ .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 54 +++++++++++++++++++ .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 1 + 3 files changed, 80 insertions(+) create mode 100644 src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.cs create mode 100644 src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt diff --git a/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.cs b/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.cs new file mode 100644 index 000000000000..ef0fe35d36f0 --- /dev/null +++ b/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.cs @@ -0,0 +1,25 @@ +using System; +using Microsoft.Extensions.FileProviders; +using Microsoft.Maui.Handlers; + +namespace Microsoft.AspNetCore.Components.WebView.Maui +{ + /// + /// A for . + /// + public partial class BlazorWebViewHandler : ViewHandler + { + /// + protected override Gtk.Widget CreatePlatformView() => throw new NotSupportedException(); + + /// + public virtual IFileProvider CreateFileProvider(string contentRootDir) => throw new NotSupportedException(); + + private void StartWebViewCoreIfPossible() { } + +#pragma warning disable CS0649 + private WebViewManager? _webviewManager; +#pragma warning restore CS0649 + + } +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..dc96fb6481fe --- /dev/null +++ b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1,54 @@ +#nullable enable +Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializedEventArgs +Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializedEventArgs.BlazorWebViewInitializedEventArgs() -> void +Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializingEventArgs +Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializingEventArgs.BlazorWebViewInitializingEventArgs() -> void +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.BlazorWebView() -> void +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.BlazorWebViewInitialized -> System.EventHandler? +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.BlazorWebViewInitializing -> System.EventHandler? +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.HostPage.get -> string? +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.HostPage.set -> void +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.RootComponents.get -> Microsoft.AspNetCore.Components.WebView.Maui.RootComponentsCollection! +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.UrlLoading -> System.EventHandler? +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.BlazorWebViewHandler() -> void +Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.BlazorWebViewHandler(Microsoft.Maui.PropertyMapper? mapper) -> void +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView.BlazorWebViewInitialized(Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializedEventArgs! args) -> void +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView.BlazorWebViewInitializing(Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializingEventArgs! args) -> void +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView.CreateFileProvider(string! contentRootDir) -> Microsoft.Extensions.FileProviders.IFileProvider! +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView.HostPage.get -> string? +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView.JSComponents.get -> Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore! +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView.RootComponents.get -> Microsoft.AspNetCore.Components.WebView.Maui.RootComponentsCollection! +Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView.UrlLoading(Microsoft.AspNetCore.Components.WebView.UrlLoadingEventArgs! args) -> void +Microsoft.AspNetCore.Components.WebView.Maui.IMauiBlazorWebViewBuilder +Microsoft.AspNetCore.Components.WebView.Maui.IMauiBlazorWebViewBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent.ComponentType.get -> System.Type? +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent.ComponentType.set -> void +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent.Parameters.get -> System.Collections.Generic.IDictionary? +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent.Parameters.set -> void +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent.RootComponent() -> void +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent.Selector.get -> string? +Microsoft.AspNetCore.Components.WebView.Maui.RootComponent.Selector.set -> void +Microsoft.AspNetCore.Components.WebView.Maui.RootComponentsCollection +Microsoft.AspNetCore.Components.WebView.Maui.RootComponentsCollection.JSComponents.get -> Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore! +Microsoft.AspNetCore.Components.WebView.Maui.RootComponentsCollection.RootComponentsCollection(Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore! jsComponents) -> void +Microsoft.AspNetCore.Components.WebView.UrlLoadingEventArgs +Microsoft.AspNetCore.Components.WebView.UrlLoadingEventArgs.Url.get -> System.Uri! +Microsoft.AspNetCore.Components.WebView.UrlLoadingEventArgs.UrlLoadingStrategy.get -> Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy +Microsoft.AspNetCore.Components.WebView.UrlLoadingEventArgs.UrlLoadingStrategy.set -> void +Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy +Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy.CancelLoad = 2 -> Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy +Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy.OpenExternally = 0 -> Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy +Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy.OpenInWebView = 1 -> Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy +Microsoft.Extensions.DependencyInjection.BlazorWebViewServiceCollectionExtensions +override Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.CreatePlatformView() -> Gtk.Widget! +static Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.MapHostPage(Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler! handler, Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView! webView) -> void +static Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.MapRootComponents(Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler! handler, Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView! webView) -> void +static Microsoft.Extensions.DependencyInjection.BlazorWebViewServiceCollectionExtensions.AddBlazorWebViewDeveloperTools(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.BlazorWebViewServiceCollectionExtensions.AddMauiBlazorWebView(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Components.WebView.Maui.IMauiBlazorWebViewBuilder! +static Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.BlazorWebViewMapper -> Microsoft.Maui.PropertyMapper! +virtual Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.CreateFileProvider(string! contentRootDir) -> Microsoft.Extensions.FileProviders.IFileProvider! +virtual Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.CreateFileProvider(string! contentRootDir) -> Microsoft.Extensions.FileProviders.IFileProvider! diff --git a/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..ab058de62d44 --- /dev/null +++ b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable From 1ce2ecdc8afa8646e4ed5d234e0a45a47dcd46ce Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 7 Sep 2022 15:27:08 +0200 Subject: [PATCH 190/425] [Core.Gtk] SemanticExtensions: remove slack --- src/Core/src/Platform/Gtk/SemanticExtensions.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Core/src/Platform/Gtk/SemanticExtensions.cs b/src/Core/src/Platform/Gtk/SemanticExtensions.cs index 13de8a26e2f8..02f95e8e3a55 100644 --- a/src/Core/src/Platform/Gtk/SemanticExtensions.cs +++ b/src/Core/src/Platform/Gtk/SemanticExtensions.cs @@ -1,11 +1,7 @@ namespace Microsoft.Maui { - public static partial class SemanticExtensions_ + public static partial class SemanticExtensions { - /// - /// Force semantic screen reader focus to specified element - /// - /// - public static void SetSemanticFocus(this IView element) { } + } } From 579bd52a79ae4ff0e23ed959483494a8efc2bcf7 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 7 Sep 2022 15:28:03 +0200 Subject: [PATCH 191/425] Controls.Maps.csproj: switch off PublicAPI.targets for the moment --- src/Controls/Maps/src/Controls.Maps.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/Maps/src/Controls.Maps.csproj b/src/Controls/Maps/src/Controls.Maps.csproj index f6de65ac6765..d3e52b343da7 100644 --- a/src/Controls/Maps/src/Controls.Maps.csproj +++ b/src/Controls/Maps/src/Controls.Maps.csproj @@ -17,6 +17,6 @@ - + \ No newline at end of file From 5b17c91df0bfa1b8b6089f429324c0021a5c6557 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 7 Sep 2022 15:28:37 +0200 Subject: [PATCH 192/425] [Controls.Maps Gtk] track api changes II --- .../SimpleSampleApp/SimpleSampleGtkApplication.cs | 1 + .../SimpleSampleApp/SimpleSampleMauiApp.cs | 14 ++------------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs index eb71f87e2c9e..848e42e5d479 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs @@ -2,6 +2,7 @@ using Gtk; using Microsoft.Maui; using Microsoft.Maui.Graphics; +using Microsoft.Maui.Hosting; namespace Maui.SimpleSampleApp { diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs index f6cb8bee9c8b..3e4360901cac 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs @@ -3,11 +3,12 @@ using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Maui; +using Microsoft.Maui.Controls; namespace Maui.SimpleSampleApp { - public class SimpleSampleMauiApp : IApplication + public class SimpleSampleMauiApp : Application { public SimpleSampleMauiApp(IServiceProvider services, ITextService textService) @@ -17,22 +18,11 @@ public SimpleSampleMauiApp(IServiceProvider services, ITextService textService) Debug.WriteLine($"The injected text service had a message: '{textService.GetText()}'"); } - readonly List _windows = new(); - - public IReadOnlyList Windows => _windows.AsReadOnly(); public IServiceProvider Services { get; } - public IWindow CreateWindow(IActivationState activationState) - { - Microsoft.Maui.Controls.Compatibility.Forms.Init(activationState); - - var window = Services.GetRequiredService(); - _windows.Add(window); - return window; - } public void ThemeChanged() { From a3b78f2a0a79402b830cf7f86533920ca935b156 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 7 Sep 2022 16:34:43 +0200 Subject: [PATCH 193/425] [Graphics.Gtk] introduce GtkImageLoadingService --- src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs | 39 +++++++++++++------ .../Gtk/GtkImageLoadingService.cs | 12 ++++++ 2 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/GtkImageLoadingService.cs diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs b/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs index 9a3e3073ee4b..2644df04fda7 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs @@ -5,9 +5,10 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; -public class GtkImage : IImage { - - public GtkImage(Gdk.Pixbuf pix) { +public class GtkImage : IImage +{ + public GtkImage(Gdk.Pixbuf pix) + { _pixbuf = pix; } @@ -16,11 +17,13 @@ public GtkImage(Gdk.Pixbuf pix) { // https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html public Gdk.Pixbuf? NativeImage => _pixbuf; - public void Draw(ICanvas canvas, RectF dirtyRect) { - canvas.DrawImage(this, dirtyRect.Left, dirtyRect.Top, (float) Math.Round(dirtyRect.Width), (float) Math.Round(dirtyRect.Height)); + public void Draw(ICanvas canvas, RectF dirtyRect) + { + canvas.DrawImage(this, dirtyRect.Left, dirtyRect.Top, (float)Math.Round(dirtyRect.Width), (float)Math.Round(dirtyRect.Height)); } - public void Dispose() { + public void Dispose() + { var previousValue = Interlocked.Exchange(ref _pixbuf, null); previousValue?.Dispose(); } @@ -30,25 +33,30 @@ public void Dispose() { public float Height => NativeImage?.Width ?? 0; [GtkMissingImplementation] - public IImage Downsize(float maxWidthOrHeight, bool disposeOriginal = false) { + public IImage Downsize(float maxWidthOrHeight, bool disposeOriginal = false) + { return this; } [GtkMissingImplementation] - public IImage Downsize(float maxWidth, float maxHeight, bool disposeOriginal = false) { + public IImage Downsize(float maxWidth, float maxHeight, bool disposeOriginal = false) + { return this; } [GtkMissingImplementation] - public IImage Resize(float width, float height, ResizeMode resizeMode = ResizeMode.Fit, bool disposeOriginal = false) { + public IImage Resize(float width, float height, ResizeMode resizeMode = ResizeMode.Fit, bool disposeOriginal = false) + { return this; } - public void Save(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) { + public void Save(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) + { NativeImage.SaveToStream(stream, format, quality); } - public async Task SaveAsync(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) { + public async Task SaveAsync(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1) + { await Task.Run(() => NativeImage.SaveToStream(stream, format, quality)); } @@ -60,5 +68,12 @@ public IImage ToImage(int width, int height, float scale = 1f) return context.Image; } - public IImage ToPlatformImage()=> this; + public IImage ToPlatformImage() => this; + + public static IImage FromStream(Stream stream, ImageFormat formatHint) + { + var platformHint = formatHint.ToImageExtension(); + var pix = new Gdk.Pixbuf(stream); + return new GtkImage(pix); + } } \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImageLoadingService.cs b/src/Graphics/src/Graphics.Gtk/Gtk/GtkImageLoadingService.cs new file mode 100644 index 000000000000..a681173d3aff --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/GtkImageLoadingService.cs @@ -0,0 +1,12 @@ +using System.IO; + +namespace Microsoft.Maui.Graphics.Platform.Gtk; + + public class GtkImageLoadingService : IImageLoadingService + { + public IImage FromStream(Stream stream, ImageFormat formatHint = ImageFormat.Png) + { + return GtkImage.FromStream(stream, formatHint); + } + } + From 0be323ad650abf4c9576754537da16ccc1b84741 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 7 Sep 2022 16:35:11 +0200 Subject: [PATCH 194/425] [Controls.Sample.Gtk] track api changes III --- .../Controls.Sample.Gtk.csproj | 3 +- .../SimpleSampleApp/ExamplePage.cs | 381 +++--------------- 2 files changed, 63 insertions(+), 321 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj index 9050e249ccef..c65d3f5535ea 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj +++ b/src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj @@ -2,9 +2,10 @@ WinExe - $(MauiPlatforms) + $(_MauiDotNetTfm)-gtk false Maui + CA1416 diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 8d96435d7b70..65e863a08832 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -6,15 +6,15 @@ using Microsoft.Maui.Controls; using Microsoft.Maui.Controls.Shapes; using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; using Debug = System.Diagnostics.Debug; using IImage = Microsoft.Maui.Graphics.IImage; +using LineBreakMode = Microsoft.Maui.LineBreakMode; namespace Maui.SimpleSampleApp { - public class ExamplePage : BasePage { - readonly IServiceProvider _services; readonly MainPageViewModel _viewModel; @@ -61,36 +61,20 @@ void Fill(Layout l, string m, int count, Color bkCol) } } - var verticalStack1 = new VerticalStackLayout() - { - Spacing = 5, - BackgroundColor = Colors.WhiteSmoke, - }; + var verticalStack1 = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.WhiteSmoke, }; - var verticalStack2 = new VerticalStackLayout() - { - Spacing = 5, - BackgroundColor = Colors.LightYellow, - }; + var verticalStack2 = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.LightYellow, }; Fill(verticalStack2, nameof(verticalStack2), 4, Colors.Coral); - var horizontalStack1 = new HorizontalStackLayout() - { - Spacing = 5, - BackgroundColor = Colors.NavajoWhite, - }; + var horizontalStack1 = new HorizontalStackLayout() { Spacing = 5, BackgroundColor = Colors.NavajoWhite, }; Fill(horizontalStack1, nameof(horizontalStack1), 4, Colors.Aquamarine); verticalStack1.Add(verticalStack2); verticalStack1.Add(horizontalStack1); - var verticalStack3 = new VerticalStackLayout() - { - Spacing = 5, - BackgroundColor = Colors.Lime, - }; + var verticalStack3 = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.Lime, }; verticalStack3.Add(new Label { @@ -104,7 +88,6 @@ void Fill(Layout l, string m, int count, Color bkCol) verticalStack1.Add(verticalStack3); Content = verticalStack1; - } void SetupMauiLayoutDrawables() @@ -114,18 +97,9 @@ void SetupMauiLayoutDrawables() void SetupMauiLayoutButtonSpacing() { - var verticalStack = new VerticalStackLayout() - { - Spacing = 5, - BackgroundColor = Colors.WhiteSmoke, - }; + var verticalStack = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.WhiteSmoke, }; - var label = new Label - { - Text = "a label", - HorizontalTextAlignment = TextAlignment.Center, - VerticalTextAlignment = TextAlignment.Center - }; + var label = new Label { Text = "a label", HorizontalTextAlignment = TextAlignment.Center, VerticalTextAlignment = TextAlignment.Center }; verticalStack.Add(label); @@ -176,10 +150,7 @@ void SetupMauiLayoutButtonSpacing() var button2 = new Button { - Padding = new Thickness(10), - Text = "Change the button!", - BackgroundColor = Colors.Green, - TextColor = Colors.Yellow, + Padding = new Thickness(10), Text = "Change the button!", BackgroundColor = Colors.Green, TextColor = Colors.Yellow, }; button2.Clicked += (sender, args) => @@ -194,11 +165,7 @@ void SetupMauiLayoutButtonSpacing() button.Clicked += (s, e) => activityIndicator.IsRunning = !activityIndicator.IsRunning; verticalStack.Add(activityIndicator); - var editor = new Editor - { - Placeholder = "write something longer", - Margin = new Thickness(5), - }; + var editor = new Editor { Placeholder = "write something longer", Margin = new Thickness(5), }; button.Clicked += (s, e) => { @@ -212,145 +179,67 @@ void SetupMauiLayoutButtonSpacing() void SetupMauiLayout() { + var verticalStack = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.AntiqueWhite }; - var verticalStack = new VerticalStackLayout() - { - Spacing = 5, - BackgroundColor = Colors.AntiqueWhite - }; - - var horizontalStack = new HorizontalStackLayout() - { - Spacing = 2, - BackgroundColor = Colors.CornflowerBlue - }; + var horizontalStack = new HorizontalStackLayout() { Spacing = 2, BackgroundColor = Colors.CornflowerBlue }; verticalStack.Add(CreateSampleGrid()); - verticalStack.Add(new Label - { - Text = " ", - Padding = new Thickness(10) - }); + verticalStack.Add(new Label { Text = " ", Padding = new Thickness(10) }); - var label = new Label - { - Text = "End-aligned text", - BackgroundColor = Colors.Fuchsia, - HorizontalTextAlignment = TextAlignment.End, - Margin = new Thickness(15, 10, 20, 15) - }; + var label = new Label { Text = "End-aligned text", BackgroundColor = Colors.Fuchsia, HorizontalTextAlignment = TextAlignment.End, Margin = new Thickness(15, 10, 20, 15) }; SemanticProperties.SetHint(label, "Hint Text"); SemanticProperties.SetDescription(label, "Description Text"); verticalStack.Add(label); - verticalStack.Add(new Label - { - Text = "This should be BIG text!", - FontSize = 24, - HorizontalOptions = LayoutOptions.End - }); + verticalStack.Add(new Label { Text = "This should be BIG text!", FontSize = 24, HorizontalOptions = LayoutOptions.End }); SemanticProperties.SetHeadingLevel((BindableObject)verticalStack.Children.Last(), SemanticHeadingLevel.Level1); - verticalStack.Add(new Label - { - Text = "This should be BOLD text!", - FontAttributes = FontAttributes.Bold, - HorizontalOptions = LayoutOptions.Center - }); + verticalStack.Add(new Label { Text = "This should be BOLD text!", FontAttributes = FontAttributes.Bold, HorizontalOptions = LayoutOptions.Center }); - verticalStack.Add(new Label - { - Text = "This should be a CUSTOM font!", - FontFamily = "Dokdo" - }); + verticalStack.Add(new Label { Text = "This should be a CUSTOM font!", FontFamily = "Dokdo" }); - verticalStack.Add(new Label - { - Text = "This should have padding", - Padding = new Thickness(40), - BackgroundColor = Colors.LightBlue - }); + verticalStack.Add(new Label { Text = "This should have padding", Padding = new Thickness(40), BackgroundColor = Colors.LightBlue }); verticalStack.Add(new Label { Text = LoremIpsum }); - verticalStack.Add(new Label - { - Text = LoremIpsum, - MaxLines = 2 - }); + verticalStack.Add(new Label { Text = LoremIpsum, MaxLines = 2 }); - verticalStack.Add(new Label - { - Text = LoremIpsum, - LineBreakMode = LineBreakMode.TailTruncation - }); + verticalStack.Add(new Label { Text = LoremIpsum, LineBreakMode = LineBreakMode.TailTruncation }); - verticalStack.Add(new Label - { - Text = LoremIpsum, - MaxLines = 2, - LineBreakMode = LineBreakMode.TailTruncation, - WidthRequest = 200 - }); + verticalStack.Add(new Label { Text = LoremIpsum, MaxLines = 2, LineBreakMode = LineBreakMode.TailTruncation, WidthRequest = 200 }); - verticalStack.Add(new Label - { - Text = "This should have five times the line height! " + LoremIpsum, - LineHeight = 5, - MaxLines = 2 - }); + verticalStack.Add(new Label { Text = "This should have five times the line height! " + LoremIpsum, LineHeight = 5, MaxLines = 2 }); SemanticProperties.SetHeadingLevel((BindableObject)verticalStack.Children.Last(), SemanticHeadingLevel.Level2); - var visibleClearButtonEntry = new Entry() - { - ClearButtonVisibility = ClearButtonVisibility.WhileEditing, - Placeholder = "This Entry will show clear button if has input." - }; + var visibleClearButtonEntry = new Entry() { ClearButtonVisibility = ClearButtonVisibility.WhileEditing, Placeholder = "This Entry will show clear button if has input." }; - var hiddenClearButtonEntry = new Entry() - { - ClearButtonVisibility = ClearButtonVisibility.Never, - Placeholder = "This Entry will not..." - }; + var hiddenClearButtonEntry = new Entry() { ClearButtonVisibility = ClearButtonVisibility.Never, Placeholder = "This Entry will not..." }; verticalStack.Add(visibleClearButtonEntry); verticalStack.Add(hiddenClearButtonEntry); - var paddingButton = new Button - { - Padding = new Thickness(40), - Text = "This button has a padding!!", - BackgroundColor = Colors.Purple, - }; + var paddingButton = new Button { Padding = new Thickness(40), Text = "This button has a padding!!", BackgroundColor = Colors.Purple, }; verticalStack.Add(paddingButton); - var underlineLabel = new Label - { - Text = (TextDecorations.Underline | TextDecorations.Strikethrough).ToString(), - TextDecorations = TextDecorations.Underline | TextDecorations.Strikethrough - }; + var underlineLabel = new Label { Text = (TextDecorations.Underline | TextDecorations.Strikethrough).ToString(), TextDecorations = TextDecorations.Underline | TextDecorations.Strikethrough }; verticalStack.Add(underlineLabel); IImage image = default; using (var stream = File.OpenRead("dotnet_bot.png")) { - image = GraphicsPlatform.CurrentService.LoadImageFromStream(stream); + image = new GtkImageLoadingService().FromStream(stream); } var paint = image.AsPaint(); - var labelImage = new Label - { - Text = "this has backgroudImage", - Background = paint - }; + var labelImage = new Label { Text = "this has backgroudImage", Background = paint }; // Background is null cause there is no ImageBrush if (labelImage.Background != null) @@ -358,31 +247,16 @@ void SetupMauiLayout() var labelG = new Label { - Text = "this has gradient", - Background = new RadialGradientBrush(new GradientStopCollection - { - new(Colors.Aqua, 0), - new(Colors.Green, 10), - }), - Padding = new Thickness(30), - Margin = new Thickness(10), + Text = "this has gradient", Background = new RadialGradientBrush(new GradientStopCollection { new(Colors.Aqua, 0), new(Colors.Green, 10), }), Padding = new Thickness(30), Margin = new Thickness(10), }; verticalStack.Add(labelG); verticalStack.Add(new ActivityIndicator()); - verticalStack.Add(new ActivityIndicator - { - Color = Colors.Red, - IsRunning = true - }); + verticalStack.Add(new ActivityIndicator { Color = Colors.Red, IsRunning = true }); - var button = new Button() - { - Text = _viewModel.Text, - WidthRequest = 200 - }; + var button = new Button() { Text = _viewModel.Text, WidthRequest = 200 }; // button.Clicked += async (sender, e) => // { @@ -395,29 +269,17 @@ void SetupMauiLayout() var button2 = new Button() { - TextColor = Colors.Green, - Text = "Hello I'm a button", - BackgroundColor = Colors.Purple, - Margin = new Thickness(12), + TextColor = Colors.Green, Text = "Hello I'm a button", BackgroundColor = Colors.Purple, Margin = new Thickness(12), }; horizontalStack.Add(button); horizontalStack.Add(button2); - horizontalStack.Add(new Label - { - Text = "And these buttons are in a HorizontalStackLayout", - VerticalOptions = LayoutOptions.Center, - HorizontalTextAlignment = TextAlignment.End - }); + horizontalStack.Add(new Label { Text = "And these buttons are in a HorizontalStackLayout", VerticalOptions = LayoutOptions.Center, HorizontalTextAlignment = TextAlignment.End }); verticalStack.Add(horizontalStack); - verticalStack.Add(new Button - { - CharacterSpacing = 4, - Text = "CharacterSpacing 4" - }); + verticalStack.Add(new Button { CharacterSpacing = 4, Text = "CharacterSpacing 4" }); var checkbox = new CheckBox(); @@ -429,11 +291,7 @@ void SetupMauiLayout() verticalStack.Add(checkbox); verticalStack.Add(new CheckBox { BackgroundColor = Colors.LightPink }); - verticalStack.Add(new CheckBox - { - IsChecked = true, - Color = Colors.Aquamarine - }); + verticalStack.Add(new CheckBox { IsChecked = true, Color = Colors.Aquamarine }); if (true) #pragma warning disable 162 @@ -442,30 +300,13 @@ void SetupMauiLayout() verticalStack.Add(new Editor { Placeholder = "This is an editor placeholder." }); verticalStack.Add(new Editor { Text = "Editor" }); - verticalStack.Add(new Editor - { - Text = "Lorem ipsum dolor sit amet", - MaxLength = 10 - }); + verticalStack.Add(new Editor { Text = "Lorem ipsum dolor sit amet", MaxLength = 10 }); - verticalStack.Add(new Editor - { - Text = "Predictive Text Off", - IsTextPredictionEnabled = false - }); + verticalStack.Add(new Editor { Text = "Predictive Text Off", IsTextPredictionEnabled = false }); - verticalStack.Add(new Editor - { - Text = "Lorem ipsum dolor sit amet", - FontSize = 10, - FontFamily = "dokdo_regular" - }); + verticalStack.Add(new Editor { Text = "Lorem ipsum dolor sit amet", FontSize = 10, FontFamily = "dokdo_regular" }); - verticalStack.Add(new Editor - { - Text = "ReadOnly Editor", - IsReadOnly = true - }); + verticalStack.Add(new Editor { Text = "ReadOnly Editor", IsReadOnly = true }); } #pragma warning restore 162 @@ -478,41 +319,18 @@ void SetupMauiLayout() verticalStack.Add(entry); - verticalStack.Add(new Entry - { - Text = "Entry", - TextColor = Colors.DarkRed, - FontFamily = "Dokdo", - MaxLength = -1 - }); + verticalStack.Add(new Entry { Text = "Entry", TextColor = Colors.DarkRed, FontFamily = "Dokdo", MaxLength = -1 }); - verticalStack.Add(new Entry - { - IsPassword = true, - TextColor = Colors.Black, - Placeholder = "Pasword Entry" - }); + verticalStack.Add(new Entry { IsPassword = true, TextColor = Colors.Black, Placeholder = "Pasword Entry" }); verticalStack.Add(new Entry { IsTextPredictionEnabled = false }); verticalStack.Add(new Entry { Placeholder = "This should be placeholder text" }); - verticalStack.Add(new Entry - { - Text = "This should be read only property", - IsReadOnly = true - }); + verticalStack.Add(new Entry { Text = "This should be read only property", IsReadOnly = true }); - verticalStack.Add(new Entry - { - MaxLength = 5, - Placeholder = "MaxLength text" - }); + verticalStack.Add(new Entry { MaxLength = 5, Placeholder = "MaxLength text" }); - var spacingEntry = new Entry - { - Text = "This should be text with character spacing", - CharacterSpacing = 10 - }; + var spacingEntry = new Entry { Text = "This should be text with character spacing", CharacterSpacing = 10 }; verticalStack.Add(spacingEntry); @@ -534,45 +352,21 @@ void SetupMauiLayout() spacingEntry.CharacterSpacing = spacingEntry.CharacterSpacing == 10 ? 5 : 10; }; - verticalStack.Add(new Entry - { - Keyboard = Keyboard.Numeric, - Placeholder = "Numeric Entry" - }); + verticalStack.Add(new Entry { Keyboard = Keyboard.Numeric, Placeholder = "Numeric Entry" }); - verticalStack.Add(new Entry - { - Keyboard = Keyboard.Email, - Placeholder = "Email Entry" - }); + verticalStack.Add(new Entry { Keyboard = Keyboard.Email, Placeholder = "Email Entry" }); verticalStack.Add(new ProgressBar { Progress = 0.5 }); - verticalStack.Add(new ProgressBar - { - Progress = 0.5, - BackgroundColor = Colors.LightCoral - }); + verticalStack.Add(new ProgressBar { Progress = 0.5, BackgroundColor = Colors.LightCoral }); - verticalStack.Add(new ProgressBar - { - Progress = 0.5, - ProgressColor = Colors.Purple - }); + verticalStack.Add(new ProgressBar { Progress = 0.5, ProgressColor = Colors.Purple }); - var searchBar = new SearchBar - { - CharacterSpacing = 4, - Text = "A search query" - }; + var searchBar = new SearchBar { CharacterSpacing = 4, Text = "A search query" }; verticalStack.Add(searchBar); - var placeholderSearchBar = new SearchBar - { - Placeholder = "Placeholder", - BackgroundColor = Colors.Plum - }; + var placeholderSearchBar = new SearchBar { Placeholder = "Placeholder", BackgroundColor = Colors.Plum }; verticalStack.Add(placeholderSearchBar); @@ -600,38 +394,20 @@ void SetupMauiLayout() verticalStack.Add(picker); - verticalStack.Add(new Slider - { - ThumbColor = Colors.Aqua, - ThumbImageSource = "rainbow_heart.png" - }); + verticalStack.Add(new Slider { ThumbColor = Colors.Aqua, ThumbImageSource = "rainbow_heart.png" }); verticalStack.Add(new Stepper()); verticalStack.Add(new Stepper { BackgroundColor = Colors.IndianRed }); - verticalStack.Add(new Stepper - { - Minimum = 0, - Maximum = 10, - Value = 5 - }); + verticalStack.Add(new Stepper { Minimum = 0, Maximum = 10, Value = 5 }); verticalStack.Add(new Switch()); verticalStack.Add(new Switch() { OnColor = Colors.Green }); verticalStack.Add(new Switch() { ThumbColor = Colors.Yellow }); - verticalStack.Add(new Switch() - { - OnColor = Colors.Green, - ThumbColor = Colors.Yellow - }); + verticalStack.Add(new Switch() { OnColor = Colors.Green, ThumbColor = Colors.Yellow }); - verticalStack.Add(new GraphicsView - { - Drawable = new TextDrawable(), - HeightRequest = 50, - WidthRequest = 200 - }); + verticalStack.Add(new GraphicsView { Drawable = new TextDrawable(), HeightRequest = 50, WidthRequest = 200 }); verticalStack.Add(new DatePicker()); verticalStack.Add(new DatePicker { CharacterSpacing = 6 }); @@ -639,32 +415,20 @@ void SetupMauiLayout() verticalStack.Add(new TimePicker()); - verticalStack.Add(new TimePicker - { - Time = TimeSpan.FromHours(8), - CharacterSpacing = 6 - }); + verticalStack.Add(new TimePicker { Time = TimeSpan.FromHours(8), CharacterSpacing = 6 }); verticalStack.Add(CreateShapes()); verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); - Content = new ScrollView - { - Content = verticalStack, - Orientation = ScrollOrientation.Both - }; + Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Both }; } public IView View { get => (IView)Content; set => Content = (View)value; } View CreateSampleGrid() { - var layout = new GridLayout() - { - ColumnSpacing = 5, - RowSpacing = 8 - }; + var layout = new Grid() { ColumnSpacing = 5, RowSpacing = 8 }; layout.AddRowDefinition(new RowDefinition() { Height = new GridLength(40) }); layout.AddRowDefinition(new RowDefinition() { Height = GridLength.Auto }); @@ -672,20 +436,11 @@ View CreateSampleGrid() layout.AddColumnDefinition(new ColumnDefinition() { Width = new GridLength(100) }); layout.AddColumnDefinition(new ColumnDefinition() { Width = new GridLength(100) }); - var topLeft = new Label - { - Text = "Top Left", - BackgroundColor = Colors.LightBlue - }; + var topLeft = new Label { Text = "Top Left", BackgroundColor = Colors.LightBlue }; layout.Add(topLeft); - var bottomLeft = new Label - { - Text = "Bottom Left", - BackgroundColor = Colors.Lavender, - VerticalTextAlignment = TextAlignment.End - }; + var bottomLeft = new Label { Text = "Bottom Left", BackgroundColor = Colors.Lavender, VerticalTextAlignment = TextAlignment.End }; layout.Add(bottomLeft); layout.SetRow(bottomLeft, 1); @@ -702,13 +457,7 @@ View CreateSampleGrid() layout.Add(topRight); layout.SetColumn(topRight, 1); - var bottomRight = new Label - { - Text = "Bottom Right", - BackgroundColor = Colors.MediumPurple, - VerticalTextAlignment = TextAlignment.End, - HorizontalTextAlignment = TextAlignment.End - }; + var bottomRight = new Label { Text = "Bottom Right", BackgroundColor = Colors.MediumPurple, VerticalTextAlignment = TextAlignment.End, HorizontalTextAlignment = TextAlignment.End }; layout.Add(bottomRight); layout.SetRow(bottomRight, 1); @@ -781,11 +530,7 @@ View CreateShapes() { RadiusX = 12, RadiusY = 6, - Fill = new LinearGradientBrush(new Microsoft.Maui.Controls.GradientStopCollection - { - new(Colors.Green, 0), - new(Colors.Blue, 1) - }, new Point(0, 0), new Point(1, 0)), + Fill = new LinearGradientBrush(new Microsoft.Maui.Controls.GradientStopCollection { new(Colors.Green, 0), new(Colors.Blue, 1) }, new Point(0, 0), new Point(1, 0)), Stroke = new SolidColorBrush(Colors.Purple), StrokeThickness = 8, StrokeDashArray = new float[] { 2, 2 }, @@ -805,12 +550,10 @@ View CreateShapes() return verticalStack; } - } class TextDrawable : IDrawable { - public void Draw(ICanvas canvas, RectF dirtyRect) { canvas.SaveState(); @@ -821,7 +564,5 @@ public void Draw(ICanvas canvas, RectF dirtyRect) canvas.DrawString("Drawable", 100, 10, HorizontalAlignment.Center); canvas.RestoreState(); } - } - } \ No newline at end of file From 6f4716b24bd784b854805c9597e48aee8180c7d1 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 8 Sep 2022 16:33:48 +0200 Subject: [PATCH 195/425] [Core.Gtk] adjust MauiGtkApplication.cs --- .../Application/Application.Gtk.cs | 6 ++++++ .../src/Core/HandlerImpl/Window/Window.Gtk.cs | 13 ++++++++++++ .../src/Platform/Gtk/MauiGtkApplication.cs | 21 +++++++------------ 3 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 src/Controls/src/Core/HandlerImpl/Application/Application.Gtk.cs create mode 100644 src/Controls/src/Core/HandlerImpl/Window/Window.Gtk.cs diff --git a/src/Controls/src/Core/HandlerImpl/Application/Application.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Application/Application.Gtk.cs new file mode 100644 index 000000000000..261b6771c807 --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Application/Application.Gtk.cs @@ -0,0 +1,6 @@ +namespace Microsoft.Maui.Controls +{ + public partial class Application + { + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/HandlerImpl/Window/Window.Gtk.cs b/src/Controls/src/Core/HandlerImpl/Window/Window.Gtk.cs new file mode 100644 index 000000000000..2deeff454adc --- /dev/null +++ b/src/Controls/src/Core/HandlerImpl/Window/Window.Gtk.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Handlers; + +namespace Microsoft.Maui.Controls +{ + public partial class Window + { + internal Gtk.Window NativeWindow => + (Handler?.PlatformView as Gtk.Window) ?? throw new InvalidOperationException("Window Handler should have a Window set."); + } +} diff --git a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs index ef7c2b65f8d7..bf90ca58374f 100644 --- a/src/Core/src/Platform/Gtk/MauiGtkApplication.cs +++ b/src/Core/src/Platform/Gtk/MauiGtkApplication.cs @@ -7,10 +7,8 @@ namespace Microsoft.Maui { - public abstract class MauiGtkApplication : IPlatformApplication { - protected abstract MauiApp CreateMauiApp(); // https://docs.gtk.org/gio/type_func.Application.id_is_valid.html @@ -44,7 +42,6 @@ public void Run() protected void RegisterLifecycleEvents(Gtk.Application app) { - app.Startup += OnStartup!; app.Shutdown += OnShutdown!; app.Opened += OnOpened; @@ -52,7 +49,6 @@ protected void RegisterLifecycleEvents(Gtk.Application app) app.Activated += OnActivated!; app.WindowRemoved += OnWindowRemoved; app.CommandLine += OnCommandLine; - } protected void OnStartup(object sender, EventArgs args) @@ -77,7 +73,6 @@ protected void OnShutdown(object sender, EventArgs args) Services?.InvokeLifecycleEvents(del => del(CurrentGtkApplication, args)); Dispatcher.DispatchPendingEvents(); - } protected void OnCommandLine(object o, GLib.CommandLineArgs args) @@ -99,17 +94,19 @@ protected void StartupLauch(object sender, EventArgs args) { IPlatformApplication.Current = this; - var startup = CreateMauiApp(); + var mauiApp = CreateMauiApp(); - Services = startup.Services; + Services = mauiApp.Services; Services.InvokeLifecycleEvents(del => del(this, args)); - var mauiContext = new MauiContext(Services); - Services.InvokeLifecycleEvents(del => del(mauiContext)); + var rootContext = new MauiContext(Services); + var applicationContext = rootContext.MakeApplicationScope(CurrentGtkApplication); + + Services.InvokeLifecycleEvents(del => del(applicationContext)); Application = Services.GetRequiredService(); - CurrentGtkApplication.SetApplicationHandler(Application, mauiContext); + CurrentGtkApplication.SetApplicationHandler(Application, applicationContext); CurrentGtkApplication.CreatePlatformWindow(Application, new PersistedState()); @@ -118,7 +115,6 @@ protected void StartupLauch(object sender, EventArgs args) protected void Launch(EventArgs args) { - Gtk.Application.Init(); var app = new Gtk.Application(ApplicationId, GLib.ApplicationFlags.None); @@ -129,9 +125,6 @@ protected void Launch(EventArgs args) Current = this; ((GLib.Application)app).Run(); - } - } - } \ No newline at end of file From b65f1b4880eb23b2046a7e5a268a1b6d0c97e7a2 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 8 Sep 2022 16:35:45 +0200 Subject: [PATCH 196/425] [Controls.Gtk] [Controls.Compatibility.Gtk] move ResourcesProvider & Forms: Register ResourcesProvider --- src/Compatibility/Core/src/Gtk/Forms.cs | 8 ++------ .../src/Core/Compatibility}/Gtk/ResourcesProvider.cs | 0 2 files changed, 2 insertions(+), 6 deletions(-) rename src/{Compatibility/Core/src => Controls/src/Core/Compatibility}/Gtk/ResourcesProvider.cs (100%) diff --git a/src/Compatibility/Core/src/Gtk/Forms.cs b/src/Compatibility/Core/src/Gtk/Forms.cs index 7021a7719194..9f8deaf9885a 100644 --- a/src/Compatibility/Core/src/Gtk/Forms.cs +++ b/src/Compatibility/Core/src/Gtk/Forms.cs @@ -1,18 +1,14 @@ using System; using System.Reflection; +using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; namespace Microsoft.Maui.Controls.Compatibility { - public static class Forms { - public static void Init(IActivationState state) { - // var gtkServices = new GtkPlatformServices(); - // Device.PlatformServices = gtkServices; + DependencyService.Register(); } - } - } \ No newline at end of file diff --git a/src/Compatibility/Core/src/Gtk/ResourcesProvider.cs b/src/Controls/src/Core/Compatibility/Gtk/ResourcesProvider.cs similarity index 100% rename from src/Compatibility/Core/src/Gtk/ResourcesProvider.cs rename to src/Controls/src/Core/Compatibility/Gtk/ResourcesProvider.cs From 95de37446c4788ae4ae59d6a1695aae0e5be5495 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 8 Sep 2022 16:36:58 +0200 Subject: [PATCH 197/425] [Controls.Sample.Gtk] track api changes IV & cleanup code --- .../samples/Controls.Sample.Gtk/Program.cs | 8 +-- .../SimpleSampleApp/SimpleSampleMauiApp.cs | 14 +---- .../SimpleSampleApp/Startup.cs | 54 +++++-------------- 3 files changed, 18 insertions(+), 58 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/Program.cs b/src/Controls/samples/Controls.Sample.Gtk/Program.cs index b3b804bbdec6..a6b6e68f36c1 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/Program.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/Program.cs @@ -17,12 +17,8 @@ class Program static void Main(string[] args) { - var app = -#if UseSimpleSample - new SimpleSampleGtkApplication(); -#else - new MauiGtkApplication(); -#endif + var app = new SimpleSampleGtkApplication(); + app.Run(); } diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs index 3e4360901cac..657056f1a327 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleMauiApp.cs @@ -7,27 +7,17 @@ namespace Maui.SimpleSampleApp { - public class SimpleSampleMauiApp : Application { - public SimpleSampleMauiApp(IServiceProvider services, ITextService textService) { Services = services; - + MainPage = services.GetService(); Debug.WriteLine($"The injected text service had a message: '{textService.GetText()}'"); } - public IServiceProvider Services { get; } - - - - public void ThemeChanged() - { - } - + public void ThemeChanged() { } } - } \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs index bf94b89faaee..f1c575adc5dd 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs @@ -8,6 +8,7 @@ using Microsoft.Maui; using Microsoft.Maui.Controls; using Microsoft.Maui.Controls.Compatibility; +using Microsoft.Maui.Controls.Compatibility.Hosting; using Microsoft.Maui.Controls.Hosting; using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; @@ -15,57 +16,33 @@ namespace Maui.SimpleSampleApp { - public class Startup { - - public readonly static bool UseSemanticsPage = false; - public readonly static bool UseXamlPage = false; - public readonly static bool UseXamlApp = true; - public static MauiApp CreateMauiApp() { var appBuilder = MauiApp.CreateBuilder(); - // if (UseXamlApp) - // { - // // Use all the Forms features - // appBuilder = appBuilder - // .UseFormsCompatibility() - // .UseMauiApp(); - // } - // else - { - // Use just the Forms renderers - appBuilder = appBuilder - .UseMauiApp(); - } + appBuilder = appBuilder + .UseMauiApp() + .UseMauiCompatibility() + ; + var services = appBuilder.Services; - appBuilder.Configuration.AddInMemoryCollection(new Dictionary - { - { "MyKey", "Dictionary MyKey Value" }, - { ":Title", "Dictionary_Title" }, - { "Position:Name", "Dictionary_Name" }, - { "Logging:LogLevel:Default", "Warning" } - }); + appBuilder.Configuration.AddInMemoryCollection(new Dictionary { { "MyKey", "Dictionary MyKey Value" }, { ":Title", "Dictionary_Title" }, { "Position:Name", "Dictionary_Name" }, { "Logging:LogLevel:Default", "Warning" } }); services.AddSingleton(); services.AddTransient(); - // if (UseXamlPage) - // services.AddTransient(); - // else if (UseSemanticsPage) - // services.AddTransient(); - // else services.AddTransient(); services.AddTransient(); + appBuilder //.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory()) - .ConfigureFonts(fonts => + .ConfigureFonts(fonts => { fonts.AddFont("Dokdo-Regular.ttf", "Dokdo"); }) @@ -81,16 +58,16 @@ public static MauiApp CreateMauiApp() // Debug.WriteLine($"You seem to have arrived from a special place: {appAction.Title} ({appAction.Id})"); // }); // }) - .ConfigureLifecycleEvents(events => + .ConfigureLifecycleEvents(events => { events.AddEvent>("CustomEventName", value => LogEvent("CustomEventName")); // Log everything in this one events.AddGtk(gtk => gtk - .OnActivated((a, b) => LogEvent(nameof(GtkLifecycle.OnApplicationActivated))) - .OnClosed((a, b) => LogEvent(nameof(GtkLifecycle.OnHidden))) - .OnLaunched((a, b) => LogEvent(nameof(GtkLifecycle.OnLaunched))) - .OnShown((a, b) => + .OnActivated((a, b) => LogEvent(nameof(GtkLifecycle.OnApplicationActivated))) + .OnClosed((a, b) => LogEvent(nameof(GtkLifecycle.OnHidden))) + .OnLaunched((a, b) => LogEvent(nameof(GtkLifecycle.OnLaunched))) + .OnShown((a, b) => { LogEvent(nameof(GtkLifecycle.OnShown)); a.Maximize(); @@ -106,9 +83,6 @@ static bool LogEvent(string eventName, string type = null) }); return appBuilder.Build(); - } - } - } \ No newline at end of file From b41c217f607f12da3a05229988de39d111ec581d Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 8 Sep 2022 21:17:20 +0200 Subject: [PATCH 198/425] [Core.Gtk] introduce NotImplementedView & add a bunch of MissingMapper --- .../Application/ApplicationHandler.Gtk.cs | 5 ++++ .../src/Handlers/Border/BorderHandler.Gtk.cs | 4 ++-- .../FlyoutView/FlyoutViewHandler.Gtk.cs | 9 +++----- .../ImageButton/ImageButtonHandler.Gtk.cs | 17 +++++++++----- .../IndicatorView/IndicatorViewHandler.Gtk.cs | 6 ++--- .../Handlers/MenuBar/MenuBarHandler.Gtk.cs | 7 ++---- .../MenuBarItem/MenuBarItemHandler.Gtk.cs | 7 ++---- .../RadioButton/RadioButtonHandler.Gtk.cs | 4 ++-- .../RefreshView/RefreshViewHandler.Gtk.cs | 23 +++++-------------- .../SwipeItemMenuItemHandler.Gtk.cs | 7 ++---- .../SwipeItemView/SwipeItemViewHandler.Gtk.cs | 5 +--- .../SwipeView/SwipeViewHandler.Gtk.cs | 2 +- .../Handlers/Toolbar/ToolbarHandler.Gtk.cs | 2 +- .../Handlers/WebView/WebViewHandler.Gtk.cs | 3 +-- .../src/Platform/Gtk/NotImplementedView.cs | 9 ++++++++ src/Core/src/Platform/Gtk/RefreshView.cs | 1 + 16 files changed, 52 insertions(+), 59 deletions(-) create mode 100644 src/Core/src/Platform/Gtk/NotImplementedView.cs diff --git a/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs b/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs index 6284dd9d7f27..1ce6c3ee6242 100644 --- a/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs +++ b/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs @@ -4,8 +4,13 @@ namespace Microsoft.Maui.Handlers { public partial class ApplicationHandler : ElementHandler { + [MissingMapper] public static void MapTerminate(ApplicationHandler handler, IApplication application, object? args) { } + + [MissingMapper] public static void MapOpenWindow(ApplicationHandler handler, IApplication application, object? args) { } + + [MissingMapper] public static void MapCloseWindow(ApplicationHandler handler, IApplication application, object? args) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs index e9157d42b6f6..e0014040aaf6 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -2,10 +2,10 @@ namespace Microsoft.Maui.Handlers { - public partial class BorderHandler : ViewHandler + public partial class BorderHandler : ViewHandler { [MissingMapper] - protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + protected override NotImplementedView CreatePlatformView() => new(); [MissingMapper] public static void MapContent(IBorderHandler handler, IBorderView border) diff --git a/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs b/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs index 3825359186b1..582b85476d61 100644 --- a/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs @@ -2,11 +2,8 @@ namespace Microsoft.Maui.Handlers { - public partial class FlyoutViewHandler : ViewHandler + public partial class FlyoutViewHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() - { - throw new System.NotImplementedException(); - } + protected override NotImplementedView CreatePlatformView() => new(); } -} +} \ No newline at end of file diff --git a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs index 2d5cb07f0b66..17d4bf009078 100644 --- a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs @@ -2,18 +2,23 @@ namespace Microsoft.Maui.Handlers { - public partial class ImageButtonHandler : ViewHandler + public partial class ImageButtonHandler : ViewHandler { - protected override MauiImageButton CreatePlatformView() => throw new NotImplementedException(); + protected override MauiImageButton CreatePlatformView() => new(); + [MissingMapper] public static void MapStrokeColor(IImageButtonHandler handler, IButtonStroke buttonStroke) { } + + [MissingMapper] public static void MapStrokeThickness(IImageButtonHandler handler, IButtonStroke buttonStroke) { } + + [MissingMapper] public static void MapCornerRadius(IImageButtonHandler handler, IButtonStroke buttonStroke) { } + + [MissingMapper] public static void MapPadding(IImageButtonHandler handler, IImageButton imageButton) { } - void OnSetImageSource(object? obj) - { - throw new NotImplementedException(); - } + [MissingMapper] + void OnSetImageSource(object? obj) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs index 4c024043ee41..b31ed569ee21 100644 --- a/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs @@ -3,9 +3,9 @@ namespace Microsoft.Maui.Handlers { [MissingMapper] - public partial class IndicatorViewHandler : ViewHandler + public partial class IndicatorViewHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + protected override NotImplementedView CreatePlatformView() => new(); public static void MapCount(IIndicatorViewHandler handler, IIndicatorView indicator) { } public static void MapPosition(IIndicatorViewHandler handler, IIndicatorView indicator) { } @@ -16,4 +16,4 @@ public static void MapIndicatorColor(IIndicatorViewHandler handler, IIndicatorVi public static void MapSelectedIndicatorColor(IIndicatorViewHandler handler, IIndicatorView indicator) { } public static void MapIndicatorShape(IIndicatorViewHandler handler, IIndicatorView indicator) { } } -} +} \ No newline at end of file diff --git a/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs b/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs index 1383795fc251..4e18f75e1dbb 100644 --- a/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs @@ -2,12 +2,9 @@ namespace Microsoft.Maui.Handlers { - public partial class MenuBarHandler : ElementHandler, IMenuBarHandler + public partial class MenuBarHandler : ElementHandler, IMenuBarHandler { - protected override Gtk.Widget CreatePlatformElement() - { - throw new NotImplementedException(); - } + protected override NotImplementedView CreatePlatformElement() => new(); public void Add(IMenuBarItem view) { diff --git a/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs index 2454fa548b04..e10d6cae45d5 100644 --- a/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs +++ b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs @@ -2,12 +2,9 @@ namespace Microsoft.Maui.Handlers { - public partial class MenuBarItemHandler : ElementHandler, IMenuBarItemHandler + public partial class MenuBarItemHandler : ElementHandler, IMenuBarItemHandler { - protected override Gtk.Widget CreatePlatformElement() - { - throw new NotImplementedException(); - } + protected override NotImplementedView CreatePlatformElement() => new(); public void Add(IMenuElement view) { diff --git a/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs index 0b7b7488a850..5d2d303d4594 100644 --- a/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs @@ -2,9 +2,9 @@ namespace Microsoft.Maui.Handlers { - public partial class RadioButtonHandler : ViewHandler + public partial class RadioButtonHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + protected override NotImplementedView CreatePlatformView() => new(); public static void MapBackground(IRadioButtonHandler handler, IRadioButton radioButton) { } public static void MapIsChecked(IRadioButtonHandler handler, IRadioButton radioButton) { } diff --git a/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs index ec2bade0c72f..15e658609f39 100644 --- a/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/RefreshView/RefreshViewHandler.Gtk.cs @@ -7,29 +7,18 @@ namespace Microsoft.Maui.Handlers { public partial class RefreshViewHandler : ViewHandler { - protected override RefreshView CreatePlatformView() - { - return new RefreshView(); - } + protected override RefreshView CreatePlatformView() => new(); [MissingMapper] - public static void MapIsRefreshing(IRefreshViewHandler handler, IRefreshView refreshView) - { - } + public static void MapIsRefreshing(IRefreshViewHandler handler, IRefreshView refreshView) { } [MissingMapper] - public static void MapContent(IRefreshViewHandler handler, IRefreshView refreshView) - { - } + public static void MapContent(IRefreshViewHandler handler, IRefreshView refreshView) { } [MissingMapper] - public static void MapRefreshColor(IRefreshViewHandler handler, IRefreshView refreshView) - { - } + public static void MapRefreshColor(IRefreshViewHandler handler, IRefreshView refreshView) { } [MissingMapper] - public static void MapRefreshViewBackground(IRefreshViewHandler handler, IView view) - { - } + public static void MapRefreshViewBackground(IRefreshViewHandler handler, IView view) { } } -} +} \ No newline at end of file diff --git a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs index 5fa3ce6fbd97..23a572d0ea9b 100644 --- a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs @@ -4,12 +4,9 @@ namespace Microsoft.Maui.Handlers { - public partial class SwipeItemMenuItemHandler : ElementHandler + public partial class SwipeItemMenuItemHandler : ElementHandler { - protected override Gtk.Widget CreatePlatformElement() - { - throw new NotImplementedException(); - } + protected override NotImplementedView CreatePlatformElement() => new(); public static void MapTextColor(ISwipeItemMenuItemHandler handler, ITextStyle view) { } diff --git a/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs index aedfcd15b5e5..dfe8d39b1043 100644 --- a/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs @@ -4,10 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class SwipeItemViewHandler : ViewHandler, ISwipeItemViewHandler { - protected override Gtk.Widget CreatePlatformView() - { - throw new NotImplementedException(); - } + protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(); public static void MapContent(ISwipeItemViewHandler handler, ISwipeItemView page) { diff --git a/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs index 60915e083817..28eea34945b7 100644 --- a/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class SwipeViewHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(); public static void MapContent(ISwipeViewHandler handler, ISwipeView view) { diff --git a/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs b/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs index a457e2b4cbf1..a4458caed1ed 100644 --- a/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs +++ b/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class ToolbarHandler : ElementHandler { - protected override Gtk.Widget CreatePlatformElement() => throw new NotImplementedException(); + protected override Gtk.Widget CreatePlatformElement() => new NotImplementedView(); public static void MapTitle(IToolbarHandler arg1, IToolbar arg2) { diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs index 0feebd21e688..5f66d1c2f3df 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs @@ -4,10 +4,9 @@ namespace Microsoft.Maui.Handlers { public partial class WebViewHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(); public static void MapSource(IWebViewHandler handler, IWebView webView) { } - public static void MapGoBack(IWebViewHandler handler, IWebView webView, object? arg) { } public static void MapGoForward(IWebViewHandler handler, IWebView webView, object? arg) { } public static void MapReload(IWebViewHandler handler, IWebView webView, object? arg) { } diff --git a/src/Core/src/Platform/Gtk/NotImplementedView.cs b/src/Core/src/Platform/Gtk/NotImplementedView.cs new file mode 100644 index 000000000000..74173d0179d0 --- /dev/null +++ b/src/Core/src/Platform/Gtk/NotImplementedView.cs @@ -0,0 +1,9 @@ +using System; +namespace Microsoft.Maui.Platform +{ +/// +/// dummy widget to mark handler as not implemented +/// but avoid +/// + public class NotImplementedView : Gtk.Widget { } +} \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/RefreshView.cs b/src/Core/src/Platform/Gtk/RefreshView.cs index 636b8c0f75c8..6c13eb376391 100644 --- a/src/Core/src/Platform/Gtk/RefreshView.cs +++ b/src/Core/src/Platform/Gtk/RefreshView.cs @@ -1,6 +1,7 @@ namespace Microsoft.Maui.Platform { + [MissingMapper] public class RefreshView : Gtk.Box { From 63cb3f900d0c21244b13118e891cc6c002fbc41a Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 28 Feb 2023 10:59:52 +0100 Subject: [PATCH 199/425] build: enhance --- Directory.Build.Override.props.in | 4 +++- Directory.Build.props | 2 ++ src/Workload/Shared/Frameworks.targets | 9 ++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Directory.Build.Override.props.in b/Directory.Build.Override.props.in index cd6c10d829c0..26a7b265c182 100644 --- a/Directory.Build.Override.props.in +++ b/Directory.Build.Override.props.in @@ -6,18 +6,20 @@ --> <_IncludeWindows> <_IncludeTizen> + <_IncludeGtk> <_IncludeAndroid> <_IncludeIos> <_IncludeMacCatalyst> - <_SpecificPlatformRequested Condition="'$(_IncludeAndroid)' == 'true' OR '$(_IncludeWindows)' == 'true' OR '$(_IncludeTizen)' == 'true' OR '$(_IncludeIos)' == 'true' OR '$(_IncludeMacCatalyst)' == 'true'">true + <_SpecificPlatformRequested Condition="'$(_IncludeAndroid)' == 'true' OR '$(_IncludeWindows)' == 'true' OR '$(_IncludeTizen)' == 'true' OR '$(_IncludeIos)' == 'true' OR '$(_IncludeMacCatalyst)' == 'true' OR '$(_IncludeGtk)' == 'true'">true false false false false false + false diff --git a/Directory.Build.props b/Directory.Build.props index 1c446abb8e74..82a22a4ec272 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -75,6 +75,7 @@ 10.0.19041 10.0.20348 6.5 + 3.24.24.64 @@ -88,6 +89,7 @@ net$(_MauiDotNetVersion)-android;$(MauiPlatforms) net$(_MauiDotNetVersion)-maccatalyst;$(MauiPlatforms) net$(_MauiDotNetVersion)-ios;$(MauiPlatforms) + net$(_MauiDotNetVersion)-gtk;$(MauiPlatforms) $(WindowsMauiPlatforms);$(MauiDeviceTestsPlatforms) diff --git a/src/Workload/Shared/Frameworks.targets b/src/Workload/Shared/Frameworks.targets index ae681b5e69aa..bf19e572d473 100644 --- a/src/Workload/Shared/Frameworks.targets +++ b/src/Workload/Shared/Frameworks.targets @@ -50,6 +50,13 @@ Tfm="net$(_MauiDotNetVersion)-tizen" Profile="Tizen" /> + <_TargetPlatform + Condition=" '$(MauiPlatformName)' == 'gtk' " + Include="net$(_MauiDotNetVersion)-gtk$(TizenTargetFrameworkVersion)" + FullTfm="%(Identity)" + Tfm="net$(_MauiDotNetVersion)-gtk" + Profile="Gtk" + /> @@ -64,4 +71,4 @@ - \ No newline at end of file + From 8b24bbc5ffa7798d430a512500502f26be69dc04 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 1 Mar 2023 00:38:14 +0100 Subject: [PATCH 200/425] build: add more gtk related stuff --- .../Microsoft.Maui.Controls.SingleProject.targets | 13 +++++++++++++ eng/cake/dotnet.cake | 3 +++ src/Workload/Shared/Frameworks.targets | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.nuspec/Microsoft.Maui.Controls.SingleProject.targets b/.nuspec/Microsoft.Maui.Controls.SingleProject.targets index 628e932bee6d..598188454c09 100644 --- a/.nuspec/Microsoft.Maui.Controls.SingleProject.targets +++ b/.nuspec/Microsoft.Maui.Controls.SingleProject.targets @@ -26,6 +26,10 @@ false $(PlatformsProjectFolder)Tizen\ $([MSBuild]::EnsureTrailingSlash('$(TizenProjectFolder)')) + + false + $(PlatformsProjectFolder)Gtk\ + $([MSBuild]::EnsureTrailingSlash('$(GtkProjectFolder)')) @@ -34,6 +38,7 @@ + @@ -68,6 +73,9 @@ $(TizenProjectFolder)shared + + + @@ -100,6 +108,11 @@ Update="$(TizenProjectFolder)**/*$(DefaultLanguageSourceExtension)"> false + + false + + <_IncludeWindows> + <_IncludeTizen> + <_IncludeAndroid> + <_IncludeIos> + <_IncludeMacCatalyst> + <_IncludeMacOS> + + + + <_SpecificPlatformRequested Condition="'$(_IncludeAndroid)' == 'true' OR '$(_IncludeWindows)' == 'true' OR '$(_IncludeTizen)' == 'true' OR '$(_IncludeIos)' == 'true' OR '$(_IncludeMacCatalyst)' == 'true' OR '$(_IncludeMacOS)' == 'true'">true + <_SpecificPlatformRequested>true + false + false + false + false + false + false + + + diff --git a/Directory.Build.props b/Directory.Build.props index 39627409156b..2bf713cc7e15 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ - <_MauiDotNetVersionMajor Condition="'$(_MauiDotNetVersionMajor)' == ''">8 + <_MauiDotNetVersionMajor Condition="'$(_MauiDotNetVersionMajor)' == ''">7 <_MauiDotNetVersionMinor Condition="'$(_MauiDotNetVersionMinor)' == ''">0 <_MauiDotNetVersion Condition="'$(_MauiDotNetVersion)' == ''">$(_MauiDotNetVersionMajor).$(_MauiDotNetVersionMinor) <_MauiDotNetTfm Condition="'$(_MauiDotNetTfm)' == ''">net$(_MauiDotNetVersion) From e659a953123747aab8dcc87841a0076411dc28cf Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 23 Oct 2023 17:58:26 +0200 Subject: [PATCH 205/425] Directory.Build.Override.props: introduce _IncludeNoPlatforms --- Directory.Build.Override.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Build.Override.props b/Directory.Build.Override.props index 9424a56b242f..daea6283d1ff 100644 --- a/Directory.Build.Override.props +++ b/Directory.Build.Override.props @@ -10,11 +10,11 @@ <_IncludeIos> <_IncludeMacCatalyst> <_IncludeMacOS> + <_IncludeNoPlatforms>true - <_SpecificPlatformRequested Condition="'$(_IncludeAndroid)' == 'true' OR '$(_IncludeWindows)' == 'true' OR '$(_IncludeTizen)' == 'true' OR '$(_IncludeIos)' == 'true' OR '$(_IncludeMacCatalyst)' == 'true' OR '$(_IncludeMacOS)' == 'true'">true - <_SpecificPlatformRequested>true + <_SpecificPlatformRequested Condition="'$(_IncludeNoPlatforms)' == 'true' OR '$(_IncludeAndroid)' == 'true' OR '$(_IncludeWindows)' == 'true' OR '$(_IncludeTizen)' == 'true' OR '$(_IncludeIos)' == 'true' OR '$(_IncludeMacCatalyst)' == 'true' OR '$(_IncludeMacOS)' == 'true'">true false false false From d697aaeb22ec6ccae738d66932de15fcd838c6a9 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 24 Oct 2023 03:34:54 +0200 Subject: [PATCH 206/425] try enable gtk --- Directory.Build.Override.props | 8 ++++++-- Directory.Build.props | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Directory.Build.Override.props b/Directory.Build.Override.props index daea6283d1ff..7838ede89737 100644 --- a/Directory.Build.Override.props +++ b/Directory.Build.Override.props @@ -6,21 +6,25 @@ --> <_IncludeWindows> <_IncludeTizen> + <_IncludeGtk>true <_IncludeAndroid> <_IncludeIos> <_IncludeMacCatalyst> <_IncludeMacOS> - <_IncludeNoPlatforms>true + <_IncludeNoPlatforms> - <_SpecificPlatformRequested Condition="'$(_IncludeNoPlatforms)' == 'true' OR '$(_IncludeAndroid)' == 'true' OR '$(_IncludeWindows)' == 'true' OR '$(_IncludeTizen)' == 'true' OR '$(_IncludeIos)' == 'true' OR '$(_IncludeMacCatalyst)' == 'true' OR '$(_IncludeMacOS)' == 'true'">true + <_SpecificPlatformRequested Condition="'$(_IncludeGtk)' == 'true' OR '$(_IncludeAndroid)' == 'true' OR '$(_IncludeWindows)' == 'true' OR '$(_IncludeTizen)' == 'true' OR '$(_IncludeIos)' == 'true' OR '$(_IncludeMacCatalyst)' == 'true' OR '$(_IncludeMacOS)' == 'true'">true false false false false false false + false + true + diff --git a/Directory.Build.props b/Directory.Build.props index 2bf713cc7e15..b92ef1be6b9e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -30,6 +30,8 @@ <_MauiTargetPlatformIsWindows Condition="$(_MauiTargetPlatformIdentifier.Contains('windows')) == 'True'">True <_MauiTargetPlatformIsTizen>false <_MauiTargetPlatformIsTizen Condition="'$(_MauiTargetPlatformIdentifier)' == 'tizen'">True + <_MauiTargetPlatformIsGtk>false + <_MauiTargetPlatformIsGtk Condition="'$(_MauiTargetPlatformIdentifier)' == 'gtk'">True @@ -47,9 +49,11 @@ $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(DotNetWorkloadInstallLocation)\microsoft.net.sdk.macos\WorkloadManifest.json')), '$(DotNetWorkloadVersionRegex)')) $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(DotNetWorkloadInstallLocation)\samsung.net.sdk.tizen\WorkloadManifest.json')), $(DotNetWorkloadVersionRegex))) + $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(DotNetWorkloadInstallLocation)\GtkSharp.NET.Sdk.Gtk\WorkloadManifest.json')), $(DotNetWorkloadVersionRegex))) true true + true true true @@ -57,6 +61,7 @@ true true true + true false true @@ -92,6 +97,7 @@ 10.0.19041 10.0.20348 6.5 + 3.24.24.64 @@ -105,6 +111,7 @@ net$(_MauiDotNetVersion)-android;$(MauiPlatforms) net$(_MauiDotNetVersion)-maccatalyst;$(MauiPlatforms) net$(_MauiDotNetVersion)-ios;$(MauiPlatforms) + net$(_MauiDotNetVersion)-gtk;$(MauiPlatforms) net$(_MauiPreviousDotNetVersion)-windows$(WindowsTargetFrameworkVersion);net$(_MauiPreviousDotNetVersion)-windows$(Windows2TargetFrameworkVersion) net$(_MauiPreviousDotNetVersion)-tizen;$(MauiPreviousPlatforms) From 3ae10ecf675fd3210b3abc5e65ea955b1149d02e Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Wed, 1 Nov 2023 21:45:46 -0500 Subject: [PATCH 207/425] Update release branch versions (#18473) --- GitInfo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitInfo.txt b/GitInfo.txt index ff5ec35d5666..ae9a76b9249a 100644 --- a/GitInfo.txt +++ b/GitInfo.txt @@ -1 +1 @@ -8.0.0-ci.net8 +8.0.0 From 073a8c47501f972d3b7305a420f0e133a7134d46 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Thu, 2 Nov 2023 16:29:17 -0400 Subject: [PATCH 208/425] [release/8.0.1xx] Bump version to generate 8.0.1.x versioning (#18491) --- GitInfo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitInfo.txt b/GitInfo.txt index ae9a76b9249a..cd1d2e94f31d 100644 --- a/GitInfo.txt +++ b/GitInfo.txt @@ -1 +1 @@ -8.0.0 +8.0.1 From a63d80ef9c0a999dae8825a78a4323b1ee77328b Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 6 Nov 2023 20:35:34 +0100 Subject: [PATCH 209/425] Versions.props: downgrade to .net7 --- eng/Versions.props | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index a73ddd71613a..da905622107c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -38,17 +38,17 @@ 10.0.22621.756 1.0.5.1 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 - 8.0.0-rc.2.23480.2 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 + 7.0.13 8.0.0-preview1.23067.2 3.3.4 From 00fc0d56fa7a9408c7b716679e21b5a51a1e3c5a Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 6 Nov 2023 21:04:07 +0100 Subject: [PATCH 210/425] Compatibility.csproj: remove Gtk2 --- src/Compatibility/Core/src/Compatibility.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Compatibility/Core/src/Compatibility.csproj b/src/Compatibility/Core/src/Compatibility.csproj index 361459e3b063..1057f87734b7 100644 --- a/src/Compatibility/Core/src/Compatibility.csproj +++ b/src/Compatibility/Core/src/Compatibility.csproj @@ -25,9 +25,11 @@ + + From 482203741cf554e91ea66c1314fbe5a245ea0938 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 6 Nov 2023 21:05:14 +0100 Subject: [PATCH 211/425] Compatibility.csproj: fix assign --- .../Handlers/Shell/Android/ShellContentFragment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellContentFragment.cs b/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellContentFragment.cs index 9d512be5cf0c..712a7ebaaa1d 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellContentFragment.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellContentFragment.cs @@ -142,7 +142,7 @@ public override AView OnCreateView(LayoutInflater inflater, ViewGroup container, var appBar = _root.FindViewById(Resource.Id.shellcontent_appbar); appBar.AddView(_toolbar); - _viewhandler = _page.ToHandler(shellContentMauiContext); + _viewhandler = (IPlatformViewHandler)_page.ToHandler(shellContentMauiContext); _shellPageContainer = new ShellPageContainer(Context, _viewhandler); From bebee0b3dd50da7e7525491f0f21eb40c72d1cb2 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 6 Nov 2023 21:06:31 +0100 Subject: [PATCH 212/425] BlazorWebViewHandler.Android.cs: add dummy to get it compile --- .../src/Maui/Android/BlazorWebViewHandler.Android.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BlazorWebView/src/Maui/Android/BlazorWebViewHandler.Android.cs b/src/BlazorWebView/src/Maui/Android/BlazorWebViewHandler.Android.cs index d36c920b2a92..4fe3f60dc332 100644 --- a/src/BlazorWebView/src/Maui/Android/BlazorWebViewHandler.Android.cs +++ b/src/BlazorWebView/src/Maui/Android/BlazorWebViewHandler.Android.cs @@ -158,7 +158,8 @@ public virtual async Task TryDispatchAsync(Action workIt return false; } - return await _webviewManager.TryDispatchAsync(workItem); + // TODO: revert this change on net8 + return await Task.FromResult(false); // await _webviewManager.TryDispatchAsync(workItem); } } } From 2a9b11ed34a7e7cc80c5262c711f796f0f6de127 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 6 Nov 2023 21:06:59 +0100 Subject: [PATCH 213/425] Directory.Build.props: nowarn public api --- Directory.Build.props | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Directory.Build.props b/Directory.Build.props index b92ef1be6b9e..764488969185 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -176,6 +176,7 @@ $(MSBuildThisFileDirectory)LICENSE.TXT $(MSBuildThisFileDirectory)THIRD-PARTY-NOTICES.TXT true + $(NoWarn);RS0016;RS0017 @@ -191,4 +192,7 @@ true + + + From 47039c38b3d543e46e54fbb2fcb4a223fc323d99 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 17:39:42 +0100 Subject: [PATCH 214/425] Graphics.csproj: add PublicApi net-gtk --- .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 1 + .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 1447 +++++++++++++++++ 2 files changed, 1448 insertions(+) create mode 100644 src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Unshipped.txt diff --git a/src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..7dc5c58110bf --- /dev/null +++ b/src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..3f8260e664ad --- /dev/null +++ b/src/Graphics/src/Graphics/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1,1447 @@ +#nullable enable +abstract Microsoft.Maui.Graphics.AbstractCanvas.Alpha.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.Antialias.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.BlendMode.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.ClipRectangle(float x, float y, float width, float height) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.FillArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.FillEllipse(float x, float y, float width, float height) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.FillRectangle(float x, float y, float width, float height) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.FillRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.FontSize.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.MiterLimit.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformConcatenateTransform(System.Numerics.Matrix3x2 transform) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformDrawArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformDrawEllipse(float x, float y, float width, float height) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformDrawLine(float x1, float y1, float x2, float y2) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformDrawRectangle(float x, float y, float width, float height) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformDrawRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformRotate(float degrees, float radians) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformRotate(float degrees, float radians, float x, float y) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformScale(float fx, float fy) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformStrokeSize.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformTranslate(float tx, float ty) -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.StrokeLineCap.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.StrokeLineJoin.set -> void +abstract Microsoft.Maui.Graphics.AbstractCanvas.SubtractFromClip(float x, float y, float width, float height) -> void +const Microsoft.Maui.Graphics.CanvasDefaults.DefaultMiterLimit = 10 -> float +const Microsoft.Maui.Graphics.CanvasDefaults.DefaultShadowBlur = 5 -> float +const Microsoft.Maui.Graphics.FontWeights.Black = 900 -> int +const Microsoft.Maui.Graphics.FontWeights.Bold = 700 -> int +const Microsoft.Maui.Graphics.FontWeights.Default = -1 -> int +const Microsoft.Maui.Graphics.FontWeights.DemiBold = 600 -> int +const Microsoft.Maui.Graphics.FontWeights.ExtraBlack = 950 -> int +const Microsoft.Maui.Graphics.FontWeights.ExtraBold = 800 -> int +const Microsoft.Maui.Graphics.FontWeights.ExtraLight = 200 -> int +const Microsoft.Maui.Graphics.FontWeights.Heavy = 900 -> int +const Microsoft.Maui.Graphics.FontWeights.Light = 300 -> int +const Microsoft.Maui.Graphics.FontWeights.Medium = 500 -> int +const Microsoft.Maui.Graphics.FontWeights.Normal = 400 -> int +const Microsoft.Maui.Graphics.FontWeights.Regular = 400 -> int +const Microsoft.Maui.Graphics.FontWeights.SemiBold = 600 -> int +const Microsoft.Maui.Graphics.FontWeights.SemiLight = 400 -> int +const Microsoft.Maui.Graphics.FontWeights.Thin = 100 -> int +const Microsoft.Maui.Graphics.FontWeights.UltraBlack = 950 -> int +const Microsoft.Maui.Graphics.FontWeights.UltraBold = 800 -> int +const Microsoft.Maui.Graphics.FontWeights.UltraLight = 200 -> int +const Microsoft.Maui.Graphics.GeometryUtil.Epsilon = 1E-10 -> float +const Microsoft.Maui.Graphics.Text.TextAttributeExtensions.DefaultFontSize = 12 -> float +Microsoft.Maui.Graphics.AbstractCanvas.AssignedStrokeLimit.get -> float +Microsoft.Maui.Graphics.AbstractCanvas.ConcatenateTransform(System.Numerics.Matrix3x2 transform) -> void +Microsoft.Maui.Graphics.AbstractCanvas.DrawArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) -> void +Microsoft.Maui.Graphics.AbstractCanvas.DrawEllipse(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.AbstractCanvas.DrawLine(float x1, float y1, float x2, float y2) -> void +Microsoft.Maui.Graphics.AbstractCanvas.DrawRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.AbstractCanvas.DrawRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +Microsoft.Maui.Graphics.AbstractCanvas.LimitStrokeScaling.set -> void +Microsoft.Maui.Graphics.AbstractCanvas.LimitStrokeScalingEnabled.get -> bool +Microsoft.Maui.Graphics.AbstractCanvas.Rotate(float degrees) -> void +Microsoft.Maui.Graphics.AbstractCanvas.Rotate(float degrees, float x, float y) -> void +Microsoft.Maui.Graphics.AbstractCanvas.Scale(float fx, float fy) -> void +Microsoft.Maui.Graphics.AbstractCanvas.StrokeDashOffset.set -> void +Microsoft.Maui.Graphics.AbstractCanvas.StrokeLimit.set -> void +Microsoft.Maui.Graphics.AbstractCanvas.StrokeSize.set -> void +Microsoft.Maui.Graphics.AbstractCanvas.Translate(float tx, float ty) -> void +Microsoft.Maui.Graphics.AbstractPattern +Microsoft.Maui.Graphics.AbstractPattern.AbstractPattern(float stepSize) -> void +Microsoft.Maui.Graphics.AbstractPattern.AbstractPattern(float width, float height) -> void +Microsoft.Maui.Graphics.AbstractPattern.AbstractPattern(float width, float height, float stepX, float stepY) -> void +Microsoft.Maui.Graphics.AbstractPattern.Height.get -> float +Microsoft.Maui.Graphics.AbstractPattern.StepX.get -> float +Microsoft.Maui.Graphics.AbstractPattern.StepY.get -> float +Microsoft.Maui.Graphics.AbstractPattern.Width.get -> float +Microsoft.Maui.Graphics.BitmapExportContext +Microsoft.Maui.Graphics.BitmapExportContext.BitmapExportContext(int width, int height, float dpi) -> void +Microsoft.Maui.Graphics.BitmapExportContext.Dpi.get -> float +Microsoft.Maui.Graphics.BitmapExportContext.Height.get -> int +Microsoft.Maui.Graphics.BitmapExportContext.Width.get -> int +Microsoft.Maui.Graphics.BitmapExportContextExtensions +Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Clear = 16 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Color = 14 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.ColorBurn = 7 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.ColorDodge = 6 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Copy = 17 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Darken = 4 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.DestinationAtop = 24 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.DestinationIn = 22 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.DestinationOut = 23 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.DestinationOver = 21 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Difference = 10 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Exclusion = 11 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.HardLight = 9 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Hue = 12 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Lighten = 5 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Luminosity = 15 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Multiply = 1 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Normal = 0 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Overlay = 3 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.PlusDarker = 26 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.PlusLighter = 27 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Saturation = 13 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Screen = 2 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.SoftLight = 8 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.SourceAtop = 20 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.SourceIn = 18 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.SourceOut = 19 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.BlendMode.Xor = 25 -> Microsoft.Maui.Graphics.BlendMode +Microsoft.Maui.Graphics.CanvasDefaults +Microsoft.Maui.Graphics.CanvasExtensions +Microsoft.Maui.Graphics.CanvasState +Microsoft.Maui.Graphics.CanvasState.CanvasState() -> void +Microsoft.Maui.Graphics.CanvasState.Scale.get -> float +Microsoft.Maui.Graphics.CanvasState.ScaleX.get -> float +Microsoft.Maui.Graphics.CanvasState.ScaleY.get -> float +Microsoft.Maui.Graphics.CanvasState.StrokeDashOffset.get -> float +Microsoft.Maui.Graphics.CanvasState.StrokeDashOffset.set -> void +Microsoft.Maui.Graphics.CanvasState.StrokeSize.get -> float +Microsoft.Maui.Graphics.CanvasState.StrokeSize.set -> void +Microsoft.Maui.Graphics.CanvasState.Transform.get -> System.Numerics.Matrix3x2 +Microsoft.Maui.Graphics.CanvasState.Transform.set -> void +Microsoft.Maui.Graphics.Color +Microsoft.Maui.Graphics.Color.Color() -> void +Microsoft.Maui.Graphics.Color.Color(byte red, byte green, byte blue) -> void +Microsoft.Maui.Graphics.Color.Color(byte red, byte green, byte blue, byte alpha) -> void +Microsoft.Maui.Graphics.Color.Color(float gray) -> void +Microsoft.Maui.Graphics.Color.Color(float red, float green, float blue) -> void +Microsoft.Maui.Graphics.Color.Color(float red, float green, float blue, float alpha) -> void +Microsoft.Maui.Graphics.Color.Color(int red, int green, int blue) -> void +Microsoft.Maui.Graphics.Color.Color(int red, int green, int blue, int alpha) -> void +Microsoft.Maui.Graphics.Color.Color(System.Numerics.Vector4 color) -> void +Microsoft.Maui.Graphics.Color.GetHue() -> float +Microsoft.Maui.Graphics.Color.GetLuminosity() -> float +Microsoft.Maui.Graphics.Color.GetSaturation() -> float +Microsoft.Maui.Graphics.Color.ToHsl(out float h, out float s, out float l) -> void +Microsoft.Maui.Graphics.Color.ToInt() -> int +Microsoft.Maui.Graphics.Color.ToRgb(out byte r, out byte g, out byte b) -> void +Microsoft.Maui.Graphics.Color.ToRgba(out byte r, out byte g, out byte b, out byte a) -> void +Microsoft.Maui.Graphics.Color.ToUint() -> uint +Microsoft.Maui.Graphics.Colors +Microsoft.Maui.Graphics.Converters.ColorTypeConverter +Microsoft.Maui.Graphics.Converters.ColorTypeConverter.ColorTypeConverter() -> void +Microsoft.Maui.Graphics.Converters.PointFTypeConverter +Microsoft.Maui.Graphics.Converters.PointFTypeConverter.PointFTypeConverter() -> void +Microsoft.Maui.Graphics.Converters.PointTypeConverter +Microsoft.Maui.Graphics.Converters.PointTypeConverter.PointTypeConverter() -> void +Microsoft.Maui.Graphics.Converters.RectFTypeConverter +Microsoft.Maui.Graphics.Converters.RectFTypeConverter.RectFTypeConverter() -> void +Microsoft.Maui.Graphics.Converters.RectTypeConverter +Microsoft.Maui.Graphics.Converters.RectTypeConverter.RectTypeConverter() -> void +Microsoft.Maui.Graphics.Converters.SizeFTypeConverter +Microsoft.Maui.Graphics.Converters.SizeFTypeConverter.SizeFTypeConverter() -> void +Microsoft.Maui.Graphics.Converters.SizeTypeConverter +Microsoft.Maui.Graphics.Converters.SizeTypeConverter.SizeTypeConverter() -> void +Microsoft.Maui.Graphics.DrawingCommand +Microsoft.Maui.Graphics.Font +Microsoft.Maui.Graphics.Font.Font() -> void +Microsoft.Maui.Graphics.Font.IsDefault.get -> bool +Microsoft.Maui.Graphics.Font.StyleType.get -> Microsoft.Maui.Graphics.FontStyleType +Microsoft.Maui.Graphics.Font.Weight.get -> int +Microsoft.Maui.Graphics.FontSource +Microsoft.Maui.Graphics.FontSource.Equals(Microsoft.Maui.Graphics.FontSource other) -> bool +Microsoft.Maui.Graphics.FontSource.FontSource() -> void +Microsoft.Maui.Graphics.FontSource.FontSource(string! filename, int weight = 400, Microsoft.Maui.Graphics.FontStyleType fontStyleType = Microsoft.Maui.Graphics.FontStyleType.Normal) -> void +Microsoft.Maui.Graphics.FontStyleType +Microsoft.Maui.Graphics.FontStyleType.Italic = 1 -> Microsoft.Maui.Graphics.FontStyleType +Microsoft.Maui.Graphics.FontStyleType.Normal = 0 -> Microsoft.Maui.Graphics.FontStyleType +Microsoft.Maui.Graphics.FontStyleType.Oblique = 2 -> Microsoft.Maui.Graphics.FontStyleType +Microsoft.Maui.Graphics.FontWeights +Microsoft.Maui.Graphics.GeometryUtil +Microsoft.Maui.Graphics.GradientPaint +Microsoft.Maui.Graphics.GradientPaint.AddOffset(float offset) -> void +Microsoft.Maui.Graphics.GradientPaint.EndColorIndex.get -> int +Microsoft.Maui.Graphics.GradientPaint.GradientPaint() -> void +Microsoft.Maui.Graphics.GradientPaint.RemoveOffset(int index) -> void +Microsoft.Maui.Graphics.GradientPaint.StartColorIndex.get -> int +Microsoft.Maui.Graphics.HorizontalAlignment +Microsoft.Maui.Graphics.HorizontalAlignment.Center = 1 -> Microsoft.Maui.Graphics.HorizontalAlignment +Microsoft.Maui.Graphics.HorizontalAlignment.Justified = 3 -> Microsoft.Maui.Graphics.HorizontalAlignment +Microsoft.Maui.Graphics.HorizontalAlignment.Left = 0 -> Microsoft.Maui.Graphics.HorizontalAlignment +Microsoft.Maui.Graphics.HorizontalAlignment.Right = 2 -> Microsoft.Maui.Graphics.HorizontalAlignment +Microsoft.Maui.Graphics.IBitmapExportService +Microsoft.Maui.Graphics.IBlurrableCanvas +Microsoft.Maui.Graphics.IBlurrableCanvas.SetBlur(float blurRadius) -> void +Microsoft.Maui.Graphics.ICanvas +Microsoft.Maui.Graphics.ICanvas.Alpha.set -> void +Microsoft.Maui.Graphics.ICanvas.Antialias.set -> void +Microsoft.Maui.Graphics.ICanvas.BlendMode.set -> void +Microsoft.Maui.Graphics.ICanvas.ClipRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ICanvas.ConcatenateTransform(System.Numerics.Matrix3x2 transform) -> void +Microsoft.Maui.Graphics.ICanvas.DisplayScale.get -> float +Microsoft.Maui.Graphics.ICanvas.DisplayScale.set -> void +Microsoft.Maui.Graphics.ICanvas.DrawArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) -> void +Microsoft.Maui.Graphics.ICanvas.DrawEllipse(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ICanvas.DrawLine(float x1, float y1, float x2, float y2) -> void +Microsoft.Maui.Graphics.ICanvas.DrawRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ICanvas.DrawRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +Microsoft.Maui.Graphics.ICanvas.FillArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise) -> void +Microsoft.Maui.Graphics.ICanvas.FillEllipse(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ICanvas.FillRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ICanvas.FillRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +Microsoft.Maui.Graphics.ICanvas.FontSize.set -> void +Microsoft.Maui.Graphics.ICanvas.MiterLimit.set -> void +Microsoft.Maui.Graphics.ICanvas.ResetState() -> void +Microsoft.Maui.Graphics.ICanvas.RestoreState() -> bool +Microsoft.Maui.Graphics.ICanvas.Rotate(float degrees) -> void +Microsoft.Maui.Graphics.ICanvas.Rotate(float degrees, float x, float y) -> void +Microsoft.Maui.Graphics.ICanvas.SaveState() -> void +Microsoft.Maui.Graphics.ICanvas.Scale(float sx, float sy) -> void +Microsoft.Maui.Graphics.ICanvas.StrokeDashOffset.set -> void +Microsoft.Maui.Graphics.ICanvas.StrokeLineCap.set -> void +Microsoft.Maui.Graphics.ICanvas.StrokeLineJoin.set -> void +Microsoft.Maui.Graphics.ICanvas.StrokeSize.set -> void +Microsoft.Maui.Graphics.ICanvas.SubtractFromClip(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ICanvas.Translate(float tx, float ty) -> void +Microsoft.Maui.Graphics.IDrawable +Microsoft.Maui.Graphics.IFont +Microsoft.Maui.Graphics.IFont.StyleType.get -> Microsoft.Maui.Graphics.FontStyleType +Microsoft.Maui.Graphics.IFont.Weight.get -> int +Microsoft.Maui.Graphics.IFontExtensions +Microsoft.Maui.Graphics.IImage +Microsoft.Maui.Graphics.IImage.Height.get -> float +Microsoft.Maui.Graphics.IImage.Width.get -> float +Microsoft.Maui.Graphics.IImageLoadingService +Microsoft.Maui.Graphics.ImageExtensions +Microsoft.Maui.Graphics.ImageFormat +Microsoft.Maui.Graphics.ImageFormat.Bmp = 4 -> Microsoft.Maui.Graphics.ImageFormat +Microsoft.Maui.Graphics.ImageFormat.Gif = 2 -> Microsoft.Maui.Graphics.ImageFormat +Microsoft.Maui.Graphics.ImageFormat.Jpeg = 1 -> Microsoft.Maui.Graphics.ImageFormat +Microsoft.Maui.Graphics.ImageFormat.Png = 0 -> Microsoft.Maui.Graphics.ImageFormat +Microsoft.Maui.Graphics.ImageFormat.Tiff = 3 -> Microsoft.Maui.Graphics.ImageFormat +Microsoft.Maui.Graphics.ImageLoadingServiceExtensions +Microsoft.Maui.Graphics.ImagePaint +Microsoft.Maui.Graphics.ImagePaint.ImagePaint() -> void +Microsoft.Maui.Graphics.Insets +Microsoft.Maui.Graphics.Insets.AllValuesAreEqualTo(double value) -> bool +Microsoft.Maui.Graphics.Insets.Bottom.get -> double +Microsoft.Maui.Graphics.Insets.Bottom.set -> void +Microsoft.Maui.Graphics.Insets.Horizontal.get -> double +Microsoft.Maui.Graphics.Insets.Insets(double top, double left, double bottom, double right) -> void +Microsoft.Maui.Graphics.Insets.Left.get -> double +Microsoft.Maui.Graphics.Insets.Left.set -> void +Microsoft.Maui.Graphics.Insets.Right.get -> double +Microsoft.Maui.Graphics.Insets.Right.set -> void +Microsoft.Maui.Graphics.Insets.Top.get -> double +Microsoft.Maui.Graphics.Insets.Top.set -> void +Microsoft.Maui.Graphics.Insets.Vertical.get -> double +Microsoft.Maui.Graphics.InsetsF +Microsoft.Maui.Graphics.InsetsF.AllValuesAreEqualTo(float value) -> bool +Microsoft.Maui.Graphics.InsetsF.Bottom.get -> float +Microsoft.Maui.Graphics.InsetsF.Bottom.set -> void +Microsoft.Maui.Graphics.InsetsF.Horizontal.get -> float +Microsoft.Maui.Graphics.InsetsF.InsetsF(float top, float left, float bottom, float right) -> void +Microsoft.Maui.Graphics.InsetsF.Left.get -> float +Microsoft.Maui.Graphics.InsetsF.Left.set -> void +Microsoft.Maui.Graphics.InsetsF.Right.get -> float +Microsoft.Maui.Graphics.InsetsF.Right.set -> void +Microsoft.Maui.Graphics.InsetsF.Top.get -> float +Microsoft.Maui.Graphics.InsetsF.Top.set -> void +Microsoft.Maui.Graphics.InsetsF.Vertical.get -> float +Microsoft.Maui.Graphics.IPattern +Microsoft.Maui.Graphics.IPattern.Height.get -> float +Microsoft.Maui.Graphics.IPattern.StepX.get -> float +Microsoft.Maui.Graphics.IPattern.StepY.get -> float +Microsoft.Maui.Graphics.IPattern.Width.get -> float +Microsoft.Maui.Graphics.IPdfPage +Microsoft.Maui.Graphics.IPdfPage.Height.get -> float +Microsoft.Maui.Graphics.IPdfPage.PageNumber.get -> int +Microsoft.Maui.Graphics.IPdfPage.Width.get -> float +Microsoft.Maui.Graphics.IPdfRenderService +Microsoft.Maui.Graphics.IPicture +Microsoft.Maui.Graphics.IPicture.Height.get -> float +Microsoft.Maui.Graphics.IPicture.Width.get -> float +Microsoft.Maui.Graphics.IPicture.X.get -> float +Microsoft.Maui.Graphics.IPicture.Y.get -> float +Microsoft.Maui.Graphics.IPictureReader +Microsoft.Maui.Graphics.IPictureWriter +Microsoft.Maui.Graphics.IPlatformFonts +Microsoft.Maui.Graphics.IPlatformFonts.Default.get -> Microsoft.Maui.Graphics.IFont! +Microsoft.Maui.Graphics.IPlatformFonts.DefaultBold.get -> Microsoft.Maui.Graphics.IFont! +Microsoft.Maui.Graphics.IPlatformFonts.Get(Microsoft.Maui.Graphics.IFont! font) -> object! +Microsoft.Maui.Graphics.IPlatformFonts.Get(string! alias, int weight = 400, Microsoft.Maui.Graphics.FontStyleType fontStyleType = Microsoft.Maui.Graphics.FontStyleType.Normal) -> object! +Microsoft.Maui.Graphics.IPlatformFonts.Register(string! alias, params Microsoft.Maui.Graphics.FontSource[]! sources) -> void +Microsoft.Maui.Graphics.IStringSizeService +Microsoft.Maui.Graphics.ITextAttributes +Microsoft.Maui.Graphics.ITextAttributes.FontSize.get -> float +Microsoft.Maui.Graphics.ITextAttributes.FontSize.set -> void +Microsoft.Maui.Graphics.ITextAttributes.HorizontalAlignment.get -> Microsoft.Maui.Graphics.HorizontalAlignment +Microsoft.Maui.Graphics.ITextAttributes.HorizontalAlignment.set -> void +Microsoft.Maui.Graphics.ITextAttributes.Margin.get -> float +Microsoft.Maui.Graphics.ITextAttributes.Margin.set -> void +Microsoft.Maui.Graphics.ITextAttributes.VerticalAlignment.get -> Microsoft.Maui.Graphics.VerticalAlignment +Microsoft.Maui.Graphics.ITextAttributes.VerticalAlignment.set -> void +Microsoft.Maui.Graphics.LayoutLine +Microsoft.Maui.Graphics.LinearGradientPaint +Microsoft.Maui.Graphics.LinearGradientPaint.EndPoint.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.LinearGradientPaint.EndPoint.set -> void +Microsoft.Maui.Graphics.LinearGradientPaint.LinearGradientPaint() -> void +Microsoft.Maui.Graphics.LinearGradientPaint.LinearGradientPaint(Microsoft.Maui.Graphics.Point startPoint, Microsoft.Maui.Graphics.Point endPoint) -> void +Microsoft.Maui.Graphics.LinearGradientPaint.StartPoint.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.LinearGradientPaint.StartPoint.set -> void +Microsoft.Maui.Graphics.LineCap +Microsoft.Maui.Graphics.LineCap.Butt = 0 -> Microsoft.Maui.Graphics.LineCap +Microsoft.Maui.Graphics.LineCap.Round = 1 -> Microsoft.Maui.Graphics.LineCap +Microsoft.Maui.Graphics.LineCap.Square = 2 -> Microsoft.Maui.Graphics.LineCap +Microsoft.Maui.Graphics.LineJoin +Microsoft.Maui.Graphics.LineJoin.Bevel = 2 -> Microsoft.Maui.Graphics.LineJoin +Microsoft.Maui.Graphics.LineJoin.Miter = 0 -> Microsoft.Maui.Graphics.LineJoin +Microsoft.Maui.Graphics.LineJoin.Round = 1 -> Microsoft.Maui.Graphics.LineJoin +Microsoft.Maui.Graphics.Paint +Microsoft.Maui.Graphics.Paint.Paint() -> void +Microsoft.Maui.Graphics.PaintGradientStop +Microsoft.Maui.Graphics.PaintGradientStop.Offset.get -> float +Microsoft.Maui.Graphics.PaintGradientStop.Offset.set -> void +Microsoft.Maui.Graphics.PaintPattern +Microsoft.Maui.Graphics.PaintPattern.Height.get -> float +Microsoft.Maui.Graphics.PaintPattern.StepX.get -> float +Microsoft.Maui.Graphics.PaintPattern.StepY.get -> float +Microsoft.Maui.Graphics.PaintPattern.Width.get -> float +Microsoft.Maui.Graphics.PathArcExtensions +Microsoft.Maui.Graphics.PathBuilder +Microsoft.Maui.Graphics.PathBuilder.PathBuilder() -> void +Microsoft.Maui.Graphics.PathExtensions +Microsoft.Maui.Graphics.PathF +Microsoft.Maui.Graphics.PathF.AppendCircle(float cx, float cy, float r) -> void +Microsoft.Maui.Graphics.PathF.AppendCircle(Microsoft.Maui.Graphics.PointF center, float r) -> void +Microsoft.Maui.Graphics.PathF.AppendEllipse(float x, float y, float w, float h) -> void +Microsoft.Maui.Graphics.PathF.AppendEllipse(Microsoft.Maui.Graphics.RectF rect) -> void +Microsoft.Maui.Graphics.PathF.AppendRectangle(float x, float y, float w, float h, bool includeLast = false) -> void +Microsoft.Maui.Graphics.PathF.AppendRectangle(Microsoft.Maui.Graphics.RectF rect, bool includeLast = false) -> void +Microsoft.Maui.Graphics.PathF.AppendRoundedRectangle(float x, float y, float w, float h, float cornerRadius, bool includeLast = false) -> void +Microsoft.Maui.Graphics.PathF.AppendRoundedRectangle(float x, float y, float w, float h, float topLeftCornerRadius, float topRightCornerRadius, float bottomLeftCornerRadius, float bottomRightCornerRadius, bool includeLast = false) -> void +Microsoft.Maui.Graphics.PathF.AppendRoundedRectangle(Microsoft.Maui.Graphics.RectF rect, float cornerRadius, bool includeLast = false) -> void +Microsoft.Maui.Graphics.PathF.AppendRoundedRectangle(Microsoft.Maui.Graphics.RectF rect, float topLeftCornerRadius, float topRightCornerRadius, float bottomLeftCornerRadius, float bottomRightCornerRadius, bool includeLast = false) -> void +Microsoft.Maui.Graphics.PathF.AppendRoundedRectangle(Microsoft.Maui.Graphics.RectF rect, float xCornerRadius, float yCornerRadius) -> void +Microsoft.Maui.Graphics.PathF.Bounds.get -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.PathF.Close() -> void +Microsoft.Maui.Graphics.PathF.Closed.get -> bool +Microsoft.Maui.Graphics.PathF.Count.get -> int +Microsoft.Maui.Graphics.PathF.Dispose() -> void +Microsoft.Maui.Graphics.PathF.FirstPoint.get -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PathF.GetArcAngle(int aIndex) -> float +Microsoft.Maui.Graphics.PathF.GetArcClockwise(int aIndex) -> bool +Microsoft.Maui.Graphics.PathF.GetBoundsByFlattening(float flatness = 0.001) -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.PathF.GetRotatedPoint(int pointIndex, Microsoft.Maui.Graphics.PointF pivotPoint, float angle) -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PathF.GetSegmentForPoint(int pointIndex) -> int +Microsoft.Maui.Graphics.PathF.GetSegmentInfo(int segmentIndex, out int pointIndex, out int arcAngleIndex, out int arcClockwiseIndex) -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathF.GetSegmentPointIndex(int index) -> int +Microsoft.Maui.Graphics.PathF.GetSegmentType(int aIndex) -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathF.Invalidate() -> void +Microsoft.Maui.Graphics.PathF.IsSubPathClosed(int subPathIndex) -> bool +Microsoft.Maui.Graphics.PathF.LastPoint.get -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PathF.LastPointIndex.get -> int +Microsoft.Maui.Graphics.PathF.Move(float x, float y) -> void +Microsoft.Maui.Graphics.PathF.MovePoint(int index, float dx, float dy) -> void +Microsoft.Maui.Graphics.PathF.Open() -> void +Microsoft.Maui.Graphics.PathF.OperationCount.get -> int +Microsoft.Maui.Graphics.PathF.PathF() -> void +Microsoft.Maui.Graphics.PathF.PathF(float x, float y) -> void +Microsoft.Maui.Graphics.PathF.PathF(Microsoft.Maui.Graphics.PointF point) -> void +Microsoft.Maui.Graphics.PathF.RemoveAllSegmentsAfter(int segmentIndex) -> void +Microsoft.Maui.Graphics.PathF.RemoveSegment(int segmentIndex) -> void +Microsoft.Maui.Graphics.PathF.SegmentCountExcludingOpenAndClose.get -> int +Microsoft.Maui.Graphics.PathF.SetArcAngle(int aIndex, float aValue) -> void +Microsoft.Maui.Graphics.PathF.SetArcClockwise(int aIndex, bool aValue) -> void +Microsoft.Maui.Graphics.PathF.SetPoint(int index, float x, float y) -> void +Microsoft.Maui.Graphics.PathF.SetPoint(int index, Microsoft.Maui.Graphics.PointF point) -> void +Microsoft.Maui.Graphics.PathF.SubPathCount.get -> int +Microsoft.Maui.Graphics.PathF.this[int index].get -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PathF.Transform(System.Numerics.Matrix3x2 transform) -> void +Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathOperation.Arc = 4 -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathOperation.Close = 5 -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathOperation.Cubic = 3 -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathOperation.Line = 1 -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathOperation.Move = 0 -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PathOperation.Quad = 2 -> Microsoft.Maui.Graphics.PathOperation +Microsoft.Maui.Graphics.PatternExtensions +Microsoft.Maui.Graphics.PatternPaint +Microsoft.Maui.Graphics.PatternPaint.PatternPaint() -> void +Microsoft.Maui.Graphics.PdfPageExtensions +Microsoft.Maui.Graphics.PictureCanvas +Microsoft.Maui.Graphics.PictureCanvas.Alpha.set -> void +Microsoft.Maui.Graphics.PictureCanvas.Antialias.set -> void +Microsoft.Maui.Graphics.PictureCanvas.BlendMode.set -> void +Microsoft.Maui.Graphics.PictureCanvas.ClipRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.PictureCanvas.ConcatenateTransform(System.Numerics.Matrix3x2 transform) -> void +Microsoft.Maui.Graphics.PictureCanvas.DisplayScale.get -> float +Microsoft.Maui.Graphics.PictureCanvas.DisplayScale.set -> void +Microsoft.Maui.Graphics.PictureCanvas.Dispose() -> void +Microsoft.Maui.Graphics.PictureCanvas.DrawArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) -> void +Microsoft.Maui.Graphics.PictureCanvas.DrawEllipse(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.PictureCanvas.DrawLine(float x1, float y1, float x2, float y2) -> void +Microsoft.Maui.Graphics.PictureCanvas.DrawRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.PictureCanvas.DrawRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +Microsoft.Maui.Graphics.PictureCanvas.FillArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise) -> void +Microsoft.Maui.Graphics.PictureCanvas.FillEllipse(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.PictureCanvas.FillRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.PictureCanvas.FillRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +Microsoft.Maui.Graphics.PictureCanvas.FontSize.set -> void +Microsoft.Maui.Graphics.PictureCanvas.MiterLimit.set -> void +Microsoft.Maui.Graphics.PictureCanvas.PictureCanvas(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.PictureCanvas.ResetState() -> void +Microsoft.Maui.Graphics.PictureCanvas.RestoreState() -> bool +Microsoft.Maui.Graphics.PictureCanvas.Rotate(float degrees) -> void +Microsoft.Maui.Graphics.PictureCanvas.Rotate(float degrees, float x, float y) -> void +Microsoft.Maui.Graphics.PictureCanvas.SaveState() -> void +Microsoft.Maui.Graphics.PictureCanvas.Scale(float sx, float sy) -> void +Microsoft.Maui.Graphics.PictureCanvas.StrokeDashOffset.set -> void +Microsoft.Maui.Graphics.PictureCanvas.StrokeLineCap.set -> void +Microsoft.Maui.Graphics.PictureCanvas.StrokeLineJoin.set -> void +Microsoft.Maui.Graphics.PictureCanvas.StrokeSize.set -> void +Microsoft.Maui.Graphics.PictureCanvas.SubtractFromClip(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.PictureCanvas.Translate(float tx, float ty) -> void +Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.Alpha = 71 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.BlendMode = 72 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.BoldSystemFont = 111 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.ClipPath = 81 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.ClipRectangle = 82 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.ConcatenateTransform = 64 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawArc = 6 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawEllipse = 3 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawImage = 5 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawLine = 0 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawPath = 4 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawPdfPage = 7 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawRectangle = 1 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawRoundedRectangle = 2 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawStringAtPoint = 20 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawStringInPath = 22 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawStringInRect = 21 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.DrawTextInRect = 25 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillArc = 14 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillColor = 40 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillEllipse = 12 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillPaint = 41 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillPath = 13 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillPath2 = 15 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillRectangle = 10 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FillRoundedRectangle = 11 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FontColor = 50 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FontName = 51 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.FontSize = 52 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.LimitStrokeScaling = 37 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.ResetState = 102 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.RestoreState = 101 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.Rotate = 62 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.RotateAtPoint = 63 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.SaveState = 100 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.Scale = 60 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.Shadow = 70 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeBrush = 39 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeColor = 31 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeDashPattern = 32 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeLimit = 38 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeLineCap = 33 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeLineJoin = 34 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeLocation = 35 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeMiterLimit = 36 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.StrokeSize = 30 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.SubtractFromClip = 80 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.SubtractPathFromClip = 83 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.SystemFont = 110 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureCommand.Translate = 61 -> Microsoft.Maui.Graphics.PictureCommand +Microsoft.Maui.Graphics.PictureExtensions +Microsoft.Maui.Graphics.PicturePattern +Microsoft.Maui.Graphics.PictureReaderExtensions +Microsoft.Maui.Graphics.PictureWriterExtensions +Microsoft.Maui.Graphics.Platform.PlatformImage +Microsoft.Maui.Graphics.Platform.PlatformImage.Dispose() -> void +Microsoft.Maui.Graphics.Platform.PlatformImage.Height.get -> float +Microsoft.Maui.Graphics.Platform.PlatformImage.Width.get -> float +Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.Point.Deconstruct(out double x, out double y) -> void +Microsoft.Maui.Graphics.Point.Distance(Microsoft.Maui.Graphics.Point other) -> double +Microsoft.Maui.Graphics.Point.IsEmpty.get -> bool +Microsoft.Maui.Graphics.Point.Offset(double dx, double dy) -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.Point.Point() -> void +Microsoft.Maui.Graphics.Point.Point(double x, double y) -> void +Microsoft.Maui.Graphics.Point.Point(Microsoft.Maui.Graphics.Size sz) -> void +Microsoft.Maui.Graphics.Point.Point(Microsoft.Maui.Graphics.SizeF sz) -> void +Microsoft.Maui.Graphics.Point.Point(System.Numerics.Vector2 v) -> void +Microsoft.Maui.Graphics.Point.Round() -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.Point.X.get -> double +Microsoft.Maui.Graphics.Point.X.set -> void +Microsoft.Maui.Graphics.Point.Y.get -> double +Microsoft.Maui.Graphics.Point.Y.set -> void +Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PointF.Deconstruct(out float x, out float y) -> void +Microsoft.Maui.Graphics.PointF.Distance(Microsoft.Maui.Graphics.PointF other) -> float +Microsoft.Maui.Graphics.PointF.IsEmpty.get -> bool +Microsoft.Maui.Graphics.PointF.Offset(float dx, float dy) -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PointF.PointF() -> void +Microsoft.Maui.Graphics.PointF.PointF(float x, float y) -> void +Microsoft.Maui.Graphics.PointF.PointF(Microsoft.Maui.Graphics.SizeF sz) -> void +Microsoft.Maui.Graphics.PointF.PointF(System.Numerics.Vector2 v) -> void +Microsoft.Maui.Graphics.PointF.Round() -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PointF.TransformBy(in System.Numerics.Matrix3x2 transform) -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.PointF.X.get -> float +Microsoft.Maui.Graphics.PointF.X.set -> void +Microsoft.Maui.Graphics.PointF.Y.get -> float +Microsoft.Maui.Graphics.PointF.Y.set -> void +Microsoft.Maui.Graphics.RadialGradientPaint +Microsoft.Maui.Graphics.RadialGradientPaint.Center.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.RadialGradientPaint.Center.set -> void +Microsoft.Maui.Graphics.RadialGradientPaint.RadialGradientPaint() -> void +Microsoft.Maui.Graphics.RadialGradientPaint.RadialGradientPaint(Microsoft.Maui.Graphics.Point center, double radius) -> void +Microsoft.Maui.Graphics.RadialGradientPaint.Radius.get -> double +Microsoft.Maui.Graphics.RadialGradientPaint.Radius.set -> void +Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.Bottom.get -> double +Microsoft.Maui.Graphics.Rect.Bottom.set -> void +Microsoft.Maui.Graphics.Rect.Center.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.Rect.Contains(double x, double y) -> bool +Microsoft.Maui.Graphics.Rect.Contains(Microsoft.Maui.Graphics.Point pt) -> bool +Microsoft.Maui.Graphics.Rect.Contains(Microsoft.Maui.Graphics.Rect rect) -> bool +Microsoft.Maui.Graphics.Rect.Deconstruct(out double x, out double y, out double width, out double height) -> void +Microsoft.Maui.Graphics.Rect.Equals(Microsoft.Maui.Graphics.Rect other) -> bool +Microsoft.Maui.Graphics.Rect.Height.get -> double +Microsoft.Maui.Graphics.Rect.Height.set -> void +Microsoft.Maui.Graphics.Rect.Inflate(double width, double height) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.Inflate(Microsoft.Maui.Graphics.Size sz) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.Intersect(Microsoft.Maui.Graphics.Rect r) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.IntersectsWith(Microsoft.Maui.Graphics.Rect r) -> bool +Microsoft.Maui.Graphics.Rect.IsEmpty.get -> bool +Microsoft.Maui.Graphics.Rect.Left.get -> double +Microsoft.Maui.Graphics.Rect.Left.set -> void +Microsoft.Maui.Graphics.Rect.Location.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Graphics.Rect.Location.set -> void +Microsoft.Maui.Graphics.Rect.Offset(double dx, double dy) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.Offset(Microsoft.Maui.Graphics.Point dr) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.Rect() -> void +Microsoft.Maui.Graphics.Rect.Rect(double x, double y, double width, double height) -> void +Microsoft.Maui.Graphics.Rect.Rect(Microsoft.Maui.Graphics.Point loc, Microsoft.Maui.Graphics.Size sz) -> void +Microsoft.Maui.Graphics.Rect.Right.get -> double +Microsoft.Maui.Graphics.Rect.Right.set -> void +Microsoft.Maui.Graphics.Rect.Round() -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.Size.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Graphics.Rect.Size.set -> void +Microsoft.Maui.Graphics.Rect.Top.get -> double +Microsoft.Maui.Graphics.Rect.Top.set -> void +Microsoft.Maui.Graphics.Rect.Union(Microsoft.Maui.Graphics.Rect r) -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Graphics.Rect.Width.get -> double +Microsoft.Maui.Graphics.Rect.Width.set -> void +Microsoft.Maui.Graphics.Rect.X.get -> double +Microsoft.Maui.Graphics.Rect.X.set -> void +Microsoft.Maui.Graphics.Rect.Y.get -> double +Microsoft.Maui.Graphics.Rect.Y.set -> void +Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.Bottom.get -> float +Microsoft.Maui.Graphics.RectF.Bottom.set -> void +Microsoft.Maui.Graphics.RectF.Center.get -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.RectF.Contains(float x, float y) -> bool +Microsoft.Maui.Graphics.RectF.Contains(Microsoft.Maui.Graphics.PointF pt) -> bool +Microsoft.Maui.Graphics.RectF.Contains(Microsoft.Maui.Graphics.RectF rect) -> bool +Microsoft.Maui.Graphics.RectF.Deconstruct(out float x, out float y, out float width, out float height) -> void +Microsoft.Maui.Graphics.RectF.Equals(Microsoft.Maui.Graphics.RectF other) -> bool +Microsoft.Maui.Graphics.RectF.Height.get -> float +Microsoft.Maui.Graphics.RectF.Height.set -> void +Microsoft.Maui.Graphics.RectF.Inflate(float width, float height) -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.Inflate(Microsoft.Maui.Graphics.SizeF sz) -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.Intersect(Microsoft.Maui.Graphics.RectF r) -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.IntersectsWith(Microsoft.Maui.Graphics.RectF r) -> bool +Microsoft.Maui.Graphics.RectF.IsEmpty.get -> bool +Microsoft.Maui.Graphics.RectF.Left.get -> float +Microsoft.Maui.Graphics.RectF.Left.set -> void +Microsoft.Maui.Graphics.RectF.Location.get -> Microsoft.Maui.Graphics.PointF +Microsoft.Maui.Graphics.RectF.Location.set -> void +Microsoft.Maui.Graphics.RectF.Offset(float dx, float dy) -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.Offset(Microsoft.Maui.Graphics.PointF dr) -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.RectF() -> void +Microsoft.Maui.Graphics.RectF.RectF(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.RectF.RectF(Microsoft.Maui.Graphics.PointF loc, Microsoft.Maui.Graphics.SizeF sz) -> void +Microsoft.Maui.Graphics.RectF.Right.get -> float +Microsoft.Maui.Graphics.RectF.Right.set -> void +Microsoft.Maui.Graphics.RectF.Round() -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.Size.get -> Microsoft.Maui.Graphics.SizeF +Microsoft.Maui.Graphics.RectF.Size.set -> void +Microsoft.Maui.Graphics.RectF.Top.get -> float +Microsoft.Maui.Graphics.RectF.Top.set -> void +Microsoft.Maui.Graphics.RectF.Union(Microsoft.Maui.Graphics.RectF r) -> Microsoft.Maui.Graphics.RectF +Microsoft.Maui.Graphics.RectF.Width.get -> float +Microsoft.Maui.Graphics.RectF.Width.set -> void +Microsoft.Maui.Graphics.RectF.X.get -> float +Microsoft.Maui.Graphics.RectF.X.set -> void +Microsoft.Maui.Graphics.RectF.Y.get -> float +Microsoft.Maui.Graphics.RectF.Y.set -> void +Microsoft.Maui.Graphics.ResizeMode +Microsoft.Maui.Graphics.ResizeMode.Bleed = 1 -> Microsoft.Maui.Graphics.ResizeMode +Microsoft.Maui.Graphics.ResizeMode.Fit = 0 -> Microsoft.Maui.Graphics.ResizeMode +Microsoft.Maui.Graphics.ResizeMode.Stretch = 2 -> Microsoft.Maui.Graphics.ResizeMode +Microsoft.Maui.Graphics.ScalingCanvas +Microsoft.Maui.Graphics.ScalingCanvas.Alpha.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.Antialias.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.BlendMode.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.ClipRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ScalingCanvas.ConcatenateTransform(System.Numerics.Matrix3x2 transform) -> void +Microsoft.Maui.Graphics.ScalingCanvas.DisplayScale.get -> float +Microsoft.Maui.Graphics.ScalingCanvas.DisplayScale.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.DrawArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) -> void +Microsoft.Maui.Graphics.ScalingCanvas.DrawEllipse(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ScalingCanvas.DrawLine(float x1, float y1, float x2, float y2) -> void +Microsoft.Maui.Graphics.ScalingCanvas.DrawRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ScalingCanvas.DrawRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +Microsoft.Maui.Graphics.ScalingCanvas.FillArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise) -> void +Microsoft.Maui.Graphics.ScalingCanvas.FillEllipse(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ScalingCanvas.FillRectangle(float x, float y, float width, float height) -> void +Microsoft.Maui.Graphics.ScalingCanvas.FillRoundedRectangle(float x, float y, float width, float height, float cornerRadius) -> void +Microsoft.Maui.Graphics.ScalingCanvas.FontSize.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.GetScale() -> float +Microsoft.Maui.Graphics.ScalingCanvas.MiterLimit.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.ResetState() -> void +Microsoft.Maui.Graphics.ScalingCanvas.RestoreState() -> bool +Microsoft.Maui.Graphics.ScalingCanvas.Rotate(float degrees) -> void +Microsoft.Maui.Graphics.ScalingCanvas.Rotate(float degrees, float x, float y) -> void +Microsoft.Maui.Graphics.ScalingCanvas.SaveState() -> void +Microsoft.Maui.Graphics.ScalingCanvas.Scale(float sx, float sy) -> void +Microsoft.Maui.Graphics.ScalingCanvas.SetBlur(float blurRadius) -> void +Microsoft.Maui.Graphics.ScalingCanvas.StrokeDashOffset.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.StrokeLineCap.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.StrokeLineJoin.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.StrokeSize.set -> void +Microsoft.Maui.Graphics.ScalingCanvas.SubtractFromClip(float x1, float y1, float x2, float y2) -> void +Microsoft.Maui.Graphics.ScalingCanvas.Translate(float tx, float ty) -> void +Microsoft.Maui.Graphics.Size +Microsoft.Maui.Graphics.Size.Deconstruct(out double width, out double height) -> void +Microsoft.Maui.Graphics.Size.Equals(Microsoft.Maui.Graphics.Size other) -> bool +Microsoft.Maui.Graphics.Size.Height.get -> double +Microsoft.Maui.Graphics.Size.Height.set -> void +Microsoft.Maui.Graphics.Size.IsZero.get -> bool +Microsoft.Maui.Graphics.Size.Size() -> void +Microsoft.Maui.Graphics.Size.Size(double size = 0) -> void +Microsoft.Maui.Graphics.Size.Size(double width, double height) -> void +Microsoft.Maui.Graphics.Size.Size(System.Numerics.Vector2 vector) -> void +Microsoft.Maui.Graphics.Size.Width.get -> double +Microsoft.Maui.Graphics.Size.Width.set -> void +Microsoft.Maui.Graphics.SizeF +Microsoft.Maui.Graphics.SizeF.Deconstruct(out float width, out float height) -> void +Microsoft.Maui.Graphics.SizeF.Equals(Microsoft.Maui.Graphics.SizeF other) -> bool +Microsoft.Maui.Graphics.SizeF.Height.get -> float +Microsoft.Maui.Graphics.SizeF.Height.set -> void +Microsoft.Maui.Graphics.SizeF.IsZero.get -> bool +Microsoft.Maui.Graphics.SizeF.SizeF() -> void +Microsoft.Maui.Graphics.SizeF.SizeF(float size = 0) -> void +Microsoft.Maui.Graphics.SizeF.SizeF(float width, float height) -> void +Microsoft.Maui.Graphics.SizeF.SizeF(System.Numerics.Vector2 vector) -> void +Microsoft.Maui.Graphics.SizeF.TransformNormalBy(in System.Numerics.Matrix3x2 transform) -> Microsoft.Maui.Graphics.SizeF +Microsoft.Maui.Graphics.SizeF.Width.get -> float +Microsoft.Maui.Graphics.SizeF.Width.set -> void +Microsoft.Maui.Graphics.SolidPaint +Microsoft.Maui.Graphics.SolidPaint.SolidPaint() -> void +Microsoft.Maui.Graphics.StandardPicture +Microsoft.Maui.Graphics.StandardPicture.Height.get -> float +Microsoft.Maui.Graphics.StandardPicture.Width.get -> float +Microsoft.Maui.Graphics.StandardPicture.X.get -> float +Microsoft.Maui.Graphics.StandardPicture.Y.get -> float +Microsoft.Maui.Graphics.StandardTextAttributes +Microsoft.Maui.Graphics.StandardTextAttributes.FontSize.get -> float +Microsoft.Maui.Graphics.StandardTextAttributes.FontSize.set -> void +Microsoft.Maui.Graphics.StandardTextAttributes.HorizontalAlignment.get -> Microsoft.Maui.Graphics.HorizontalAlignment +Microsoft.Maui.Graphics.StandardTextAttributes.HorizontalAlignment.set -> void +Microsoft.Maui.Graphics.StandardTextAttributes.Margin.get -> float +Microsoft.Maui.Graphics.StandardTextAttributes.Margin.set -> void +Microsoft.Maui.Graphics.StandardTextAttributes.StandardTextAttributes() -> void +Microsoft.Maui.Graphics.StandardTextAttributes.VerticalAlignment.get -> Microsoft.Maui.Graphics.VerticalAlignment +Microsoft.Maui.Graphics.StandardTextAttributes.VerticalAlignment.set -> void +Microsoft.Maui.Graphics.Text.AbstractAttributedText +Microsoft.Maui.Graphics.Text.AbstractAttributedText.AbstractAttributedText() -> void +Microsoft.Maui.Graphics.Text.AbstractAttributedText.Optimal.get -> bool +Microsoft.Maui.Graphics.Text.AbstractAttributedText.Optimal.set -> void +Microsoft.Maui.Graphics.Text.AttributedText +Microsoft.Maui.Graphics.Text.AttributedTextBlock +Microsoft.Maui.Graphics.Text.AttributedTextExtensions +Microsoft.Maui.Graphics.Text.AttributedTextRun +Microsoft.Maui.Graphics.Text.AttributedTextRun.Length.get -> int +Microsoft.Maui.Graphics.Text.AttributedTextRun.Start.get -> int +Microsoft.Maui.Graphics.Text.AttributedTextRunComparer +Microsoft.Maui.Graphics.Text.AttributedTextRunComparer.AttributedTextRunComparer() -> void +Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions +Microsoft.Maui.Graphics.Text.CountingWriter +Microsoft.Maui.Graphics.Text.CountingWriter.Count.get -> int +Microsoft.Maui.Graphics.Text.IAttributedText +Microsoft.Maui.Graphics.Text.IAttributedTextRun +Microsoft.Maui.Graphics.Text.IAttributedTextRun.Length.get -> int +Microsoft.Maui.Graphics.Text.IAttributedTextRun.Start.get -> int +Microsoft.Maui.Graphics.Text.ITextAttributes +Microsoft.Maui.Graphics.Text.MarkerType +Microsoft.Maui.Graphics.Text.MarkerType.ClosedCircle = 0 -> Microsoft.Maui.Graphics.Text.MarkerType +Microsoft.Maui.Graphics.Text.MarkerType.Hyphen = 2 -> Microsoft.Maui.Graphics.Text.MarkerType +Microsoft.Maui.Graphics.Text.MarkerType.OpenCircle = 1 -> Microsoft.Maui.Graphics.Text.MarkerType +Microsoft.Maui.Graphics.Text.MutableAttributedText +Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Background = 9 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Bold = 2 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Color = 8 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.FontName = 0 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.FontSize = 1 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Italic = 3 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Marker = 11 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Strikethrough = 5 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Subscript = 6 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Superscript = 7 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.Underline = 4 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttribute.UnorderedList = 10 -> Microsoft.Maui.Graphics.Text.TextAttribute +Microsoft.Maui.Graphics.Text.TextAttributeExtensions +Microsoft.Maui.Graphics.Text.TextAttributes +Microsoft.Maui.Graphics.Text.TextAttributes.TextAttributes() -> void +Microsoft.Maui.Graphics.Text.TextAttributesExtensions +Microsoft.Maui.Graphics.Text.TextColors +Microsoft.Maui.Graphics.Text.XmlAttributedTextReader +Microsoft.Maui.Graphics.Text.XmlAttributedTextReader.ElementEnded() -> void +Microsoft.Maui.Graphics.Text.XmlAttributedTextReader.ElementStarted() -> void +Microsoft.Maui.Graphics.Text.XmlAttributedTextReader.XmlAttributedTextReader() -> void +Microsoft.Maui.Graphics.Text.XmlAttributedTextWriter +Microsoft.Maui.Graphics.Text.XmlAttributedTextWriter.XmlAttributedTextWriter() -> void +Microsoft.Maui.Graphics.TextFlow +Microsoft.Maui.Graphics.TextFlow.ClipBounds = 0 -> Microsoft.Maui.Graphics.TextFlow +Microsoft.Maui.Graphics.TextFlow.OverflowBounds = 1 -> Microsoft.Maui.Graphics.TextFlow +Microsoft.Maui.Graphics.VerticalAlignment +Microsoft.Maui.Graphics.VerticalAlignment.Bottom = 2 -> Microsoft.Maui.Graphics.VerticalAlignment +Microsoft.Maui.Graphics.VerticalAlignment.Center = 1 -> Microsoft.Maui.Graphics.VerticalAlignment +Microsoft.Maui.Graphics.VerticalAlignment.Top = 0 -> Microsoft.Maui.Graphics.VerticalAlignment +Microsoft.Maui.Graphics.WindingMode +Microsoft.Maui.Graphics.WindingMode.EvenOdd = 1 -> Microsoft.Maui.Graphics.WindingMode +Microsoft.Maui.Graphics.WindingMode.NonZero = 0 -> Microsoft.Maui.Graphics.WindingMode +Microsoft.Maui.Graphics.XmlnsPrefixAttribute +override Microsoft.Maui.Graphics.Color.GetHashCode() -> int +override Microsoft.Maui.Graphics.Font.GetHashCode() -> int +override Microsoft.Maui.Graphics.FontSource.Equals(object? obj) -> bool +override Microsoft.Maui.Graphics.FontSource.GetHashCode() -> int +override Microsoft.Maui.Graphics.GradientPaint.IsTransparent.get -> bool +override Microsoft.Maui.Graphics.ImagePaint.IsTransparent.get -> bool +override Microsoft.Maui.Graphics.Insets.GetHashCode() -> int +override Microsoft.Maui.Graphics.InsetsF.GetHashCode() -> int +override Microsoft.Maui.Graphics.PathF.GetHashCode() -> int +override Microsoft.Maui.Graphics.PatternPaint.IsTransparent.get -> bool +override Microsoft.Maui.Graphics.Point.GetHashCode() -> int +override Microsoft.Maui.Graphics.PointF.GetHashCode() -> int +override Microsoft.Maui.Graphics.Rect.GetHashCode() -> int +override Microsoft.Maui.Graphics.RectF.GetHashCode() -> int +override Microsoft.Maui.Graphics.Size.GetHashCode() -> int +override Microsoft.Maui.Graphics.SizeF.GetHashCode() -> int +override Microsoft.Maui.Graphics.SolidPaint.IsTransparent.get -> bool +override Microsoft.Maui.Graphics.Text.CountingWriter.Write(char value) -> void +readonly Microsoft.Maui.Graphics.Color.Alpha -> float +readonly Microsoft.Maui.Graphics.Color.Blue -> float +readonly Microsoft.Maui.Graphics.Color.Green -> float +readonly Microsoft.Maui.Graphics.Color.Red -> float +readonly Microsoft.Maui.Graphics.FontSource.FontStyleType -> Microsoft.Maui.Graphics.FontStyleType +readonly Microsoft.Maui.Graphics.FontSource.Name -> string! +readonly Microsoft.Maui.Graphics.FontSource.Weight -> int +static Microsoft.Maui.Graphics.CanvasState.GetLengthScale(System.Numerics.Matrix3x2 matrix) -> float +static Microsoft.Maui.Graphics.Font.Default.get -> Microsoft.Maui.Graphics.Font +static Microsoft.Maui.Graphics.Font.DefaultBold.get -> Microsoft.Maui.Graphics.Font +static Microsoft.Maui.Graphics.Font.operator !=(Microsoft.Maui.Graphics.Font left, Microsoft.Maui.Graphics.Font right) -> bool +static Microsoft.Maui.Graphics.Font.operator ==(Microsoft.Maui.Graphics.Font left, Microsoft.Maui.Graphics.Font right) -> bool +static Microsoft.Maui.Graphics.FontSource.operator !=(Microsoft.Maui.Graphics.FontSource left, Microsoft.Maui.Graphics.FontSource right) -> bool +static Microsoft.Maui.Graphics.FontSource.operator ==(Microsoft.Maui.Graphics.FontSource left, Microsoft.Maui.Graphics.FontSource right) -> bool +static Microsoft.Maui.Graphics.GeometryUtil.DegreesToRadians(double angle) -> double +static Microsoft.Maui.Graphics.GeometryUtil.DegreesToRadians(float angle) -> float +static Microsoft.Maui.Graphics.GeometryUtil.EllipseAngleToPoint(float x, float y, float width, float height, float angleInDegrees) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.GeometryUtil.GetAngleAsDegrees(float x1, float y1, float x2, float y2) -> float +static Microsoft.Maui.Graphics.GeometryUtil.GetDistance(float x1, float y1, float x2, float y2) -> float +static Microsoft.Maui.Graphics.GeometryUtil.GetFactor(float aMin, float aMax, float aValue) -> float +static Microsoft.Maui.Graphics.GeometryUtil.GetLinearValue(float aMin, float aMax, float aFactor) -> float +static Microsoft.Maui.Graphics.GeometryUtil.GetOppositePoint(Microsoft.Maui.Graphics.PointF pivot, Microsoft.Maui.Graphics.PointF oppositePoint) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.GeometryUtil.GetSweep(float angle1, float angle2, bool clockwise) -> float +static Microsoft.Maui.Graphics.GeometryUtil.IsLineIntersectingLine(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) -> bool +static Microsoft.Maui.Graphics.GeometryUtil.PolarToPoint(float angleInRadians, float fx, float fy) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.GeometryUtil.RadiansToDegrees(double angle) -> double +static Microsoft.Maui.Graphics.GeometryUtil.RadiansToDegrees(float angle) -> float +static Microsoft.Maui.Graphics.GeometryUtil.RotatePoint(Microsoft.Maui.Graphics.PointF center, Microsoft.Maui.Graphics.PointF point, float angle) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.GeometryUtil.RotatePoint(Microsoft.Maui.Graphics.PointF point, float angle) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.Point.explicit operator Microsoft.Maui.Graphics.Size(Microsoft.Maui.Graphics.Point pt) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Graphics.Point.implicit operator Microsoft.Maui.Graphics.Point(System.Numerics.Vector2 v) -> Microsoft.Maui.Graphics.Point +static Microsoft.Maui.Graphics.Point.implicit operator Microsoft.Maui.Graphics.PointF(Microsoft.Maui.Graphics.Point p) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.Point.operator !=(Microsoft.Maui.Graphics.Point ptA, Microsoft.Maui.Graphics.Point ptB) -> bool +static Microsoft.Maui.Graphics.Point.operator +(Microsoft.Maui.Graphics.Point pt, Microsoft.Maui.Graphics.SizeF sz) -> Microsoft.Maui.Graphics.Point +static Microsoft.Maui.Graphics.Point.operator -(Microsoft.Maui.Graphics.Point pt, Microsoft.Maui.Graphics.SizeF sz) -> Microsoft.Maui.Graphics.Point +static Microsoft.Maui.Graphics.Point.operator -(Microsoft.Maui.Graphics.Point ptA, Microsoft.Maui.Graphics.Point ptB) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Graphics.Point.operator ==(Microsoft.Maui.Graphics.Point ptA, Microsoft.Maui.Graphics.Point ptB) -> bool +static Microsoft.Maui.Graphics.Point.Zero -> Microsoft.Maui.Graphics.Point +static Microsoft.Maui.Graphics.PointF.explicit operator Microsoft.Maui.Graphics.SizeF(Microsoft.Maui.Graphics.PointF pt) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.PointF.explicit operator System.Numerics.Vector2(Microsoft.Maui.Graphics.PointF p) -> System.Numerics.Vector2 +static Microsoft.Maui.Graphics.PointF.implicit operator Microsoft.Maui.Graphics.Point(Microsoft.Maui.Graphics.PointF p) -> Microsoft.Maui.Graphics.Point +static Microsoft.Maui.Graphics.PointF.implicit operator Microsoft.Maui.Graphics.PointF(System.Numerics.Vector2 v) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.PointF.operator !=(Microsoft.Maui.Graphics.PointF ptA, Microsoft.Maui.Graphics.PointF ptB) -> bool +static Microsoft.Maui.Graphics.PointF.operator +(Microsoft.Maui.Graphics.PointF pt, Microsoft.Maui.Graphics.SizeF sz) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.PointF.operator -(Microsoft.Maui.Graphics.PointF pt, Microsoft.Maui.Graphics.SizeF sz) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.PointF.operator -(Microsoft.Maui.Graphics.PointF ptA, Microsoft.Maui.Graphics.PointF ptB) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.PointF.operator ==(Microsoft.Maui.Graphics.PointF ptA, Microsoft.Maui.Graphics.PointF ptB) -> bool +static Microsoft.Maui.Graphics.Rect.FromLTRB(double left, double top, double right, double bottom) -> Microsoft.Maui.Graphics.Rect +static Microsoft.Maui.Graphics.Rect.implicit operator Microsoft.Maui.Graphics.RectF(Microsoft.Maui.Graphics.Rect rect) -> Microsoft.Maui.Graphics.RectF +static Microsoft.Maui.Graphics.Rect.Intersect(Microsoft.Maui.Graphics.Rect r1, Microsoft.Maui.Graphics.Rect r2) -> Microsoft.Maui.Graphics.Rect +static Microsoft.Maui.Graphics.Rect.operator !=(Microsoft.Maui.Graphics.Rect r1, Microsoft.Maui.Graphics.Rect r2) -> bool +static Microsoft.Maui.Graphics.Rect.operator ==(Microsoft.Maui.Graphics.Rect r1, Microsoft.Maui.Graphics.Rect r2) -> bool +static Microsoft.Maui.Graphics.Rect.Union(Microsoft.Maui.Graphics.Rect r1, Microsoft.Maui.Graphics.Rect r2) -> Microsoft.Maui.Graphics.Rect +static Microsoft.Maui.Graphics.Rect.Zero -> Microsoft.Maui.Graphics.Rect +static Microsoft.Maui.Graphics.RectF.FromLTRB(float left, float top, float right, float bottom) -> Microsoft.Maui.Graphics.RectF +static Microsoft.Maui.Graphics.RectF.implicit operator Microsoft.Maui.Graphics.Rect(Microsoft.Maui.Graphics.RectF rect) -> Microsoft.Maui.Graphics.Rect +static Microsoft.Maui.Graphics.RectF.Intersect(Microsoft.Maui.Graphics.RectF r1, Microsoft.Maui.Graphics.RectF r2) -> Microsoft.Maui.Graphics.RectF +static Microsoft.Maui.Graphics.RectF.operator !=(Microsoft.Maui.Graphics.RectF r1, Microsoft.Maui.Graphics.RectF r2) -> bool +static Microsoft.Maui.Graphics.RectF.operator ==(Microsoft.Maui.Graphics.RectF r1, Microsoft.Maui.Graphics.RectF r2) -> bool +static Microsoft.Maui.Graphics.RectF.Union(Microsoft.Maui.Graphics.RectF r1, Microsoft.Maui.Graphics.RectF r2) -> Microsoft.Maui.Graphics.RectF +static Microsoft.Maui.Graphics.RectF.Zero -> Microsoft.Maui.Graphics.RectF +static Microsoft.Maui.Graphics.Size.explicit operator Microsoft.Maui.Graphics.Point(Microsoft.Maui.Graphics.Size size) -> Microsoft.Maui.Graphics.Point +static Microsoft.Maui.Graphics.Size.implicit operator Microsoft.Maui.Graphics.SizeF(Microsoft.Maui.Graphics.Size s) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.Size.operator !=(Microsoft.Maui.Graphics.Size s1, Microsoft.Maui.Graphics.Size s2) -> bool +static Microsoft.Maui.Graphics.Size.operator *(Microsoft.Maui.Graphics.Size s1, double value) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Graphics.Size.operator +(Microsoft.Maui.Graphics.Size s1, Microsoft.Maui.Graphics.Size s2) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Graphics.Size.operator -(Microsoft.Maui.Graphics.Size s1, Microsoft.Maui.Graphics.Size s2) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Graphics.Size.operator /(Microsoft.Maui.Graphics.Size s1, double value) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Graphics.Size.operator ==(Microsoft.Maui.Graphics.Size s1, Microsoft.Maui.Graphics.Size s2) -> bool +static Microsoft.Maui.Graphics.SizeF.explicit operator Microsoft.Maui.Graphics.PointF(Microsoft.Maui.Graphics.SizeF size) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.SizeF.explicit operator Microsoft.Maui.Graphics.SizeF(System.Numerics.Vector2 size) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.SizeF.explicit operator System.Numerics.Vector2(Microsoft.Maui.Graphics.SizeF size) -> System.Numerics.Vector2 +static Microsoft.Maui.Graphics.SizeF.implicit operator Microsoft.Maui.Graphics.Size(Microsoft.Maui.Graphics.SizeF s) -> Microsoft.Maui.Graphics.Size +static Microsoft.Maui.Graphics.SizeF.operator !=(Microsoft.Maui.Graphics.SizeF s1, Microsoft.Maui.Graphics.SizeF s2) -> bool +static Microsoft.Maui.Graphics.SizeF.operator *(Microsoft.Maui.Graphics.SizeF s1, float value) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.SizeF.operator +(Microsoft.Maui.Graphics.SizeF s1, Microsoft.Maui.Graphics.SizeF s2) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.SizeF.operator -(Microsoft.Maui.Graphics.SizeF s1, Microsoft.Maui.Graphics.SizeF s2) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.SizeF.operator /(Microsoft.Maui.Graphics.SizeF s1, float value) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.SizeF.operator ==(Microsoft.Maui.Graphics.SizeF s1, Microsoft.Maui.Graphics.SizeF s2) -> bool +static readonly Microsoft.Maui.Graphics.CanvasDefaults.DefaultShadowOffset -> Microsoft.Maui.Graphics.SizeF +static readonly Microsoft.Maui.Graphics.PointF.Zero -> Microsoft.Maui.Graphics.PointF +static readonly Microsoft.Maui.Graphics.Size.Zero -> Microsoft.Maui.Graphics.Size +static readonly Microsoft.Maui.Graphics.SizeF.Zero -> Microsoft.Maui.Graphics.SizeF +virtual Microsoft.Maui.Graphics.AbstractCanvas.DisplayScale.get -> float +virtual Microsoft.Maui.Graphics.AbstractCanvas.DisplayScale.set -> void +virtual Microsoft.Maui.Graphics.AbstractCanvas.Dispose() -> void +virtual Microsoft.Maui.Graphics.AbstractCanvas.ResetState() -> void +virtual Microsoft.Maui.Graphics.AbstractCanvas.RestoreState() -> bool +virtual Microsoft.Maui.Graphics.AbstractCanvas.SaveState() -> void +virtual Microsoft.Maui.Graphics.BitmapExportContext.Dispose() -> void +virtual Microsoft.Maui.Graphics.CanvasState.Dispose() -> void +virtual Microsoft.Maui.Graphics.CanvasState.TransformChanged() -> void +virtual Microsoft.Maui.Graphics.Paint.IsTransparent.get -> bool +~abstract Microsoft.Maui.Graphics.AbstractCanvas.ClipPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode = Microsoft.Maui.Graphics.WindingMode.NonZero) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.DrawImage(Microsoft.Maui.Graphics.IImage image, float x, float y, float width, float height) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.DrawString(string value, float x, float y, float width, float height, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, float lineSpacingAdjustment = 0) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.DrawString(string value, float x, float y, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.DrawText(Microsoft.Maui.Graphics.Text.IAttributedText value, float x, float y, float width, float height) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.FillColor.set -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.FillPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.Font.set -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.FontColor.set -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformDrawPath(Microsoft.Maui.Graphics.PathF path) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.PlatformSetStrokeDashPattern(float[] strokePattern, float strokeDashOffset, float strokeSize) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.SetFillPaint(Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.RectF rectangle) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.SetShadow(Microsoft.Maui.Graphics.SizeF offset, float blur, Microsoft.Maui.Graphics.Color color) -> void +~abstract Microsoft.Maui.Graphics.AbstractCanvas.StrokeColor.set -> void +~abstract Microsoft.Maui.Graphics.AbstractPattern.Draw(Microsoft.Maui.Graphics.ICanvas canvas) -> void +~abstract Microsoft.Maui.Graphics.BitmapExportContext.Canvas.get -> Microsoft.Maui.Graphics.ICanvas +~abstract Microsoft.Maui.Graphics.BitmapExportContext.Image.get -> Microsoft.Maui.Graphics.IImage +~abstract Microsoft.Maui.Graphics.BitmapExportContext.WriteToStream(System.IO.Stream stream) -> void +~abstract Microsoft.Maui.Graphics.Text.AbstractAttributedText.Runs.get -> System.Collections.Generic.IReadOnlyList +~abstract Microsoft.Maui.Graphics.Text.AbstractAttributedText.Text.get -> string +~Microsoft.Maui.Graphics.AbstractCanvas +~Microsoft.Maui.Graphics.AbstractCanvas.AbstractCanvas(Microsoft.Maui.Graphics.ICanvasStateService stateService, Microsoft.Maui.Graphics.IStringSizeService stringSizeService) -> void +~Microsoft.Maui.Graphics.AbstractCanvas.CurrentState.get -> TState +~Microsoft.Maui.Graphics.AbstractCanvas.DrawPath(Microsoft.Maui.Graphics.PathF path) -> void +~Microsoft.Maui.Graphics.AbstractCanvas.GetStringSize(string aString, Microsoft.Maui.Graphics.IFont font, float aFontSize, Microsoft.Maui.Graphics.HorizontalAlignment aHorizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment aVerticalAlignment) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.AbstractCanvas.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.AbstractCanvas.StrokeDashPattern.set -> void +~Microsoft.Maui.Graphics.CanvasState.CanvasState(Microsoft.Maui.Graphics.CanvasState prototype) -> void +~Microsoft.Maui.Graphics.CanvasState.StrokeDashPattern.get -> float[] +~Microsoft.Maui.Graphics.CanvasState.StrokeDashPattern.set -> void +~Microsoft.Maui.Graphics.Color.AddLuminosity(float delta) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Color.AsPaint() -> Microsoft.Maui.Graphics.Paint +~Microsoft.Maui.Graphics.Color.GetComplementary() -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Color.MultiplyAlpha(float multiplyBy) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Color.ToArgbHex(bool includeAlpha = false) -> string +~Microsoft.Maui.Graphics.Color.ToHex() -> string +~Microsoft.Maui.Graphics.Color.ToHex(bool includeAlpha) -> string +~Microsoft.Maui.Graphics.Color.ToRgbaHex(bool includeAlpha = false) -> string +~Microsoft.Maui.Graphics.Color.WithAlpha(float alpha) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Color.WithHue(float hue) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Color.WithLuminosity(float luminosity) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Color.WithSaturation(float saturation) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Font.Equals(Microsoft.Maui.Graphics.IFont other) -> bool +~Microsoft.Maui.Graphics.Font.Font(string name, int weight = 400, Microsoft.Maui.Graphics.FontStyleType styleType = Microsoft.Maui.Graphics.FontStyleType.Normal) -> void +~Microsoft.Maui.Graphics.Font.Name.get -> string +~Microsoft.Maui.Graphics.GradientPaint.AddOffset(float offset, Microsoft.Maui.Graphics.Color color) -> void +~Microsoft.Maui.Graphics.GradientPaint.BlendStartAndEndColors() -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.GradientPaint.BlendStartAndEndColors(Microsoft.Maui.Graphics.Color startColor, Microsoft.Maui.Graphics.Color endColor, float factor) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.GradientPaint.EndColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.GradientPaint.EndColor.set -> void +~Microsoft.Maui.Graphics.GradientPaint.GetColorAt(float offset) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.GradientPaint.GetSortedStops() -> Microsoft.Maui.Graphics.PaintGradientStop[] +~Microsoft.Maui.Graphics.GradientPaint.GradientPaint(Microsoft.Maui.Graphics.GradientPaint source) -> void +~Microsoft.Maui.Graphics.GradientPaint.GradientStops.get -> Microsoft.Maui.Graphics.PaintGradientStop[] +~Microsoft.Maui.Graphics.GradientPaint.GradientStops.set -> void +~Microsoft.Maui.Graphics.GradientPaint.SetGradientStops(float[] offsets, Microsoft.Maui.Graphics.Color[] colors) -> void +~Microsoft.Maui.Graphics.GradientPaint.StartColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.GradientPaint.StartColor.set -> void +~Microsoft.Maui.Graphics.IBitmapExportService.CreateContext(int width, int height, float displayScale = 1) -> Microsoft.Maui.Graphics.BitmapExportContext +~Microsoft.Maui.Graphics.ICanvas.ClipPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode = Microsoft.Maui.Graphics.WindingMode.NonZero) -> void +~Microsoft.Maui.Graphics.ICanvas.DrawImage(Microsoft.Maui.Graphics.IImage image, float x, float y, float width, float height) -> void +~Microsoft.Maui.Graphics.ICanvas.DrawPath(Microsoft.Maui.Graphics.PathF path) -> void +~Microsoft.Maui.Graphics.ICanvas.DrawString(string value, float x, float y, float width, float height, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, float lineSpacingAdjustment = 0) -> void +~Microsoft.Maui.Graphics.ICanvas.DrawString(string value, float x, float y, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment) -> void +~Microsoft.Maui.Graphics.ICanvas.DrawText(Microsoft.Maui.Graphics.Text.IAttributedText value, float x, float y, float width, float height) -> void +~Microsoft.Maui.Graphics.ICanvas.FillColor.set -> void +~Microsoft.Maui.Graphics.ICanvas.FillPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode) -> void +~Microsoft.Maui.Graphics.ICanvas.Font.set -> void +~Microsoft.Maui.Graphics.ICanvas.FontColor.set -> void +~Microsoft.Maui.Graphics.ICanvas.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.ICanvas.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.ICanvas.SetFillPaint(Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.RectF rectangle) -> void +~Microsoft.Maui.Graphics.ICanvas.SetShadow(Microsoft.Maui.Graphics.SizeF offset, float blur, Microsoft.Maui.Graphics.Color color) -> void +~Microsoft.Maui.Graphics.ICanvas.StrokeColor.set -> void +~Microsoft.Maui.Graphics.ICanvas.StrokeDashPattern.set -> void +~Microsoft.Maui.Graphics.ICanvasStateService +~Microsoft.Maui.Graphics.ICanvasStateService.CreateCopy(TState prototype) -> TState +~Microsoft.Maui.Graphics.ICanvasStateService.CreateNew(object context) -> TState +~Microsoft.Maui.Graphics.IDrawable.Draw(Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.RectF dirtyRect) -> void +~Microsoft.Maui.Graphics.IFont.Name.get -> string +~Microsoft.Maui.Graphics.IImage.Downsize(float maxWidth, float maxHeight, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.IImage.Downsize(float maxWidthOrHeight, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.IImage.Resize(float width, float height, Microsoft.Maui.Graphics.ResizeMode resizeMode = Microsoft.Maui.Graphics.ResizeMode.Fit, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.IImage.Save(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> void +~Microsoft.Maui.Graphics.IImage.SaveAsync(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> System.Threading.Tasks.Task +~Microsoft.Maui.Graphics.IImage.ToPlatformImage() -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.IImageLoadingService.FromStream(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.ImagePaint.Image.get -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.ImagePaint.Image.set -> void +~Microsoft.Maui.Graphics.Insets.Insets(Microsoft.Maui.Graphics.Insets insets) -> void +~Microsoft.Maui.Graphics.Insets.ToParsableString() -> string +~Microsoft.Maui.Graphics.InsetsF.InsetsF(Microsoft.Maui.Graphics.InsetsF insets) -> void +~Microsoft.Maui.Graphics.InsetsF.ToParsableString() -> string +~Microsoft.Maui.Graphics.IPattern.Draw(Microsoft.Maui.Graphics.ICanvas canvas) -> void +~Microsoft.Maui.Graphics.IPdfPage.Save(System.IO.Stream stream) -> void +~Microsoft.Maui.Graphics.IPdfPage.SaveAsync(System.IO.Stream stream) -> System.Threading.Tasks.Task +~Microsoft.Maui.Graphics.IPdfRenderService.CreatePage(System.IO.Stream stream, int pageNumber = -1) -> Microsoft.Maui.Graphics.IPdfPage +~Microsoft.Maui.Graphics.IPicture.Draw(Microsoft.Maui.Graphics.ICanvas canvas) -> void +~Microsoft.Maui.Graphics.IPictureReader.Read(byte[] data) -> Microsoft.Maui.Graphics.IPicture +~Microsoft.Maui.Graphics.IPictureWriter.Save(Microsoft.Maui.Graphics.IPicture picture, System.IO.Stream stream) -> void +~Microsoft.Maui.Graphics.IPictureWriter.SaveAsync(Microsoft.Maui.Graphics.IPicture picture, System.IO.Stream stream) -> System.Threading.Tasks.Task +~Microsoft.Maui.Graphics.IStringSizeService.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.IStringSizeService.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.ITextAttributes.Font.get -> Microsoft.Maui.Graphics.IFont +~Microsoft.Maui.Graphics.ITextAttributes.Font.set -> void +~Microsoft.Maui.Graphics.ITextAttributes.TextFontColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.ITextAttributes.TextFontColor.set -> void +~Microsoft.Maui.Graphics.LinearGradientPaint.LinearGradientPaint(Microsoft.Maui.Graphics.GradientPaint gradientPaint) -> void +~Microsoft.Maui.Graphics.LinearGradientPaint.LinearGradientPaint(Microsoft.Maui.Graphics.PaintGradientStop[] gradientStops) -> void +~Microsoft.Maui.Graphics.LinearGradientPaint.LinearGradientPaint(Microsoft.Maui.Graphics.PaintGradientStop[] gradientStops, Microsoft.Maui.Graphics.Point startPoint, Microsoft.Maui.Graphics.Point endPoint) -> void +~Microsoft.Maui.Graphics.Paint.BackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Paint.BackgroundColor.set -> void +~Microsoft.Maui.Graphics.Paint.ForegroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Paint.ForegroundColor.set -> void +~Microsoft.Maui.Graphics.PaintGradientStop.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.PaintGradientStop.Color.set -> void +~Microsoft.Maui.Graphics.PaintGradientStop.CompareTo(Microsoft.Maui.Graphics.PaintGradientStop obj) -> int +~Microsoft.Maui.Graphics.PaintGradientStop.PaintGradientStop(float offset, Microsoft.Maui.Graphics.Color color) -> void +~Microsoft.Maui.Graphics.PaintGradientStop.PaintGradientStop(Microsoft.Maui.Graphics.PaintGradientStop source) -> void +~Microsoft.Maui.Graphics.PaintPattern.Draw(Microsoft.Maui.Graphics.ICanvas canvas) -> void +~Microsoft.Maui.Graphics.PaintPattern.Paint.get -> Microsoft.Maui.Graphics.Paint +~Microsoft.Maui.Graphics.PaintPattern.Paint.set -> void +~Microsoft.Maui.Graphics.PaintPattern.PaintPattern(Microsoft.Maui.Graphics.IPattern pattern) -> void +~Microsoft.Maui.Graphics.PaintPattern.Wrapped.get -> Microsoft.Maui.Graphics.IPattern +~Microsoft.Maui.Graphics.PathBuilder.BuildPath(string pathAsString) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.AddArc(float x1, float y1, float x2, float y2, float startAngle, float endAngle, bool clockwise) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.AddArc(Microsoft.Maui.Graphics.PointF topLeft, Microsoft.Maui.Graphics.PointF bottomRight, float startAngle, float endAngle, bool clockwise) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.CurveTo(float c1X, float c1Y, float c2X, float c2Y, float x, float y) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.CurveTo(Microsoft.Maui.Graphics.PointF controlPoint1, Microsoft.Maui.Graphics.PointF controlPoint2, Microsoft.Maui.Graphics.PointF point) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.Equals(object obj, float epsilon) -> bool +~Microsoft.Maui.Graphics.PathF.GetFlattenedPath(float flatness = 0.001, bool includeSubPaths = false) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.GetPointsForSegment(int segmentIndex) -> Microsoft.Maui.Graphics.PointF[] +~Microsoft.Maui.Graphics.PathF.InsertCurveTo(Microsoft.Maui.Graphics.PointF controlPoint1, Microsoft.Maui.Graphics.PointF controlPoint2, Microsoft.Maui.Graphics.PointF point, int index) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.InsertLineTo(Microsoft.Maui.Graphics.PointF point, int index) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.InsertQuadTo(Microsoft.Maui.Graphics.PointF controlPoint, Microsoft.Maui.Graphics.PointF point, int index) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.LineTo(float x, float y) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.LineTo(Microsoft.Maui.Graphics.PointF point) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.MoveTo(float x, float y) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.MoveTo(Microsoft.Maui.Graphics.PointF point) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.PathF(Microsoft.Maui.Graphics.PathF path) -> void +~Microsoft.Maui.Graphics.PathF.PlatformPath.get -> object +~Microsoft.Maui.Graphics.PathF.PlatformPath.set -> void +~Microsoft.Maui.Graphics.PathF.Points.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Graphics.PathF.QuadTo(float cx, float cy, float x, float y) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.QuadTo(Microsoft.Maui.Graphics.PointF controlPoint, Microsoft.Maui.Graphics.PointF point) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.Reverse() -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.Rotate(float angleAsDegrees, Microsoft.Maui.Graphics.PointF pivot) -> Microsoft.Maui.Graphics.PathF +~Microsoft.Maui.Graphics.PathF.SegmentTypes.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Graphics.PathF.Separate() -> System.Collections.Generic.List +~Microsoft.Maui.Graphics.PatternPaint.Pattern.get -> Microsoft.Maui.Graphics.IPattern +~Microsoft.Maui.Graphics.PatternPaint.Pattern.set -> void +~Microsoft.Maui.Graphics.PictureCanvas.ClipPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode = Microsoft.Maui.Graphics.WindingMode.NonZero) -> void +~Microsoft.Maui.Graphics.PictureCanvas.DrawImage(Microsoft.Maui.Graphics.IImage image, float x, float y, float width, float height) -> void +~Microsoft.Maui.Graphics.PictureCanvas.DrawPath(Microsoft.Maui.Graphics.PathF path) -> void +~Microsoft.Maui.Graphics.PictureCanvas.DrawString(string value, float x, float y, float width, float height, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, float lineSpacingAdjustment = 0) -> void +~Microsoft.Maui.Graphics.PictureCanvas.DrawString(string value, float x, float y, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment) -> void +~Microsoft.Maui.Graphics.PictureCanvas.DrawText(Microsoft.Maui.Graphics.Text.IAttributedText value, float x, float y, float width, float height) -> void +~Microsoft.Maui.Graphics.PictureCanvas.FillColor.set -> void +~Microsoft.Maui.Graphics.PictureCanvas.FillPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode) -> void +~Microsoft.Maui.Graphics.PictureCanvas.Font.set -> void +~Microsoft.Maui.Graphics.PictureCanvas.FontColor.set -> void +~Microsoft.Maui.Graphics.PictureCanvas.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.PictureCanvas.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.PictureCanvas.Picture.get -> Microsoft.Maui.Graphics.IPicture +~Microsoft.Maui.Graphics.PictureCanvas.SetFillPaint(Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.PointF point1, Microsoft.Maui.Graphics.PointF point2) -> void +~Microsoft.Maui.Graphics.PictureCanvas.SetFillPaint(Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.RectF rectangle) -> void +~Microsoft.Maui.Graphics.PictureCanvas.SetShadow(Microsoft.Maui.Graphics.SizeF offset, float blur, Microsoft.Maui.Graphics.Color color) -> void +~Microsoft.Maui.Graphics.PictureCanvas.StrokeColor.set -> void +~Microsoft.Maui.Graphics.PictureCanvas.StrokeDashPattern.set -> void +~Microsoft.Maui.Graphics.PicturePattern.PicturePattern(Microsoft.Maui.Graphics.IPicture picture) -> void +~Microsoft.Maui.Graphics.PicturePattern.PicturePattern(Microsoft.Maui.Graphics.IPicture picture, float stepX, float stepY) -> void +~Microsoft.Maui.Graphics.Platform.PlatformImage.Bytes.get -> byte[] +~Microsoft.Maui.Graphics.Platform.PlatformImage.Downsize(float maxWidth, float maxHeight, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Platform.PlatformImage.Downsize(float maxWidthOrHeight, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Platform.PlatformImage.Draw(Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.RectF dirtyRect) -> void +~Microsoft.Maui.Graphics.Platform.PlatformImage.PlatformImage(byte[] bytes, Microsoft.Maui.Graphics.ImageFormat originalFormat = Microsoft.Maui.Graphics.ImageFormat.Png) -> void +~Microsoft.Maui.Graphics.Platform.PlatformImage.Resize(float width, float height, Microsoft.Maui.Graphics.ResizeMode resizeMode = Microsoft.Maui.Graphics.ResizeMode.Fit, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Platform.PlatformImage.Save(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> void +~Microsoft.Maui.Graphics.Platform.PlatformImage.SaveAsync(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> System.Threading.Tasks.Task +~Microsoft.Maui.Graphics.Platform.PlatformImage.ToPlatformImage() -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Point.Equals(object o, double epsilon) -> bool +~Microsoft.Maui.Graphics.PointF.Equals(object o, float epsilon) -> bool +~Microsoft.Maui.Graphics.RadialGradientPaint.RadialGradientPaint(Microsoft.Maui.Graphics.GradientPaint gradientPaint) -> void +~Microsoft.Maui.Graphics.RadialGradientPaint.RadialGradientPaint(Microsoft.Maui.Graphics.PaintGradientStop[] gradientStops) -> void +~Microsoft.Maui.Graphics.RadialGradientPaint.RadialGradientPaint(Microsoft.Maui.Graphics.PaintGradientStop[] gradientStops, Microsoft.Maui.Graphics.Point center, double radius) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.ClipPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode = Microsoft.Maui.Graphics.WindingMode.NonZero) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.DrawImage(Microsoft.Maui.Graphics.IImage image, float x, float y, float width, float height) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.DrawPath(Microsoft.Maui.Graphics.PathF path) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.DrawString(string value, float x, float y, float width, float height, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, float lineSpacingAdjustment = 0) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.DrawString(string value, float x, float y, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.DrawText(Microsoft.Maui.Graphics.Text.IAttributedText value, float x, float y, float width, float height) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.FillColor.set -> void +~Microsoft.Maui.Graphics.ScalingCanvas.FillPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.Font.set -> void +~Microsoft.Maui.Graphics.ScalingCanvas.FontColor.set -> void +~Microsoft.Maui.Graphics.ScalingCanvas.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.ScalingCanvas.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.ScalingCanvas.ParentCanvas.get -> Microsoft.Maui.Graphics.ICanvas +~Microsoft.Maui.Graphics.ScalingCanvas.ScalingCanvas(Microsoft.Maui.Graphics.ICanvas wrapped) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.SetFillPaint(Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.RectF rectangle) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.SetShadow(Microsoft.Maui.Graphics.SizeF offset, float blur, Microsoft.Maui.Graphics.Color color) -> void +~Microsoft.Maui.Graphics.ScalingCanvas.StrokeColor.set -> void +~Microsoft.Maui.Graphics.ScalingCanvas.StrokeDashPattern.set -> void +~Microsoft.Maui.Graphics.ScalingCanvas.Wrapped.get -> object +~Microsoft.Maui.Graphics.SolidPaint.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.SolidPaint.Color.set -> void +~Microsoft.Maui.Graphics.SolidPaint.SolidPaint(Microsoft.Maui.Graphics.Color color) -> void +~Microsoft.Maui.Graphics.StandardPicture.Draw(Microsoft.Maui.Graphics.ICanvas canvas) -> void +~Microsoft.Maui.Graphics.StandardPicture.Hash.get -> string +~Microsoft.Maui.Graphics.StandardPicture.Hash.set -> void +~Microsoft.Maui.Graphics.StandardPicture.StandardPicture(float x, float y, float width, float height, Microsoft.Maui.Graphics.DrawingCommand[] commands, string hash = null) -> void +~Microsoft.Maui.Graphics.StandardTextAttributes.Font.get -> Microsoft.Maui.Graphics.IFont +~Microsoft.Maui.Graphics.StandardTextAttributes.Font.set -> void +~Microsoft.Maui.Graphics.StandardTextAttributes.TextFontColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.StandardTextAttributes.TextFontColor.set -> void +~Microsoft.Maui.Graphics.Text.AttributedText.AttributedText(string text, System.Collections.Generic.IReadOnlyList runs, bool optimal = false) -> void +~Microsoft.Maui.Graphics.Text.AttributedTextBlock.AttributedTextBlock(string text, Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> void +~Microsoft.Maui.Graphics.Text.AttributedTextBlock.Attributes.get -> Microsoft.Maui.Graphics.Text.ITextAttributes +~Microsoft.Maui.Graphics.Text.AttributedTextBlock.Text.get -> string +~Microsoft.Maui.Graphics.Text.AttributedTextRun.AttributedTextRun(int start, int length, Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> void +~Microsoft.Maui.Graphics.Text.AttributedTextRun.Attributes.get -> Microsoft.Maui.Graphics.Text.ITextAttributes +~Microsoft.Maui.Graphics.Text.AttributedTextRunComparer.Compare(Microsoft.Maui.Graphics.Text.IAttributedTextRun first, Microsoft.Maui.Graphics.Text.IAttributedTextRun second) -> int +~Microsoft.Maui.Graphics.Text.CountingWriter.CountingWriter(System.IO.TextWriter writer) -> void +~Microsoft.Maui.Graphics.Text.IAttributedText.Runs.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Graphics.Text.IAttributedText.Text.get -> string +~Microsoft.Maui.Graphics.Text.IAttributedTextRun.Attributes.get -> Microsoft.Maui.Graphics.Text.ITextAttributes +~Microsoft.Maui.Graphics.Text.MutableAttributedText.AddRun(Microsoft.Maui.Graphics.Text.IAttributedTextRun run) -> void +~Microsoft.Maui.Graphics.Text.MutableAttributedText.MutableAttributedText(string text) -> void +~Microsoft.Maui.Graphics.Text.TextAttributes.TextAttributes(System.Collections.Generic.IDictionary dictionary) -> void +~Microsoft.Maui.Graphics.Text.TextAttributes.TextAttributes(System.Collections.Generic.IReadOnlyDictionary first, System.Collections.Generic.IReadOnlyDictionary second) -> void +~Microsoft.Maui.Graphics.Text.XmlAttributedTextReader.Read(string text) -> Microsoft.Maui.Graphics.Text.IAttributedText +~Microsoft.Maui.Graphics.Text.XmlAttributedTextReader.Read(System.IO.TextReader reader) -> Microsoft.Maui.Graphics.Text.IAttributedText +~Microsoft.Maui.Graphics.Text.XmlAttributedTextWriter.Write(Microsoft.Maui.Graphics.Text.IAttributedText attributedText, System.IO.TextWriter writer) -> void +~Microsoft.Maui.Graphics.Text.XmlAttributedTextWriter.Write(Microsoft.Maui.Graphics.Text.IAttributedText text) -> string +~Microsoft.Maui.Graphics.XmlnsPrefixAttribute.Prefix.get -> string +~Microsoft.Maui.Graphics.XmlnsPrefixAttribute.XmlNamespace.get -> string +~Microsoft.Maui.Graphics.XmlnsPrefixAttribute.XmlnsPrefixAttribute(string xmlNamespace, string prefix) -> void +~override Microsoft.Maui.Graphics.Color.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.Color.ToString() -> string +~override Microsoft.Maui.Graphics.Converters.ColorTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Graphics.Converters.ColorTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Graphics.Converters.ColorTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object fromValue) -> object +~override Microsoft.Maui.Graphics.Converters.ColorTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Graphics.Converters.ColorTypeConverter.GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) -> System.ComponentModel.TypeConverter.StandardValuesCollection +~override Microsoft.Maui.Graphics.Converters.ColorTypeConverter.GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Graphics.Converters.ColorTypeConverter.GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Graphics.Converters.PointFTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Graphics.Converters.PointFTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Graphics.Converters.PointFTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Graphics.Converters.PointFTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Graphics.Converters.PointTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Graphics.Converters.PointTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Graphics.Converters.PointTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Graphics.Converters.PointTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Graphics.Converters.RectFTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Graphics.Converters.RectFTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Graphics.Converters.RectFTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Graphics.Converters.RectFTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Graphics.Converters.RectTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Graphics.Converters.RectTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Graphics.Converters.RectTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Graphics.Converters.RectTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Graphics.Converters.SizeFTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Graphics.Converters.SizeFTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Graphics.Converters.SizeFTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Graphics.Converters.SizeFTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Graphics.Converters.SizeTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Graphics.Converters.SizeTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Graphics.Converters.SizeTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Graphics.Converters.SizeTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Graphics.Font.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.GradientPaint.ToString() -> string +~override Microsoft.Maui.Graphics.Insets.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.Insets.ToString() -> string +~override Microsoft.Maui.Graphics.InsetsF.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.InsetsF.ToString() -> string +~override Microsoft.Maui.Graphics.PathF.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.PicturePattern.Draw(Microsoft.Maui.Graphics.ICanvas canvas) -> void +~override Microsoft.Maui.Graphics.Point.Equals(object o) -> bool +~override Microsoft.Maui.Graphics.Point.ToString() -> string +~override Microsoft.Maui.Graphics.PointF.Equals(object o) -> bool +~override Microsoft.Maui.Graphics.PointF.ToString() -> string +~override Microsoft.Maui.Graphics.Rect.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.Rect.ToString() -> string +~override Microsoft.Maui.Graphics.RectF.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.RectF.ToString() -> string +~override Microsoft.Maui.Graphics.Size.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.Size.ToString() -> string +~override Microsoft.Maui.Graphics.SizeF.Equals(object obj) -> bool +~override Microsoft.Maui.Graphics.SizeF.ToString() -> string +~override Microsoft.Maui.Graphics.SolidPaint.ToString() -> string +~override Microsoft.Maui.Graphics.Text.AttributedText.Runs.get -> System.Collections.Generic.IReadOnlyList +~override Microsoft.Maui.Graphics.Text.AttributedText.Text.get -> string +~override Microsoft.Maui.Graphics.Text.AttributedTextBlock.ToString() -> string +~override Microsoft.Maui.Graphics.Text.AttributedTextRun.ToString() -> string +~override Microsoft.Maui.Graphics.Text.CountingWriter.Encoding.get -> System.Text.Encoding +~override Microsoft.Maui.Graphics.Text.CountingWriter.ToString() -> string +~override Microsoft.Maui.Graphics.Text.MutableAttributedText.Runs.get -> System.Collections.Generic.IReadOnlyList +~override Microsoft.Maui.Graphics.Text.MutableAttributedText.Text.get -> string +~static Microsoft.Maui.Graphics.BitmapExportContextExtensions.WriteToFile(this Microsoft.Maui.Graphics.BitmapExportContext exportContext, string filename) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.ClipPath(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode = Microsoft.Maui.Graphics.WindingMode.NonZero) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.ClipRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.ClipRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawArc(this Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.Rect bounds, float startAngle, float endAngle, bool clockwise, bool closed) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawArc(this Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.RectF bounds, float startAngle, float endAngle, bool clockwise, bool closed) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawCircle(this Microsoft.Maui.Graphics.ICanvas target, float centerX, float centerY, float radius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawCircle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Point center, double radius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawCircle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.PointF center, float radius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawEllipse(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawEllipse(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawLine(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.PointF point1, Microsoft.Maui.Graphics.PointF point2) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawPath(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.PathF path) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, float x, float y, float width, float height, float topLeftCornerRadius, float topRightCornerRadius, float bottomLeftCornerRadius, float bottomRightCornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect, double cornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect, double topLeftCornerRadius, double topRightCornerRadius, double bottomLeftCornerRadius, double bottomRightCornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect, float cornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect, float topLeftCornerRadius, float topRightCornerRadius, float bottomLeftCornerRadius, float bottomRightCornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect, float xRadius, float yRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawString(this Microsoft.Maui.Graphics.ICanvas target, string value, Microsoft.Maui.Graphics.Rect bounds, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, float lineSpacingAdjustment = 0) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.DrawString(this Microsoft.Maui.Graphics.ICanvas target, string value, Microsoft.Maui.Graphics.RectF bounds, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, float lineSpacingAdjustment = 0) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.EnableDefaultShadow(this Microsoft.Maui.Graphics.ICanvas canvas, float zoom = 1) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillArc(this Microsoft.Maui.Graphics.ICanvas canvas, float x, float y, float width, float height, float startAngle, float endAngle, Microsoft.Maui.Graphics.Paint paint, bool clockwise) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillArc(this Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.Rect bounds, float startAngle, float endAngle, bool clockwise) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillArc(this Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.RectF bounds, float startAngle, float endAngle, bool clockwise) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillCircle(this Microsoft.Maui.Graphics.ICanvas target, float centerX, float centerY, float radius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillCircle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Point center, double radius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillCircle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.PointF center, float radius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillEllipse(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillEllipse(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillPath(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.PathF path) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillPath(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, float x, float y, float width, float height, float topLeftCornerRadius, float topRightCornerRadius, float bottomLeftCornerRadius, float bottomRightCornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect, double cornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect, double topLeftCornerRadius, double topRightCornerRadius, double bottomLeftCornerRadius, double bottomRightCornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect, float cornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect, float topLeftCornerRadius, float topRightCornerRadius, float bottomLeftCornerRadius, float bottomRightCornerRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.FillRoundedRectangle(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect, float xRadius, float yRadius) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.ResetStroke(this Microsoft.Maui.Graphics.ICanvas canvas) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SetFillPaint(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.Point point1, Microsoft.Maui.Graphics.Point point2) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SetFillPaint(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.PointF point1, Microsoft.Maui.Graphics.PointF point2) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SetFillPaint(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.Rect rectangle) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SetFillPaint(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.RectF rectangle) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SetFillPattern(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.IPattern pattern) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SetFillPattern(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.IPattern pattern, Microsoft.Maui.Graphics.Color foregroundColor) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SubtractFromClip(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.Rect rect) -> void +~static Microsoft.Maui.Graphics.CanvasExtensions.SubtractFromClip(this Microsoft.Maui.Graphics.ICanvas target, Microsoft.Maui.Graphics.RectF rect) -> void +~static Microsoft.Maui.Graphics.Color.FromArgb(string colorAsHex) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromHex(string colorAsArgbHex) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromHsla(double h, double s, double l, double a = 1) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromHsla(float h, float s, float l, float a = 1) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromHsv(float h, float s, float v) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromHsv(int h, int s, int v) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromHsva(float h, float s, float v, float a) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromHsva(int h, int s, int v, int a) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromInt(int argb) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgb(byte red, byte green, byte blue) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgb(double red, double green, double blue) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgb(float red, float green, float blue) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgb(int red, int green, int blue) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgba(byte red, byte green, byte blue, byte alpha) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgba(double r, double g, double b, double a) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgba(float r, float g, float b, float a) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgba(int red, int green, int blue, int alpha) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromRgba(string colorAsHex) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.FromUint(uint argb) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.implicit operator Microsoft.Maui.Graphics.Color(System.Numerics.Vector4 color) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.Parse(string value) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Color.TryParse(string value, out Microsoft.Maui.Graphics.Color color) -> bool +~static Microsoft.Maui.Graphics.IFontExtensions.GetSvgStyle(this Microsoft.Maui.Graphics.IFont font) -> string +~static Microsoft.Maui.Graphics.IFontExtensions.GetSvgWeight(this Microsoft.Maui.Graphics.IFont font) -> string +~static Microsoft.Maui.Graphics.ImageExtensions.AsBase64(this Microsoft.Maui.Graphics.IImage target, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> string +~static Microsoft.Maui.Graphics.ImageExtensions.AsBytes(this Microsoft.Maui.Graphics.IImage target, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> byte[] +~static Microsoft.Maui.Graphics.ImageExtensions.AsBytesAsync(this Microsoft.Maui.Graphics.IImage target, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Graphics.ImageExtensions.AsPaint(this Microsoft.Maui.Graphics.IImage target) -> Microsoft.Maui.Graphics.Paint +~static Microsoft.Maui.Graphics.ImageExtensions.AsStream(this Microsoft.Maui.Graphics.IImage target, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> System.IO.Stream +~static Microsoft.Maui.Graphics.ImageExtensions.SetFillImage(this Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.IImage image) -> void +~static Microsoft.Maui.Graphics.ImageLoadingServiceExtensions.FromBytes(this Microsoft.Maui.Graphics.IImageLoadingService target, byte[] bytes) -> Microsoft.Maui.Graphics.IImage +~static Microsoft.Maui.Graphics.Insets.Parse(string value) -> Microsoft.Maui.Graphics.Insets +~static Microsoft.Maui.Graphics.InsetsF.Parse(string value) -> Microsoft.Maui.Graphics.InsetsF +~static Microsoft.Maui.Graphics.PathArcExtensions.DrawArc(this Microsoft.Maui.Graphics.PathF aPath, float x, float y, float startAngle, float arc, float radius, float yRadius, float xAxisRotation) -> void +~static Microsoft.Maui.Graphics.PathArcExtensions.SVGArcTo(this Microsoft.Maui.Graphics.PathF aTarget, float rx, float ry, float angle, bool largeArcFlag, bool sweepFlag, float x, float y, float lastPointX, float lastPointY) -> void +~static Microsoft.Maui.Graphics.PathBuilder.Build(string definition) -> Microsoft.Maui.Graphics.PathF +~static Microsoft.Maui.Graphics.PathBuilder.ParseFloat(string value) -> float +~static Microsoft.Maui.Graphics.PathExtensions.AsScaledPath(this Microsoft.Maui.Graphics.PathF target, float scale) -> Microsoft.Maui.Graphics.PathF +~static Microsoft.Maui.Graphics.PathExtensions.AsScaledPath(this Microsoft.Maui.Graphics.PathF target, float xScale, float yScale) -> Microsoft.Maui.Graphics.PathF +~static Microsoft.Maui.Graphics.PathExtensions.ToDefinitionString(this Microsoft.Maui.Graphics.PathF path, float ppu = 1) -> string +~static Microsoft.Maui.Graphics.PatternExtensions.AsPaint(this Microsoft.Maui.Graphics.IPattern target) -> Microsoft.Maui.Graphics.Paint +~static Microsoft.Maui.Graphics.PatternExtensions.AsPaint(this Microsoft.Maui.Graphics.IPattern target, Microsoft.Maui.Graphics.Color foregroundColor) -> Microsoft.Maui.Graphics.Paint +~static Microsoft.Maui.Graphics.PdfPageExtensions.AsBase64(this Microsoft.Maui.Graphics.IPdfPage target) -> string +~static Microsoft.Maui.Graphics.PdfPageExtensions.AsBytes(this Microsoft.Maui.Graphics.IPdfPage target) -> byte[] +~static Microsoft.Maui.Graphics.PdfPageExtensions.AsBytesAsync(this Microsoft.Maui.Graphics.IPdfPage target) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Graphics.PdfPageExtensions.AsStream(this Microsoft.Maui.Graphics.IPdfPage target) -> System.IO.Stream +~static Microsoft.Maui.Graphics.PictureExtensions.GetBounds(this Microsoft.Maui.Graphics.IPicture target) -> Microsoft.Maui.Graphics.RectF +~static Microsoft.Maui.Graphics.PictureReaderExtensions.Read(this Microsoft.Maui.Graphics.IPictureReader target, System.IO.Stream stream, string hash = null) -> Microsoft.Maui.Graphics.IPicture +~static Microsoft.Maui.Graphics.PictureReaderExtensions.ReadAsync(this Microsoft.Maui.Graphics.IPictureReader target, System.IO.Stream stream, string hash = null) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Graphics.PictureWriterExtensions.SaveAsBase64(this Microsoft.Maui.Graphics.IPictureWriter target, Microsoft.Maui.Graphics.IPicture picture) -> string +~static Microsoft.Maui.Graphics.PictureWriterExtensions.SaveAsBytes(this Microsoft.Maui.Graphics.IPictureWriter target, Microsoft.Maui.Graphics.IPicture picture) -> byte[] +~static Microsoft.Maui.Graphics.PictureWriterExtensions.SaveAsBytesAsync(this Microsoft.Maui.Graphics.IPictureWriter target, Microsoft.Maui.Graphics.IPicture picture) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Graphics.PictureWriterExtensions.SaveAsStream(this Microsoft.Maui.Graphics.IPictureWriter target, Microsoft.Maui.Graphics.IPicture picture) -> System.IO.Stream +~static Microsoft.Maui.Graphics.Platform.PlatformImage.FromStream(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png) -> Microsoft.Maui.Graphics.IImage +~static Microsoft.Maui.Graphics.Point.TryParse(string value, out Microsoft.Maui.Graphics.Point point) -> bool +~static Microsoft.Maui.Graphics.PointF.TryParse(string value, out Microsoft.Maui.Graphics.PointF pointF) -> bool +~static Microsoft.Maui.Graphics.Rect.TryParse(string value, out Microsoft.Maui.Graphics.Rect rectangle) -> bool +~static Microsoft.Maui.Graphics.RectF.TryParse(string value, out Microsoft.Maui.Graphics.RectF rectangleF) -> bool +~static Microsoft.Maui.Graphics.Size.TryParse(string value, out Microsoft.Maui.Graphics.Size size) -> bool +~static Microsoft.Maui.Graphics.SizeF.TryParse(string value, out Microsoft.Maui.Graphics.SizeF sizeF) -> bool +~static Microsoft.Maui.Graphics.Text.AttributedTextExtensions.CreateBlocks(this Microsoft.Maui.Graphics.Text.IAttributedText text) -> System.Collections.Generic.IList +~static Microsoft.Maui.Graphics.Text.AttributedTextExtensions.CreateParagraphRun(this Microsoft.Maui.Graphics.Text.IAttributedText text, int start, int length, System.Collections.Generic.IList runs, int startIndexForSearch = 0) -> int +~static Microsoft.Maui.Graphics.Text.AttributedTextExtensions.CreateParagraphs(this Microsoft.Maui.Graphics.Text.IAttributedText attributedText) -> System.Collections.Generic.IReadOnlyList +~static Microsoft.Maui.Graphics.Text.AttributedTextExtensions.Optimize(this Microsoft.Maui.Graphics.Text.IAttributedText attributedText) -> Microsoft.Maui.Graphics.Text.IAttributedText +~static Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions.CalculatedIntersections(this Microsoft.Maui.Graphics.Text.IAttributedTextRun first, Microsoft.Maui.Graphics.Text.IAttributedTextRun second) -> System.Collections.Generic.IList +~static Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions.GetEnd(this Microsoft.Maui.Graphics.Text.IAttributedTextRun run) -> int +~static Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions.Intersects(this Microsoft.Maui.Graphics.Text.IAttributedTextRun first, int start, int length) -> bool +~static Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions.Intersects(this Microsoft.Maui.Graphics.Text.IAttributedTextRun first, Microsoft.Maui.Graphics.Text.IAttributedTextRun second) -> bool +~static Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions.IntersectsExactly(this Microsoft.Maui.Graphics.Text.IAttributedTextRun first, int start, int length) -> bool +~static Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions.IntersectsExactly(this Microsoft.Maui.Graphics.Text.IAttributedTextRun first, Microsoft.Maui.Graphics.Text.IAttributedTextRun second) -> bool +~static Microsoft.Maui.Graphics.Text.AttributedTextRunExtensions.Optimize(this System.Collections.Generic.List runs, int textLength) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetBackgroundColor(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> string +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetBold(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetFontName(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> string +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetFontSize(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes, float? fontSize = null) -> float +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetForegroundColor(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> string +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetItalic(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetMarker(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> Microsoft.Maui.Graphics.Text.MarkerType +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetStrikethrough(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetSubscript(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetSuperscript(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetUnderline(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.GetUnorderedList(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetBackgroundColor(this System.Collections.Generic.Dictionary attributes, string value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetBold(this System.Collections.Generic.Dictionary attributes, bool value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetFontName(this System.Collections.Generic.Dictionary attributes, string value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetFontSize(this System.Collections.Generic.Dictionary attributes, float value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetForegroundColor(this System.Collections.Generic.Dictionary attributes, string value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetItalic(this System.Collections.Generic.Dictionary attributes, bool value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetMarker(this System.Collections.Generic.Dictionary attributes, Microsoft.Maui.Graphics.Text.MarkerType value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetStrikethrough(this System.Collections.Generic.Dictionary attributes, bool value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetSubscript(this System.Collections.Generic.Dictionary attributes, bool value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetSuperscript(this System.Collections.Generic.Dictionary attributes, bool value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetUnderline(this System.Collections.Generic.Dictionary attributes, bool value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.SetUnorderedList(this System.Collections.Generic.Dictionary attributes, bool value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributeExtensions.Union(this System.Collections.Generic.IReadOnlyDictionary first, System.Collections.Generic.IReadOnlyDictionary second) -> Microsoft.Maui.Graphics.Text.ITextAttributes +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.GetAttribute(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, string defaultValue = null) -> string +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.GetBoolAttribute(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, bool defaultValue = false) -> bool +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.GetEnumAttribute(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, T defaultValue) -> T +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.GetFloatAttribute(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, float defaultValue) -> float +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.GetIntAttribute(this Microsoft.Maui.Graphics.Text.ITextAttributes attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, int defaultValue) -> int +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.RemoveAttribute(this System.Collections.Generic.Dictionary attributes, Microsoft.Maui.Graphics.Text.TextAttribute type) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.SetAttribute(this System.Collections.Generic.Dictionary attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, string value) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.SetBoolAttribute(this System.Collections.Generic.Dictionary attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, bool value, bool defaultValue = false) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.SetEnumAttribute(this System.Collections.Generic.Dictionary attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, T value, T defaultValue) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.SetFloatAttribute(this System.Collections.Generic.Dictionary attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, float value, float defaultValue) -> void +~static Microsoft.Maui.Graphics.Text.TextAttributesExtensions.SetIntAttribute(this System.Collections.Generic.Dictionary attributes, Microsoft.Maui.Graphics.Text.TextAttribute type, int value, int defaultValue) -> void +~static Microsoft.Maui.Graphics.Text.TextColors.Parse(this string color) -> float[] +~static Microsoft.Maui.Graphics.Text.TextColors.ParseAsInts(this string color) -> int[] +~static Microsoft.Maui.Graphics.Text.TextColors.StandardColors -> System.Collections.Generic.Dictionary +~static readonly Microsoft.Maui.Graphics.CanvasDefaults.DefaultShadowColor -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.AliceBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.AntiqueWhite -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Aqua -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Aquamarine -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Azure -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Beige -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Bisque -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Black -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.BlanchedAlmond -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Blue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.BlueViolet -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Brown -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.BurlyWood -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.CadetBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Chartreuse -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Chocolate -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Coral -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.CornflowerBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Cornsilk -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Crimson -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Cyan -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkCyan -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkGoldenrod -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkGray -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkGrey -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkKhaki -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkMagenta -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkOliveGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkOrange -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkOrchid -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkRed -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkSalmon -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkSeaGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkSlateBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkSlateGray -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkSlateGrey -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkTurquoise -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DarkViolet -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DeepPink -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DeepSkyBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DimGray -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DimGrey -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.DodgerBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Firebrick -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.FloralWhite -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.ForestGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Fuchsia -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Gainsboro -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.GhostWhite -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Gold -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Goldenrod -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Gray -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Green -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.GreenYellow -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Grey -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Honeydew -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.HotPink -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.IndianRed -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Indigo -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Ivory -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Khaki -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Lavender -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LavenderBlush -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LawnGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LemonChiffon -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightCoral -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightCyan -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightGoldenrodYellow -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightGray -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightGrey -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightPink -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightSalmon -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightSeaGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightSkyBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightSlateGray -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightSlateGrey -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightSteelBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LightYellow -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Lime -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.LimeGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Linen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Magenta -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Maroon -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumAquamarine -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumOrchid -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumPurple -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumSeaGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumSlateBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumSpringGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumTurquoise -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MediumVioletRed -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MidnightBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MintCream -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.MistyRose -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Moccasin -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.NavajoWhite -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Navy -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.OldLace -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Olive -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.OliveDrab -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Orange -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.OrangeRed -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Orchid -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.PaleGoldenrod -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.PaleGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.PaleTurquoise -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.PaleVioletRed -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.PapayaWhip -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.PeachPuff -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Peru -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Pink -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Plum -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.PowderBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Purple -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Red -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.RosyBrown -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.RoyalBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SaddleBrown -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Salmon -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SandyBrown -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SeaGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SeaShell -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Sienna -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Silver -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SkyBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SlateBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SlateGray -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SlateGrey -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Snow -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SpringGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.SteelBlue -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Tan -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Teal -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Thistle -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Tomato -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Transparent -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Turquoise -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Violet -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Wheat -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.White -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.WhiteSmoke -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.Yellow -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Colors.YellowGreen -> Microsoft.Maui.Graphics.Color +~static readonly Microsoft.Maui.Graphics.Text.AttributedTextRunComparer.Instance -> Microsoft.Maui.Graphics.Text.AttributedTextRunComparer +~virtual Microsoft.Maui.Graphics.AbstractCanvas.StateRestored(TState state) -> void From c934544a22a2683acc2de8e4e4de7ad509fcb884 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 18:08:57 +0100 Subject: [PATCH 215/425] Essentials.csproj: track api changes --- .../src/Accelerometer/Accelerometer.Gtk.cs | 1 - src/Essentials/src/AppActions/AppActions.Gtk.cs | 1 - src/Essentials/src/AppInfo/AppInfo.Gtk.cs | 1 - src/Essentials/src/Battery/Battery.Gtk.cs | 1 - src/Essentials/src/Browser/Browser.Gtk.cs | 1 - src/Essentials/src/Clipboard/Clipboard.Gtk.cs | 1 - .../src/Connectivity/Connectivity.Gtk.cs | 1 - src/Essentials/src/Contacts/Contacts.Gtk.cs | 1 - src/Essentials/src/Email/Email.Gtk.cs | 1 - src/Essentials/src/Essentials.csproj | 6 +++++- src/Essentials/src/FilePicker/FilePicker.Gtk.cs | 1 - src/Essentials/src/FileSystem/FileSystem.Gtk.cs | 2 -- src/Essentials/src/Flashlight/Flashlight.Gtk.cs | 7 ++++++- src/Essentials/src/Geolocation/Geolocation.Gtk.cs | 8 ++++++++ .../src/HapticFeedback/HapticFeedback.Gtk.cs | 1 - src/Essentials/src/Launcher/Launcher.Gtk.cs | 1 - .../src/Magnetometer/Magnetometer.Gtk.cs | 1 - src/Essentials/src/Map/Map.Gtk.cs | 1 - src/Essentials/src/MediaPicker/MediaPicker.Gtk.cs | 1 - .../src/OrientationSensor/OrientationSensor.Gtk.cs | 1 - src/Essentials/src/Permissions/Permissions.Gtk.cs | 14 +++++++++----- src/Essentials/src/Screenshot/Screenshot.shared.cs | 12 ++++++++++++ src/Essentials/src/Sms/Sms.Gtk.cs | 1 - .../src/WebAuthenticator/WebAuthenticator.Gtk.cs | 1 - 24 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs b/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs index ee4a81592fd6..dc3484ad73a6 100644 --- a/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs +++ b/src/Essentials/src/Accelerometer/Accelerometer.Gtk.cs @@ -2,7 +2,6 @@ namespace Microsoft.Maui.Devices.Sensors { - /// partial class AccelerometerImplementation { public bool IsSupported => false; diff --git a/src/Essentials/src/AppActions/AppActions.Gtk.cs b/src/Essentials/src/AppActions/AppActions.Gtk.cs index c5137e0e8c07..11b8b48a38b7 100644 --- a/src/Essentials/src/AppActions/AppActions.Gtk.cs +++ b/src/Essentials/src/AppActions/AppActions.Gtk.cs @@ -4,7 +4,6 @@ namespace Microsoft.Maui.ApplicationModel { - /// partial class AppActionsImplementation : IAppActions { public bool IsSupported => false; diff --git a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs index fd874de831b6..abc5b997fe74 100644 --- a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs +++ b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs @@ -1,6 +1,5 @@ namespace Microsoft.Maui.ApplicationModel { - /// class AppInfoImplementation : IAppInfo { public string PackageName => throw ExceptionUtils.NotSupportedOrImplementedException; diff --git a/src/Essentials/src/Battery/Battery.Gtk.cs b/src/Essentials/src/Battery/Battery.Gtk.cs index d240857d4b5f..c8baebd7294b 100644 --- a/src/Essentials/src/Battery/Battery.Gtk.cs +++ b/src/Essentials/src/Battery/Battery.Gtk.cs @@ -2,7 +2,6 @@ namespace Microsoft.Maui.Devices { - /// partial class BatteryImplementation : IBattery { void StartBatteryListeners() => diff --git a/src/Essentials/src/Browser/Browser.Gtk.cs b/src/Essentials/src/Browser/Browser.Gtk.cs index 2f1a38c6c983..9dc72a2819d8 100644 --- a/src/Essentials/src/Browser/Browser.Gtk.cs +++ b/src/Essentials/src/Browser/Browser.Gtk.cs @@ -4,7 +4,6 @@ namespace Microsoft.Maui.ApplicationModel { - /// partial class BrowserImplementation : IBrowser { public Task OpenAsync(Uri uri, BrowserLaunchOptions options) => diff --git a/src/Essentials/src/Clipboard/Clipboard.Gtk.cs b/src/Essentials/src/Clipboard/Clipboard.Gtk.cs index 3fca1680a18b..2417ae47dc64 100644 --- a/src/Essentials/src/Clipboard/Clipboard.Gtk.cs +++ b/src/Essentials/src/Clipboard/Clipboard.Gtk.cs @@ -5,7 +5,6 @@ namespace Microsoft.Maui.ApplicationModel.DataTransfer { - /// partial class ClipboardImplementation : IClipboard { diff --git a/src/Essentials/src/Connectivity/Connectivity.Gtk.cs b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs index b262827a64be..869074a41d3c 100644 --- a/src/Essentials/src/Connectivity/Connectivity.Gtk.cs +++ b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs @@ -3,7 +3,6 @@ namespace Microsoft.Maui.Networking { - /// partial class ConnectivityImplementation : IConnectivity { public NetworkAccess NetworkAccess => diff --git a/src/Essentials/src/Contacts/Contacts.Gtk.cs b/src/Essentials/src/Contacts/Contacts.Gtk.cs index 8d853be41a81..d494d76ae697 100644 --- a/src/Essentials/src/Contacts/Contacts.Gtk.cs +++ b/src/Essentials/src/Contacts/Contacts.Gtk.cs @@ -4,7 +4,6 @@ namespace Microsoft.Maui.ApplicationModel.Communication { - /// class ContactsImplementation : IContacts { public Task PickContactAsync() => diff --git a/src/Essentials/src/Email/Email.Gtk.cs b/src/Essentials/src/Email/Email.Gtk.cs index c7276cebd802..141b888ef582 100644 --- a/src/Essentials/src/Email/Email.Gtk.cs +++ b/src/Essentials/src/Email/Email.Gtk.cs @@ -2,7 +2,6 @@ namespace Microsoft.Maui.ApplicationModel.Communication { - /// partial class EmailImplementation : IEmail { public bool IsComposeSupported => diff --git a/src/Essentials/src/Essentials.csproj b/src/Essentials/src/Essentials.csproj index 47e3380489ea..525d5d4c6c2f 100644 --- a/src/Essentials/src/Essentials.csproj +++ b/src/Essentials/src/Essentials.csproj @@ -8,7 +8,7 @@ true true true - $(NoWarn);NU5104;RS0041;RS0026 + $(NoWarn);NU5104;RS0041;RS0026;RS0036 $(WarningsAsErrors);CS1591 $(NoWarn);CA1420 @@ -60,6 +60,10 @@ + + + + diff --git a/src/Core/src/Core.csproj b/src/Core/src/Core.csproj index a8550640c289..106a2dd74b76 100644 --- a/src/Core/src/Core.csproj +++ b/src/Core/src/Core.csproj @@ -44,6 +44,9 @@ + + + diff --git a/src/Core/src/Core/Extensions/VisualTreeElementExtensions.cs b/src/Core/src/Core/Extensions/VisualTreeElementExtensions.cs index 89f15a9b8d68..8ac6ce6e8872 100644 --- a/src/Core/src/Core/Extensions/VisualTreeElementExtensions.cs +++ b/src/Core/src/Core/Extensions/VisualTreeElementExtensions.cs @@ -26,6 +26,9 @@ #elif TIZEN using PlatformView = Tizen.NUI.BaseComponents.View; using ParentView = Tizen.NUI.BaseComponents.View; +#elif GTK +using PlatformView = Gtk.Widget; +using ParentView = Gtk.Widget; #else using PlatformView = System.Object; using ParentView = System.Object; diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs index 0f99dc0150e9..a4ac23c5d5f6 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Gtk.cs @@ -9,13 +9,13 @@ protected override Spinner CreatePlatformView() return new(); } - public static void MapIsRunning(IActivityIndicatorHandler handler, IActivityIndicator activityIndicator) + public static partial void MapIsRunning(IActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { handler.PlatformView?.UpdateIsRunning(activityIndicator); } - public static void MapColor(IActivityIndicatorHandler handler, IActivityIndicator activityIndicator) + public static partial void MapColor(IActivityIndicatorHandler handler, IActivityIndicator activityIndicator) { handler.PlatformView?.SetForegroundColor(activityIndicator.Color); diff --git a/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs b/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs index 1ce6c3ee6242..13d5d34d62ee 100644 --- a/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs +++ b/src/Core/src/Handlers/Application/ApplicationHandler.Gtk.cs @@ -5,12 +5,12 @@ namespace Microsoft.Maui.Handlers public partial class ApplicationHandler : ElementHandler { [MissingMapper] - public static void MapTerminate(ApplicationHandler handler, IApplication application, object? args) { } + public static partial void MapTerminate(ApplicationHandler handler, IApplication application, object? args) { } [MissingMapper] - public static void MapOpenWindow(ApplicationHandler handler, IApplication application, object? args) { } + public static partial void MapOpenWindow(ApplicationHandler handler, IApplication application, object? args) { } [MissingMapper] - public static void MapCloseWindow(ApplicationHandler handler, IApplication application, object? args) { } + public static partial void MapCloseWindow(ApplicationHandler handler, IApplication application, object? args) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs index e0014040aaf6..ab6e22717a98 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -7,9 +7,5 @@ public partial class BorderHandler : ViewHandler new(); - [MissingMapper] - public static void MapContent(IBorderHandler handler, IBorderView border) - { - } } } diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index af74c403dbef..a496e33f5eda 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -4,12 +4,10 @@ namespace Microsoft.Maui.Handlers { - // https://docs.gtk.org/gtk3/class.Button.html public partial class ButtonHandler : ViewHandler { - protected override Button CreatePlatformView() { return Button.NewWithLabel(string.Empty); @@ -82,7 +80,9 @@ void OnButtonClicked(object? sender, EventArgs e) InvokeEvent(() => VirtualView?.Clicked()); } - void OnSetImageSource(object? obj) { } + partial class ButtonImageSourcePartSetter + { + public override void SetImageSource(object? platformImage) { } + } } - } \ No newline at end of file diff --git a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs index 382a2ac54a15..2594cc9186d8 100644 --- a/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs +++ b/src/Core/src/Handlers/CheckBox/CheckBoxHandler.Gtk.cs @@ -11,7 +11,7 @@ public partial class CheckBoxHandler : ViewHandler protected override CheckButton CreatePlatformView() => new(); - public static void MapIsChecked(ICheckBoxHandler handler, ICheckBox check) + public static partial void MapIsChecked(ICheckBoxHandler handler, ICheckBox check) { handler.PlatformView?.UpdateIsChecked(check); } @@ -33,7 +33,7 @@ protected void OnToggledEvent(object? sender, EventArgs e) } - public static void MapForeground(ICheckBoxHandler handler, ICheckBox check) + public static partial void MapForeground(ICheckBoxHandler handler, ICheckBox check) { handler.PlatformView?.UpdateForeground(check.Foreground); } diff --git a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs index 5cc5ff5e21dc..90c621bcd9b6 100644 --- a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs @@ -18,7 +18,7 @@ public void UpdateContent() PlatformView.Content = view.ToPlatform(MauiContext); } - public static void MapContent(IContentViewHandler handler, IContentView page) + public static partial void MapContent(IContentViewHandler handler, IContentView page) { if (handler is ContentViewHandler contentViewHandler) { diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs index fb023fa5e7a2..9da3f62fbe56 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Gtk.cs @@ -12,27 +12,27 @@ protected override MauiDatePicker CreatePlatformView() } [MissingMapper] - public static void MapFormat(IDatePickerHandler handler, IDatePicker datePicker) + public static partial void MapFormat(IDatePickerHandler handler, IDatePicker datePicker) { handler.PlatformView?.UpdateFormat(datePicker); } [MissingMapper] - public static void MapDate(IDatePickerHandler handler, IDatePicker datePicker) + public static partial void MapDate(IDatePickerHandler handler, IDatePicker datePicker) { handler.PlatformView?.UpdateDate(datePicker); } [MissingMapper] - public static void MapMinimumDate(IDatePickerHandler handler, IDatePicker datePicker) { } + public static partial void MapMinimumDate(IDatePickerHandler handler, IDatePicker datePicker) { } [MissingMapper] - public static void MapMaximumDate(IDatePickerHandler handler, IDatePicker datePicker) { } + public static partial void MapMaximumDate(IDatePickerHandler handler, IDatePicker datePicker) { } [MissingMapper] - public static void MapCharacterSpacing(IDatePickerHandler handler, IDatePicker datePicker) { } + public static partial void MapCharacterSpacing(IDatePickerHandler handler, IDatePicker datePicker) { } - public static void MapFont(IDatePickerHandler handler, IDatePicker datePicker) + public static partial void MapFont(IDatePickerHandler handler, IDatePicker datePicker) { var fontManager = handler.GetRequiredService(); @@ -40,7 +40,7 @@ public static void MapFont(IDatePickerHandler handler, IDatePicker datePicker) } [MissingMapper] - public static void MapTextColor(IDatePickerHandler handler, IDatePicker datePicker) { } + public static partial void MapTextColor(IDatePickerHandler handler, IDatePicker datePicker) { } } diff --git a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs index e543551014b9..04d1d7fbe53e 100644 --- a/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs +++ b/src/Core/src/Handlers/Editor/EditorHandler.Gtk.cs @@ -114,6 +114,14 @@ public static void MapCursorPosition(IEditorHandler handler, ITextInput editor) [MissingMapper] public static void MapSelectionLength(IEditorHandler handler, ITextInput editor) { } + + /// + /// Maps the abstract property to the platform-specific implementations. + /// + /// The associated handler. + /// The associated instance. + [MissingMapper] + public static void MapIsSpellCheckEnabled(IEditorHandler handler, IEditor editor) { } } diff --git a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs index 323321efdac2..d7b7374c1349 100644 --- a/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs +++ b/src/Core/src/Handlers/Entry/EntryHandler.Gtk.cs @@ -217,6 +217,13 @@ public static void MapKeyboard(IEntryHandler handler, IEntry entry) } } + /// + /// Maps the abstract property to the platform-specific implementations. + /// + /// The associated handler. + /// The associated instance. + [MissingMapper] + public static void MapIsSpellCheckEnabled(IEntryHandler handler, IEntry entry) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs index 844844b7b962..c985ccf1b67f 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs @@ -6,10 +6,8 @@ namespace Microsoft.Maui.Handlers { - public partial class ImageHandler : ViewHandler { - protected override ImageView CreatePlatformView() { var img = new ImageView(); @@ -32,14 +30,11 @@ public static async Task MapSourceAsync(IImageHandler handler, IImage image) return; await handler.SourceLoader.UpdateImageSourceAsync(); - } - void OnSetImageSource(Pixbuf? obj) + partial class ImageImageSourcePartSetter { - PlatformView.Image = obj; + public override void SetImageSource(object? platformImage) { } } - } - } \ No newline at end of file diff --git a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs index 17d4bf009078..0922af9b2073 100644 --- a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs @@ -18,7 +18,9 @@ public static void MapCornerRadius(IImageButtonHandler handler, IButtonStroke bu [MissingMapper] public static void MapPadding(IImageButtonHandler handler, IImageButton imageButton) { } - [MissingMapper] - void OnSetImageSource(object? obj) { } + partial class ImageButtonImageSourcePartSetter + { + public override void SetImageSource(object? platformImage) { } + } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 002bbd93dbef..80bef1eca053 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -6,10 +6,8 @@ namespace Microsoft.Maui.Handlers { - public partial class LayoutHandler : ViewHandler { - protected override LayoutView CreatePlatformView() { if (VirtualView == null) @@ -17,11 +15,7 @@ protected override LayoutView CreatePlatformView() throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a {nameof(LayoutView)}"); } - return new LayoutView - { - CrossPlatformVirtualView = () => VirtualView, - - }; + return new LayoutView { CrossPlatformVirtualView = () => VirtualView, }; } public override void SetVirtualView(IView view) @@ -40,7 +34,6 @@ public override void SetVirtualView(IView view) { if (child.ToPlatform(MauiContext) is { } nativeChild) PlatformView.Add(child, nativeChild); - } PlatformView.QueueAllocate(); @@ -92,7 +85,6 @@ public void Insert(int index, IView child) PlatformView.Insert(child, nativeChild, index); PlatformView.QueueAllocate(); - } public void Update(int index, IView child) @@ -105,7 +97,6 @@ public void Update(int index, IView child) PlatformView.Update(child, nativeChild, index); PlatformView.QueueAllocate(); - } #if DEBUG @@ -126,7 +117,11 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra [MissingMapper] public void UpdateZIndex(IView view) => throw new NotImplementedException(); - - } + [MissingMapper] + public static partial void MapBackground(ILayoutHandler handler, ILayout layout) + { + + } + } } \ No newline at end of file diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index a8ffd9dcfc9e..70f049ec0498 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -102,12 +102,12 @@ protected override void DisconnectHandler(ScrollView nativeView) DisconnectButtonEvents(nativeView.HScrollbar); } - bool _scrolling = false; + bool _scrolling; Point _lastscroll = Point.Zero; Point _lastMotion = Point.Zero; - double _lastDelta = 0d; + double _lastDelta; - bool _valueChanged = false; + bool _valueChanged; bool _intermediate = true; void EndScrolling() diff --git a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs index 868e547b6b27..86ff4cce5089 100644 --- a/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/SearchBar/SearchBarHandler.Gtk.cs @@ -95,6 +95,18 @@ public static void MapIsTextPredictionEnabled(ISearchBarHandler handler, ISearch [MissingMapper] public static void MapCancelButtonColor(IViewHandler handler, ISearchBar searchBar) { } + + /// + /// Maps the abstract property to the platform-specific implementations. + /// + /// The associated handler. + /// The associated instance. + [MissingMapper] + public static void MapIsSpellCheckEnabled(IViewHandler handler, ISearchBar searchBar) { } + + [MissingMapper] + public static void MapKeyboard(IViewHandler handler, ISearchBar searchBar) { } + } diff --git a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs index 23a572d0ea9b..fe9f71cc7d80 100644 --- a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs @@ -20,9 +20,9 @@ public static void MapBackground(ISwipeItemMenuItemHandler handler, ISwipeItemMe public static void MapVisibility(ISwipeItemMenuItemHandler handler, ISwipeItemMenuItem view) { } - void OnSetImageSource(object? obj) + partial class SwipeItemMenuItemImageSourcePartSetter { - throw new NotImplementedException(); + public override void SetImageSource(object? platformImage) { } } } } diff --git a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs index 93da88832b17..2f5305d3729d 100644 --- a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs @@ -36,10 +36,6 @@ public static void MapAnchorX(IViewHandler handler, IView view) { } [MissingMapper] public static void MapAnchorY(IViewHandler handler, IView view) { } - - [MissingMapper] - public virtual bool NeedsContainer => false; - } diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs index 5f66d1c2f3df..5be4cf64d5ac 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs @@ -12,5 +12,7 @@ public static void MapGoForward(IWebViewHandler handler, IWebView webView, objec public static void MapReload(IWebViewHandler handler, IWebView webView, object? arg) { } public static void MapEval(IWebViewHandler handler, IWebView webView, object? arg) { } public static void MapEvaluateJavaScriptAsync(IWebViewHandler handler, IWebView webView, object? arg) { } + + public static void MapUserAgent(IWebViewHandler handler, IWebView webView) { } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs index 5667f79bac6e..7ff0fae0b51c 100644 --- a/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs +++ b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs @@ -20,6 +20,18 @@ public static void MapContent(IWindowHandler handler, IWindow window) [MissingMapper] public static void MapRequestDisplayDensity(IWindowHandler handler, IWindow window, object? args) { } + + [MissingMapper] + public static void MapX(IWindowHandler handler, IWindow view) { } + + [MissingMapper] + public static void MapY(IWindowHandler handler, IWindow view) { } + + [MissingMapper] + public static void MapWidth(IWindowHandler handler, IWindow view) { } + + [MissingMapper] + public static void MapHeight(IWindowHandler handler, IWindow view) { } } } \ No newline at end of file diff --git a/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs index 87476ddda61e..8e806f33c338 100644 --- a/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs +++ b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Gtk.cs @@ -64,6 +64,8 @@ static void OnConfigureLifeCycle(IGtkLifecycleBuilder gtk) } + internal static MauiAppBuilder ConfigureWindowEvents(this MauiAppBuilder builder) => + builder; } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index f11baabbee23..7f89c6b2c68d 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -137,6 +137,11 @@ public static void UpdateOpacity(this Widget nativeView, IView view) nativeView.Opacity = view.Opacity; } + internal static void UpdateOpacity(this Widget nativeView, double opacity) + { + nativeView.Opacity = opacity; + } + public static void UpdateClip(this WrapperView nativeView, IView view) { nativeView.Clip = view.Clip; diff --git a/src/Core/src/Platform/ViewExtensions.cs b/src/Core/src/Platform/ViewExtensions.cs index 1cbc56f5e052..e000156b8f12 100644 --- a/src/Core/src/Platform/ViewExtensions.cs +++ b/src/Core/src/Platform/ViewExtensions.cs @@ -228,7 +228,7 @@ internal static bool IsLoadedOnPlatform(this IElement element) PlatformView? child; while ((child = descendantView?.GetChildAt(i)) is not null) { -#if TIZEN +#if TIZEN || GTK // I had to add this check for Tizen to compile. // I think Tizen isn't accounting for the null check // in the while loop correctly diff --git a/src/Core/src/SoftInputExtensions.cs b/src/Core/src/SoftInputExtensions.cs index ab5cec57287f..9d1ff998fd17 100644 --- a/src/Core/src/SoftInputExtensions.cs +++ b/src/Core/src/SoftInputExtensions.cs @@ -13,6 +13,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = Tizen.NUI.BaseComponents.View; +#elif GTK +using PlatformView = Gtk.Widget; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; using IPlatformViewHandler = Microsoft.Maui.IViewHandler; diff --git a/src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs b/src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs index 6bf6bafdd7eb..5476da3c64bb 100644 --- a/src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs +++ b/src/Core/src/WindowOverlay/WindowOverlay.Gtk.cs @@ -2,7 +2,7 @@ { public partial class WindowOverlay { - Gtk.Widget? _graphicsView = null; + Gtk.Widget? _graphicsView; /// public void Invalidate() From 2fb378278f00953a284a332e6859350681b6b940 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 19:01:13 +0000 Subject: [PATCH 217/425] [release/8.0.1xx] Update car image/size (#18577) * Update car image/size * Change name back to dotnet_bot The old image name was used in a bunch of tests, it's still the bot so the old name is still fine, and seems like reasonable idea to just revert the name to clean this up. --------- Co-authored-by: redth --- .../src/templates/maui-mobile/MainPage.xaml | 3 +-- .../templates/maui-mobile/MauiApp.1.csproj | 2 +- .../Resources/Images/dotnet_bot.png | Bin 900871 -> 69811 bytes 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Templates/src/templates/maui-mobile/MainPage.xaml b/src/Templates/src/templates/maui-mobile/MainPage.xaml index 3c36c074f912..81c95ce3deda 100644 --- a/src/Templates/src/templates/maui-mobile/MainPage.xaml +++ b/src/Templates/src/templates/maui-mobile/MainPage.xaml @@ -9,9 +9,8 @@ Spacing="25">
      FP@;w?B{&oSrEpCdNP#e_!eXjz`4~vS>AFH!jPh&ijUqycXd93b_H->5uJP91-E8m*P zk@m=|<8MPn7aC)qbA9)Q?|5ti!%rD6U9&OtQA89xMoCb7|8u+|kqvoPlFbWCU1Y_cA8sk5j|Y7en`AJ) zLn9u?i9`IkI^gpM!C&X1wmbq1bsKrt^aTgX&R$khaV{-TvaYrk+}ALKP$|Z1dI0Ob z&9B%3o}l@t+r0z7e6QwqRch0Q|4%dPt0l-I`IRarj1ER|&V>=0);lDR+e2K?$bJLv zQO%z5KJ@lB;P`+4*9i!{nE7gVg}}ApdSf;@>TB8C?8XE8mqoE2cbv}Zi;ZrQmwU}B z1Z5H_Z}Y*|?*n>5uc(~}^9e(7+ zVzSc65#q$h1iuF~aB|35&k?r_;|cFV*f%dbl6MkMh>z`~2M_f0EZ* zqW15cH8k#D6-mNWJQwv_-p1z-`?dj-l~UJ@%$C0JgZr=Ej@5!9lA3EPmkI&tTkAzd z-$4&RTm+MxSvd}|3cl&Ct zL^&13+f#u`SiZ@iFk!QRn>Crz$DYIQt4@CwapG7B91<>Ec*+$^$0^VNCZ23fxE#7P z9UChN=PW+n>7#_qUY+B8;Pl2roy6OsoH?BEl?G?K>G4BY+T-_uZPJ^AZpkpwE<>jk z%ierPUQ4}Ex1jZWJf2O7lI-Ezvs?CIha=WqAa3dhj&*minvmbxy&)o&!8hbu*Xv-# z`9PALu7v}7b-92Ii-+}Y{h_u$M6ls6XXE+-{; zc8k7ul+*JMMl^kQGn&xUMXqbt9F}C#(>Le>9CiR%PE#$2@QM1&mAo)@7osythIj5qy*Z7Pj5r_{t zBex)PVCy0R!iG>_ZyS_oeOX6`d=4znE{~<8$Jp?HxcVGbus1BHY*P1H4~1WMpAE1S z<$L}(L8ug0TSWQuHg@g`+fBWsJ8yM*^u#r@qv>r zn(YmN>a>Yq1AbCM_IG-A+^=^`)YJy8qU5^t8B}!d-r+|F8W5Ab$%2c#=@x|?)+Xc1 zA8h{>W}Oz_kZ;~J0jZ7Tyko(tkn~l}=xUo(y?T2{Z`Ff^N9($nG)9-7PZfuP-rwLa z=f*b_g&Z{H=}P`}JlNX4sdx5=LOq?Fz9dIhfFb?LrL84)Hgaf>E4_pOU&$gv#eWIW z<)4(NGhy$1|FBKf>i(&Czy3O?d1ja{^6y@oFeYeUc3|t9+cAHS!R$ItD5FyVn2&id zZF4mbh;%U0njH|q#F_klQ66h2z4C+!Bimq4h%M_0W z!w+i2sa7s-_Gz?eX76gqZr?t=5s9Js(l}U#(v;ngJrrSakZOCR;J>6xk+EuW%OO7| zCD0*DYSTl%r9`8e{cp$@X6!Y!UUG{*UZ* zRJ+t3TCIfO%)usP7ABLO6IK8fowljZPXJ3GPvB6p1I z?9+-b5?6P*c_)}3>1D3KA-gn@VXNcebNgiD2Rmx<=8kjKM%IukXgmp@H8N#HK zGoEUz()b0O^>i6rNF0Ij$X-d+%thbwEgzH=X57^3pFg^#i3|`V;x-h)G&5F z8Drg0a!OkqY2XyFwR2jImxkpFM_#;ExiT%pB{rfAk zll~rdi3d$3SUQ~K7c6DGwTFt4rvs(dARI^ih^fi4`m@JVI!d3N&#qo+9CDR*9ZVHh zujNoz%Y^V@KaZ{kdhk09K-3^QgaRw0MtRoK!a9&r7mxd+7~0>H74#fM*dBG$DbOMw zaT_VFG~M;?I@Og%*BqEr$4V{f_auN_Sr3}?_g z2LYn&fLg~O9e(e2qKWU|-+hYVv_jl00HrtYL<_PeQrrC%!S;6$#M3RZA(8=9yuPjB z|5M0#Ye3d>eWUv3)Aq4nD)!kdreLGjxM)=ZKOI8oj5&#$v~xF@19vQg&)5f?0wl|u zh$oxhu=hW}j7F1wc?-BaVuBmw#HptyvMaIv9%G{2-Ygv{wu}0Y#;>9hEo8;qoMJ`# zRq!U%z&tfnG2Y~{^!^=_JecPkM@WRb47`zbDXeuZ6*t zgXV+8?S_Xyq2Uz$2g&&{(vO=h*G_FPs%T2^JniO|%gy=>`+^ z0ePF0><0{uQAzwqR!MV2c~!_EK{yc!-m^#J^OR&iGOyP%0@gnZE@#&vQfr8 z@ZlPCu4NAZJ$P8U>vLF_B%W108|EJVV{tf`q^rQ{JnIm++6?zb-1`!ruN>F0VYcqy z;5S5~D)D-6+in*oow5VfMc%1T$1hpT-fg}@96qU1V97ixrg3VH7x%16F7h>`&Ta28 z8p-Fo{$?D1%d2!efNM#leD96F zadJZa-{aHh1A%z2Ojz80yPu(imFuC-LE`Xu=ZZ*UOT{J~<*@TwQHb6SM}^<$gy23A zjCHZBw|Tck3(%V_Sy^=cBa1G0z`&5W^>C>kY6-{{AOzoNw0$xAqh%cJ)B}Mf^7x`y z;Vu^;&r8hiQJ!)E z347PG3rcFR#^jN0ql>C4VO9gHPbNJdi*_m1fG;##f_xlH5#k<}d#e+p5^We8U3TxE z^1?jSrc&a|b@$dVVBWod(XWzS^!xb~b*Ho~^8FoW4Hh`;>9u*I0ZrwoZ@cG7hrKLGO(9HJ?t#i5F>Cm|(;C0TyWcH3!rt~$wir!K<&n@(O zuOJDZ!x8E_@&#(WemV`m-9o{y#h=U!>w^MVPMs9do)j60oOqF15ONhW6Px(Y_mBcSDvS z0~@%Jc_uYZ`~g>L=yIQ6#m<8E_OaR7VPapwj2omanVZHj(-j7AW9LX&1;l{ z)NgnhK}ValoAh0(&05{y6-Dv z9ERm;4f9nQqy_ASiU>{n!;%TJ=)m>dnPoP$Tu^eA=p2FKE0PIr+q%r?$8+YeVPU^0 z(^6)cJNSsVu|f7p#CO82OF9SdZ>1m*UPpUtZBm$clV*K*&<77!QJuq9R;au)^x^Py z&Sum$A3m*#ON=@}(l>2$Dt+5fh$MItDIm@9FKWK%!L!~Jz!lp4UIuTCqk}#cdi{Tf zq>E-QVcMAnEDUd70yM+5rwb+WXwSeiYddtpsGB?C~cTRi6;P@Z^ zqv*WD+4|csZf|PErl?U#^oOG8w6|J`6ElguM~$NPrc@C{?LC6TD7E+AB}$7@RLxe6 zqSZI=|G6$#+X8cb=D#Gk8lJ*WF$=ldPf@7r&^ z_nwElW{oOQ7jRu)k_Q7{|NnC`Kq?3J9%qAakM_nn_CAENjT0d)e!EL$drZh|I9xpQ z_y$8K=L=Qs*1GGjym?)hNpYHkw+@&V))oQR$tO-47vX)OTY_*ieT5a0@veO|3B8=q za}ch6Q`U+xy? z?tl7;p<4bpFqY>poLEBfnw~qllg&KDGQrFTA&=O^SY_HfWSiF(a3{hSY-4524hm>v zYshNitFZUhUa--Veim+y71~1(uhf+O_p<`cQ%bI#rvwXP#~alNVJX1U;-pu6EzOJy zJ~JkVlEoiN)o&8D>Pt>Lr;AOe6_+(>eR$9S5%ji$;f{(Kr9p!=HT-m3=n1sQhc7gCa#3QEJ zRoE~FTy;es?rO00!YqXhI+~yOVXo7zCBKJc$0c3Vi5qdlwsiY`xl`FI27Rb%QV|u$ zmWa98p{0EU90`j6iNiHG;!b+Xh994)Ia(>4?$>w!{n77f;o0`R+``0Sm9aC)`#j35 z{$hF9u|)XKm-J~epz?T64DQ@M{qXMrzhgQuSM?`rMh-QY9hL%kGmk&07TDzvS$ebJ zGX!6>oO*G8ZFY}m2SNnK(s7A)YM4fV?Z~+F>Y_2EF#+6*6lEOM19`wA0}0& zCUL0KluOwl;QAjUujOe-X3FbF`-I@iKry9|WRx&5ywBH~v)aA_3>Y!K+Vt=tMG zZLELWi@lTHyuUQP=5ccP>Ad^zVf)eQD@v!%t1kn{lWi}b)R3i#Ex=oh&&a_iDK zprTFe&%M))x|-T%T-3hqR>_;+MxE*pS~m-Pe(>u()O%jqEw4%3hmU#cbiL{6Q|^rT z`qS;jC`uGfM1jFtqAODlG1=-!ck9)4m|3(e@qzC6Z2DKPd*xH?QK(4$9~#*d`5E+q zOA-v9_)X~@RcBHS3cH+{MYP@Ho z@Py*zbLX#Dk$^{sEfp>j2>$!E)MqiI_RhFekcm%i8^S*Ssw<5_`mvtY580c)@di5VqB6<2I8KlUYfE^ZbDh}g5`X&p z&&##D{dM;T>e`{1-nWb|(3Sq~{&u;r#IxJ*q&LncL=J&%=|>5XA=p=Cu9_L) zD+9%YIo-E%081!sQooB!UtR!fi~ph8qA>R3R918UvfxDohl#Y3qB&maZWo)ub-W?% zhvYyX*?mwq>9AG6iy8Q0^fb{g_%hO~Wjp*q;Gh73b`&Y$&mQ4SXWZP}_p+9h;6Mg{ z^g+t|v-B^UTZcEayXdTt3k?Hs7QObk9BT)vf3o<>Tf58)c6xaq_<%) z@`!u=_RYes+zFIPlmNf59lwgDQ6vF#?=M!B@eIiFK!;FUR~?1Yaqtte!kf*)&{=wl zsC>4Ad`ome^Inp-&wP2|Uj~-bunKs{@!A6)kI+HA2-`+(HroNA zNEC$++LjzzqK5ZVCo;~Y;Cc`{${K@=!NfG2Bl1AekfjefDQZoLPvo}KA4#}*gE-1> zFmHG{vFMzc{*|@1;YQq*xVtyFwqGAAUt2dY0B$dY&54|^)oTs-phnIWGSmUQOm1Hn zj<{j+Zp(u?l^Ir*EUsqN=t^@*eR@wx%#Dk29G>eF*ivTfML14W)*OnYL|REC?CT#sDLI5)yt(e@ji_ccCnf;) zwhJQBd;>WsVqlpRN0h4*%JT2KCA~^cGb6?RjFg}yB5sw`C#tPSkZY$`8YP$czeR0anGL8F1FBT2-F!>gypIz+ZnoXS1_<@pW$ZH*yZCyKp zZO9w-<`C-))l)0?7_uB3Ht^=`O3iBk(@@l=_yr{QRo%xLyntoZU3 z@EVg&9wTGfq(PEu%7!>L_L{*E**8e3P9t@w%sD`H#S zERxYLjALr|$ISV$;ck=fwaR^=Z*;>?K>Svo>9_tT<5!sF^ghr-W7O8DtsfZgK?gdT z6XV+$Gqj{>-y0{&(}!?$CST^wgzYaP4Ngrw4pnzfc&`DFK@M!m9@Rhi#W5;gJJGdv%N)p}v zll3x*P5QEO&JwKoXZc0zd86~gXN)BQwxS+^cbhV{EfX?5>*acCHgI=V1G{fld~)rh z0`BgkmNIF92X}+`;2yY}W*gGEDw%fj@2B%oWlN^fi**x?Gh3!n&amfl`3!Jj4k!UJ zsTs57+?Vtp6;7o*JxUwS`p<6pT8)~9=+*{|$t4f6t;-3vQiupBA;vfehy(Y4#ggto zZqfG+pev^pyf`c`B>2WVA=9b9LEKfCr;1us1jAP`#mr)^3oVU@M-G`@qR932T+Nk1 z@JJ#tNkHi=?&$k{j|$NFyZ4c=vh{$T1oB4qz3#*dUk_P)HTYM~eBpV$S;e~9$C>NI zg7aB4rlh3m;0``U9Z3o|jj$xk{Ivh`ok#E38CVXRI#j8yv1C&v+~Hs5;{$E^3}dPL z*?L><;lt!OIR@-7Ew@QY1)@lA`>IoqU`+Jg;&Ri>=b#T`MBIe^D-3WN&2xkU)Zk}` zTp0^(vq;3+S;Xn-xzb{)PM^tB$!|PFOh9h00Lx-mQ<0B@i;x0Ktsai^R6ZzXOzmZt z!9qioG4>Ojr}jVI(?!GZ2a^!ZbAL9-V)T5If!t0DNgWyRjRPr%`QmMR4Et;#)DQ`y z$-P4sm)Mi`o~T(^dA}Eku>aF4TnZ@-ulddK>k&Tx;*LQ0P)2_n36pC@j*>x0GrNjC z-01h>Ma%sIT!S9OMr_nJ0;pzSYuMEw^rITIB;T!>K*rZ_ADmLnid_G!Bj1@he2}VA zl5KhkB~KFA!^}alC5wcI; z@%w@)Z-8#+BO2DIJy`p=>eWfpMX>u=bHE~ z`gF*2uXnBA%~oeGh^&FQRQ$GrZ~f4TC}N_w+C*OTFk7|Gy>O3?Y7ulFJhZzaZ0)yi z^#z;>Ay*c4u;1<_!Yxa4=P%<2E}du)XabpS-*h({cBCc}%1=x|M01FL7302hBr{?x z^1U<6Qv|P}2z~mGQ{FBK^R@S6qClqeB)Vr~T(Jw~PzJ^~4Em^X!5GO+%1eXQqA%~* zcqi(&>ikDrtZKd20oxZcpd#F%1!@eu=v=RV#hSG`%nTSWKYW9(WyKAM`6pa;-zrJu z-4W--iq^y+45iKc2dY#3@_Z2M4KuoSPTc0F?o1yO&0t%wx7M>WxjmTITl4J+7#%IE zPe0a&7Im+f-`=Qw^|2|{@}~V;O5`lsUC|5?a9pi`9iPre>b1_vJcHVf|B|6V@@M$~ z5~RPv-mSEUT#fA)9S10B_oX6V^<+xt`+xC5&gb+#z)D5-0WE$_` zk-T5IMc1=CHa%~jc7NwevDR~~GW#IGIM(dCw%Qe`x8tcE;%+a3FN7lp%?uS@Qs4;8 z#AQ3%ffs_qBqMv3Yh zdwXlxIx-T}#_?hZ9K>x&D(ULYL*MS7B&YcP^_k90T1%f;d<<1c6w4Vo5OUwBaMp%EM{qk z&x!Xs{1rn5;O?Qk2_qQwZt555&U@MLqFYo{oz=BSkg zn{>sQN&stOH@>P?=&^~N|8ZS`Vzp>W%CR7wp0oA&$=3}cPc2`45>94{}DFJy} zO#fV)txEOja!hpf?$O&((*XHQ+S|hOMK>dweYS^5;MIdUCUma7RJz(wjc7`M^ET^d z@wum3mC?^aWLd1c1}H8(Mt7CT<^_zXq5Q)W16mKSRNV2;OP;Z@_Ss8_S<+=J=X2}H zBX)j{&>{c&A2jpM%3B7P4h?qK2et~4BAdwTXA(HdRTIs%UJcnZad;D_i^Tu1j!zDp%|k*w!1Y?(Wje4!s*}h zf5*ea0>SGwj(XUQ1`_OD2CQuI{P9jEKRnUVCuBAyIN3%eGjN`&N>BXp4-ZQ4ux@Sp zk6TFm$Ih{Kn`{$+3SNqv(x##>H2&lGY(X93JvK%6Dbb9AkVuAY^vS#bXJv^#^84`5 zl}GP@L|UtTfg?6T&+fn*Vsk+%8+#+Xk?y`872!YLSU<{~LVE{pbBQuc>H=?c%-^mA zQ3)`6;{e2eBa!WBd{-s&?}EtIt-kNb84_*Q0K^8UO(Y5P>rf1Su8b#b0`gGxw$0Mp`~LO^V;1}o_- zi`+ZVw^G$BPDeCMbl0dgoU+a35hp;1@1la~o$(Qs8$>k0M-EK7(!ay!%y}DWff(Cf zD0Q5oREF`g)kxo0YYTf-6->(#iUr};a!-2wy1--kc%R;;mKv8a3=T0|eA0j{W)LQp|-!gQM#k;&q2~Ci=UMWW%+{ub5x~DT<`7*lh6S* zGUP|^8ww6+rY|>dIAt6q+Gx{Yh~u%3$V<8Byp4Ao%jUp81C~&tDueT9@<&WT2p`p7 z^LjD?{WTDkO=(orO-xE%(_rzia6=cPwUDqKU6K;%b4X7PVnqSExkzr}Qj!kO=znse zv>?F7!$7#~q`)>#Kop=P#M3ccA{>(-w97?C9|1mKJ>I0DO}?~BKG_|!eDimMy)z^r|;{%q*DqKtq0iH;X+Jjr29 zYvSpBK#8TRv%@j7hT@!cNeOp}8y99P~Xp*>>;t zn@*gmp-v;(etu6cOajJlf0Y($B47ZW_C5Cp&Lr5I-6nMOA*Y2N^NImKs-+Tl(CJh5 zEmf@b6P0xEq`tmN-W5!bl8A~*7%63VvlJ)MGpQq$5Odhno(^mc3)AaLj$;|Okn+_@mr3r>wV8l6@pcd zlDCHEH*T{s8hV?&vicB?`a+3spXqBTz#qV7INRAxEgUN|%)vvUU{vLtc$hJbOF-{q zGyKDhJip179sWpVI>^0yK5%xg^#0evkg&BG$#s`o#^y8O=Fyp7RgGNFdevJLcA93Y zu=41lS$jrTBTT=aYDdn?aEIhOf+5o$4@pfTEn~TXVc?=9bvy%Y&DT2VfLHb^ zt^(>+cU}f2#y-2p3(X{YM5fS25fF7Eb)tv@dI{koMhCpcybCj*Q4i^;>eAQhylLT4 zz~1hk^8;uBHmb}7%oJ_Q?>*D?dXFzQ$kV^#tN-+ky_MADgkVAQ=Qo_~_j8WTYdq*X8h8%kakAX$m;T z`SF{-Xa>}H_=dS|Y9gX3?FVLy7RU&flRn)S{N{mH6g%0A7N@|Cy{eV1d|BD;UZbFy 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 literal 900871 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%0Dsg?jO_#LXYuef#y46lCVsrzV`)rmU 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 z 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�DD7r`2a<%y7J~2>Ao(^Qa*GoIaBvme;p))%B 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�B=>v++t?;5epH!A6;`{^FABb%;N1gi5 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 j*h74hK17jN^cpwAdCHErNrJ?wl%1mQO@RH=4 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
      @|;YzVKYdZ)e>U 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
        2=U@K#?fHX0eRuxw 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 From f3f28c1aa8cfb1d057314baeeac0d5b4f8d9ec94 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 20:28:04 +0100 Subject: [PATCH 218/425] Graphics.Gtk.csproj: remove package --- src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj index 0278d774d482..8817406fde30 100644 --- a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj +++ b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj @@ -1,7 +1,7 @@ - netstandard2.1;netstandard2.0;$(_MauiDotNetTfm) + $(_MauiDotNetTfm)-gtk Microsoft.Maui.Graphics.Gtk @@ -9,10 +9,7 @@ $(NoWarn);CA1307;CA1309;CS8603;CS8618;CS0162 - - - - + From 6c851c700e4060c2624c06b039a56accc934b42c Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 20:28:45 +0100 Subject: [PATCH 219/425] Essentials.csproj: Screenshot.shared.cs: track api changes --- .../src/Screenshot/Screenshot.shared.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Essentials/src/Screenshot/Screenshot.shared.cs b/src/Essentials/src/Screenshot/Screenshot.shared.cs index 7fc758d41da7..be8cbade5699 100644 --- a/src/Essentials/src/Screenshot/Screenshot.shared.cs +++ b/src/Essentials/src/Screenshot/Screenshot.shared.cs @@ -93,6 +93,21 @@ public interface IPlatformScreenshot : IScreenshot /// The view to capture. /// An instance of with information about the captured screenshot. Task CaptureAsync(Tizen.NUI.BaseComponents.View view); +#elif GTK + + /// + /// Captures a screenshot of the specified window. + /// + /// The window to capture. + /// An instance of with information about the captured screenshot. + Task CaptureAsync(Gtk.Window window); + + /// + /// Captures a screenshot of the specified view. + /// + /// The view to capture. + /// An instance of with information about the captured screenshot. + Task CaptureAsync(Gtk.Widget view); #endif } @@ -280,7 +295,7 @@ public static Task CaptureAsync(this IScreenshot screenshot, /// The object this method is invoked on. /// The widget to capture. /// An instance of with information about the captured screenshot. - public static Task CaptureAsync(this IScreenshot screenshot, Gtk.Widget view) => + public static Task CaptureAsync(this IScreenshot screenshot, Gtk.Widget view) => screenshot.AsPlatform().CaptureAsync(view); #endif } From 27bd53f1640dbffd83d3af5e7190d5a56eacea8e Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 20:29:42 +0100 Subject: [PATCH 220/425] Core.csproj: ViewExtensions: some more dummy's & GetChildAt --- src/Core/src/Platform/Gtk/ViewExtensions.cs | 50 ++++++++++++++------- src/Core/src/ViewExtensions.cs | 2 +- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 7f89c6b2c68d..321e935f4241 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -8,12 +8,9 @@ namespace Microsoft.Maui.Platform { - public static partial class ViewExtensions { - - public static void UpdateAutomationId(this Widget nativeView, IView view) - { } + public static void UpdateAutomationId(this Widget nativeView, IView view) { } public static void UpdateBackground(this Widget nativeView, IView view) { @@ -109,7 +106,6 @@ public static void UpdateForeground(this Widget nativeView, Paint? paint) break; } - } public static void UpdateIsEnabled(this Widget nativeView, IView view) => @@ -129,7 +125,6 @@ public static void UpdateSemantics(this Widget nativeView, IView view) { accessible.Description = semantics.Description; } - } public static void UpdateOpacity(this Widget nativeView, IView view) @@ -141,19 +136,17 @@ internal static void UpdateOpacity(this Widget nativeView, double opacity) { nativeView.Opacity = opacity; } - + public static void UpdateClip(this WrapperView nativeView, IView view) { nativeView.Clip = view.Clip; } [MissingMapper] - public static void UpdateClip(this Widget nativeView, IView view) - { } + public static void UpdateClip(this Widget nativeView, IView view) { } [MissingMapper] - public static void UpdateFlowDirection(this Widget nativeView, IView view) - { } + public static void UpdateFlowDirection(this Widget nativeView, IView view) { } internal static Rect GetBoundingBox(this IView view) => view.ToPlatform().GetBoundingBox(); @@ -163,7 +156,6 @@ internal static Graphics.Rect GetPlatformViewBounds(this IView view) var w = view.ToPlatform(); return w.GetPlatformViewBounds(); - } internal static Rect GetPlatformViewBounds(this Gtk.Widget? platformView) @@ -219,8 +211,7 @@ public static void Unfocus(this Widget? platformView, IView view) { } public static void UpdateInputTransparent(this Widget? platformView, IViewHandler handler, IView view) { } - public static void UpdateToolTip(this Widget? platformView, ToolTip? tooltip) - { } + public static void UpdateToolTip(this Widget? platformView, ToolTip? tooltip) { } [MissingMapper] internal static IDisposable OnLoaded(this Widget? platformView, Action action) @@ -242,6 +233,35 @@ public static bool IsLoaded(this Widget? platformView) return platformView.IsRealized; } - } + [MissingMapper] + public static bool HideSoftInput(this Widget platformView) + { + return false; + } + [MissingMapper] + public static bool ShowSoftInput(this Widget platformView) + { + return false; + } + + [MissingMapper] + public static bool IsSoftInputShowing(this Widget platformView) + { + return false; + } + + internal static T? GetChildAt(this Widget view, int index) where T : Widget + { + if (view is Gtk.Container container && container.Children.Length < index) + { + return (T)container.Children[index]; + } + + if (view is Gtk.Bin bin && index == 0 && bin.Child is T child) + return child; + + return default; + } + } } \ No newline at end of file diff --git a/src/Core/src/ViewExtensions.cs b/src/Core/src/ViewExtensions.cs index 99c033278264..f22a770b0803 100644 --- a/src/Core/src/ViewExtensions.cs +++ b/src/Core/src/ViewExtensions.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; using Microsoft.Maui.Media; using System.IO; -#if (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) +#if (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN && !GTK) using IPlatformViewHandler = Microsoft.Maui.IViewHandler; #endif #if IOS || MACCATALYST From 8bc9bc869b22638260a9d3dbca02032fae47e0bc Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 20:36:37 +0100 Subject: [PATCH 221/425] Controls.Core.csproj: GestureManager.Gtk, ModalNavigationManager.Gtk: track api changes --- ...ager.Gtk.cs => GesturePlatformManager.Gtk.cs} | 4 ++-- .../ModalNavigationManager.Gtk.cs | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) rename src/Controls/src/Core/Platform/GestureManager/{GestureManager.Gtk.cs => GesturePlatformManager.Gtk.cs} (57%) diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Gtk.cs b/src/Controls/src/Core/Platform/GestureManager/GesturePlatformManager.Gtk.cs similarity index 57% rename from src/Controls/src/Core/Platform/GestureManager/GestureManager.Gtk.cs rename to src/Controls/src/Core/Platform/GestureManager/GesturePlatformManager.Gtk.cs index 6275ef1b866d..ca137b46c499 100644 --- a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Gtk.cs +++ b/src/Controls/src/Core/Platform/GestureManager/GesturePlatformManager.Gtk.cs @@ -4,9 +4,9 @@ namespace Microsoft.Maui.Controls.Platform { - class GestureManager : IDisposable + class GesturePlatformManager : IDisposable { - public GestureManager(IViewHandler handler) + public GesturePlatformManager(IViewHandler handler) { } diff --git a/src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs b/src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs index c8893d0583f8..75df1eda4e4c 100644 --- a/src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs +++ b/src/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.Gtk.cs @@ -9,14 +9,22 @@ namespace Microsoft.Maui.Controls.Platform { internal partial class ModalNavigationManager { - public Task PopModalAsync(bool animated) + Task PopModalPlatformAsync(bool animated) { - throw new NotImplementedException(); + var currentPage = CurrentPlatformPage!; + _platformModalPages.Remove(currentPage); + return Task.FromResult(currentPage); } - public Task PushModalAsync(Page modal, bool animated) + Task PushModalPlatformAsync(Page modal, bool animated) { - throw new NotImplementedException(); + _platformModalPages.Add(modal); + return Task.CompletedTask; } + + Task SyncModalStackWhenPlatformIsReadyAsync() => + SyncPlatformModalStackAsync(); + + bool IsModalPlatformReady => true; } } From 5619bee4227c13f5a2fb06f6d0cbc9c8ac4bf6d3 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 21:04:25 +0100 Subject: [PATCH 222/425] Controls.Core.csproj: track api changes & add dummy's --- src/Controls/src/Core/Button/Button.Gtk.cs | 2 +- src/Controls/src/Core/Controls.Core.csproj | 2 +- src/Controls/src/Core/Editor/Editor.Gtk.cs | 2 +- src/Controls/src/Core/Element/Element.Gtk.cs | 4 +- .../Core/{HandlerImpl => }/Entry/Entry.Gtk.cs | 2 +- src/Controls/src/Core/Label/Label.Gtk.cs | 8 +- .../{HandlerImpl => }/Layout/Layout.Gtk.cs | 0 .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 7029 +++++++++++++++++ .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 213 + .../src/Core/RadioButton/RadioButton.Gtk.cs | 16 + .../SearchBar/SearchBar.Gtk.cs | 2 +- 11 files changed, 7269 insertions(+), 11 deletions(-) rename src/Controls/src/Core/{HandlerImpl => }/Entry/Entry.Gtk.cs (65%) rename src/Controls/src/Core/{HandlerImpl => }/Layout/Layout.Gtk.cs (100%) create mode 100644 src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Unshipped.txt create mode 100644 src/Controls/src/Core/RadioButton/RadioButton.Gtk.cs rename src/Controls/src/Core/{HandlerImpl => }/SearchBar/SearchBar.Gtk.cs (64%) diff --git a/src/Controls/src/Core/Button/Button.Gtk.cs b/src/Controls/src/Core/Button/Button.Gtk.cs index 2cf031d5a196..3426b782da9c 100644 --- a/src/Controls/src/Core/Button/Button.Gtk.cs +++ b/src/Controls/src/Core/Button/Button.Gtk.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui.Controls { public partial class Button { - public static void MapText(ButtonHandler handler, Button button) + public static void MapText(IButtonHandler handler, Button button) { handler.PlatformView?.UpdateText(button); } diff --git a/src/Controls/src/Core/Controls.Core.csproj b/src/Controls/src/Core/Controls.Core.csproj index 7d4320035e95..05fef17ddd0f 100644 --- a/src/Controls/src/Core/Controls.Core.csproj +++ b/src/Controls/src/Core/Controls.Core.csproj @@ -12,7 +12,7 @@ high true true - $(NoWarn);CS1591;RS0041;RS0026;RS0027;RS0022 + $(NoWarn);CS1591;RS0041;RS0026;RS0027;RS0022;RS0036 $(NoWarn);CA1420 diff --git a/src/Controls/src/Core/Editor/Editor.Gtk.cs b/src/Controls/src/Core/Editor/Editor.Gtk.cs index 72971cce45ed..1374990cd39b 100644 --- a/src/Controls/src/Core/Editor/Editor.Gtk.cs +++ b/src/Controls/src/Core/Editor/Editor.Gtk.cs @@ -2,7 +2,7 @@ { public partial class Editor { - public static void MapText(EditorHandler handler, Editor editor) + public static void MapText(IEditorHandler handler, Editor editor) { handler.PlatformView?.UpdateText(editor); } diff --git a/src/Controls/src/Core/Element/Element.Gtk.cs b/src/Controls/src/Core/Element/Element.Gtk.cs index ab1b890d85d9..ccd418c17a32 100644 --- a/src/Controls/src/Core/Element/Element.Gtk.cs +++ b/src/Controls/src/Core/Element/Element.Gtk.cs @@ -9,11 +9,11 @@ public partial class Element { [MissingMapper] - public static void MapAutomationPropertiesIsInAccessibleTree(IElementHandler handler, Element element) + public static void MapAutomationPropertiesIsInAccessibleTree(IElementHandler handler, IElement element) { } [MissingMapper] - public static void MapAutomationPropertiesExcludedWithChildren(IElementHandler handler, Element element) + public static void MapAutomationPropertiesExcludedWithChildren(IElementHandler handler, IElement element) { } } diff --git a/src/Controls/src/Core/HandlerImpl/Entry/Entry.Gtk.cs b/src/Controls/src/Core/Entry/Entry.Gtk.cs similarity index 65% rename from src/Controls/src/Core/HandlerImpl/Entry/Entry.Gtk.cs rename to src/Controls/src/Core/Entry/Entry.Gtk.cs index 94ffcc014403..9a8cb9b1a5f4 100644 --- a/src/Controls/src/Core/HandlerImpl/Entry/Entry.Gtk.cs +++ b/src/Controls/src/Core/Entry/Entry.Gtk.cs @@ -2,7 +2,7 @@ { public partial class Entry { - public static void MapText(EntryHandler handler, Entry entry) + public static void MapText(IEntryHandler handler, Entry entry) { handler.PlatformView.UpdateText(entry); } diff --git a/src/Controls/src/Core/Label/Label.Gtk.cs b/src/Controls/src/Core/Label/Label.Gtk.cs index f788f312a628..6199444d75b5 100644 --- a/src/Controls/src/Core/Label/Label.Gtk.cs +++ b/src/Controls/src/Core/Label/Label.Gtk.cs @@ -6,22 +6,22 @@ namespace Microsoft.Maui.Controls public partial class Label { - public static void MapTextType(LabelHandler handler, Label label) + public static void MapTextType(ILabelHandler handler, Label label) { handler.PlatformView?.UpdateText(label, label.TextType); } - public static void MapText(LabelHandler handler, Label label) + public static void MapText(ILabelHandler handler, Label label) { handler.PlatformView?.UpdateText(label, label.TextType); } - public static void MapLineBreakMode(LabelHandler handler, Label label) + public static void MapLineBreakMode(ILabelHandler handler, Label label) { handler.PlatformView?.UpdateLineBreakMode(label); } - public static void MapMaxLines(LabelHandler handler, Label label) + public static void MapMaxLines(ILabelHandler handler, Label label) { handler.PlatformView?.UpdateText(label, label.TextType); } diff --git a/src/Controls/src/Core/HandlerImpl/Layout/Layout.Gtk.cs b/src/Controls/src/Core/Layout/Layout.Gtk.cs similarity index 100% rename from src/Controls/src/Core/HandlerImpl/Layout/Layout.Gtk.cs rename to src/Controls/src/Core/Layout/Layout.Gtk.cs diff --git a/src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..5b822a0d7828 --- /dev/null +++ b/src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1,7029 @@ +#nullable enable +~abstract Microsoft.Maui.Controls.DataTemplateSelector.OnSelectTemplate(object item, Microsoft.Maui.Controls.BindableObject container) -> Microsoft.Maui.Controls.DataTemplate +~abstract Microsoft.Maui.Controls.Internals.GIFImageParser.AddBitmap(Microsoft.Maui.Controls.Internals.GIFHeader header, Microsoft.Maui.Controls.Internals.GIFBitmap bitmap, bool ignoreImageData) -> void +~abstract Microsoft.Maui.Controls.Internals.TableModel.GetItem(int section, int row) -> object +~abstract Microsoft.Maui.Controls.Layout.CreateLayoutManager() -> Microsoft.Maui.Layouts.ILayoutManager +~abstract Microsoft.Maui.Controls.MultiPage.CreateDefault(object item) -> T +~abstract Microsoft.Maui.Controls.RouteFactory.GetOrCreate() -> Microsoft.Maui.Controls.Element +~abstract Microsoft.Maui.Controls.RouteFactory.GetOrCreate(System.IServiceProvider services) -> Microsoft.Maui.Controls.Element +~abstract Microsoft.Maui.Controls.Shapes.Geometry.AppendPath(Microsoft.Maui.Graphics.PathF path) -> void +~abstract Microsoft.Maui.Controls.TriggerAction.Invoke(T sender) -> void +~abstract Microsoft.Maui.Controls.WebViewSource.Load(Microsoft.Maui.IWebViewDelegate renderer) -> void +~const Microsoft.Maui.Controls.Binding.SelfPath = "." -> string +~const Microsoft.Maui.Controls.BrushTypeConverter.Hsl = "hsl" -> string +~const Microsoft.Maui.Controls.BrushTypeConverter.Hsla = "hsla" -> string +~const Microsoft.Maui.Controls.BrushTypeConverter.LinearGradient = "linear-gradient" -> string +~const Microsoft.Maui.Controls.BrushTypeConverter.RadialGradient = "radial-gradient" -> string +~const Microsoft.Maui.Controls.BrushTypeConverter.Rgb = "rgb" -> string +~const Microsoft.Maui.Controls.BrushTypeConverter.Rgba = "rgba" -> string +~const Microsoft.Maui.Controls.CarouselView.CurrentItemVisualState = "CurrentItem" -> string +~const Microsoft.Maui.Controls.CarouselView.DefaultItemVisualState = "DefaultItem" -> string +~const Microsoft.Maui.Controls.CarouselView.NextItemVisualState = "NextItem" -> string +~const Microsoft.Maui.Controls.CarouselView.PreviousItemVisualState = "PreviousItem" -> string +~const Microsoft.Maui.Controls.CheckBox.IsCheckedVisualState = "IsChecked" -> string +~const Microsoft.Maui.Controls.Device.Android = "Android" -> string +~const Microsoft.Maui.Controls.Device.iOS = "iOS" -> string +~const Microsoft.Maui.Controls.Device.MacCatalyst = "MacCatalyst" -> string +~const Microsoft.Maui.Controls.Device.Tizen = "Tizen" -> string +~const Microsoft.Maui.Controls.Device.tvOS = "tvOS" -> string +~const Microsoft.Maui.Controls.Device.UWP = "WinUI" -> string +~const Microsoft.Maui.Controls.Device.WinUI = "WinUI" -> string +~const Microsoft.Maui.Controls.FlyoutItem.ImageStyle = "FlyoutItemImageStyle" -> string +~const Microsoft.Maui.Controls.FlyoutItem.LabelStyle = "FlyoutItemLabelStyle" -> string +~const Microsoft.Maui.Controls.FlyoutItem.LayoutStyle = "FlyoutItemLayoutStyle" -> string +~const Microsoft.Maui.Controls.Page.ActionSheetSignalName = "Microsoft.Maui.Controls.ShowActionSheet" -> string +~const Microsoft.Maui.Controls.Page.AlertSignalName = "Microsoft.Maui.Controls.SendAlert" -> string +~const Microsoft.Maui.Controls.Page.BusySetSignalName = "Microsoft.Maui.Controls.BusySet" -> string +~const Microsoft.Maui.Controls.Page.PromptSignalName = "Microsoft.Maui.Controls.SendPrompt" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ButtonStyle.Bottom = "bottom" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ButtonStyle.Circle = "circle" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ButtonStyle.Default = "default" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ButtonStyle.SelectMode = "select_mode" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ButtonStyle.Text = "textbutton" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection.Back = "Back" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection.Down = "Down" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection.Forward = "Forward" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection.Left = "Left" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection.None = "None" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection.Right = "Right" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection.Up = "Up" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.Black = "Black" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.Bold = "Bold" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.Book = "Book" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.ExtraBlack = "ExtraBlack" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.Light = "Light" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.Medium = "Medium" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.None = "None" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.Normal = "Normal" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.SemiBold = "SemiBold" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.Thin = "Thin" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.UltraBold = "UltraBold" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight.UltraLight = "UltraLight" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBarStyle.Default = "default" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBarStyle.Pending = "pending" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.SwitchStyle.CheckBox = "default" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.SwitchStyle.Favorite = "favorite" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.SwitchStyle.OnOff = "on&off" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.SwitchStyle.Small = "small" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.SwitchStyle.Toggle = "toggle" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.TabbedPageStyle.Default = "default" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.TabbedPageStyle.Tabbar = "tabbar" -> string +~const Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.TabbedPageStyle.TabbarWithTitle = "tabbar_with_title" -> string +~const Microsoft.Maui.Controls.RadioButton.CheckedIndicator = "CheckedIndicator" -> string +~const Microsoft.Maui.Controls.RadioButton.CheckedVisualState = "Checked" -> string +~const Microsoft.Maui.Controls.RadioButton.TemplateRootName = "Root" -> string +~const Microsoft.Maui.Controls.RadioButton.UncheckedButton = "Button" -> string +~const Microsoft.Maui.Controls.RadioButton.UncheckedVisualState = "Unchecked" -> string +~const Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.Ellipse = "Ellipse" -> string +~const Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.Line = "Line" -> string +~const Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.Path = "Path" -> string +~const Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.Polygon = "Polygon" -> string +~const Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.Polyline = "Polyline" -> string +~const Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.Rectangle = "Rectangle" -> string +~const Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.RoundRectangle = "RoundRectangle" -> string +~const Microsoft.Maui.Controls.Switch.SwitchOffVisualState = "Off" -> string +~const Microsoft.Maui.Controls.Switch.SwitchOnVisualState = "On" -> string +~const Microsoft.Maui.Controls.VisualStateManager.CommonStates.Disabled = "Disabled" -> string +~const Microsoft.Maui.Controls.VisualStateManager.CommonStates.Focused = "Focused" -> string +~const Microsoft.Maui.Controls.VisualStateManager.CommonStates.Normal = "Normal" -> string +~const Microsoft.Maui.Controls.VisualStateManager.CommonStates.PointerOver = "PointerOver" -> string +~const Microsoft.Maui.Controls.VisualStateManager.CommonStates.Selected = "Selected" -> string +~Microsoft.Maui.Controls.AbsoluteLayout.GetLayoutBounds(Microsoft.Maui.IView view) -> Microsoft.Maui.Graphics.Rect +~Microsoft.Maui.Controls.AbsoluteLayout.GetLayoutFlags(Microsoft.Maui.IView view) -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +~Microsoft.Maui.Controls.AbsoluteLayout.SetLayoutBounds(Microsoft.Maui.IView view, Microsoft.Maui.Graphics.Rect bounds) -> void +~Microsoft.Maui.Controls.AbsoluteLayout.SetLayoutFlags(Microsoft.Maui.IView view, Microsoft.Maui.Layouts.AbsoluteLayoutFlags flags) -> void +~Microsoft.Maui.Controls.Accelerator.Keys.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.Accelerator.Keys.set -> void +~Microsoft.Maui.Controls.Accelerator.Modifiers.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.Accelerator.Modifiers.set -> void +~Microsoft.Maui.Controls.ActivityIndicator.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ActivityIndicator.Color.set -> void +~Microsoft.Maui.Controls.ActivityIndicator.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.AndExpandLayoutManager.AndExpandLayoutManager(Microsoft.Maui.Controls.StackLayout stackLayout) -> void +~Microsoft.Maui.Controls.Animation.Add(double beginAt, double finishAt, Microsoft.Maui.Controls.Animation animation) -> void +~Microsoft.Maui.Controls.Animation.Animation(System.Action callback, double start = 0, double end = 1, Microsoft.Maui.Easing easing = null, System.Action finished = null) -> void +~Microsoft.Maui.Controls.Animation.Commit(Microsoft.Maui.Controls.IAnimatable owner, string name, uint rate = 16, uint length = 250, Microsoft.Maui.Easing easing = null, System.Action finished = null, System.Func repeat = null) -> void +~Microsoft.Maui.Controls.Animation.GetCallback() -> System.Action +~Microsoft.Maui.Controls.Animation.Insert(double beginAt, double finishAt, Microsoft.Maui.Controls.Animation animation) -> Microsoft.Maui.Controls.Animation +~Microsoft.Maui.Controls.Animation.WithConcurrent(Microsoft.Maui.Controls.Animation animation, double beginAt = 0, double finishAt = 1) -> Microsoft.Maui.Controls.Animation +~Microsoft.Maui.Controls.Animation.WithConcurrent(System.Action callback, double start = 0, double end = 1, Microsoft.Maui.Easing easing = null, double beginAt = 0, double finishAt = 1) -> Microsoft.Maui.Controls.Animation +~Microsoft.Maui.Controls.AppLinkEntry.AppLinkUri.get -> System.Uri +~Microsoft.Maui.Controls.AppLinkEntry.AppLinkUri.set -> void +~Microsoft.Maui.Controls.AppLinkEntry.Description.get -> string +~Microsoft.Maui.Controls.AppLinkEntry.Description.set -> void +~Microsoft.Maui.Controls.AppLinkEntry.KeyValues.get -> System.Collections.Generic.IDictionary +~Microsoft.Maui.Controls.AppLinkEntry.Thumbnail.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.AppLinkEntry.Thumbnail.set -> void +~Microsoft.Maui.Controls.AppLinkEntry.Title.get -> string +~Microsoft.Maui.Controls.AppLinkEntry.Title.set -> void +~Microsoft.Maui.Controls.BackButtonBehavior.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.BackButtonBehavior.Command.set -> void +~Microsoft.Maui.Controls.BackButtonBehavior.CommandParameter.get -> object +~Microsoft.Maui.Controls.BackButtonBehavior.CommandParameter.set -> void +~Microsoft.Maui.Controls.BackButtonBehavior.IconOverride.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.BackButtonBehavior.IconOverride.set -> void +~Microsoft.Maui.Controls.BackButtonBehavior.TextOverride.get -> string +~Microsoft.Maui.Controls.BackButtonBehavior.TextOverride.set -> void +~Microsoft.Maui.Controls.BackgroundingEventArgs.BackgroundingEventArgs(Microsoft.Maui.IPersistedState state) -> void +~Microsoft.Maui.Controls.BackgroundingEventArgs.State.get -> Microsoft.Maui.IPersistedState +~Microsoft.Maui.Controls.BackgroundingEventArgs.State.set -> void +~Microsoft.Maui.Controls.BaseShellItem.FlyoutIcon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.BaseShellItem.FlyoutIcon.set -> void +~Microsoft.Maui.Controls.BaseShellItem.Icon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.BaseShellItem.Icon.set -> void +~Microsoft.Maui.Controls.BaseShellItem.Route.get -> string +~Microsoft.Maui.Controls.BaseShellItem.Route.set -> void +~Microsoft.Maui.Controls.BaseShellItem.Title.get -> string +~Microsoft.Maui.Controls.BaseShellItem.Title.set -> void +~Microsoft.Maui.Controls.BaseShellItem.Window.get -> Microsoft.Maui.Controls.Window +~Microsoft.Maui.Controls.Behavior.AssociatedType.get -> System.Type +~Microsoft.Maui.Controls.Behavior +~Microsoft.Maui.Controls.BindableObject.BindingContext.get -> object +~Microsoft.Maui.Controls.BindableObject.BindingContext.set -> void +~Microsoft.Maui.Controls.BindableObject.ClearValue(Microsoft.Maui.Controls.BindableProperty property) -> void +~Microsoft.Maui.Controls.BindableObject.ClearValue(Microsoft.Maui.Controls.BindablePropertyKey propertyKey) -> void +~Microsoft.Maui.Controls.BindableObject.CoerceValue(Microsoft.Maui.Controls.BindableProperty property) -> void +~Microsoft.Maui.Controls.BindableObject.CoerceValue(Microsoft.Maui.Controls.BindablePropertyKey propertyKey) -> void +~Microsoft.Maui.Controls.BindableObject.Dispatcher.get -> Microsoft.Maui.Dispatching.IDispatcher +~Microsoft.Maui.Controls.BindableObject.GetValue(Microsoft.Maui.Controls.BindableProperty property) -> object +~Microsoft.Maui.Controls.BindableObject.IsSet(Microsoft.Maui.Controls.BindableProperty targetProperty) -> bool +~Microsoft.Maui.Controls.BindableObject.RemoveBinding(Microsoft.Maui.Controls.BindableProperty property) -> void +~Microsoft.Maui.Controls.BindableObject.SetBinding(Microsoft.Maui.Controls.BindableProperty targetProperty, Microsoft.Maui.Controls.BindingBase binding) -> void +~Microsoft.Maui.Controls.BindableObject.SetValue(Microsoft.Maui.Controls.BindableProperty property, object value) -> void +~Microsoft.Maui.Controls.BindableObject.SetValue(Microsoft.Maui.Controls.BindablePropertyKey propertyKey, object value) -> void +~Microsoft.Maui.Controls.BindableProperty.DeclaringType.get -> System.Type +~Microsoft.Maui.Controls.BindableProperty.DefaultValue.get -> object +~Microsoft.Maui.Controls.BindableProperty.PropertyName.get -> string +~Microsoft.Maui.Controls.BindableProperty.ReturnType.get -> System.Type +~Microsoft.Maui.Controls.BindablePropertyKey.BindableProperty.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.Binding.Binding(string path, Microsoft.Maui.Controls.BindingMode mode = Microsoft.Maui.Controls.BindingMode.Default, Microsoft.Maui.Controls.IValueConverter converter = null, object converterParameter = null, string stringFormat = null, object source = null) -> void +~Microsoft.Maui.Controls.Binding.Converter.get -> Microsoft.Maui.Controls.IValueConverter +~Microsoft.Maui.Controls.Binding.Converter.set -> void +~Microsoft.Maui.Controls.Binding.ConverterParameter.get -> object +~Microsoft.Maui.Controls.Binding.ConverterParameter.set -> void +~Microsoft.Maui.Controls.Binding.Path.get -> string +~Microsoft.Maui.Controls.Binding.Path.set -> void +~Microsoft.Maui.Controls.Binding.Source.get -> object +~Microsoft.Maui.Controls.Binding.Source.set -> void +~Microsoft.Maui.Controls.Binding.UpdateSourceEventName.get -> string +~Microsoft.Maui.Controls.Binding.UpdateSourceEventName.set -> void +~Microsoft.Maui.Controls.BindingBase.FallbackValue.get -> object +~Microsoft.Maui.Controls.BindingBase.FallbackValue.set -> void +~Microsoft.Maui.Controls.BindingBase.StringFormat.get -> string +~Microsoft.Maui.Controls.BindingBase.StringFormat.set -> void +~Microsoft.Maui.Controls.BindingBase.TargetNullValue.get -> object +~Microsoft.Maui.Controls.BindingBase.TargetNullValue.set -> void +~Microsoft.Maui.Controls.BindingCondition.Binding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.BindingCondition.Binding.set -> void +~Microsoft.Maui.Controls.BindingCondition.Value.get -> object +~Microsoft.Maui.Controls.BindingCondition.Value.set -> void +~Microsoft.Maui.Controls.BoxView.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.BoxView.Color.set -> void +~Microsoft.Maui.Controls.BoxView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.BrushTypeConverter.GradientBrushParser.GradientBrushParser(Microsoft.Maui.Graphics.Converters.ColorTypeConverter colorConverter = null) -> void +~Microsoft.Maui.Controls.BrushTypeConverter.GradientBrushParser.Parse(string css) -> Microsoft.Maui.Controls.GradientBrush +~Microsoft.Maui.Controls.Button.BorderColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Button.BorderColor.set -> void +~Microsoft.Maui.Controls.Button.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.Button.Command.set -> void +~Microsoft.Maui.Controls.Button.CommandParameter.get -> object +~Microsoft.Maui.Controls.Button.CommandParameter.set -> void +~Microsoft.Maui.Controls.Button.ContentLayout.get -> Microsoft.Maui.Controls.Button.ButtonContentLayout +~Microsoft.Maui.Controls.Button.ContentLayout.set -> void +~Microsoft.Maui.Controls.Button.FontFamily.get -> string +~Microsoft.Maui.Controls.Button.FontFamily.set -> void +~Microsoft.Maui.Controls.Button.ImageSource.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Button.ImageSource.set -> void +~Microsoft.Maui.Controls.Button.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Button.Text.get -> string +~Microsoft.Maui.Controls.Button.Text.set -> void +~Microsoft.Maui.Controls.Button.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Button.TextColor.set -> void +~Microsoft.Maui.Controls.CarouselView.CurrentItem.get -> object +~Microsoft.Maui.Controls.CarouselView.CurrentItem.set -> void +~Microsoft.Maui.Controls.CarouselView.CurrentItemChangedCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.CarouselView.CurrentItemChangedCommand.set -> void +~Microsoft.Maui.Controls.CarouselView.CurrentItemChangedCommandParameter.get -> object +~Microsoft.Maui.Controls.CarouselView.CurrentItemChangedCommandParameter.set -> void +~Microsoft.Maui.Controls.CarouselView.IndicatorView.set -> void +~Microsoft.Maui.Controls.CarouselView.ItemsLayout.get -> Microsoft.Maui.Controls.LinearItemsLayout +~Microsoft.Maui.Controls.CarouselView.ItemsLayout.set -> void +~Microsoft.Maui.Controls.CarouselView.PositionChangedCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.CarouselView.PositionChangedCommand.set -> void +~Microsoft.Maui.Controls.CarouselView.PositionChangedCommandParameter.get -> object +~Microsoft.Maui.Controls.CarouselView.PositionChangedCommandParameter.set -> void +~Microsoft.Maui.Controls.CarouselView.VisibleViews.get -> System.Collections.ObjectModel.ObservableCollection +~Microsoft.Maui.Controls.Cell.ContextActions.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Cell.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.CheckBox.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.CheckBox.Color.set -> void +~Microsoft.Maui.Controls.CheckBox.Foreground.get -> Microsoft.Maui.Graphics.Paint +~Microsoft.Maui.Controls.CheckBox.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.ChildGestureRecognizer.GestureRecognizer.get -> Microsoft.Maui.Controls.IGestureRecognizer +~Microsoft.Maui.Controls.ChildGestureRecognizer.GestureRecognizer.set -> void +~Microsoft.Maui.Controls.ChildGestureRecognizer.OnPropertyChanged(string propertyName = "") -> void +~Microsoft.Maui.Controls.ClickedEventArgs.ClickedEventArgs(Microsoft.Maui.Controls.ButtonsMask buttons, object commandParameter) -> void +~Microsoft.Maui.Controls.ClickedEventArgs.Parameter.get -> object +~Microsoft.Maui.Controls.ClickGestureRecognizer.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.ClickGestureRecognizer.Command.set -> void +~Microsoft.Maui.Controls.ClickGestureRecognizer.CommandParameter.get -> object +~Microsoft.Maui.Controls.ClickGestureRecognizer.CommandParameter.set -> void +~Microsoft.Maui.Controls.ClickGestureRecognizer.SendClicked(Microsoft.Maui.Controls.View sender, Microsoft.Maui.Controls.ButtonsMask buttons) -> void +~Microsoft.Maui.Controls.ColumnDefinitionCollection.ColumnDefinitionCollection(params Microsoft.Maui.Controls.ColumnDefinition[] definitions) -> void +~Microsoft.Maui.Controls.Command.CanExecute(object parameter) -> bool +~Microsoft.Maui.Controls.Command.Command(System.Action execute, System.Func canExecute) -> void +~Microsoft.Maui.Controls.Command.Command(System.Action execute) -> void +~Microsoft.Maui.Controls.Command.Command(System.Action execute, System.Func canExecute) -> void +~Microsoft.Maui.Controls.Command.Command(System.Action execute) -> void +~Microsoft.Maui.Controls.Command.Execute(object parameter) -> void +~Microsoft.Maui.Controls.Command.Command(System.Action execute, System.Func canExecute) -> void +~Microsoft.Maui.Controls.Command.Command(System.Action execute) -> void +~Microsoft.Maui.Controls.CompareStateTrigger.Property.get -> object +~Microsoft.Maui.Controls.CompareStateTrigger.Property.set -> void +~Microsoft.Maui.Controls.CompareStateTrigger.Value.get -> object +~Microsoft.Maui.Controls.CompareStateTrigger.Value.set -> void +~Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.Children.get -> Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.IAbsoluteList +~Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.IAbsoluteList +~Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.IAbsoluteList.Add(Microsoft.Maui.Controls.View view, Microsoft.Maui.Graphics.Point position) -> void +~Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.IAbsoluteList.Add(Microsoft.Maui.Controls.View view, Microsoft.Maui.Graphics.Rect bounds, Microsoft.Maui.Layouts.AbsoluteLayoutFlags flags = Microsoft.Maui.Layouts.AbsoluteLayoutFlags.None) -> void +~Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Compatibility.ConstraintExpression.ElementName.get -> string +~Microsoft.Maui.Controls.Compatibility.ConstraintExpression.ElementName.set -> void +~Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Property.get -> string +~Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Property.set -> void +~Microsoft.Maui.Controls.Compatibility.ConstraintExpression.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.Compatibility.Constraint +~Microsoft.Maui.Controls.Compatibility.Grid.Children.get -> Microsoft.Maui.Controls.Compatibility.Grid.IGridList +~Microsoft.Maui.Controls.Compatibility.Grid.ColumnDefinitions.get -> Microsoft.Maui.Controls.ColumnDefinitionCollection +~Microsoft.Maui.Controls.Compatibility.Grid.ColumnDefinitions.set -> void +~Microsoft.Maui.Controls.Compatibility.Grid.IGridList +~Microsoft.Maui.Controls.Compatibility.Grid.IGridList.Add(Microsoft.Maui.Controls.View view, int left, int right, int top, int bottom) -> void +~Microsoft.Maui.Controls.Compatibility.Grid.IGridList.Add(Microsoft.Maui.Controls.View view, int left, int top) -> void +~Microsoft.Maui.Controls.Compatibility.Grid.IGridList.AddHorizontal(Microsoft.Maui.Controls.View view) -> void +~Microsoft.Maui.Controls.Compatibility.Grid.IGridList.AddHorizontal(System.Collections.Generic.IEnumerable views) -> void +~Microsoft.Maui.Controls.Compatibility.Grid.IGridList.AddVertical(Microsoft.Maui.Controls.View view) -> void +~Microsoft.Maui.Controls.Compatibility.Grid.IGridList.AddVertical(System.Collections.Generic.IEnumerable views) -> void +~Microsoft.Maui.Controls.Compatibility.Grid.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Compatibility.Grid.RowDefinitions.get -> Microsoft.Maui.Controls.RowDefinitionCollection +~Microsoft.Maui.Controls.Compatibility.Grid.RowDefinitions.set -> void +~Microsoft.Maui.Controls.Compatibility.INativeElementView.Element.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.Compatibility.Layout.Children.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.Compatibility.Layout.LowerChild(Microsoft.Maui.Controls.View view) -> void +~Microsoft.Maui.Controls.Compatibility.Layout.OnChildMeasureInvalidated(object sender, System.EventArgs e) -> void +~Microsoft.Maui.Controls.Compatibility.Layout.RaiseChild(Microsoft.Maui.Controls.View view) -> void +~Microsoft.Maui.Controls.Compatibility.Layout +~Microsoft.Maui.Controls.Compatibility.Layout.Children.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Compatibility.Layout.LayoutHandler.get -> Microsoft.Maui.ILayoutHandler +~Microsoft.Maui.Controls.Compatibility.Layout.this[int index].get -> Microsoft.Maui.IView +~Microsoft.Maui.Controls.Compatibility.Layout.this[int index].set -> void +~Microsoft.Maui.Controls.Compatibility.RelativeLayout.Children.get -> Microsoft.Maui.Controls.Compatibility.RelativeLayout.IRelativeList +~Microsoft.Maui.Controls.Compatibility.RelativeLayout.IRelativeList +~Microsoft.Maui.Controls.Compatibility.RelativeLayout.IRelativeList.Add(T view, Microsoft.Maui.Controls.Compatibility.Constraint xConstraint = null, Microsoft.Maui.Controls.Compatibility.Constraint yConstraint = null, Microsoft.Maui.Controls.Compatibility.Constraint widthConstraint = null, Microsoft.Maui.Controls.Compatibility.Constraint heightConstraint = null) -> void +~Microsoft.Maui.Controls.Compatibility.RelativeLayout.IRelativeList.Add(T view, System.Linq.Expressions.Expression> x = null, System.Linq.Expressions.Expression> y = null, System.Linq.Expressions.Expression> width = null, System.Linq.Expressions.Expression> height = null) -> void +~Microsoft.Maui.Controls.Compatibility.RelativeLayout.IRelativeList.Add(T view, System.Linq.Expressions.Expression> bounds) -> void +~Microsoft.Maui.Controls.Compatibility.RelativeLayout.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Compatibility.StackLayout.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Configuration +~Microsoft.Maui.Controls.Configuration.Configuration(TElement element) -> void +~Microsoft.Maui.Controls.Configuration.Element.get -> TElement +~Microsoft.Maui.Controls.ContentPage.Content.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.ContentPage.Content.set -> void +~Microsoft.Maui.Controls.ContentPresenter.Content.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.ContentPresenter.Content.set -> void +~Microsoft.Maui.Controls.ContentPropertyAttribute.ContentPropertyAttribute(string name) -> void +~Microsoft.Maui.Controls.ContentPropertyAttribute.Name.get -> string +~Microsoft.Maui.Controls.ContentView.Content.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.ContentView.Content.set -> void +~Microsoft.Maui.Controls.ControlTemplate.ControlTemplate(System.Func createTemplate) -> void +~Microsoft.Maui.Controls.ControlTemplate.ControlTemplate(System.Type type) -> void +~Microsoft.Maui.Controls.CurrentItemChangedEventArgs.CurrentItem.get -> object +~Microsoft.Maui.Controls.CurrentItemChangedEventArgs.PreviousItem.get -> object +~Microsoft.Maui.Controls.DataPackage.Image.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.DataPackage.Image.set -> void +~Microsoft.Maui.Controls.DataPackage.Properties.get -> Microsoft.Maui.Controls.DataPackagePropertySet +~Microsoft.Maui.Controls.DataPackage.Text.get -> string +~Microsoft.Maui.Controls.DataPackage.Text.set -> void +~Microsoft.Maui.Controls.DataPackage.View.get -> Microsoft.Maui.Controls.DataPackageView +~Microsoft.Maui.Controls.DataPackagePropertySet.Add(string key, object value) -> void +~Microsoft.Maui.Controls.DataPackagePropertySet.ContainsKey(string key) -> bool +~Microsoft.Maui.Controls.DataPackagePropertySet.GetEnumerator() -> System.Collections.Generic.IEnumerator> +~Microsoft.Maui.Controls.DataPackagePropertySet.Keys.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.DataPackagePropertySet.this[string key].get -> object +~Microsoft.Maui.Controls.DataPackagePropertySet.this[string key].set -> void +~Microsoft.Maui.Controls.DataPackagePropertySet.TryGetValue(string key, out object value) -> bool +~Microsoft.Maui.Controls.DataPackagePropertySet.Values.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.DataPackagePropertySetView._dataPackagePropertySet -> Microsoft.Maui.Controls.DataPackagePropertySet +~Microsoft.Maui.Controls.DataPackagePropertySetView.ContainsKey(string key) -> bool +~Microsoft.Maui.Controls.DataPackagePropertySetView.DataPackagePropertySetView(Microsoft.Maui.Controls.DataPackagePropertySet dataPackagePropertySet) -> void +~Microsoft.Maui.Controls.DataPackagePropertySetView.GetEnumerator() -> System.Collections.Generic.IEnumerator> +~Microsoft.Maui.Controls.DataPackagePropertySetView.Keys.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.DataPackagePropertySetView.this[string key].get -> object +~Microsoft.Maui.Controls.DataPackagePropertySetView.TryGetValue(string key, out object value) -> bool +~Microsoft.Maui.Controls.DataPackagePropertySetView.Values.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.DataPackageView.GetImageAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.DataPackageView.GetTextAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.DataPackageView.Properties.get -> Microsoft.Maui.Controls.DataPackagePropertySetView +~Microsoft.Maui.Controls.DataTemplate.Bindings.get -> System.Collections.Generic.IDictionary +~Microsoft.Maui.Controls.DataTemplate.DataTemplate(System.Func loadTemplate) -> void +~Microsoft.Maui.Controls.DataTemplate.DataTemplate(System.Type type) -> void +~Microsoft.Maui.Controls.DataTemplate.SetBinding(Microsoft.Maui.Controls.BindableProperty property, Microsoft.Maui.Controls.BindingBase binding) -> void +~Microsoft.Maui.Controls.DataTemplate.SetValue(Microsoft.Maui.Controls.BindableProperty property, object value) -> void +~Microsoft.Maui.Controls.DataTemplate.Values.get -> System.Collections.Generic.IDictionary +~Microsoft.Maui.Controls.DataTemplateSelector.SelectTemplate(object item, Microsoft.Maui.Controls.BindableObject container) -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.DataTrigger.Binding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.DataTrigger.Binding.set -> void +~Microsoft.Maui.Controls.DataTrigger.DataTrigger(System.Type targetType) -> void +~Microsoft.Maui.Controls.DataTrigger.Setters.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.DataTrigger.Value.get -> object +~Microsoft.Maui.Controls.DataTrigger.Value.set -> void +~Microsoft.Maui.Controls.DatePicker.FontFamily.get -> string +~Microsoft.Maui.Controls.DatePicker.FontFamily.set -> void +~Microsoft.Maui.Controls.DatePicker.Format.get -> string +~Microsoft.Maui.Controls.DatePicker.Format.set -> void +~Microsoft.Maui.Controls.DatePicker.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.DatePicker.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.DatePicker.TextColor.set -> void +~Microsoft.Maui.Controls.DefinitionCollection +~Microsoft.Maui.Controls.DefinitionCollection.CopyTo(T[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.DefinitionCollection.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.DependencyAttribute.DependencyAttribute(System.Type implementorType) -> void +~Microsoft.Maui.Controls.DeviceStateTrigger.Device.get -> string +~Microsoft.Maui.Controls.DeviceStateTrigger.Device.set -> void +~Microsoft.Maui.Controls.DoubleCollection.DoubleCollection(double[] values) -> void +~Microsoft.Maui.Controls.DropGestureRecognizer.DragLeaveCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.DropGestureRecognizer.DragLeaveCommand.set -> void +~Microsoft.Maui.Controls.DropGestureRecognizer.DragLeaveCommandParameter.get -> object +~Microsoft.Maui.Controls.DropGestureRecognizer.DragLeaveCommandParameter.set -> void +~Microsoft.Maui.Controls.DropGestureRecognizer.DragOverCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.DropGestureRecognizer.DragOverCommand.set -> void +~Microsoft.Maui.Controls.DropGestureRecognizer.DragOverCommandParameter.get -> object +~Microsoft.Maui.Controls.DropGestureRecognizer.DragOverCommandParameter.set -> void +~Microsoft.Maui.Controls.DropGestureRecognizer.DropCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.DropGestureRecognizer.DropCommand.set -> void +~Microsoft.Maui.Controls.DropGestureRecognizer.DropCommandParameter.get -> object +~Microsoft.Maui.Controls.DropGestureRecognizer.DropCommandParameter.set -> void +~Microsoft.Maui.Controls.DropGestureRecognizer.SendDragOver(Microsoft.Maui.Controls.DragEventArgs args) -> void +~Microsoft.Maui.Controls.Editor.FontFamily.get -> string +~Microsoft.Maui.Controls.Editor.FontFamily.set -> void +~Microsoft.Maui.Controls.Editor.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Effect.Element.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.Effect.ResolveId.get -> string +~Microsoft.Maui.Controls.Element.AutomationId.get -> string +~Microsoft.Maui.Controls.Element.AutomationId.set -> void +~Microsoft.Maui.Controls.Element.ClassId.get -> string +~Microsoft.Maui.Controls.Element.ClassId.set -> void +~Microsoft.Maui.Controls.Element.EffectControlProvider.get -> Microsoft.Maui.Controls.IEffectControlProvider +~Microsoft.Maui.Controls.Element.EffectControlProvider.set -> void +~Microsoft.Maui.Controls.Element.EffectIsAttached(string name) -> bool +~Microsoft.Maui.Controls.Element.Effects.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Element.FindByName(string name) -> object +~Microsoft.Maui.Controls.Element.Handler.get -> Microsoft.Maui.IElementHandler +~Microsoft.Maui.Controls.Element.Handler.set -> void +~Microsoft.Maui.Controls.Element.LogicalChildren.get -> System.Collections.ObjectModel.ReadOnlyCollection +~Microsoft.Maui.Controls.Element.Parent.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.Element.Parent.set -> void +~Microsoft.Maui.Controls.Element.RealParent.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.Element.RemoveDynamicResource(Microsoft.Maui.Controls.BindableProperty property) -> void +~Microsoft.Maui.Controls.Element.SetDynamicResource(Microsoft.Maui.Controls.BindableProperty property, string key) -> void +~Microsoft.Maui.Controls.Element.SetValueFromRenderer(Microsoft.Maui.Controls.BindableProperty property, object value) -> void +~Microsoft.Maui.Controls.Element.SetValueFromRenderer(Microsoft.Maui.Controls.BindablePropertyKey property, object value) -> void +~Microsoft.Maui.Controls.Element.StyleId.get -> string +~Microsoft.Maui.Controls.Element.StyleId.set -> void +~Microsoft.Maui.Controls.ElementEventArgs.Element.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.ElementEventArgs.ElementEventArgs(Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.ElementTemplate.CreateContent() -> object +~Microsoft.Maui.Controls.ElementTemplate.LoadTemplate.get -> System.Func +~Microsoft.Maui.Controls.ElementTemplate.LoadTemplate.set -> void +~Microsoft.Maui.Controls.Entry.FontFamily.get -> string +~Microsoft.Maui.Controls.Entry.FontFamily.set -> void +~Microsoft.Maui.Controls.Entry.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Entry.ReturnCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.Entry.ReturnCommand.set -> void +~Microsoft.Maui.Controls.Entry.ReturnCommandParameter.get -> object +~Microsoft.Maui.Controls.Entry.ReturnCommandParameter.set -> void +~Microsoft.Maui.Controls.EntryCell.Keyboard.get -> Microsoft.Maui.Keyboard +~Microsoft.Maui.Controls.EntryCell.Keyboard.set -> void +~Microsoft.Maui.Controls.EntryCell.Label.get -> string +~Microsoft.Maui.Controls.EntryCell.Label.set -> void +~Microsoft.Maui.Controls.EntryCell.LabelColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.EntryCell.LabelColor.set -> void +~Microsoft.Maui.Controls.EntryCell.Placeholder.get -> string +~Microsoft.Maui.Controls.EntryCell.Placeholder.set -> void +~Microsoft.Maui.Controls.EntryCell.Text.get -> string +~Microsoft.Maui.Controls.EntryCell.Text.set -> void +~Microsoft.Maui.Controls.EventTrigger.Actions.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.EventTrigger.Event.get -> string +~Microsoft.Maui.Controls.EventTrigger.Event.set -> void +~Microsoft.Maui.Controls.ExportEffectAttribute.ExportEffectAttribute(System.Type effectType, string uniqueName) -> void +~Microsoft.Maui.Controls.ExportFontAttribute.Alias.get -> string +~Microsoft.Maui.Controls.ExportFontAttribute.Alias.set -> void +~Microsoft.Maui.Controls.ExportFontAttribute.ExportFontAttribute(string fontFileName) -> void +~Microsoft.Maui.Controls.ExportFontAttribute.FontFileName.get -> string +~Microsoft.Maui.Controls.FileImageSource.File.get -> string +~Microsoft.Maui.Controls.FileImageSource.File.set -> void +~Microsoft.Maui.Controls.FlexLayout.GetAlignSelf(Microsoft.Maui.IView view) -> Microsoft.Maui.Layouts.FlexAlignSelf +~Microsoft.Maui.Controls.FlexLayout.GetBasis(Microsoft.Maui.IView view) -> Microsoft.Maui.Layouts.FlexBasis +~Microsoft.Maui.Controls.FlexLayout.GetFlexFrame(Microsoft.Maui.IView view) -> Microsoft.Maui.Graphics.Rect +~Microsoft.Maui.Controls.FlexLayout.GetGrow(Microsoft.Maui.IView view) -> float +~Microsoft.Maui.Controls.FlexLayout.GetOrder(Microsoft.Maui.IView view) -> int +~Microsoft.Maui.Controls.FlexLayout.GetShrink(Microsoft.Maui.IView view) -> float +~Microsoft.Maui.Controls.FlexLayout.SetAlignSelf(Microsoft.Maui.IView view, Microsoft.Maui.Layouts.FlexAlignSelf alignSelf) -> void +~Microsoft.Maui.Controls.FlexLayout.SetBasis(Microsoft.Maui.IView view, Microsoft.Maui.Layouts.FlexBasis basis) -> void +~Microsoft.Maui.Controls.FlexLayout.SetGrow(Microsoft.Maui.IView view, float grow) -> void +~Microsoft.Maui.Controls.FlexLayout.SetOrder(Microsoft.Maui.IView view, int order) -> void +~Microsoft.Maui.Controls.FlexLayout.SetShrink(Microsoft.Maui.IView view, float shrink) -> void +~Microsoft.Maui.Controls.FlyoutPage.Detail.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.FlyoutPage.Detail.set -> void +~Microsoft.Maui.Controls.FlyoutPage.Flyout.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.FlyoutPage.Flyout.set -> void +~Microsoft.Maui.Controls.FlyoutPage.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.FocusEventArgs.FocusEventArgs(Microsoft.Maui.Controls.VisualElement visualElement, bool isFocused) -> void +~Microsoft.Maui.Controls.FocusEventArgs.VisualElement.get -> Microsoft.Maui.Controls.VisualElement +~Microsoft.Maui.Controls.FontImageSource.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.FontImageSource.Color.set -> void +~Microsoft.Maui.Controls.FontImageSource.FontFamily.get -> string +~Microsoft.Maui.Controls.FontImageSource.FontFamily.set -> void +~Microsoft.Maui.Controls.FontImageSource.Glyph.get -> string +~Microsoft.Maui.Controls.FontImageSource.Glyph.set -> void +~Microsoft.Maui.Controls.FormattedString.Spans.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Frame.BorderColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Frame.BorderColor.set -> void +~Microsoft.Maui.Controls.Frame.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.GestureElement.GestureRecognizers.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.GradientBrush.GradientStops.get -> Microsoft.Maui.Controls.GradientStopCollection +~Microsoft.Maui.Controls.GradientBrush.GradientStops.set -> void +~Microsoft.Maui.Controls.GradientStop.Color.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.GradientStop.Color.set -> void +~Microsoft.Maui.Controls.GradientStop.GradientStop(Microsoft.Maui.Graphics.Color color, float offset) -> void +~Microsoft.Maui.Controls.GraphicsView.Drawable.get -> Microsoft.Maui.Graphics.IDrawable +~Microsoft.Maui.Controls.GraphicsView.Drawable.set -> void +~Microsoft.Maui.Controls.Grid.AddColumnDefinition(Microsoft.Maui.Controls.ColumnDefinition gridColumnDefinition) -> void +~Microsoft.Maui.Controls.Grid.AddRowDefinition(Microsoft.Maui.Controls.RowDefinition gridRowDefinition) -> void +~Microsoft.Maui.Controls.Grid.ColumnDefinitions.get -> Microsoft.Maui.Controls.ColumnDefinitionCollection +~Microsoft.Maui.Controls.Grid.ColumnDefinitions.set -> void +~Microsoft.Maui.Controls.Grid.GetColumn(Microsoft.Maui.IView view) -> int +~Microsoft.Maui.Controls.Grid.GetColumnSpan(Microsoft.Maui.IView view) -> int +~Microsoft.Maui.Controls.Grid.GetRow(Microsoft.Maui.IView view) -> int +~Microsoft.Maui.Controls.Grid.GetRowSpan(Microsoft.Maui.IView view) -> int +~Microsoft.Maui.Controls.Grid.RowDefinitions.get -> Microsoft.Maui.Controls.RowDefinitionCollection +~Microsoft.Maui.Controls.Grid.RowDefinitions.set -> void +~Microsoft.Maui.Controls.Grid.SetColumn(Microsoft.Maui.IView view, int col) -> void +~Microsoft.Maui.Controls.Grid.SetColumnSpan(Microsoft.Maui.IView view, int span) -> void +~Microsoft.Maui.Controls.Grid.SetRow(Microsoft.Maui.IView view, int row) -> void +~Microsoft.Maui.Controls.Grid.SetRowSpan(Microsoft.Maui.IView view, int span) -> void +~Microsoft.Maui.Controls.GroupableItemsView.GroupFooterTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.GroupableItemsView.GroupFooterTemplate.set -> void +~Microsoft.Maui.Controls.GroupableItemsView.GroupHeaderTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.GroupableItemsView.GroupHeaderTemplate.set -> void +~Microsoft.Maui.Controls.HandlerAttribute.HandlerAttribute(System.Type handler, System.Type target, System.Type[] supportedVisuals) -> void +~Microsoft.Maui.Controls.HandlerAttribute.HandlerAttribute(System.Type handler, System.Type target) -> void +~Microsoft.Maui.Controls.HandlerChangingEventArgs.HandlerChangingEventArgs(Microsoft.Maui.IElementHandler oldHandler, Microsoft.Maui.IElementHandler newHandler) -> void +~Microsoft.Maui.Controls.HandlerChangingEventArgs.NewHandler.get -> Microsoft.Maui.IElementHandler +~Microsoft.Maui.Controls.HandlerChangingEventArgs.OldHandler.get -> Microsoft.Maui.IElementHandler +~Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.CarouselViewHandler(Microsoft.Maui.PropertyMapper mapper = null) -> void +~Microsoft.Maui.Controls.Handlers.Items.CollectionViewHandler.CollectionViewHandler(Microsoft.Maui.PropertyMapper mapper = null) -> void +~Microsoft.Maui.Controls.Handlers.Items.GroupableItemsViewHandler +~Microsoft.Maui.Controls.Handlers.Items.GroupableItemsViewHandler.GroupableItemsViewHandler(Microsoft.Maui.PropertyMapper mapper = null) -> void +~Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler +~Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.ItemsViewHandler(Microsoft.Maui.PropertyMapper mapper = null) -> void +~Microsoft.Maui.Controls.Handlers.Items.ReorderableItemsViewHandler +~Microsoft.Maui.Controls.Handlers.Items.ReorderableItemsViewHandler.ReorderableItemsViewHandler(Microsoft.Maui.PropertyMapper mapper = null) -> void +~Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler +~Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler.SelectableItemsViewHandler(Microsoft.Maui.PropertyMapper mapper = null) -> void +~Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler +~Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.StructuredItemsViewHandler(Microsoft.Maui.PropertyMapper mapper = null) -> void +~Microsoft.Maui.Controls.Handlers.LineHandler.LineHandler(Microsoft.Maui.IPropertyMapper mapper) -> void +~Microsoft.Maui.Controls.Handlers.PathHandler.PathHandler(Microsoft.Maui.IPropertyMapper mapper) -> void +~Microsoft.Maui.Controls.Handlers.PolygonHandler.PolygonHandler(Microsoft.Maui.IPropertyMapper mapper) -> void +~Microsoft.Maui.Controls.Handlers.PolylineHandler.PolylineHandler(Microsoft.Maui.IPropertyMapper mapper) -> void +~Microsoft.Maui.Controls.Handlers.RectangleHandler.RectangleHandler(Microsoft.Maui.IPropertyMapper mapper) -> void +~Microsoft.Maui.Controls.Handlers.RoundRectangleHandler.RoundRectangleHandler(Microsoft.Maui.IPropertyMapper mapper) -> void +~Microsoft.Maui.Controls.Hosting.IEffectsBuilder.Add(System.Type TEffect, System.Type TPlatformEffect) -> Microsoft.Maui.Controls.Hosting.IEffectsBuilder +~Microsoft.Maui.Controls.Hosting.IEffectsBuilder.Add() -> Microsoft.Maui.Controls.Hosting.IEffectsBuilder +~Microsoft.Maui.Controls.HtmlWebViewSource.BaseUrl.get -> string +~Microsoft.Maui.Controls.HtmlWebViewSource.BaseUrl.set -> void +~Microsoft.Maui.Controls.HtmlWebViewSource.Html.get -> string +~Microsoft.Maui.Controls.HtmlWebViewSource.Html.set -> void +~Microsoft.Maui.Controls.IAppearanceObserver.OnAppearanceChanged(Microsoft.Maui.Controls.ShellAppearance appearance) -> void +~Microsoft.Maui.Controls.IAppIndexingProvider.AppLinks.get -> Microsoft.Maui.Controls.IAppLinks +~Microsoft.Maui.Controls.IApplicationController.SetAppIndexingProvider(Microsoft.Maui.Controls.IAppIndexingProvider appIndexing) -> void +~Microsoft.Maui.Controls.IAppLinkEntry.AppLinkUri.get -> System.Uri +~Microsoft.Maui.Controls.IAppLinkEntry.AppLinkUri.set -> void +~Microsoft.Maui.Controls.IAppLinkEntry.Description.get -> string +~Microsoft.Maui.Controls.IAppLinkEntry.Description.set -> void +~Microsoft.Maui.Controls.IAppLinkEntry.KeyValues.get -> System.Collections.Generic.IDictionary +~Microsoft.Maui.Controls.IAppLinkEntry.Thumbnail.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.IAppLinkEntry.Thumbnail.set -> void +~Microsoft.Maui.Controls.IAppLinkEntry.Title.get -> string +~Microsoft.Maui.Controls.IAppLinkEntry.Title.set -> void +~Microsoft.Maui.Controls.IAppLinks.DeregisterLink(Microsoft.Maui.Controls.IAppLinkEntry appLink) -> void +~Microsoft.Maui.Controls.IAppLinks.DeregisterLink(System.Uri appLinkUri) -> void +~Microsoft.Maui.Controls.IAppLinks.RegisterLink(Microsoft.Maui.Controls.IAppLinkEntry appLink) -> void +~Microsoft.Maui.Controls.IBindableLayout.Children.get -> System.Collections.IList +~Microsoft.Maui.Controls.IBorderElement.Background.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.IBorderElement.BackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IBorderElement.BorderColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IBorderElement.BorderColorDefaultValue.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IBorderElement.OnBorderColorPropertyChanged(Microsoft.Maui.Graphics.Color oldValue, Microsoft.Maui.Graphics.Color newValue) -> void +~Microsoft.Maui.Controls.IConfigElement +~Microsoft.Maui.Controls.IConfigElement.Element.get -> T +~Microsoft.Maui.Controls.IEffectControlProvider.RegisterEffect(Microsoft.Maui.Controls.Effect effect) -> void +~Microsoft.Maui.Controls.IElementConfiguration +~Microsoft.Maui.Controls.IElementConfiguration.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.IElementController.Descendants() -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.IElementController.EffectControlProvider.get -> Microsoft.Maui.Controls.IEffectControlProvider +~Microsoft.Maui.Controls.IElementController.EffectControlProvider.set -> void +~Microsoft.Maui.Controls.IElementController.EffectIsAttached(string name) -> bool +~Microsoft.Maui.Controls.IElementController.LogicalChildren.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.IElementController.RealParent.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.IElementController.SetValueFromRenderer(Microsoft.Maui.Controls.BindableProperty property, object value) -> void +~Microsoft.Maui.Controls.IElementController.SetValueFromRenderer(Microsoft.Maui.Controls.BindablePropertyKey propertyKey, object value) -> void +~Microsoft.Maui.Controls.IExtendedTypeConverter.ConvertFromInvariantString(string value, System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.IGestureRecognizers.GestureRecognizers.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.IImageElement.OnImageSourceSourceChanged(object sender, System.EventArgs e) -> void +~Microsoft.Maui.Controls.IImageElement.Source.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.IItemsView +~Microsoft.Maui.Controls.IItemsView.CreateDefault(object item) -> T +~Microsoft.Maui.Controls.IItemsView.SetupContent(T content, int index) -> void +~Microsoft.Maui.Controls.IItemsView.UnhookContent(T content) -> void +~Microsoft.Maui.Controls.IItemViewController.BindView(Microsoft.Maui.Controls.View view, object item) -> void +~Microsoft.Maui.Controls.IItemViewController.CreateView(object itemType) -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.IItemViewController.GetItem(int index) -> object +~Microsoft.Maui.Controls.IItemViewController.GetItemType(object item) -> object +~Microsoft.Maui.Controls.ILayoutController.Children.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.ILayoutManagerFactory.CreateLayoutManager(Microsoft.Maui.Controls.Layout layout) -> Microsoft.Maui.Layouts.ILayoutManager +~Microsoft.Maui.Controls.IListProxy.ProxiedEnumerable.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.IListProxy.TryGetValue(int index, out object value) -> bool +~Microsoft.Maui.Controls.IListViewController.CreateDefaultCell(object item) -> Microsoft.Maui.Controls.Cell +~Microsoft.Maui.Controls.IListViewController.FooterElement.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.IListViewController.GetDisplayTextFromGroup(object cell) -> string +~Microsoft.Maui.Controls.IListViewController.HeaderElement.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.IListViewController.NotifyRowTapped(int index, int inGroupIndex, Microsoft.Maui.Controls.Cell cell, bool isContextMenuRequested) -> void +~Microsoft.Maui.Controls.IListViewController.NotifyRowTapped(int index, int inGroupIndex, Microsoft.Maui.Controls.Cell cell) -> void +~Microsoft.Maui.Controls.IListViewController.NotifyRowTapped(int index, Microsoft.Maui.Controls.Cell cell, bool isContextMenuRequested) -> void +~Microsoft.Maui.Controls.IListViewController.NotifyRowTapped(int index, Microsoft.Maui.Controls.Cell cell) -> void +~Microsoft.Maui.Controls.IListViewController.SendCellAppearing(Microsoft.Maui.Controls.Cell cell) -> void +~Microsoft.Maui.Controls.IListViewController.SendCellDisappearing(Microsoft.Maui.Controls.Cell cell) -> void +~Microsoft.Maui.Controls.Image.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Image.Source.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Image.Source.set -> void +~Microsoft.Maui.Controls.ImageButton.BorderColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ImageButton.BorderColor.set -> void +~Microsoft.Maui.Controls.ImageButton.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.ImageButton.Command.set -> void +~Microsoft.Maui.Controls.ImageButton.CommandParameter.get -> object +~Microsoft.Maui.Controls.ImageButton.CommandParameter.set -> void +~Microsoft.Maui.Controls.ImageButton.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.ImageButton.Source.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.ImageButton.Source.set -> void +~Microsoft.Maui.Controls.ImageCell.ImageSource.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.ImageCell.ImageSource.set -> void +~Microsoft.Maui.Controls.IMessagingCenter.Send(TSender sender, string message, TArgs args) -> void +~Microsoft.Maui.Controls.IMessagingCenter.Send(TSender sender, string message) -> void +~Microsoft.Maui.Controls.IMessagingCenter.Subscribe(object subscriber, string message, System.Action callback, TSender source = null) -> void +~Microsoft.Maui.Controls.IMessagingCenter.Subscribe(object subscriber, string message, System.Action callback, TSender source = null) -> void +~Microsoft.Maui.Controls.IMessagingCenter.Unsubscribe(object subscriber, string message) -> void +~Microsoft.Maui.Controls.IMessagingCenter.Unsubscribe(object subscriber, string message) -> void +~Microsoft.Maui.Controls.IMultiValueConverter.Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) -> object +~Microsoft.Maui.Controls.IMultiValueConverter.ConvertBack(object value, System.Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) -> object[] +~Microsoft.Maui.Controls.INavigation.InsertPageBefore(Microsoft.Maui.Controls.Page page, Microsoft.Maui.Controls.Page before) -> void +~Microsoft.Maui.Controls.INavigation.ModalStack.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.INavigation.NavigationStack.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.INavigation.PopAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PopAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PopModalAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PopModalAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PopToRootAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PopToRootAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PushAsync(Microsoft.Maui.Controls.Page page, bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PushAsync(Microsoft.Maui.Controls.Page page) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PushModalAsync(Microsoft.Maui.Controls.Page page, bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.PushModalAsync(Microsoft.Maui.Controls.Page page) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigation.RemovePage(Microsoft.Maui.Controls.Page page) -> void +~Microsoft.Maui.Controls.INavigationPageController.Pages.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.INavigationPageController.Peek(int depth = 0) -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.INavigationPageController.PopAsyncInner(bool animated, bool fast = false) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.INavigationPageController.RemoveAsyncInner(Microsoft.Maui.Controls.Page page, bool animated, bool fast) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.IndicatorView.IndicatorColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IndicatorView.IndicatorColor.set -> void +~Microsoft.Maui.Controls.IndicatorView.IndicatorLayout.get -> Microsoft.Maui.Controls.IBindableLayout +~Microsoft.Maui.Controls.IndicatorView.IndicatorLayout.set -> void +~Microsoft.Maui.Controls.IndicatorView.IndicatorTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.IndicatorView.IndicatorTemplate.set -> void +~Microsoft.Maui.Controls.IndicatorView.ItemsSource.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.IndicatorView.ItemsSource.set -> void +~Microsoft.Maui.Controls.IndicatorView.SelectedIndicatorColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IndicatorView.SelectedIndicatorColor.set -> void +~Microsoft.Maui.Controls.InputView.Keyboard.get -> Microsoft.Maui.Keyboard +~Microsoft.Maui.Controls.InputView.Keyboard.set -> void +~Microsoft.Maui.Controls.InputView.Placeholder.get -> string +~Microsoft.Maui.Controls.InputView.Placeholder.set -> void +~Microsoft.Maui.Controls.InputView.PlaceholderColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.InputView.PlaceholderColor.set -> void +~Microsoft.Maui.Controls.InputView.Text.get -> string +~Microsoft.Maui.Controls.InputView.Text.set -> void +~Microsoft.Maui.Controls.InputView.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.InputView.TextColor.set -> void +~Microsoft.Maui.Controls.InputView.UpdateFormsText(string original, Microsoft.Maui.TextTransform transform) -> string +~Microsoft.Maui.Controls.Internals.ActionSheetArguments.ActionSheetArguments(string title, string cancel, string destruction, System.Collections.Generic.IEnumerable buttons) -> void +~Microsoft.Maui.Controls.Internals.ActionSheetArguments.Buttons.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.Internals.ActionSheetArguments.Cancel.get -> string +~Microsoft.Maui.Controls.Internals.ActionSheetArguments.Destruction.get -> string +~Microsoft.Maui.Controls.Internals.ActionSheetArguments.Result.get -> System.Threading.Tasks.TaskCompletionSource +~Microsoft.Maui.Controls.Internals.ActionSheetArguments.SetResult(string result) -> void +~Microsoft.Maui.Controls.Internals.ActionSheetArguments.Title.get -> string +~Microsoft.Maui.Controls.Internals.AlertArguments.Accept.get -> string +~Microsoft.Maui.Controls.Internals.AlertArguments.AlertArguments(string title, string message, string accept, string cancel) -> void +~Microsoft.Maui.Controls.Internals.AlertArguments.Cancel.get -> string +~Microsoft.Maui.Controls.Internals.AlertArguments.Message.get -> string +~Microsoft.Maui.Controls.Internals.AlertArguments.Result.get -> System.Threading.Tasks.TaskCompletionSource +~Microsoft.Maui.Controls.Internals.AlertArguments.Title.get -> string +~Microsoft.Maui.Controls.Internals.AsyncValue.AsyncValue(System.Threading.Tasks.Task valueTask, T defaultValue = default(T)) -> void +~Microsoft.Maui.Controls.Internals.DynamicResource.DynamicResource(string key) -> void +~Microsoft.Maui.Controls.Internals.DynamicResource.Key.get -> string +~Microsoft.Maui.Controls.Internals.EvalRequested.EvalRequested(string script) -> void +~Microsoft.Maui.Controls.Internals.EvalRequested.Script.get -> string +~Microsoft.Maui.Controls.Internals.GIFBitmap.Bounds.get -> Microsoft.Maui.Controls.Internals.GIFBitmap.Rect +~Microsoft.Maui.Controls.Internals.GIFBitmap.ColorTable.get -> Microsoft.Maui.Controls.Internals.GIFColorTable +~Microsoft.Maui.Controls.Internals.GIFBitmap.Data.get -> int[] +~Microsoft.Maui.Controls.Internals.GIFBitmap.Data.set -> void +~Microsoft.Maui.Controls.Internals.GIFBitmapDecoder.Compose(Microsoft.Maui.Controls.Internals.GIFHeader header, Microsoft.Maui.Controls.Internals.GIFBitmap currentBitmap, Microsoft.Maui.Controls.Internals.GIFBitmap previousBitmap) -> void +~Microsoft.Maui.Controls.Internals.GIFBitmapDecoder.DecodeAsync(Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader stream, int width, int height) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.GIFColorTable.Data.get -> int[] +~Microsoft.Maui.Controls.Internals.GIFDecoderFormatException.GIFDecoderFormatException(string message, System.Exception innerException) -> void +~Microsoft.Maui.Controls.Internals.GIFDecoderFormatException.GIFDecoderFormatException(string message) -> void +~Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.CurrentBlockBuffer.get -> byte[] +~Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.GIFDecoderStreamReader(System.IO.Stream stream) -> void +~Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.ReadAsync(byte[] buffer, int toRead) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.ReadBlockAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.ReadString(int length) -> string +~Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.SkipBlockAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.GIFHeader.GlobalColorTable.get -> Microsoft.Maui.Controls.Internals.GIFColorTable +~Microsoft.Maui.Controls.Internals.GIFHeader.TypeIdentifier.get -> string +~Microsoft.Maui.Controls.Internals.GIFHeader.Version.get -> string +~Microsoft.Maui.Controls.Internals.GIFImageParser.ParseAsync(System.IO.Stream stream, bool skipTypeIdentifier = false, bool ignoreImageData = false) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.IDataTemplateController.IdString.get -> string +~Microsoft.Maui.Controls.Internals.IDynamicResourceHandler.SetDynamicResource(Microsoft.Maui.Controls.BindableProperty property, string key) -> void +~Microsoft.Maui.Controls.Internals.IExpressionSearch.FindObjects(System.Linq.Expressions.Expression expression) -> System.Collections.Generic.List +~Microsoft.Maui.Controls.Internals.IFontElement.FontFamily.get -> string +~Microsoft.Maui.Controls.Internals.IFontElement.OnFontFamilyChanged(string oldValue, string newValue) -> void +~Microsoft.Maui.Controls.Internals.IFontNamedSizeService.GetNamedSize(Microsoft.Maui.Controls.NamedSize size, System.Type targetElementType, bool useOldSizes) -> double +~Microsoft.Maui.Controls.Internals.IGestureController.CompositeGestureRecognizers.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Internals.IGestureController.GetChildElements(Microsoft.Maui.Graphics.Point point) -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Internals.INameScope.FindByName(string name) -> object +~Microsoft.Maui.Controls.Internals.INameScope.RegisterName(string name, object scopedElement) -> void +~Microsoft.Maui.Controls.Internals.INameScope.UnregisterName(string name) -> void +~Microsoft.Maui.Controls.Internals.INavigationProxy.NavigationProxy.get -> Microsoft.Maui.Controls.Internals.NavigationProxy +~Microsoft.Maui.Controls.Internals.IPerformanceProvider.Start(string reference, string tag, string path, string member) -> void +~Microsoft.Maui.Controls.Internals.IPerformanceProvider.Stop(string reference, string tag, string path, string member) -> void +~Microsoft.Maui.Controls.Internals.IPlatformSizeService.GetPlatformSize(Microsoft.Maui.Controls.VisualElement view, double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +~Microsoft.Maui.Controls.Internals.IResourceDictionary.TryGetValue(string key, out object value) -> bool +~Microsoft.Maui.Controls.Internals.ISystemResourcesProvider.GetSystemResources() -> Microsoft.Maui.Controls.Internals.IResourceDictionary +~Microsoft.Maui.Controls.Internals.NavigationProxy.Inner.get -> Microsoft.Maui.Controls.INavigation +~Microsoft.Maui.Controls.Internals.NavigationProxy.Inner.set -> void +~Microsoft.Maui.Controls.Internals.NavigationProxy.InsertPageBefore(Microsoft.Maui.Controls.Page page, Microsoft.Maui.Controls.Page before) -> void +~Microsoft.Maui.Controls.Internals.NavigationProxy.ModalStack.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.Internals.NavigationProxy.NavigationStack.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.Internals.NavigationProxy.PopAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PopAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PopModalAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PopModalAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PopToRootAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PopToRootAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PushAsync(Microsoft.Maui.Controls.Page root, bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PushAsync(Microsoft.Maui.Controls.Page root) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PushModalAsync(Microsoft.Maui.Controls.Page modal, bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.PushModalAsync(Microsoft.Maui.Controls.Page modal) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationProxy.RemovePage(Microsoft.Maui.Controls.Page page) -> void +~Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.BeforePage.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.BeforePage.set -> void +~Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.NavigationRequestedEventArgs(Microsoft.Maui.Controls.Page page, bool animated) -> void +~Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.NavigationRequestedEventArgs(Microsoft.Maui.Controls.Page page, Microsoft.Maui.Controls.Page before, bool animated) -> void +~Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.Task.get -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.Task.set -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, object changedItem, int index, int oldIndex) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, object changedItem, int index) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, object changedItem) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, object newItem, object oldItem, int index) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, object newItem, object oldItem) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, System.Collections.IList changedItems, int index, int oldIndex) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, System.Collections.IList changedItems, int startingIndex) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, System.Collections.IList changedItems) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, System.Collections.IList newItems, System.Collections.IList oldItems, int startingIndex) -> void +~Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action, System.Collections.IList newItems, System.Collections.IList oldItems) -> void +~Microsoft.Maui.Controls.Internals.Profile.Datum.Id -> string +~Microsoft.Maui.Controls.Internals.Profile.Datum.Name -> string +~Microsoft.Maui.Controls.Internals.ProfileDatum.Id -> string +~Microsoft.Maui.Controls.Internals.ProfileDatum.Name -> string +~Microsoft.Maui.Controls.Internals.ProfileDatum.Path -> string +~Microsoft.Maui.Controls.Internals.PromptArguments.Accept.get -> string +~Microsoft.Maui.Controls.Internals.PromptArguments.Cancel.get -> string +~Microsoft.Maui.Controls.Internals.PromptArguments.InitialValue.get -> string +~Microsoft.Maui.Controls.Internals.PromptArguments.Keyboard.get -> Microsoft.Maui.Keyboard +~Microsoft.Maui.Controls.Internals.PromptArguments.Message.get -> string +~Microsoft.Maui.Controls.Internals.PromptArguments.Placeholder.get -> string +~Microsoft.Maui.Controls.Internals.PromptArguments.PromptArguments(string title, string message, string accept = "OK", string cancel = "Cancel", string placeholder = null, int maxLength = -1, Microsoft.Maui.Keyboard keyboard = null, string initialValue = "") -> void +~Microsoft.Maui.Controls.Internals.PromptArguments.Result.get -> System.Threading.Tasks.TaskCompletionSource +~Microsoft.Maui.Controls.Internals.PromptArguments.SetResult(string text) -> void +~Microsoft.Maui.Controls.Internals.PromptArguments.Title.get -> string +~Microsoft.Maui.Controls.Internals.Registrar +~Microsoft.Maui.Controls.Internals.Registrar.GetHandler(System.Type type, params object[] args) -> TOut +~Microsoft.Maui.Controls.Internals.Registrar.GetHandler(System.Type type) -> TOut +~Microsoft.Maui.Controls.Internals.Registrar.GetHandlerForObject(object obj, params object[] args) -> TOut +~Microsoft.Maui.Controls.Internals.Registrar.GetHandlerForObject(object obj) -> TOut +~Microsoft.Maui.Controls.Internals.Registrar.GetHandlerType(System.Type viewType, System.Type visualType) -> System.Type +~Microsoft.Maui.Controls.Internals.Registrar.GetHandlerType(System.Type viewType) -> System.Type +~Microsoft.Maui.Controls.Internals.Registrar.GetHandlerTypeForObject(object obj) -> System.Type +~Microsoft.Maui.Controls.Internals.Registrar.Register(System.Type tview, System.Type trender, System.Type[] supportedVisual) -> void +~Microsoft.Maui.Controls.Internals.Registrar.Register(System.Type tview, System.Type trender, System.Type[] supportedVisuals, short priority) -> void +~Microsoft.Maui.Controls.Internals.Registrar.Register(System.Type tview, System.Type trender) -> void +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery.AssemblyName.get -> System.Reflection.AssemblyName +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery.AssemblyName.set -> void +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery.Instance.get -> object +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery.Instance.set -> void +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery.ResourcePath.get -> string +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery.ResourcePath.set -> void +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingResponse.ResourceContent.get -> string +~Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingResponse.ResourceContent.set -> void +~Microsoft.Maui.Controls.Internals.ResourcesChangedEventArgs.ResourcesChangedEventArgs(System.Collections.Generic.IEnumerable> values) -> void +~Microsoft.Maui.Controls.Internals.ResourcesChangedEventArgs.Values.get -> System.Collections.Generic.IEnumerable> +~Microsoft.Maui.Controls.Internals.TableModel.RowLongPressed(object item) -> void +~Microsoft.Maui.Controls.Internals.TableModel.RowSelected(object item) -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.ActivateContent(int index, object item) -> TItem +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.CreateContent(int index, object item, bool insert = false) -> TItem +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetGlobalIndexForGroup(Microsoft.Maui.Controls.ITemplatedItemsList group) -> int +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetGlobalIndexOfGroup(object item) -> int +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetGlobalIndexOfItem(object group, object item) -> int +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetGlobalIndexOfItem(object item) -> int +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetGroupAndIndexOfItem(object group, object item) -> System.Tuple +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetGroupAndIndexOfItem(object item) -> System.Tuple +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupDisplayBinding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupDisplayBinding.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupHeaderTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupHeaderTemplate.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupHeaderTemplateProperty.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupHeaderTemplateProperty.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupShortNameBinding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupShortNameBinding.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.HeaderContent.get -> TItem +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.IndexOf(TItem item) -> int +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.IsGroupingEnabledProperty.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.IsGroupingEnabledProperty.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.ItemsSource.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.Name.get -> string +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.Name.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.Parent.get -> Microsoft.Maui.Controls.Internals.TemplatedItemsList +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.ProgressiveLoadingProperty.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.ProgressiveLoadingProperty.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.SelectDataTemplate(object item) -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.ShortName.get -> string +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.ShortName.set -> void +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.ShortNames.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.Internals.TemplatedItemsList.this[int index].get -> TItem +~Microsoft.Maui.Controls.Internals.TypedBinding.TypedBinding(System.Func getter, System.Action setter, System.Tuple, string>[] handlers) -> void +~Microsoft.Maui.Controls.Internals.TypedBindingBase.Converter.get -> Microsoft.Maui.Controls.IValueConverter +~Microsoft.Maui.Controls.Internals.TypedBindingBase.Converter.set -> void +~Microsoft.Maui.Controls.Internals.TypedBindingBase.ConverterParameter.get -> object +~Microsoft.Maui.Controls.Internals.TypedBindingBase.ConverterParameter.set -> void +~Microsoft.Maui.Controls.Internals.TypedBindingBase.Source.get -> object +~Microsoft.Maui.Controls.Internals.TypedBindingBase.Source.set -> void +~Microsoft.Maui.Controls.InvalidNavigationException.InvalidNavigationException(string message, System.Exception innerException) -> void +~Microsoft.Maui.Controls.InvalidNavigationException.InvalidNavigationException(string message) -> void +~Microsoft.Maui.Controls.InvalidNavigationException.InvalidNavigationException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +~Microsoft.Maui.Controls.IPageContainer +~Microsoft.Maui.Controls.IPageContainer.CurrentPage.get -> T +~Microsoft.Maui.Controls.IPageController.InternalChildren.get -> System.Collections.ObjectModel.ObservableCollection +~Microsoft.Maui.Controls.IPanGestureController.SendPan(Microsoft.Maui.Controls.Element sender, double totalX, double totalY, int gestureId) -> void +~Microsoft.Maui.Controls.IPanGestureController.SendPanCanceled(Microsoft.Maui.Controls.Element sender, int gestureId) -> void +~Microsoft.Maui.Controls.IPanGestureController.SendPanCompleted(Microsoft.Maui.Controls.Element sender, int gestureId) -> void +~Microsoft.Maui.Controls.IPanGestureController.SendPanStarted(Microsoft.Maui.Controls.Element sender, int gestureId) -> void +~Microsoft.Maui.Controls.IPinchGestureController.SendPinch(Microsoft.Maui.Controls.Element sender, double scale, Microsoft.Maui.Graphics.Point currentScalePoint) -> void +~Microsoft.Maui.Controls.IPinchGestureController.SendPinchCanceled(Microsoft.Maui.Controls.Element sender) -> void +~Microsoft.Maui.Controls.IPinchGestureController.SendPinchEnded(Microsoft.Maui.Controls.Element sender) -> void +~Microsoft.Maui.Controls.IPinchGestureController.SendPinchStarted(Microsoft.Maui.Controls.Element sender, Microsoft.Maui.Graphics.Point intialScalePoint) -> void +~Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.IQueryAttributable.ApplyQueryAttributes(System.Collections.Generic.IDictionary query) -> void +~Microsoft.Maui.Controls.IScrollViewController.GetScrollPositionForElement(Microsoft.Maui.Controls.VisualElement item, Microsoft.Maui.Controls.ScrollToPosition position) -> Microsoft.Maui.Graphics.Point +~Microsoft.Maui.Controls.ISearchHandlerController.ItemSelected(object obj) -> void +~Microsoft.Maui.Controls.ISearchHandlerController.ListProxy.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.IShellAppearanceElement.EffectiveTabBarBackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IShellAppearanceElement.EffectiveTabBarDisabledColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IShellAppearanceElement.EffectiveTabBarForegroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IShellAppearanceElement.EffectiveTabBarTitleColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IShellAppearanceElement.EffectiveTabBarUnselectedColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.IShellContentController.GetOrCreateContent() -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.IShellContentController.Page.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.IShellContentController.RecyclePage(Microsoft.Maui.Controls.Page page) -> void +~Microsoft.Maui.Controls.IShellController.AddAppearanceObserver(Microsoft.Maui.Controls.IAppearanceObserver observer, Microsoft.Maui.Controls.Element pivot) -> void +~Microsoft.Maui.Controls.IShellController.AddFlyoutBehaviorObserver(Microsoft.Maui.Controls.IFlyoutBehaviorObserver observer) -> void +~Microsoft.Maui.Controls.IShellController.AppearanceChanged(Microsoft.Maui.Controls.Element source, bool appearanceSet) -> void +~Microsoft.Maui.Controls.IShellController.FlyoutContent.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.IShellController.FlyoutFooter.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.IShellController.FlyoutHeader.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.IShellController.FlyoutIcon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.IShellController.GenerateFlyoutGrouping() -> System.Collections.Generic.List> +~Microsoft.Maui.Controls.IShellController.GetFlyoutItemDataTemplate(Microsoft.Maui.Controls.BindableObject bo) -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.IShellController.GetItems() -> System.Collections.ObjectModel.ReadOnlyCollection +~Microsoft.Maui.Controls.IShellController.GetNavigationState(Microsoft.Maui.Controls.ShellItem shellItem, Microsoft.Maui.Controls.ShellSection shellSection, Microsoft.Maui.Controls.ShellContent shellContent, bool includeStack = true) -> Microsoft.Maui.Controls.ShellNavigationState +~Microsoft.Maui.Controls.IShellController.OnFlyoutItemSelected(Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.IShellController.OnFlyoutItemSelectedAsync(Microsoft.Maui.Controls.Element element) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.IShellController.ProposeNavigation(Microsoft.Maui.Controls.ShellNavigationSource source, Microsoft.Maui.Controls.ShellItem item, Microsoft.Maui.Controls.ShellSection shellSection, Microsoft.Maui.Controls.ShellContent shellContent, System.Collections.Generic.IReadOnlyList stack, bool canCancel) -> bool +~Microsoft.Maui.Controls.IShellController.RemoveAppearanceObserver(Microsoft.Maui.Controls.IAppearanceObserver observer) -> bool +~Microsoft.Maui.Controls.IShellController.RemoveFlyoutBehaviorObserver(Microsoft.Maui.Controls.IFlyoutBehaviorObserver observer) -> bool +~Microsoft.Maui.Controls.IShellItemController.GetItems() -> System.Collections.ObjectModel.ReadOnlyCollection +~Microsoft.Maui.Controls.IShellItemController.ProposeSection(Microsoft.Maui.Controls.ShellSection shellSection, bool setValue = true) -> bool +~Microsoft.Maui.Controls.IShellSectionController.AddContentInsetObserver(Microsoft.Maui.Controls.IShellContentInsetObserver observer) -> void +~Microsoft.Maui.Controls.IShellSectionController.AddDisplayedPageObserver(object observer, System.Action callback) -> void +~Microsoft.Maui.Controls.IShellSectionController.GetItems() -> System.Collections.ObjectModel.ReadOnlyCollection +~Microsoft.Maui.Controls.IShellSectionController.PresentedPage.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.IShellSectionController.RemoveContentInsetObserver(Microsoft.Maui.Controls.IShellContentInsetObserver observer) -> bool +~Microsoft.Maui.Controls.IShellSectionController.RemoveDisplayedPageObserver(object observer) -> bool +~Microsoft.Maui.Controls.IShellSectionController.SendPopped(Microsoft.Maui.Controls.Page page) -> void +~Microsoft.Maui.Controls.IShellSectionController.SendPopping(Microsoft.Maui.Controls.Page page) -> void +~Microsoft.Maui.Controls.IShellSectionController.SendPopping(System.Threading.Tasks.Task poppingCompleted) -> void +~Microsoft.Maui.Controls.IShellSectionController.SendPoppingToRoot(System.Threading.Tasks.Task finishedPopping) -> void +~Microsoft.Maui.Controls.ISwipeGestureController.DetectSwipe(Microsoft.Maui.Controls.View sender, Microsoft.Maui.SwipeDirection direction) -> bool +~Microsoft.Maui.Controls.ISwipeGestureController.SendSwipe(Microsoft.Maui.Controls.Element sender, double totalX, double totalY) -> void +~Microsoft.Maui.Controls.ISwipeItem.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.ISwipeItem.Command.set -> void +~Microsoft.Maui.Controls.ISwipeItem.CommandParameter.get -> object +~Microsoft.Maui.Controls.ISwipeItem.CommandParameter.set -> void +~Microsoft.Maui.Controls.ISwipeViewController.SendSwipeChanging(Microsoft.Maui.Controls.SwipeChangingEventArgs args) -> void +~Microsoft.Maui.Controls.ISwipeViewController.SendSwipeEnded(Microsoft.Maui.Controls.SwipeEndedEventArgs args) -> void +~Microsoft.Maui.Controls.ISwipeViewController.SendSwipeStarted(Microsoft.Maui.Controls.SwipeStartedEventArgs args) -> void +~Microsoft.Maui.Controls.ITableModel.GetCell(int section, int row) -> Microsoft.Maui.Controls.Cell +~Microsoft.Maui.Controls.ITableModel.GetHeaderCell(int section) -> Microsoft.Maui.Controls.Cell +~Microsoft.Maui.Controls.ITableModel.GetItem(int section, int row) -> object +~Microsoft.Maui.Controls.ITableModel.GetSectionIndexTitles() -> string[] +~Microsoft.Maui.Controls.ITableModel.GetSectionTextColor(int section) -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ITableModel.GetSectionTitle(int section) -> string +~Microsoft.Maui.Controls.ITableModel.RowSelected(object item) -> void +~Microsoft.Maui.Controls.ITableViewController.Model.get -> Microsoft.Maui.Controls.ITableModel +~Microsoft.Maui.Controls.ITemplatedItemsList +~Microsoft.Maui.Controls.ITemplatedItemsList.ActivateContent(int index, object item = null) -> TItem +~Microsoft.Maui.Controls.ITemplatedItemsList.BindingContext.get -> object +~Microsoft.Maui.Controls.ITemplatedItemsList.GetGlobalIndexForGroup(Microsoft.Maui.Controls.ITemplatedItemsList group) -> int +~Microsoft.Maui.Controls.ITemplatedItemsList.GetGlobalIndexOfItem(object item) -> int +~Microsoft.Maui.Controls.ITemplatedItemsList.GetGroup(int index) -> Microsoft.Maui.Controls.ITemplatedItemsList +~Microsoft.Maui.Controls.ITemplatedItemsList.GetGroupAndIndexOfItem(object group, object item) -> System.Tuple +~Microsoft.Maui.Controls.ITemplatedItemsList.GetGroupAndIndexOfItem(object item) -> System.Tuple +~Microsoft.Maui.Controls.ITemplatedItemsList.HeaderContent.get -> TItem +~Microsoft.Maui.Controls.ITemplatedItemsList.IndexOf(TItem item) -> int +~Microsoft.Maui.Controls.ITemplatedItemsList.ItemsSource.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.ITemplatedItemsList.ListProxy.get -> Microsoft.Maui.Controls.IListProxy +~Microsoft.Maui.Controls.ITemplatedItemsList.Name.get -> string +~Microsoft.Maui.Controls.ITemplatedItemsList.Name.set -> void +~Microsoft.Maui.Controls.ITemplatedItemsList.SelectDataTemplate(object item) -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ITemplatedItemsList.ShortNames.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.ITemplatedItemsList.UpdateContent(TItem content, int index) -> TItem +~Microsoft.Maui.Controls.ITemplatedItemsList.UpdateHeader(TItem content, int groupIndex) -> TItem +~Microsoft.Maui.Controls.ITemplatedItemsListScrollToRequestedEventArgs.Group.get -> object +~Microsoft.Maui.Controls.ITemplatedItemsListScrollToRequestedEventArgs.Item.get -> object +~Microsoft.Maui.Controls.ITemplatedItemsView +~Microsoft.Maui.Controls.ITemplatedItemsView.ListProxy.get -> Microsoft.Maui.Controls.IListProxy +~Microsoft.Maui.Controls.ITemplatedItemsView.TemplatedItems.get -> Microsoft.Maui.Controls.ITemplatedItemsList +~Microsoft.Maui.Controls.ItemsView.AddLogicalChild(Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.ItemsView.EmptyView.get -> object +~Microsoft.Maui.Controls.ItemsView.EmptyView.set -> void +~Microsoft.Maui.Controls.ItemsView.EmptyViewTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ItemsView.EmptyViewTemplate.set -> void +~Microsoft.Maui.Controls.ItemsView.InternalItemsLayout.get -> Microsoft.Maui.Controls.IItemsLayout +~Microsoft.Maui.Controls.ItemsView.InternalItemsLayout.set -> void +~Microsoft.Maui.Controls.ItemsView.ItemsSource.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.ItemsView.ItemsSource.set -> void +~Microsoft.Maui.Controls.ItemsView.ItemTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ItemsView.ItemTemplate.set -> void +~Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdReachedCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdReachedCommand.set -> void +~Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdReachedCommandParameter.get -> object +~Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdReachedCommandParameter.set -> void +~Microsoft.Maui.Controls.ItemsView.RemoveLogicalChild(Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.ItemsView.ScrollTo(object item, object group = null, Microsoft.Maui.Controls.ScrollToPosition position = Microsoft.Maui.Controls.ScrollToPosition.MakeVisible, bool animate = true) -> void +~Microsoft.Maui.Controls.ItemsView.SendScrolled(Microsoft.Maui.Controls.ItemsViewScrolledEventArgs e) -> void +~Microsoft.Maui.Controls.ItemsView +~Microsoft.Maui.Controls.ItemsView.ItemsSource.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.ItemsView.ItemsSource.set -> void +~Microsoft.Maui.Controls.ItemsView.ItemTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ItemsView.ItemTemplate.set -> void +~Microsoft.Maui.Controls.ItemsView.TemplatedItems.get -> Microsoft.Maui.Controls.Internals.TemplatedItemsList, TVisual> +~Microsoft.Maui.Controls.ItemTappedEventArgs.Group.get -> object +~Microsoft.Maui.Controls.ItemTappedEventArgs.Item.get -> object +~Microsoft.Maui.Controls.ItemTappedEventArgs.ItemTappedEventArgs(object group, object item, int itemIndex) -> void +~Microsoft.Maui.Controls.ItemVisibilityEventArgs.Item.get -> object +~Microsoft.Maui.Controls.ItemVisibilityEventArgs.ItemVisibilityEventArgs(object item, int itemIndex) -> void +~Microsoft.Maui.Controls.IValueConverter.Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) -> object +~Microsoft.Maui.Controls.IValueConverter.ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) -> object +~Microsoft.Maui.Controls.IViewContainer +~Microsoft.Maui.Controls.IViewContainer.Children.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.IVisualElementController.NavigationProxy.get -> Microsoft.Maui.Controls.Internals.NavigationProxy +~Microsoft.Maui.Controls.IWebViewController.SendNavigated(Microsoft.Maui.Controls.WebNavigatedEventArgs args) -> void +~Microsoft.Maui.Controls.IWebViewController.SendNavigating(Microsoft.Maui.Controls.WebNavigatingEventArgs args) -> void +~Microsoft.Maui.Controls.Label.FontFamily.get -> string +~Microsoft.Maui.Controls.Label.FontFamily.set -> void +~Microsoft.Maui.Controls.Label.FormattedText.get -> Microsoft.Maui.Controls.FormattedString +~Microsoft.Maui.Controls.Label.FormattedText.set -> void +~Microsoft.Maui.Controls.Label.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Label.Text.get -> string +~Microsoft.Maui.Controls.Label.Text.set -> void +~Microsoft.Maui.Controls.Label.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Label.TextColor.set -> void +~Microsoft.Maui.Controls.Layout._layoutManager -> Microsoft.Maui.Layouts.ILayoutManager +~Microsoft.Maui.Controls.Layout.Add(Microsoft.Maui.IView child) -> void +~Microsoft.Maui.Controls.Layout.Children.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Layout.Contains(Microsoft.Maui.IView item) -> bool +~Microsoft.Maui.Controls.Layout.CopyTo(Microsoft.Maui.IView[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.Layout.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.Layout.IndexOf(Microsoft.Maui.IView item) -> int +~Microsoft.Maui.Controls.Layout.Insert(int index, Microsoft.Maui.IView child) -> void +~Microsoft.Maui.Controls.Layout.Remove(Microsoft.Maui.IView child) -> bool +~Microsoft.Maui.Controls.Layout.this[int index].get -> Microsoft.Maui.IView +~Microsoft.Maui.Controls.Layout.this[int index].set -> void +~Microsoft.Maui.Controls.LinearGradientBrush.LinearGradientBrush(Microsoft.Maui.Controls.GradientStopCollection gradientStops, Microsoft.Maui.Graphics.Point startPoint, Microsoft.Maui.Graphics.Point endPoint) -> void +~Microsoft.Maui.Controls.LinearGradientBrush.LinearGradientBrush(Microsoft.Maui.Controls.GradientStopCollection gradientStops) -> void +~Microsoft.Maui.Controls.ListProxyChangedEventArgs.ListProxyChangedEventArgs(System.Collections.Generic.IReadOnlyCollection oldList, System.Collections.Generic.IReadOnlyCollection newList) -> void +~Microsoft.Maui.Controls.ListProxyChangedEventArgs.NewList.get -> System.Collections.Generic.IReadOnlyCollection +~Microsoft.Maui.Controls.ListProxyChangedEventArgs.OldList.get -> System.Collections.Generic.IReadOnlyCollection +~Microsoft.Maui.Controls.ListView.CreateDefaultCell(object item) -> Microsoft.Maui.Controls.Cell +~Microsoft.Maui.Controls.ListView.Footer.get -> object +~Microsoft.Maui.Controls.ListView.Footer.set -> void +~Microsoft.Maui.Controls.ListView.FooterElement.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.ListView.FooterTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ListView.FooterTemplate.set -> void +~Microsoft.Maui.Controls.ListView.GetDisplayTextFromGroup(object cell) -> string +~Microsoft.Maui.Controls.ListView.GroupDisplayBinding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.ListView.GroupDisplayBinding.set -> void +~Microsoft.Maui.Controls.ListView.GroupHeaderTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ListView.GroupHeaderTemplate.set -> void +~Microsoft.Maui.Controls.ListView.GroupShortNameBinding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.ListView.GroupShortNameBinding.set -> void +~Microsoft.Maui.Controls.ListView.Header.get -> object +~Microsoft.Maui.Controls.ListView.Header.set -> void +~Microsoft.Maui.Controls.ListView.HeaderElement.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.ListView.HeaderTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ListView.HeaderTemplate.set -> void +~Microsoft.Maui.Controls.ListView.NotifyRowTapped(int groupIndex, int inGroupIndex, Microsoft.Maui.Controls.Cell cell = null) -> void +~Microsoft.Maui.Controls.ListView.NotifyRowTapped(int groupIndex, int inGroupIndex, Microsoft.Maui.Controls.Cell cell, bool isContextMenuRequested) -> void +~Microsoft.Maui.Controls.ListView.NotifyRowTapped(int index, Microsoft.Maui.Controls.Cell cell = null) -> void +~Microsoft.Maui.Controls.ListView.NotifyRowTapped(int index, Microsoft.Maui.Controls.Cell cell, bool isContextmenuRequested) -> void +~Microsoft.Maui.Controls.ListView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.ListView.RefreshCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.ListView.RefreshCommand.set -> void +~Microsoft.Maui.Controls.ListView.RefreshControlColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ListView.RefreshControlColor.set -> void +~Microsoft.Maui.Controls.ListView.ScrollTo(object item, Microsoft.Maui.Controls.ScrollToPosition position, bool animated) -> void +~Microsoft.Maui.Controls.ListView.ScrollTo(object item, object group, Microsoft.Maui.Controls.ScrollToPosition position, bool animated) -> void +~Microsoft.Maui.Controls.ListView.SelectedItem.get -> object +~Microsoft.Maui.Controls.ListView.SelectedItem.set -> void +~Microsoft.Maui.Controls.ListView.SendCellAppearing(Microsoft.Maui.Controls.Cell cell) -> void +~Microsoft.Maui.Controls.ListView.SendCellDisappearing(Microsoft.Maui.Controls.Cell cell) -> void +~Microsoft.Maui.Controls.ListView.SendScrolled(Microsoft.Maui.Controls.ScrolledEventArgs args) -> void +~Microsoft.Maui.Controls.ListView.SeparatorColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ListView.SeparatorColor.set -> void +~Microsoft.Maui.Controls.MarshalingObservableCollection.MarshalingObservableCollection(System.Collections.IList list) -> void +~Microsoft.Maui.Controls.MenuBar.Add(Microsoft.Maui.IMenuBarItem item) -> void +~Microsoft.Maui.Controls.MenuBar.Contains(Microsoft.Maui.IMenuBarItem item) -> bool +~Microsoft.Maui.Controls.MenuBar.CopyTo(Microsoft.Maui.IMenuBarItem[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.MenuBar.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.MenuBar.IndexOf(Microsoft.Maui.IMenuBarItem item) -> int +~Microsoft.Maui.Controls.MenuBar.Insert(int index, Microsoft.Maui.IMenuBarItem item) -> void +~Microsoft.Maui.Controls.MenuBar.Remove(Microsoft.Maui.IMenuBarItem item) -> bool +~Microsoft.Maui.Controls.MenuBar.this[int index].get -> Microsoft.Maui.IMenuBarItem +~Microsoft.Maui.Controls.MenuBar.this[int index].set -> void +~Microsoft.Maui.Controls.MenuBarItem.Add(Microsoft.Maui.IMenuElement item) -> void +~Microsoft.Maui.Controls.MenuBarItem.Contains(Microsoft.Maui.IMenuElement item) -> bool +~Microsoft.Maui.Controls.MenuBarItem.CopyTo(Microsoft.Maui.IMenuElement[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.MenuBarItem.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.MenuBarItem.IndexOf(Microsoft.Maui.IMenuElement item) -> int +~Microsoft.Maui.Controls.MenuBarItem.Insert(int index, Microsoft.Maui.IMenuElement item) -> void +~Microsoft.Maui.Controls.MenuBarItem.Remove(Microsoft.Maui.IMenuElement item) -> bool +~Microsoft.Maui.Controls.MenuBarItem.Text.get -> string +~Microsoft.Maui.Controls.MenuBarItem.Text.set -> void +~Microsoft.Maui.Controls.MenuBarItem.this[int index].get -> Microsoft.Maui.IMenuElement +~Microsoft.Maui.Controls.MenuBarItem.this[int index].set -> void +~Microsoft.Maui.Controls.MenuFlyout.Add(Microsoft.Maui.IMenuElement item) -> void +~Microsoft.Maui.Controls.MenuFlyout.Contains(Microsoft.Maui.IMenuElement item) -> bool +~Microsoft.Maui.Controls.MenuFlyout.CopyTo(Microsoft.Maui.IMenuElement[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.MenuFlyout.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.MenuFlyout.IndexOf(Microsoft.Maui.IMenuElement item) -> int +~Microsoft.Maui.Controls.MenuFlyout.Insert(int index, Microsoft.Maui.IMenuElement item) -> void +~Microsoft.Maui.Controls.MenuFlyout.Remove(Microsoft.Maui.IMenuElement item) -> bool +~Microsoft.Maui.Controls.MenuFlyout.this[int index].get -> Microsoft.Maui.IMenuElement +~Microsoft.Maui.Controls.MenuFlyout.this[int index].set -> void +~Microsoft.Maui.Controls.MenuFlyoutSubItem.Add(Microsoft.Maui.IMenuElement item) -> void +~Microsoft.Maui.Controls.MenuFlyoutSubItem.Contains(Microsoft.Maui.IMenuElement item) -> bool +~Microsoft.Maui.Controls.MenuFlyoutSubItem.CopyTo(Microsoft.Maui.IMenuElement[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.MenuFlyoutSubItem.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.MenuFlyoutSubItem.IndexOf(Microsoft.Maui.IMenuElement item) -> int +~Microsoft.Maui.Controls.MenuFlyoutSubItem.Insert(int index, Microsoft.Maui.IMenuElement item) -> void +~Microsoft.Maui.Controls.MenuFlyoutSubItem.Remove(Microsoft.Maui.IMenuElement item) -> bool +~Microsoft.Maui.Controls.MenuFlyoutSubItem.this[int index].get -> Microsoft.Maui.IMenuElement +~Microsoft.Maui.Controls.MenuFlyoutSubItem.this[int index].set -> void +~Microsoft.Maui.Controls.MenuItem.class.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.MenuItem.class.set -> void +~Microsoft.Maui.Controls.MenuItem.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.MenuItem.Command.set -> void +~Microsoft.Maui.Controls.MenuItem.CommandParameter.get -> object +~Microsoft.Maui.Controls.MenuItem.CommandParameter.set -> void +~Microsoft.Maui.Controls.MenuItem.IconImageSource.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.MenuItem.IconImageSource.set -> void +~Microsoft.Maui.Controls.MenuItem.StyleClass.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.MenuItem.StyleClass.set -> void +~Microsoft.Maui.Controls.MenuItem.Text.get -> string +~Microsoft.Maui.Controls.MenuItem.Text.set -> void +~Microsoft.Maui.Controls.MenuItemCollection.Add(Microsoft.Maui.Controls.MenuItem item) -> void +~Microsoft.Maui.Controls.MenuItemCollection.Contains(Microsoft.Maui.Controls.MenuItem item) -> bool +~Microsoft.Maui.Controls.MenuItemCollection.CopyTo(Microsoft.Maui.Controls.MenuItem[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.MenuItemCollection.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.MenuItemCollection.IndexOf(Microsoft.Maui.Controls.MenuItem item) -> int +~Microsoft.Maui.Controls.MenuItemCollection.Insert(int index, Microsoft.Maui.Controls.MenuItem item) -> void +~Microsoft.Maui.Controls.MenuItemCollection.Remove(Microsoft.Maui.Controls.MenuItem item) -> bool +~Microsoft.Maui.Controls.MenuItemCollection.this[int index].get -> Microsoft.Maui.Controls.MenuItem +~Microsoft.Maui.Controls.MenuItemCollection.this[int index].set -> void +~Microsoft.Maui.Controls.ModalEventArgs.Modal.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.ModalEventArgs.ModalEventArgs(Microsoft.Maui.Controls.Page modal) -> void +~Microsoft.Maui.Controls.ModalPoppedEventArgs.ModalPoppedEventArgs(Microsoft.Maui.Controls.Page modal) -> void +~Microsoft.Maui.Controls.ModalPoppingEventArgs.ModalPoppingEventArgs(Microsoft.Maui.Controls.Page modal) -> void +~Microsoft.Maui.Controls.ModalPushedEventArgs.ModalPushedEventArgs(Microsoft.Maui.Controls.Page modal) -> void +~Microsoft.Maui.Controls.ModalPushingEventArgs.ModalPushingEventArgs(Microsoft.Maui.Controls.Page modal) -> void +~Microsoft.Maui.Controls.MultiBinding.Bindings.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.MultiBinding.Bindings.set -> void +~Microsoft.Maui.Controls.MultiBinding.Converter.get -> Microsoft.Maui.Controls.IMultiValueConverter +~Microsoft.Maui.Controls.MultiBinding.Converter.set -> void +~Microsoft.Maui.Controls.MultiBinding.ConverterParameter.get -> object +~Microsoft.Maui.Controls.MultiBinding.ConverterParameter.set -> void +~Microsoft.Maui.Controls.MultiPage +~Microsoft.Maui.Controls.MultiPage.Children.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.MultiPage.CurrentPage.get -> T +~Microsoft.Maui.Controls.MultiPage.CurrentPage.set -> void +~Microsoft.Maui.Controls.MultiPage.GetPageByIndex(int index) -> T +~Microsoft.Maui.Controls.MultiPage.ItemsSource.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.MultiPage.ItemsSource.set -> void +~Microsoft.Maui.Controls.MultiPage.ItemTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.MultiPage.ItemTemplate.set -> void +~Microsoft.Maui.Controls.MultiPage.SelectedItem.get -> object +~Microsoft.Maui.Controls.MultiPage.SelectedItem.set -> void +~Microsoft.Maui.Controls.MultiTrigger.Conditions.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.MultiTrigger.MultiTrigger(System.Type targetType) -> void +~Microsoft.Maui.Controls.MultiTrigger.Setters.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.NavigableElement.class.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.NavigableElement.class.set -> void +~Microsoft.Maui.Controls.NavigableElement.Navigation.get -> Microsoft.Maui.Controls.INavigation +~Microsoft.Maui.Controls.NavigableElement.NavigationProxy.get -> Microsoft.Maui.Controls.Internals.NavigationProxy +~Microsoft.Maui.Controls.NavigableElement.Style.get -> Microsoft.Maui.Controls.Style +~Microsoft.Maui.Controls.NavigableElement.Style.set -> void +~Microsoft.Maui.Controls.NavigableElement.StyleClass.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.NavigableElement.StyleClass.set -> void +~Microsoft.Maui.Controls.NavigationEventArgs.NavigationEventArgs(Microsoft.Maui.Controls.Page page) -> void +~Microsoft.Maui.Controls.NavigationEventArgs.Page.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.NavigationPage.BarBackground.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.NavigationPage.BarBackground.set -> void +~Microsoft.Maui.Controls.NavigationPage.BarBackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.NavigationPage.BarBackgroundColor.set -> void +~Microsoft.Maui.Controls.NavigationPage.BarTextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.NavigationPage.BarTextColor.set -> void +~Microsoft.Maui.Controls.NavigationPage.CurrentPage.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.NavigationPage.NavigationPage(Microsoft.Maui.Controls.Page root) -> void +~Microsoft.Maui.Controls.NavigationPage.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.NavigationPage.Peek(int depth) -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.NavigationPage.PopAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.NavigationPage.PopAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.NavigationPage.PopToRootAsync() -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.NavigationPage.PopToRootAsync(bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.NavigationPage.PushAsync(Microsoft.Maui.Controls.Page page, bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.NavigationPage.PushAsync(Microsoft.Maui.Controls.Page page) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.NavigationPage.RootPage.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.On.Platform.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.On.Platform.set -> void +~Microsoft.Maui.Controls.On.Value.get -> object +~Microsoft.Maui.Controls.On.Value.set -> void +~Microsoft.Maui.Controls.OnPlatform.Platforms.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.OpenGLView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.OpenGLView.OnDisplay.get -> System.Action +~Microsoft.Maui.Controls.OpenGLView.OnDisplay.set -> void +~Microsoft.Maui.Controls.Page.BackgroundImageSource.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Page.BackgroundImageSource.set -> void +~Microsoft.Maui.Controls.Page.DisplayActionSheet(string title, string cancel, string destruction, Microsoft.Maui.FlowDirection flowDirection, params string[] buttons) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Page.DisplayActionSheet(string title, string cancel, string destruction, params string[] buttons) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Page.DisplayAlert(string title, string message, string accept, string cancel, Microsoft.Maui.FlowDirection flowDirection) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Page.DisplayAlert(string title, string message, string accept, string cancel) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Page.DisplayAlert(string title, string message, string cancel, Microsoft.Maui.FlowDirection flowDirection) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Page.DisplayAlert(string title, string message, string cancel) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Page.DisplayPromptAsync(string title, string message, string accept = "OK", string cancel = "Cancel", string placeholder = null, int maxLength = -1, Microsoft.Maui.Keyboard keyboard = null, string initialValue = "") -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Page.IconImageSource.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Page.IconImageSource.set -> void +~Microsoft.Maui.Controls.Page.InternalChildren.get -> System.Collections.ObjectModel.ObservableCollection +~Microsoft.Maui.Controls.Page.MenuBarItems.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Page.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Page.Title.get -> string +~Microsoft.Maui.Controls.Page.Title.set -> void +~Microsoft.Maui.Controls.Page.ToolbarItems.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.ParentChangingEventArgs.NewParent.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.ParentChangingEventArgs.OldParent.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.ParentChangingEventArgs.ParentChangingEventArgs(Microsoft.Maui.Controls.Element oldParent, Microsoft.Maui.Controls.Element newParent) -> void +~Microsoft.Maui.Controls.Picker.FontFamily.get -> string +~Microsoft.Maui.Controls.Picker.FontFamily.set -> void +~Microsoft.Maui.Controls.Picker.ItemDisplayBinding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.Picker.ItemDisplayBinding.set -> void +~Microsoft.Maui.Controls.Picker.Items.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Picker.ItemsSource.get -> System.Collections.IList +~Microsoft.Maui.Controls.Picker.ItemsSource.set -> void +~Microsoft.Maui.Controls.Picker.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Picker.SelectedItem.get -> object +~Microsoft.Maui.Controls.Picker.SelectedItem.set -> void +~Microsoft.Maui.Controls.Picker.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Picker.TextColor.set -> void +~Microsoft.Maui.Controls.Picker.Title.get -> string +~Microsoft.Maui.Controls.Picker.Title.set -> void +~Microsoft.Maui.Controls.Picker.TitleColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Picker.TitleColor.set -> void +~Microsoft.Maui.Controls.PlatformConfigurationRegistry +~Microsoft.Maui.Controls.PlatformConfigurationRegistry.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.PlatformConfigurationRegistry.PlatformConfigurationRegistry(TElement element) -> void +~Microsoft.Maui.Controls.PlatformEffect +~Microsoft.Maui.Controls.PlatformEffect.Container.get -> TContainer +~Microsoft.Maui.Controls.PlatformEffect.Control.get -> TControl +~Microsoft.Maui.Controls.PointCollection.PointCollection(Microsoft.Maui.Graphics.Point[] p) -> void +~Microsoft.Maui.Controls.PoppedToRootEventArgs.PoppedPages.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.PoppedToRootEventArgs.PoppedToRootEventArgs(Microsoft.Maui.Controls.Page page, System.Collections.Generic.IEnumerable poppedPages) -> void +~Microsoft.Maui.Controls.ProgressBar.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.ProgressBar.ProgressColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ProgressBar.ProgressColor.set -> void +~Microsoft.Maui.Controls.ProgressBar.ProgressTo(double value, uint length, Microsoft.Maui.Easing easing) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.PropertyChangingEventArgs.PropertyChangingEventArgs(string propertyName) -> void +~Microsoft.Maui.Controls.PropertyCondition.Property.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.PropertyCondition.Property.set -> void +~Microsoft.Maui.Controls.PropertyCondition.Value.get -> object +~Microsoft.Maui.Controls.PropertyCondition.Value.set -> void +~Microsoft.Maui.Controls.QueryPropertyAttribute.Name.get -> string +~Microsoft.Maui.Controls.QueryPropertyAttribute.QueryId.get -> string +~Microsoft.Maui.Controls.QueryPropertyAttribute.QueryPropertyAttribute(string name, string queryId) -> void +~Microsoft.Maui.Controls.RadialGradientBrush.RadialGradientBrush(Microsoft.Maui.Controls.GradientStopCollection gradientStops, double radius) -> void +~Microsoft.Maui.Controls.RadialGradientBrush.RadialGradientBrush(Microsoft.Maui.Controls.GradientStopCollection gradientStops, Microsoft.Maui.Graphics.Point center, double radius) -> void +~Microsoft.Maui.Controls.RadialGradientBrush.RadialGradientBrush(Microsoft.Maui.Controls.GradientStopCollection gradientStops) -> void +~Microsoft.Maui.Controls.RadioButton.BorderColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.RadioButton.BorderColor.set -> void +~Microsoft.Maui.Controls.RadioButton.Content.get -> object +~Microsoft.Maui.Controls.RadioButton.Content.set -> void +~Microsoft.Maui.Controls.RadioButton.ContentAsString() -> string +~Microsoft.Maui.Controls.RadioButton.FontFamily.get -> string +~Microsoft.Maui.Controls.RadioButton.FontFamily.set -> void +~Microsoft.Maui.Controls.RadioButton.GroupName.get -> string +~Microsoft.Maui.Controls.RadioButton.GroupName.set -> void +~Microsoft.Maui.Controls.RadioButton.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.RadioButton.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.RadioButton.TextColor.set -> void +~Microsoft.Maui.Controls.RadioButton.Value.get -> object +~Microsoft.Maui.Controls.RadioButton.Value.set -> void +~Microsoft.Maui.Controls.RefreshView.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.RefreshView.Command.set -> void +~Microsoft.Maui.Controls.RefreshView.CommandParameter.get -> object +~Microsoft.Maui.Controls.RefreshView.CommandParameter.set -> void +~Microsoft.Maui.Controls.RefreshView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.RefreshView.RefreshColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.RefreshView.RefreshColor.set -> void +~Microsoft.Maui.Controls.RelativeBindingSource.AncestorType.get -> System.Type +~Microsoft.Maui.Controls.RelativeBindingSource.RelativeBindingSource(Microsoft.Maui.Controls.RelativeBindingSourceMode mode, System.Type ancestorType = null, int ancestorLevel = 1) -> void +~Microsoft.Maui.Controls.RenderWithAttribute.RenderWithAttribute(System.Type type, System.Type[] supportedVisuals) -> void +~Microsoft.Maui.Controls.RenderWithAttribute.RenderWithAttribute(System.Type type) -> void +~Microsoft.Maui.Controls.RenderWithAttribute.SupportedVisuals.get -> System.Type[] +~Microsoft.Maui.Controls.RenderWithAttribute.Type.get -> System.Type +~Microsoft.Maui.Controls.ResolutionGroupNameAttribute.ResolutionGroupNameAttribute(string name) -> void +~Microsoft.Maui.Controls.ResourceDictionary.Add(Microsoft.Maui.Controls.ResourceDictionary mergedResourceDictionary) -> void +~Microsoft.Maui.Controls.ResourceDictionary.Add(Microsoft.Maui.Controls.Style style) -> void +~Microsoft.Maui.Controls.ResourceDictionary.Add(Microsoft.Maui.Controls.StyleSheets.StyleSheet styleSheet) -> void +~Microsoft.Maui.Controls.ResourceDictionary.Add(string key, object value) -> void +~Microsoft.Maui.Controls.ResourceDictionary.ContainsKey(string key) -> bool +~Microsoft.Maui.Controls.ResourceDictionary.GetEnumerator() -> System.Collections.Generic.IEnumerator> +~Microsoft.Maui.Controls.ResourceDictionary.Keys.get -> System.Collections.Generic.ICollection +~Microsoft.Maui.Controls.ResourceDictionary.MergedDictionaries.get -> System.Collections.Generic.ICollection +~Microsoft.Maui.Controls.ResourceDictionary.Remove(string key) -> bool +~Microsoft.Maui.Controls.ResourceDictionary.SetAndLoadSource(System.Uri value, string resourcePath, System.Reflection.Assembly assembly, System.Xml.IXmlLineInfo lineInfo) -> void +~Microsoft.Maui.Controls.ResourceDictionary.Source.get -> System.Uri +~Microsoft.Maui.Controls.ResourceDictionary.Source.set -> void +~Microsoft.Maui.Controls.ResourceDictionary.this[string index].get -> object +~Microsoft.Maui.Controls.ResourceDictionary.this[string index].set -> void +~Microsoft.Maui.Controls.ResourceDictionary.TryGetValue(string key, out object value) -> bool +~Microsoft.Maui.Controls.ResourceDictionary.Values.get -> System.Collections.Generic.ICollection +~Microsoft.Maui.Controls.RoutingEffect.RoutingEffect(string effectId) -> void +~Microsoft.Maui.Controls.RowDefinitionCollection.RowDefinitionCollection(params Microsoft.Maui.Controls.RowDefinition[] definitions) -> void +~Microsoft.Maui.Controls.ScrollToRequestedEventArgs.Element.get -> Microsoft.Maui.Controls.Element +~Microsoft.Maui.Controls.ScrollToRequestedEventArgs.ToRequest() -> Microsoft.Maui.ScrollToRequest +~Microsoft.Maui.Controls.ScrollToRequestEventArgs.Group.get -> object +~Microsoft.Maui.Controls.ScrollToRequestEventArgs.Item.get -> object +~Microsoft.Maui.Controls.ScrollToRequestEventArgs.ScrollToRequestEventArgs(object item, object group, Microsoft.Maui.Controls.ScrollToPosition scrollToPosition, bool isAnimated) -> void +~Microsoft.Maui.Controls.ScrollView.Content.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.ScrollView.Content.set -> void +~Microsoft.Maui.Controls.ScrollView.GetScrollPositionForElement(Microsoft.Maui.Controls.VisualElement item, Microsoft.Maui.Controls.ScrollToPosition pos) -> Microsoft.Maui.Graphics.Point +~Microsoft.Maui.Controls.ScrollView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.ScrollView.ScrollToAsync(double x, double y, bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.ScrollView.ScrollToAsync(Microsoft.Maui.Controls.Element element, Microsoft.Maui.Controls.ScrollToPosition position, bool animated) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.SearchBar.CancelButtonColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.SearchBar.CancelButtonColor.set -> void +~Microsoft.Maui.Controls.SearchBar.FontFamily.get -> string +~Microsoft.Maui.Controls.SearchBar.FontFamily.set -> void +~Microsoft.Maui.Controls.SearchBar.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.SearchBar.SearchCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.SearchBar.SearchCommand.set -> void +~Microsoft.Maui.Controls.SearchBar.SearchCommandParameter.get -> object +~Microsoft.Maui.Controls.SearchBar.SearchCommandParameter.set -> void +~Microsoft.Maui.Controls.SearchHandler.AutomationId.get -> string +~Microsoft.Maui.Controls.SearchHandler.AutomationId.set -> void +~Microsoft.Maui.Controls.SearchHandler.BackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.SearchHandler.BackgroundColor.set -> void +~Microsoft.Maui.Controls.SearchHandler.CancelButtonColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.SearchHandler.CancelButtonColor.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearIcon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.SearchHandler.ClearIcon.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearIconHelpText.get -> string +~Microsoft.Maui.Controls.SearchHandler.ClearIconHelpText.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearIconName.get -> string +~Microsoft.Maui.Controls.SearchHandler.ClearIconName.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderCommand.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderCommandParameter.get -> object +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderCommandParameter.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderHelpText.get -> string +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderHelpText.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderIcon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderIcon.set -> void +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderName.get -> string +~Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderName.set -> void +~Microsoft.Maui.Controls.SearchHandler.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.SearchHandler.Command.set -> void +~Microsoft.Maui.Controls.SearchHandler.CommandParameter.get -> object +~Microsoft.Maui.Controls.SearchHandler.CommandParameter.set -> void +~Microsoft.Maui.Controls.SearchHandler.DisplayMemberName.get -> string +~Microsoft.Maui.Controls.SearchHandler.DisplayMemberName.set -> void +~Microsoft.Maui.Controls.SearchHandler.FontFamily.get -> string +~Microsoft.Maui.Controls.SearchHandler.FontFamily.set -> void +~Microsoft.Maui.Controls.SearchHandler.ItemsSource.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.SearchHandler.ItemsSource.set -> void +~Microsoft.Maui.Controls.SearchHandler.ItemTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.SearchHandler.ItemTemplate.set -> void +~Microsoft.Maui.Controls.SearchHandler.Keyboard.get -> Microsoft.Maui.Keyboard +~Microsoft.Maui.Controls.SearchHandler.Keyboard.set -> void +~Microsoft.Maui.Controls.SearchHandler.Placeholder.get -> string +~Microsoft.Maui.Controls.SearchHandler.Placeholder.set -> void +~Microsoft.Maui.Controls.SearchHandler.PlaceholderColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.SearchHandler.PlaceholderColor.set -> void +~Microsoft.Maui.Controls.SearchHandler.Query.get -> string +~Microsoft.Maui.Controls.SearchHandler.Query.set -> void +~Microsoft.Maui.Controls.SearchHandler.QueryIcon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.SearchHandler.QueryIcon.set -> void +~Microsoft.Maui.Controls.SearchHandler.QueryIconHelpText.get -> string +~Microsoft.Maui.Controls.SearchHandler.QueryIconHelpText.set -> void +~Microsoft.Maui.Controls.SearchHandler.QueryIconName.get -> string +~Microsoft.Maui.Controls.SearchHandler.QueryIconName.set -> void +~Microsoft.Maui.Controls.SearchHandler.SelectedItem.get -> object +~Microsoft.Maui.Controls.SearchHandler.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.SearchHandler.TextColor.set -> void +~Microsoft.Maui.Controls.SelectableItemsView.SelectedItem.get -> object +~Microsoft.Maui.Controls.SelectableItemsView.SelectedItem.set -> void +~Microsoft.Maui.Controls.SelectableItemsView.SelectedItems.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.SelectableItemsView.SelectedItems.set -> void +~Microsoft.Maui.Controls.SelectableItemsView.SelectionChangedCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.SelectableItemsView.SelectionChangedCommand.set -> void +~Microsoft.Maui.Controls.SelectableItemsView.SelectionChangedCommandParameter.get -> object +~Microsoft.Maui.Controls.SelectableItemsView.SelectionChangedCommandParameter.set -> void +~Microsoft.Maui.Controls.SelectableItemsView.UpdateSelectedItems(System.Collections.Generic.IList newSelection) -> void +~Microsoft.Maui.Controls.SelectedItemChangedEventArgs.SelectedItem.get -> object +~Microsoft.Maui.Controls.SelectedItemChangedEventArgs.SelectedItemChangedEventArgs(object selectedItem, int selectedItemIndex) -> void +~Microsoft.Maui.Controls.SelectedPositionChangedEventArgs.SelectedPosition.get -> object +~Microsoft.Maui.Controls.SelectionChangedEventArgs.CurrentSelection.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.SelectionChangedEventArgs.PreviousSelection.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.Setter.Property.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.Setter.Property.set -> void +~Microsoft.Maui.Controls.Setter.TargetName.get -> string +~Microsoft.Maui.Controls.Setter.TargetName.set -> void +~Microsoft.Maui.Controls.Setter.Value.get -> object +~Microsoft.Maui.Controls.Setter.Value.set -> void +~Microsoft.Maui.Controls.Shadow.Brush.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.Shadow.Brush.set -> void +~Microsoft.Maui.Controls.Shapes.GeometryGroup.Children.get -> Microsoft.Maui.Controls.Shapes.GeometryCollection +~Microsoft.Maui.Controls.Shapes.GeometryGroup.Children.set -> void +~Microsoft.Maui.Controls.Shapes.Matrix.Transform(Microsoft.Maui.Graphics.Point[] points) -> void +~Microsoft.Maui.Controls.Shapes.Path.Data.get -> Microsoft.Maui.Controls.Shapes.Geometry +~Microsoft.Maui.Controls.Shapes.Path.Data.set -> void +~Microsoft.Maui.Controls.Shapes.Path.Path(Microsoft.Maui.Controls.Shapes.Geometry data) -> void +~Microsoft.Maui.Controls.Shapes.Path.RenderTransform.get -> Microsoft.Maui.Controls.Shapes.Transform +~Microsoft.Maui.Controls.Shapes.Path.RenderTransform.set -> void +~Microsoft.Maui.Controls.Shapes.PathFigure.Segments.get -> Microsoft.Maui.Controls.Shapes.PathSegmentCollection +~Microsoft.Maui.Controls.Shapes.PathFigure.Segments.set -> void +~Microsoft.Maui.Controls.Shapes.PathGeometry.Figures.get -> Microsoft.Maui.Controls.Shapes.PathFigureCollection +~Microsoft.Maui.Controls.Shapes.PathGeometry.Figures.set -> void +~Microsoft.Maui.Controls.Shapes.PathGeometry.PathGeometry(Microsoft.Maui.Controls.Shapes.PathFigureCollection figures, Microsoft.Maui.Controls.Shapes.FillRule fillRule) -> void +~Microsoft.Maui.Controls.Shapes.PathGeometry.PathGeometry(Microsoft.Maui.Controls.Shapes.PathFigureCollection figures) -> void +~Microsoft.Maui.Controls.Shapes.PolyBezierSegment.Points.get -> Microsoft.Maui.Controls.PointCollection +~Microsoft.Maui.Controls.Shapes.PolyBezierSegment.Points.set -> void +~Microsoft.Maui.Controls.Shapes.PolyBezierSegment.PolyBezierSegment(Microsoft.Maui.Controls.PointCollection points) -> void +~Microsoft.Maui.Controls.Shapes.Polygon.Points.get -> Microsoft.Maui.Controls.PointCollection +~Microsoft.Maui.Controls.Shapes.Polygon.Points.set -> void +~Microsoft.Maui.Controls.Shapes.Polygon.Polygon(Microsoft.Maui.Controls.PointCollection points) -> void +~Microsoft.Maui.Controls.Shapes.Polyline.Points.get -> Microsoft.Maui.Controls.PointCollection +~Microsoft.Maui.Controls.Shapes.Polyline.Points.set -> void +~Microsoft.Maui.Controls.Shapes.Polyline.Polyline(Microsoft.Maui.Controls.PointCollection points) -> void +~Microsoft.Maui.Controls.Shapes.PolyLineSegment.Points.get -> Microsoft.Maui.Controls.PointCollection +~Microsoft.Maui.Controls.Shapes.PolyLineSegment.Points.set -> void +~Microsoft.Maui.Controls.Shapes.PolyLineSegment.PolyLineSegment(Microsoft.Maui.Controls.PointCollection points) -> void +~Microsoft.Maui.Controls.Shapes.PolyQuadraticBezierSegment.Points.get -> Microsoft.Maui.Controls.PointCollection +~Microsoft.Maui.Controls.Shapes.PolyQuadraticBezierSegment.Points.set -> void +~Microsoft.Maui.Controls.Shapes.PolyQuadraticBezierSegment.PolyQuadraticBezierSegment(Microsoft.Maui.Controls.PointCollection points) -> void +~Microsoft.Maui.Controls.Shapes.TransformGroup.Children.get -> Microsoft.Maui.Controls.Shapes.TransformCollection +~Microsoft.Maui.Controls.Shapes.TransformGroup.Children.set -> void +~Microsoft.Maui.Controls.Shell.AddLogicalChild(Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.Shell.CurrentItem.get -> Microsoft.Maui.Controls.ShellItem +~Microsoft.Maui.Controls.Shell.CurrentItem.set -> void +~Microsoft.Maui.Controls.Shell.CurrentPage.get -> Microsoft.Maui.Controls.Page +~Microsoft.Maui.Controls.Shell.CurrentState.get -> Microsoft.Maui.Controls.ShellNavigationState +~Microsoft.Maui.Controls.Shell.FlyoutBackdrop.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.Shell.FlyoutBackdrop.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutBackground.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.Shell.FlyoutBackground.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutBackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Shell.FlyoutBackgroundColor.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutBackgroundImage.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Shell.FlyoutBackgroundImage.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutContent.get -> object +~Microsoft.Maui.Controls.Shell.FlyoutContent.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutContentTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Shell.FlyoutContentTemplate.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutFooter.get -> object +~Microsoft.Maui.Controls.Shell.FlyoutFooter.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutFooterTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Shell.FlyoutFooterTemplate.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutHeader.get -> object +~Microsoft.Maui.Controls.Shell.FlyoutHeader.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutHeaderTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Shell.FlyoutHeaderTemplate.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutIcon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Shell.FlyoutIcon.set -> void +~Microsoft.Maui.Controls.Shell.FlyoutItems.get -> System.Collections.IEnumerable +~Microsoft.Maui.Controls.Shell.GoToAsync(Microsoft.Maui.Controls.ShellNavigationState state, bool animate, System.Collections.Generic.IDictionary parameters) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Shell.GoToAsync(Microsoft.Maui.Controls.ShellNavigationState state, bool animate) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Shell.GoToAsync(Microsoft.Maui.Controls.ShellNavigationState state, System.Collections.Generic.IDictionary parameters) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Shell.GoToAsync(Microsoft.Maui.Controls.ShellNavigationState state) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Shell.Items.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Shell.ItemTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Shell.ItemTemplate.set -> void +~Microsoft.Maui.Controls.Shell.MenuItemTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.Shell.MenuItemTemplate.set -> void +~Microsoft.Maui.Controls.Shell.RemoveLogicalChild(Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.ShellAppearance.BackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.DisabledColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.FlyoutBackdrop.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.ShellAppearance.ForegroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.Ingest(Microsoft.Maui.Controls.Element pivot) -> bool +~Microsoft.Maui.Controls.ShellAppearance.TabBarBackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.TabBarDisabledColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.TabBarForegroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.TabBarTitleColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.TabBarUnselectedColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.TitleColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellAppearance.UnselectedColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.ShellContent.Content.get -> object +~Microsoft.Maui.Controls.ShellContent.Content.set -> void +~Microsoft.Maui.Controls.ShellContent.ContentTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.ShellContent.ContentTemplate.set -> void +~Microsoft.Maui.Controls.ShellContent.MenuItems.get -> Microsoft.Maui.Controls.MenuItemCollection +~Microsoft.Maui.Controls.ShellItem.CurrentItem.get -> Microsoft.Maui.Controls.ShellSection +~Microsoft.Maui.Controls.ShellItem.CurrentItem.set -> void +~Microsoft.Maui.Controls.ShellItem.Items.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.ShellItem.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.ShellNavigatedEventArgs.Current.get -> Microsoft.Maui.Controls.ShellNavigationState +~Microsoft.Maui.Controls.ShellNavigatedEventArgs.Previous.get -> Microsoft.Maui.Controls.ShellNavigationState +~Microsoft.Maui.Controls.ShellNavigatedEventArgs.ShellNavigatedEventArgs(Microsoft.Maui.Controls.ShellNavigationState previous, Microsoft.Maui.Controls.ShellNavigationState current, Microsoft.Maui.Controls.ShellNavigationSource source) -> void +~Microsoft.Maui.Controls.ShellNavigatingEventArgs.Current.get -> Microsoft.Maui.Controls.ShellNavigationState +~Microsoft.Maui.Controls.ShellNavigatingEventArgs.GetDeferral() -> Microsoft.Maui.Controls.ShellNavigatingDeferral +~Microsoft.Maui.Controls.ShellNavigatingEventArgs.ShellNavigatingEventArgs(Microsoft.Maui.Controls.ShellNavigationState current, Microsoft.Maui.Controls.ShellNavigationState target, Microsoft.Maui.Controls.ShellNavigationSource source, bool canCancel) -> void +~Microsoft.Maui.Controls.ShellNavigatingEventArgs.Target.get -> Microsoft.Maui.Controls.ShellNavigationState +~Microsoft.Maui.Controls.ShellNavigationState.Location.get -> System.Uri +~Microsoft.Maui.Controls.ShellNavigationState.ShellNavigationState(string location) -> void +~Microsoft.Maui.Controls.ShellNavigationState.ShellNavigationState(System.Uri location) -> void +~Microsoft.Maui.Controls.ShellSection.CurrentItem.get -> Microsoft.Maui.Controls.ShellContent +~Microsoft.Maui.Controls.ShellSection.CurrentItem.set -> void +~Microsoft.Maui.Controls.ShellSection.Items.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.ShellSection.Stack.get -> System.Collections.Generic.IReadOnlyList +~Microsoft.Maui.Controls.Slider.DragCompletedCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.Slider.DragCompletedCommand.set -> void +~Microsoft.Maui.Controls.Slider.DragStartedCommand.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.Slider.DragStartedCommand.set -> void +~Microsoft.Maui.Controls.Slider.MaximumTrackColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Slider.MaximumTrackColor.set -> void +~Microsoft.Maui.Controls.Slider.MinimumTrackColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Slider.MinimumTrackColor.set -> void +~Microsoft.Maui.Controls.Slider.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Slider.ThumbColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Slider.ThumbColor.set -> void +~Microsoft.Maui.Controls.Slider.ThumbImageSource.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Slider.ThumbImageSource.set -> void +~Microsoft.Maui.Controls.SolidColorBrush.SolidColorBrush(Microsoft.Maui.Graphics.Color color) -> void +~Microsoft.Maui.Controls.Span.BackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Span.BackgroundColor.set -> void +~Microsoft.Maui.Controls.Span.FontFamily.get -> string +~Microsoft.Maui.Controls.Span.FontFamily.set -> void +~Microsoft.Maui.Controls.Span.Style.get -> Microsoft.Maui.Controls.Style +~Microsoft.Maui.Controls.Span.Style.set -> void +~Microsoft.Maui.Controls.Span.Text.get -> string +~Microsoft.Maui.Controls.Span.Text.set -> void +~Microsoft.Maui.Controls.Span.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Span.TextColor.set -> void +~Microsoft.Maui.Controls.StackLayoutManager.StackLayoutManager(Microsoft.Maui.Controls.StackLayout stackLayout) -> void +~Microsoft.Maui.Controls.Stepper.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.StructuredItemsView.Footer.get -> object +~Microsoft.Maui.Controls.StructuredItemsView.Footer.set -> void +~Microsoft.Maui.Controls.StructuredItemsView.FooterTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.StructuredItemsView.FooterTemplate.set -> void +~Microsoft.Maui.Controls.StructuredItemsView.Header.get -> object +~Microsoft.Maui.Controls.StructuredItemsView.Header.set -> void +~Microsoft.Maui.Controls.StructuredItemsView.HeaderTemplate.get -> Microsoft.Maui.Controls.DataTemplate +~Microsoft.Maui.Controls.StructuredItemsView.HeaderTemplate.set -> void +~Microsoft.Maui.Controls.StructuredItemsView.ItemsLayout.get -> Microsoft.Maui.Controls.IItemsLayout +~Microsoft.Maui.Controls.StructuredItemsView.ItemsLayout.set -> void +~Microsoft.Maui.Controls.Style.BasedOn.get -> Microsoft.Maui.Controls.Style +~Microsoft.Maui.Controls.Style.BasedOn.set -> void +~Microsoft.Maui.Controls.Style.BaseResourceKey.get -> string +~Microsoft.Maui.Controls.Style.BaseResourceKey.set -> void +~Microsoft.Maui.Controls.Style.Behaviors.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Style.Class.get -> string +~Microsoft.Maui.Controls.Style.Class.set -> void +~Microsoft.Maui.Controls.Style.Setters.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Style.Style(System.Type targetType) -> void +~Microsoft.Maui.Controls.Style.TargetType.get -> System.Type +~Microsoft.Maui.Controls.Style.Triggers.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.SwipedEventArgs.Parameter.get -> object +~Microsoft.Maui.Controls.SwipedEventArgs.SwipedEventArgs(object parameter, Microsoft.Maui.SwipeDirection direction) -> void +~Microsoft.Maui.Controls.SwipeGestureRecognizer.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.SwipeGestureRecognizer.Command.set -> void +~Microsoft.Maui.Controls.SwipeGestureRecognizer.CommandParameter.get -> object +~Microsoft.Maui.Controls.SwipeGestureRecognizer.CommandParameter.set -> void +~Microsoft.Maui.Controls.SwipeGestureRecognizer.SendSwiped(Microsoft.Maui.Controls.View sender, Microsoft.Maui.SwipeDirection direction) -> void +~Microsoft.Maui.Controls.SwipeItem.BackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.SwipeItem.BackgroundColor.set -> void +~Microsoft.Maui.Controls.SwipeItems.Add(Microsoft.Maui.Controls.ISwipeItem item) -> void +~Microsoft.Maui.Controls.SwipeItems.Contains(Microsoft.Maui.Controls.ISwipeItem item) -> bool +~Microsoft.Maui.Controls.SwipeItems.CopyTo(Microsoft.Maui.Controls.ISwipeItem[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.SwipeItems.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.SwipeItems.IndexOf(Microsoft.Maui.Controls.ISwipeItem item) -> int +~Microsoft.Maui.Controls.SwipeItems.Insert(int index, Microsoft.Maui.Controls.ISwipeItem item) -> void +~Microsoft.Maui.Controls.SwipeItems.Remove(Microsoft.Maui.Controls.ISwipeItem item) -> bool +~Microsoft.Maui.Controls.SwipeItems.SwipeItems(System.Collections.Generic.IEnumerable swipeItems) -> void +~Microsoft.Maui.Controls.SwipeItems.this[int index].get -> Microsoft.Maui.Controls.ISwipeItem +~Microsoft.Maui.Controls.SwipeItems.this[int index].set -> void +~Microsoft.Maui.Controls.SwipeItemView.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.SwipeItemView.Command.set -> void +~Microsoft.Maui.Controls.SwipeItemView.CommandParameter.get -> object +~Microsoft.Maui.Controls.SwipeItemView.CommandParameter.set -> void +~Microsoft.Maui.Controls.SwipeView.BottomItems.get -> Microsoft.Maui.Controls.SwipeItems +~Microsoft.Maui.Controls.SwipeView.BottomItems.set -> void +~Microsoft.Maui.Controls.SwipeView.LeftItems.get -> Microsoft.Maui.Controls.SwipeItems +~Microsoft.Maui.Controls.SwipeView.LeftItems.set -> void +~Microsoft.Maui.Controls.SwipeView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.SwipeView.RightItems.get -> Microsoft.Maui.Controls.SwipeItems +~Microsoft.Maui.Controls.SwipeView.RightItems.set -> void +~Microsoft.Maui.Controls.SwipeView.TopItems.get -> Microsoft.Maui.Controls.SwipeItems +~Microsoft.Maui.Controls.SwipeView.TopItems.set -> void +~Microsoft.Maui.Controls.Switch.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.Switch.OnColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Switch.OnColor.set -> void +~Microsoft.Maui.Controls.Switch.ThumbColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.Switch.ThumbColor.set -> void +~Microsoft.Maui.Controls.SwitchCell.OnColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.SwitchCell.OnColor.set -> void +~Microsoft.Maui.Controls.SwitchCell.Text.get -> string +~Microsoft.Maui.Controls.SwitchCell.Text.set -> void +~Microsoft.Maui.Controls.TabbedPage.BarBackground.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.TabbedPage.BarBackground.set -> void +~Microsoft.Maui.Controls.TabbedPage.BarBackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TabbedPage.BarBackgroundColor.set -> void +~Microsoft.Maui.Controls.TabbedPage.BarTextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TabbedPage.BarTextColor.set -> void +~Microsoft.Maui.Controls.TabbedPage.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.TabbedPage.SelectedTabColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TabbedPage.SelectedTabColor.set -> void +~Microsoft.Maui.Controls.TabbedPage.UnselectedTabColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TabbedPage.UnselectedTabColor.set -> void +~Microsoft.Maui.Controls.TableRoot.TableRoot(string title) -> void +~Microsoft.Maui.Controls.TableSection.TableSection(string title) -> void +~Microsoft.Maui.Controls.TableSectionBase.TableSectionBase(string title) -> void +~Microsoft.Maui.Controls.TableSectionBase.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TableSectionBase.TextColor.set -> void +~Microsoft.Maui.Controls.TableSectionBase.Title.get -> string +~Microsoft.Maui.Controls.TableSectionBase.Title.set -> void +~Microsoft.Maui.Controls.TableSectionBase +~Microsoft.Maui.Controls.TableSectionBase.Add(System.Collections.Generic.IEnumerable items) -> void +~Microsoft.Maui.Controls.TableSectionBase.Add(T item) -> void +~Microsoft.Maui.Controls.TableSectionBase.Contains(T item) -> bool +~Microsoft.Maui.Controls.TableSectionBase.CopyTo(T[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.TableSectionBase.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.TableSectionBase.IndexOf(T item) -> int +~Microsoft.Maui.Controls.TableSectionBase.Insert(int index, T item) -> void +~Microsoft.Maui.Controls.TableSectionBase.Remove(T item) -> bool +~Microsoft.Maui.Controls.TableSectionBase.TableSectionBase(string title) -> void +~Microsoft.Maui.Controls.TableSectionBase.this[int index].get -> T +~Microsoft.Maui.Controls.TableSectionBase.this[int index].set -> void +~Microsoft.Maui.Controls.TableView.Model.get -> Microsoft.Maui.Controls.Internals.TableModel +~Microsoft.Maui.Controls.TableView.Model.set -> void +~Microsoft.Maui.Controls.TableView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.TableView.Root.get -> Microsoft.Maui.Controls.TableRoot +~Microsoft.Maui.Controls.TableView.Root.set -> void +~Microsoft.Maui.Controls.TableView.TableView(Microsoft.Maui.Controls.TableRoot root) -> void +~Microsoft.Maui.Controls.TemplateBinding.Converter.get -> Microsoft.Maui.Controls.IValueConverter +~Microsoft.Maui.Controls.TemplateBinding.Converter.set -> void +~Microsoft.Maui.Controls.TemplateBinding.ConverterParameter.get -> object +~Microsoft.Maui.Controls.TemplateBinding.ConverterParameter.set -> void +~Microsoft.Maui.Controls.TemplateBinding.Path.get -> string +~Microsoft.Maui.Controls.TemplateBinding.Path.set -> void +~Microsoft.Maui.Controls.TemplateBinding.TemplateBinding(string path, Microsoft.Maui.Controls.BindingMode mode = Microsoft.Maui.Controls.BindingMode.Default, Microsoft.Maui.Controls.IValueConverter converter = null, object converterParameter = null, string stringFormat = null) -> void +~Microsoft.Maui.Controls.TemplatedPage.ControlTemplate.get -> Microsoft.Maui.Controls.ControlTemplate +~Microsoft.Maui.Controls.TemplatedPage.ControlTemplate.set -> void +~Microsoft.Maui.Controls.TemplatedPage.GetTemplateChild(string name) -> object +~Microsoft.Maui.Controls.TemplatedView.ControlTemplate.get -> Microsoft.Maui.Controls.ControlTemplate +~Microsoft.Maui.Controls.TemplatedView.ControlTemplate.set -> void +~Microsoft.Maui.Controls.TemplatedView.GetTemplateChild(string name) -> object +~Microsoft.Maui.Controls.TextCell.Command.get -> System.Windows.Input.ICommand +~Microsoft.Maui.Controls.TextCell.Command.set -> void +~Microsoft.Maui.Controls.TextCell.CommandParameter.get -> object +~Microsoft.Maui.Controls.TextCell.CommandParameter.set -> void +~Microsoft.Maui.Controls.TextCell.Detail.get -> string +~Microsoft.Maui.Controls.TextCell.Detail.set -> void +~Microsoft.Maui.Controls.TextCell.DetailColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TextCell.DetailColor.set -> void +~Microsoft.Maui.Controls.TextCell.Text.get -> string +~Microsoft.Maui.Controls.TextCell.Text.set -> void +~Microsoft.Maui.Controls.TextCell.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TextCell.TextColor.set -> void +~Microsoft.Maui.Controls.TextChangedEventArgs.NewTextValue.get -> string +~Microsoft.Maui.Controls.TextChangedEventArgs.OldTextValue.get -> string +~Microsoft.Maui.Controls.TextChangedEventArgs.TextChangedEventArgs(string oldTextValue, string newTextValue) -> void +~Microsoft.Maui.Controls.TimePicker.FontFamily.get -> string +~Microsoft.Maui.Controls.TimePicker.FontFamily.set -> void +~Microsoft.Maui.Controls.TimePicker.Format.get -> string +~Microsoft.Maui.Controls.TimePicker.Format.set -> void +~Microsoft.Maui.Controls.TimePicker.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.TimePicker.TextColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.TimePicker.TextColor.set -> void +~Microsoft.Maui.Controls.Toolbar.BackButtonTitle.get -> string +~Microsoft.Maui.Controls.Toolbar.BackButtonTitle.set -> void +~Microsoft.Maui.Controls.Toolbar.BarBackground.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.Toolbar.BarBackground.set -> void +~Microsoft.Maui.Controls.Toolbar.Handler.get -> Microsoft.Maui.IElementHandler +~Microsoft.Maui.Controls.Toolbar.Handler.set -> void +~Microsoft.Maui.Controls.Toolbar.Parent.get -> Microsoft.Maui.IElement +~Microsoft.Maui.Controls.Toolbar.TitleIcon.get -> Microsoft.Maui.Controls.ImageSource +~Microsoft.Maui.Controls.Toolbar.TitleIcon.set -> void +~Microsoft.Maui.Controls.Toolbar.Toolbar(Microsoft.Maui.IElement parent) -> void +~Microsoft.Maui.Controls.Toolbar.ToolbarItems.get -> System.Collections.Generic.IEnumerable +~Microsoft.Maui.Controls.Toolbar.ToolbarItems.set -> void +~Microsoft.Maui.Controls.ToolbarItem.ToolbarItem(string name, string icon, System.Action activated, Microsoft.Maui.Controls.ToolbarItemOrder order = Microsoft.Maui.Controls.ToolbarItemOrder.Default, int priority = 0) -> void +~Microsoft.Maui.Controls.TouchEventArgs.Touches.get -> Microsoft.Maui.Graphics.PointF[] +~Microsoft.Maui.Controls.TouchEventArgs.TouchEventArgs(Microsoft.Maui.Graphics.PointF[] points, bool isInsideBounds) -> void +~Microsoft.Maui.Controls.Trigger.Property.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.Trigger.Property.set -> void +~Microsoft.Maui.Controls.Trigger.Setters.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.Trigger.Trigger(System.Type targetType) -> void +~Microsoft.Maui.Controls.Trigger.Value.get -> object +~Microsoft.Maui.Controls.Trigger.Value.set -> void +~Microsoft.Maui.Controls.TriggerAction +~Microsoft.Maui.Controls.TriggerBase.EnterActions.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.TriggerBase.ExitActions.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.TriggerBase.TargetType.get -> System.Type +~Microsoft.Maui.Controls.UnsolvableConstraintsException.UnsolvableConstraintsException(string message, System.Exception innerException) -> void +~Microsoft.Maui.Controls.UnsolvableConstraintsException.UnsolvableConstraintsException(string message) -> void +~Microsoft.Maui.Controls.UnsolvableConstraintsException.UnsolvableConstraintsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +~Microsoft.Maui.Controls.UriImageSource.Uri.get -> System.Uri +~Microsoft.Maui.Controls.UriImageSource.Uri.set -> void +~Microsoft.Maui.Controls.UrlWebViewSource.Url.get -> string +~Microsoft.Maui.Controls.UrlWebViewSource.Url.set -> void +~Microsoft.Maui.Controls.View.GestureController.get -> Microsoft.Maui.Controls.Internals.IGestureController +~Microsoft.Maui.Controls.View.GestureRecognizers.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.ViewCell.View.get -> Microsoft.Maui.Controls.View +~Microsoft.Maui.Controls.ViewCell.View.set -> void +~Microsoft.Maui.Controls.VisualAttribute.VisualAttribute(string key, System.Type visual) -> void +~Microsoft.Maui.Controls.VisualElement.Background.get -> Microsoft.Maui.Controls.Brush +~Microsoft.Maui.Controls.VisualElement.Background.set -> void +~Microsoft.Maui.Controls.VisualElement.BackgroundColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Controls.VisualElement.BackgroundColor.set -> void +~Microsoft.Maui.Controls.VisualElement.Behaviors.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.VisualElement.Clip.get -> Microsoft.Maui.Controls.Shapes.Geometry +~Microsoft.Maui.Controls.VisualElement.Clip.set -> void +~Microsoft.Maui.Controls.VisualElement.Resources.get -> Microsoft.Maui.Controls.ResourceDictionary +~Microsoft.Maui.Controls.VisualElement.Resources.set -> void +~Microsoft.Maui.Controls.VisualElement.Triggers.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.VisualElement.Visual.get -> Microsoft.Maui.Controls.IVisual +~Microsoft.Maui.Controls.VisualElement.Visual.set -> void +~Microsoft.Maui.Controls.VisualElement.Window.get -> Microsoft.Maui.Controls.Window +~Microsoft.Maui.Controls.VisualState.Name.get -> string +~Microsoft.Maui.Controls.VisualState.Name.set -> void +~Microsoft.Maui.Controls.VisualState.Setters.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.VisualState.StateTriggers.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.VisualState.TargetType.get -> System.Type +~Microsoft.Maui.Controls.VisualState.TargetType.set -> void +~Microsoft.Maui.Controls.VisualStateGroup.CurrentState.get -> Microsoft.Maui.Controls.VisualState +~Microsoft.Maui.Controls.VisualStateGroup.Name.get -> string +~Microsoft.Maui.Controls.VisualStateGroup.Name.set -> void +~Microsoft.Maui.Controls.VisualStateGroup.States.get -> System.Collections.Generic.IList +~Microsoft.Maui.Controls.VisualStateGroup.TargetType.get -> System.Type +~Microsoft.Maui.Controls.VisualStateGroup.TargetType.set -> void +~Microsoft.Maui.Controls.VisualStateGroupList.Add(Microsoft.Maui.Controls.VisualStateGroup item) -> void +~Microsoft.Maui.Controls.VisualStateGroupList.Contains(Microsoft.Maui.Controls.VisualStateGroup item) -> bool +~Microsoft.Maui.Controls.VisualStateGroupList.CopyTo(Microsoft.Maui.Controls.VisualStateGroup[] array, int arrayIndex) -> void +~Microsoft.Maui.Controls.VisualStateGroupList.GetEnumerator() -> System.Collections.Generic.IEnumerator +~Microsoft.Maui.Controls.VisualStateGroupList.IndexOf(Microsoft.Maui.Controls.VisualStateGroup item) -> int +~Microsoft.Maui.Controls.VisualStateGroupList.Insert(int index, Microsoft.Maui.Controls.VisualStateGroup item) -> void +~Microsoft.Maui.Controls.VisualStateGroupList.Remove(Microsoft.Maui.Controls.VisualStateGroup item) -> bool +~Microsoft.Maui.Controls.VisualStateGroupList.this[int index].get -> Microsoft.Maui.Controls.VisualStateGroup +~Microsoft.Maui.Controls.VisualStateGroupList.this[int index].set -> void +~Microsoft.Maui.Controls.WebNavigatedEventArgs.WebNavigatedEventArgs(Microsoft.Maui.WebNavigationEvent navigationEvent, Microsoft.Maui.Controls.WebViewSource source, string url, Microsoft.Maui.WebNavigationResult result) -> void +~Microsoft.Maui.Controls.WebNavigatingEventArgs.WebNavigatingEventArgs(Microsoft.Maui.WebNavigationEvent navigationEvent, Microsoft.Maui.Controls.WebViewSource source, string url) -> void +~Microsoft.Maui.Controls.WebNavigationEventArgs.Source.get -> Microsoft.Maui.Controls.WebViewSource +~Microsoft.Maui.Controls.WebNavigationEventArgs.Url.get -> string +~Microsoft.Maui.Controls.WebNavigationEventArgs.WebNavigationEventArgs(Microsoft.Maui.WebNavigationEvent navigationEvent, Microsoft.Maui.Controls.WebViewSource source, string url) -> void +~Microsoft.Maui.Controls.WebView.Cookies.get -> System.Net.CookieContainer +~Microsoft.Maui.Controls.WebView.Cookies.set -> void +~Microsoft.Maui.Controls.WebView.Eval(string script) -> void +~Microsoft.Maui.Controls.WebView.EvaluateJavaScriptAsync(string script) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.WebView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~Microsoft.Maui.Controls.WebView.OnSourceChanged(object sender, System.EventArgs e) -> void +~Microsoft.Maui.Controls.WebView.Source.get -> Microsoft.Maui.Controls.WebViewSource +~Microsoft.Maui.Controls.WebView.Source.set -> void +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingBaseErrorEventArgs.Binding.get -> Microsoft.Maui.Controls.BindingBase +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingBaseErrorEventArgs.ErrorCode.get -> string +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingBaseErrorEventArgs.Message.get -> string +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingBaseErrorEventArgs.MessageArgs.get -> object[] +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingBaseErrorEventArgs.XamlSourceInfo.get -> Microsoft.Maui.SourceInfo +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingErrorEventArgs.Source.get -> object +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingErrorEventArgs.Target.get -> Microsoft.Maui.Controls.BindableObject +~Microsoft.Maui.Controls.Xaml.Diagnostics.BindingErrorEventArgs.TargetProperty.get -> Microsoft.Maui.Controls.BindableProperty +~Microsoft.Maui.Controls.Xaml.IMarkupExtension.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.IMarkupExtension.ProvideValue(System.IServiceProvider serviceProvider) -> T +~Microsoft.Maui.Controls.Xaml.Internals.INativeBindingService.TrySetBinding(object target, Microsoft.Maui.Controls.BindableProperty property, Microsoft.Maui.Controls.BindingBase binding) -> bool +~Microsoft.Maui.Controls.Xaml.Internals.INativeBindingService.TrySetBinding(object target, string propertyName, Microsoft.Maui.Controls.BindingBase binding) -> bool +~Microsoft.Maui.Controls.Xaml.Internals.INativeBindingService.TrySetValue(object target, Microsoft.Maui.Controls.BindableProperty property, object value) -> bool +~Microsoft.Maui.Controls.Xaml.Internals.INativeValueConverterService.ConvertTo(object value, System.Type toType, out object platformValue) -> bool +~Microsoft.Maui.Controls.Xaml.IProvideValueTarget.TargetObject.get -> object +~Microsoft.Maui.Controls.Xaml.IProvideValueTarget.TargetProperty.get -> object +~Microsoft.Maui.Controls.Xaml.IReferenceProvider.FindByName(string name) -> object +~Microsoft.Maui.Controls.Xaml.IRootObjectProvider.RootObject.get -> object +~Microsoft.Maui.Controls.Xaml.IValueProvider.ProvideValue(System.IServiceProvider serviceProvider) -> object +~Microsoft.Maui.Controls.Xaml.IXamlTypeResolver.Resolve(string qualifiedTypeName, System.IServiceProvider serviceProvider = null) -> System.Type +~Microsoft.Maui.Controls.Xaml.IXamlTypeResolver.TryResolve(string qualifiedTypeName, out System.Type type) -> bool +~Microsoft.Maui.Controls.Xaml.IXmlLineInfoProvider.XmlLineInfo.get -> System.Xml.IXmlLineInfo +~Microsoft.Maui.Controls.Xaml.XamlParseException.XamlParseException(string message, System.Exception innerException) -> void +~Microsoft.Maui.Controls.Xaml.XamlParseException.XamlParseException(string message, System.Xml.IXmlLineInfo xmlInfo, System.Exception innerException = null) -> void +~Microsoft.Maui.Controls.Xaml.XamlParseException.XamlParseException(string message) -> void +~Microsoft.Maui.Controls.Xaml.XamlParseException.XamlParseException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +~Microsoft.Maui.Controls.Xaml.XamlParseException.XmlInfo.get -> System.Xml.IXmlLineInfo +~Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute.Path.get -> string +~Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute.Path.set -> void +~Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute.ResourceId.get -> string +~Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute.ResourceId.set -> void +~Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute.Type.get -> System.Type +~Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute.Type.set -> void +~Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute.XamlResourceIdAttribute(string resourceId, string path, System.Type type) -> void +~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.AssemblyName.get -> string +~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.AssemblyName.set -> void +~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.ClrNamespace.get -> string +~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlNamespace.get -> string +~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) -> void +~Microsoft.Maui.Controls.XmlnsPrefixAttribute.Prefix.get -> string +~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlNamespace.get -> string +~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlnsPrefixAttribute(string xmlNamespace, string prefix) -> void +~override Microsoft.Maui.Controls.AbsoluteLayout.CreateLayoutManager() -> Microsoft.Maui.Layouts.ILayoutManager +~override Microsoft.Maui.Controls.AbsoluteLayout.OnAdd(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.AbsoluteLayout.OnInsert(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.AbsoluteLayout.OnRemove(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.AbsoluteLayout.OnUpdate(int index, Microsoft.Maui.IView view, Microsoft.Maui.IView oldView) -> void +~override Microsoft.Maui.Controls.Accelerator.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.Accelerator.ToString() -> string +~override Microsoft.Maui.Controls.AcceleratorTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.AcceleratorTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.AcceleratorTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.AcceleratorTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.AppLinkEntry.ToString() -> string +~override Microsoft.Maui.Controls.BaseShellItem.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.Behavior.OnAttachedTo(Microsoft.Maui.Controls.BindableObject bindable) -> void +~override Microsoft.Maui.Controls.Behavior.OnDetachingFrom(Microsoft.Maui.Controls.BindableObject bindable) -> void +~override Microsoft.Maui.Controls.BindablePropertyConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.BindablePropertyConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.BindablePropertyConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.BindablePropertyConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.BoundsTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.BoundsTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.BoundsTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.BoundsTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.BrushTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.BrushTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.BrushTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.BrushTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Button.ButtonContentLayout.ToString() -> string +~override Microsoft.Maui.Controls.Button.ButtonContentTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Button.ButtonContentTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.Button.ButtonContentTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Button.ButtonContentTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Button.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.CarouselLayoutTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.CarouselLayoutTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.CarouselLayoutTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.CarouselLayoutTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Cell.OnPropertyChanging(string propertyName = null) -> void +~override Microsoft.Maui.Controls.ColumnDefinitionCollectionTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.ColumnDefinitionCollectionTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.ColumnDefinitionCollectionTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.ColumnDefinitionCollectionTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~override Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.Compatibility.ConstraintTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Compatibility.ConstraintTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.Compatibility.ConstraintTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Compatibility.ConstraintTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Compatibility.FlexLayout.OnAdded(Microsoft.Maui.Controls.View view) -> void +~override Microsoft.Maui.Controls.Compatibility.FlexLayout.OnRemoved(Microsoft.Maui.Controls.View view) -> void +~override Microsoft.Maui.Controls.Compatibility.Grid.OnAdded(Microsoft.Maui.Controls.View view) -> void +~override Microsoft.Maui.Controls.Compatibility.Grid.OnRemoved(Microsoft.Maui.Controls.View view) -> void +~override Microsoft.Maui.Controls.Compatibility.Layout.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~override Microsoft.Maui.Controls.Compatibility.Layout.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.Compatibility.RelativeLayout.OnAdded(Microsoft.Maui.Controls.View view) -> void +~override Microsoft.Maui.Controls.Compatibility.RelativeLayout.OnRemoved(Microsoft.Maui.Controls.View view) -> void +~override Microsoft.Maui.Controls.DoubleCollectionConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.DoubleCollectionConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.DoubleCollectionConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.DoubleCollectionConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Editor.OnTextChanged(string oldValue, string newValue) -> void +~override Microsoft.Maui.Controls.Element.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.FileImageSource.Cancel() -> System.Threading.Tasks.Task +~override Microsoft.Maui.Controls.FileImageSource.ToString() -> string +~override Microsoft.Maui.Controls.FileImageSourceConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.FileImageSourceConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.FileImageSourceConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.FileImageSourceConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.FlexLayout.CreateLayoutManager() -> Microsoft.Maui.Layouts.ILayoutManager +~override Microsoft.Maui.Controls.FlexLayout.OnAdd(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.FlexLayout.OnInsert(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.FlexLayout.OnRemove(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.FlexLayout.OnUpdate(int index, Microsoft.Maui.IView view, Microsoft.Maui.IView oldView) -> void +~override Microsoft.Maui.Controls.FlowDirectionConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.FlowDirectionConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.FlowDirectionConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.FlowDirectionConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.FontAttributesConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.FontAttributesConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.FontAttributesConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.FontAttributesConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.FontSizeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.FontSizeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.FontSizeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.FontSizeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.FormattedString.ToString() -> string +~override Microsoft.Maui.Controls.GradientStop.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.Grid.CreateLayoutManager() -> Microsoft.Maui.Layouts.ILayoutManager +~override Microsoft.Maui.Controls.Grid.OnAdd(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.Grid.OnInsert(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.Grid.OnRemove(int index, Microsoft.Maui.IView view) -> void +~override Microsoft.Maui.Controls.Grid.OnUpdate(int index, Microsoft.Maui.IView view, Microsoft.Maui.IView oldView) -> void +~override Microsoft.Maui.Controls.GridLengthTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.GridLengthTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.GridLengthTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.GridLengthTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.CreatePlatformView() -> object +~override Microsoft.Maui.Controls.Handlers.Items.CollectionViewHandler.CreatePlatformView() -> object +~override Microsoft.Maui.Controls.Handlers.Items.GroupableItemsViewHandler.CreatePlatformView() -> object +~override Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.CreatePlatformView() -> object +~override Microsoft.Maui.Controls.Handlers.Items.ReorderableItemsViewHandler.CreatePlatformView() -> object +~override Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler.CreatePlatformView() -> object +~override Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.CreatePlatformView() -> object +~override Microsoft.Maui.Controls.HorizontalStackLayout.CreateLayoutManager() -> Microsoft.Maui.Layouts.ILayoutManager +~override Microsoft.Maui.Controls.HtmlWebViewSource.Load(Microsoft.Maui.IWebViewDelegate renderer) -> void +~override Microsoft.Maui.Controls.ImageSourceConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.ImageSourceConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.ImageSourceConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.ImageSourceConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.ItemsLayoutTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.ItemsLayoutTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.ItemsLayoutTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.ItemsLayoutTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Label.GetChildElements(Microsoft.Maui.Graphics.Point point) -> System.Collections.Generic.IList +~override Microsoft.Maui.Controls.LayoutOptionsConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.LayoutOptionsConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.LayoutOptionsConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.LayoutOptionsConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.LayoutOptionsConverter.GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) -> System.ComponentModel.TypeConverter.StandardValuesCollection +~override Microsoft.Maui.Controls.LayoutOptionsConverter.GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Controls.LayoutOptionsConverter.GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Controls.ListStringTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.ListStringTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.ListStringTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.ListStringTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.ListView.CreateDefault(object item) -> Microsoft.Maui.Controls.Cell +~override Microsoft.Maui.Controls.ListView.SetupContent(Microsoft.Maui.Controls.Cell content, int index) -> void +~override Microsoft.Maui.Controls.ListView.UnhookContent(Microsoft.Maui.Controls.Cell content) -> void +~override Microsoft.Maui.Controls.ListView.ValidateItemTemplate(Microsoft.Maui.Controls.DataTemplate template) -> bool +~override Microsoft.Maui.Controls.MultiPage.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~override Microsoft.Maui.Controls.MultiPage.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.ReferenceTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.ReferenceTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.ReferenceTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.ReferenceTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.RefreshView.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.ResourceDictionary.RDSourceTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.ResourceDictionary.RDSourceTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.ResourceDictionary.RDSourceTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.ResourceDictionary.RDSourceTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.RowDefinitionCollectionTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.RowDefinitionCollectionTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.RowDefinitionCollectionTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.RowDefinitionCollectionTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Shapes.Ellipse.GetPath() -> Microsoft.Maui.Graphics.PathF +~override Microsoft.Maui.Controls.Shapes.EllipseGeometry.AppendPath(Microsoft.Maui.Graphics.PathF path) -> void +~override Microsoft.Maui.Controls.Shapes.GeometryGroup.AppendPath(Microsoft.Maui.Graphics.PathF path) -> void +~override Microsoft.Maui.Controls.Shapes.Line.GetPath() -> Microsoft.Maui.Graphics.PathF +~override Microsoft.Maui.Controls.Shapes.LineGeometry.AppendPath(Microsoft.Maui.Graphics.PathF path) -> void +~override Microsoft.Maui.Controls.Shapes.MatrixTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Shapes.MatrixTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.Shapes.MatrixTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Shapes.MatrixTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Shapes.Path.GetPath() -> Microsoft.Maui.Graphics.PathF +~override Microsoft.Maui.Controls.Shapes.PathFigureCollectionConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Shapes.PathFigureCollectionConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.Shapes.PathFigureCollectionConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Shapes.PathFigureCollectionConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Shapes.PathGeometry.AppendPath(Microsoft.Maui.Graphics.PathF path) -> void +~override Microsoft.Maui.Controls.Shapes.PathGeometryConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Shapes.PathGeometryConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.Shapes.PathGeometryConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Shapes.PathGeometryConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Shapes.PointCollectionConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Shapes.PointCollectionConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.Shapes.PointCollectionConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Shapes.PointCollectionConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Shapes.Polygon.GetPath() -> Microsoft.Maui.Graphics.PathF +~override Microsoft.Maui.Controls.Shapes.Polyline.GetPath() -> Microsoft.Maui.Graphics.PathF +~override Microsoft.Maui.Controls.Shapes.Rectangle.GetPath() -> Microsoft.Maui.Graphics.PathF +~override Microsoft.Maui.Controls.Shapes.RectangleGeometry.AppendPath(Microsoft.Maui.Graphics.PathF path) -> void +~override Microsoft.Maui.Controls.Shapes.RoundRectangle.GetPath() -> Microsoft.Maui.Graphics.PathF +~override Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.AppendPath(Microsoft.Maui.Graphics.PathF path) -> void +~override Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Shapes.TransformTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.Shapes.TransformTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.Shapes.TransformTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.Shapes.TransformTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.Shell.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.ShellAppearance.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.ShellContent.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~override Microsoft.Maui.Controls.ShellContent.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.ShellItem.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~override Microsoft.Maui.Controls.ShellItem.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.ShellSection.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~override Microsoft.Maui.Controls.ShellSection.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.SolidColorBrush.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.StackLayout.CreateLayoutManager() -> Microsoft.Maui.Layouts.ILayoutManager +~override Microsoft.Maui.Controls.StreamImageSource.OnPropertyChanged(string propertyName) -> void +~override Microsoft.Maui.Controls.Switch.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.TabbedPage.CreateDefault(object item) -> Microsoft.Maui.Controls.Page +~override Microsoft.Maui.Controls.TemplatedPage.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.TemplatedView.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.TextAlignmentConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.TextAlignmentConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.TextAlignmentConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.TextAlignmentConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.TextDecorationConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.TextDecorationConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.TextDecorationConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.TextDecorationConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.TriggerAction.Invoke(object sender) -> void +~override Microsoft.Maui.Controls.TypeTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.TypeTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.TypeTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.TypeTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.UriImageSource.ToString() -> string +~override Microsoft.Maui.Controls.UriTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.UriTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.UriTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.UriTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.UrlWebViewSource.Load(Microsoft.Maui.IWebViewDelegate renderer) -> void +~override Microsoft.Maui.Controls.VerticalStackLayout.CreateLayoutManager() -> Microsoft.Maui.Layouts.ILayoutManager +~override Microsoft.Maui.Controls.VisualElement.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~override Microsoft.Maui.Controls.VisualElement.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~override Microsoft.Maui.Controls.VisualElement.VisibilityConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.VisualElement.VisibilityConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.VisualElement.VisibilityConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.VisualElement.VisibilityConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.VisualState.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.VisualStateGroup.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.VisualStateGroupList.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.VisualTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.VisualTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.VisualTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.VisualTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Controls.VisualTypeConverter.GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) -> System.ComponentModel.TypeConverter.StandardValuesCollection +~override Microsoft.Maui.Controls.VisualTypeConverter.GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Controls.VisualTypeConverter.GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) -> bool +~override Microsoft.Maui.Controls.WebView.OnPropertyChanged(string propertyName) -> void +~override Microsoft.Maui.Controls.WebViewSourceTypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) -> bool +~override Microsoft.Maui.Controls.WebViewSourceTypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) -> bool +~override Microsoft.Maui.Controls.WebViewSourceTypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) -> object +~override Microsoft.Maui.Controls.WebViewSourceTypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) -> object +~override Microsoft.Maui.Foldable.FoldEventArgs.ToString() -> string +~static Microsoft.Maui.Controls.AbsoluteLayout.GetLayoutBounds(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Graphics.Rect +~static Microsoft.Maui.Controls.AbsoluteLayout.GetLayoutFlags(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +~static Microsoft.Maui.Controls.AbsoluteLayout.SetLayoutBounds(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Graphics.Rect bounds) -> void +~static Microsoft.Maui.Controls.AbsoluteLayout.SetLayoutFlags(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Layouts.AbsoluteLayoutFlags flags) -> void +~static Microsoft.Maui.Controls.Accelerator.FromString(string text) -> Microsoft.Maui.Controls.Accelerator +~static Microsoft.Maui.Controls.Accelerator.implicit operator Microsoft.Maui.Controls.Accelerator(string accelerator) -> Microsoft.Maui.Controls.Accelerator +~static Microsoft.Maui.Controls.AnimationExtensions.AbortAnimation(this Microsoft.Maui.Controls.IAnimatable self, string handle) -> bool +~static Microsoft.Maui.Controls.AnimationExtensions.Add(this Microsoft.Maui.Animations.IAnimationManager animationManager, System.Action step) -> int +~static Microsoft.Maui.Controls.AnimationExtensions.Animate(this Microsoft.Maui.Controls.IAnimatable self, string name, Microsoft.Maui.Controls.Animation animation, uint rate = 16, uint length = 250, Microsoft.Maui.Easing easing = null, System.Action finished = null, System.Func repeat = null) -> void +~static Microsoft.Maui.Controls.AnimationExtensions.Animate(this Microsoft.Maui.Controls.IAnimatable self, string name, System.Action callback, double start, double end, uint rate = 16, uint length = 250, Microsoft.Maui.Easing easing = null, System.Action finished = null, System.Func repeat = null) -> void +~static Microsoft.Maui.Controls.AnimationExtensions.Animate(this Microsoft.Maui.Controls.IAnimatable self, string name, System.Action callback, uint rate = 16, uint length = 250, Microsoft.Maui.Easing easing = null, System.Action finished = null, System.Func repeat = null) -> void +~static Microsoft.Maui.Controls.AnimationExtensions.Animate(this Microsoft.Maui.Controls.IAnimatable self, string name, System.Func transform, System.Action callback, uint rate = 16, uint length = 250, Microsoft.Maui.Easing easing = null, System.Action finished = null, System.Func repeat = null, Microsoft.Maui.Animations.IAnimationManager animationManager = null) -> void +~static Microsoft.Maui.Controls.AnimationExtensions.AnimateKinetic(this Microsoft.Maui.Controls.IAnimatable self, string name, System.Func callback, double velocity, double drag, System.Action finished = null, Microsoft.Maui.Animations.IAnimationManager animationManager = null) -> void +~static Microsoft.Maui.Controls.AnimationExtensions.AnimationIsRunning(this Microsoft.Maui.Controls.IAnimatable self, string handle) -> bool +~static Microsoft.Maui.Controls.AnimationExtensions.Batch(this Microsoft.Maui.Controls.IAnimatable self) -> System.IDisposable +~static Microsoft.Maui.Controls.AnimationExtensions.Insert(this Microsoft.Maui.Animations.IAnimationManager animationManager, System.Func step) -> int +~static Microsoft.Maui.Controls.AnimationExtensions.Interpolate(double start, double end = 1, double reverseVal = 0, bool reverse = false) -> System.Func +~static Microsoft.Maui.Controls.AnimationExtensions.Remove(this Microsoft.Maui.Animations.IAnimationManager animationManager, int tickerId) -> void +~static Microsoft.Maui.Controls.Application.ControlsApplicationMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.AppLinkEntry.FromUri(System.Uri uri) -> Microsoft.Maui.Controls.AppLinkEntry +~static Microsoft.Maui.Controls.AutomationProperties.GetExcludedWithChildren(Microsoft.Maui.Controls.BindableObject bindable) -> bool? +~static Microsoft.Maui.Controls.AutomationProperties.GetHelpText(Microsoft.Maui.Controls.BindableObject bindable) -> string +~static Microsoft.Maui.Controls.AutomationProperties.GetIsInAccessibleTree(Microsoft.Maui.Controls.BindableObject bindable) -> bool? +~static Microsoft.Maui.Controls.AutomationProperties.GetLabeledBy(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.VisualElement +~static Microsoft.Maui.Controls.AutomationProperties.GetName(Microsoft.Maui.Controls.BindableObject bindable) -> string +~static Microsoft.Maui.Controls.AutomationProperties.SetExcludedWithChildren(Microsoft.Maui.Controls.BindableObject bindable, bool? value) -> void +~static Microsoft.Maui.Controls.AutomationProperties.SetHelpText(Microsoft.Maui.Controls.BindableObject bindable, string value) -> void +~static Microsoft.Maui.Controls.AutomationProperties.SetIsInAccessibleTree(Microsoft.Maui.Controls.BindableObject bindable, bool? value) -> void +~static Microsoft.Maui.Controls.AutomationProperties.SetLabeledBy(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.VisualElement value) -> void +~static Microsoft.Maui.Controls.AutomationProperties.SetName(Microsoft.Maui.Controls.BindableObject bindable, string value) -> void +~static Microsoft.Maui.Controls.BindableLayout.GetEmptyView(Microsoft.Maui.Controls.BindableObject b) -> object +~static Microsoft.Maui.Controls.BindableLayout.GetEmptyViewTemplate(Microsoft.Maui.Controls.BindableObject b) -> Microsoft.Maui.Controls.DataTemplate +~static Microsoft.Maui.Controls.BindableLayout.GetItemsSource(Microsoft.Maui.Controls.BindableObject b) -> System.Collections.IEnumerable +~static Microsoft.Maui.Controls.BindableLayout.GetItemTemplate(Microsoft.Maui.Controls.BindableObject b) -> Microsoft.Maui.Controls.DataTemplate +~static Microsoft.Maui.Controls.BindableLayout.GetItemTemplateSelector(Microsoft.Maui.Controls.BindableObject b) -> Microsoft.Maui.Controls.DataTemplateSelector +~static Microsoft.Maui.Controls.BindableLayout.SetEmptyView(Microsoft.Maui.Controls.BindableObject b, object value) -> void +~static Microsoft.Maui.Controls.BindableLayout.SetEmptyViewTemplate(Microsoft.Maui.Controls.BindableObject b, Microsoft.Maui.Controls.DataTemplate value) -> void +~static Microsoft.Maui.Controls.BindableLayout.SetItemsSource(Microsoft.Maui.Controls.BindableObject b, System.Collections.IEnumerable value) -> void +~static Microsoft.Maui.Controls.BindableLayout.SetItemTemplate(Microsoft.Maui.Controls.BindableObject b, Microsoft.Maui.Controls.DataTemplate value) -> void +~static Microsoft.Maui.Controls.BindableLayout.SetItemTemplateSelector(Microsoft.Maui.Controls.BindableObject b, Microsoft.Maui.Controls.DataTemplateSelector value) -> void +~static Microsoft.Maui.Controls.BindableObject.SetInheritedBindingContext(Microsoft.Maui.Controls.BindableObject bindable, object value) -> void +~static Microsoft.Maui.Controls.BindableObjectExtensions.GetPropertyIfSet(this Microsoft.Maui.Controls.BindableObject bindableObject, Microsoft.Maui.Controls.BindableProperty bindableProperty, T returnIfNotSet) -> T +~static Microsoft.Maui.Controls.BindableObjectExtensions.SetAppTheme(this Microsoft.Maui.Controls.BindableObject self, Microsoft.Maui.Controls.BindableProperty targetProperty, T light, T dark) -> void +~static Microsoft.Maui.Controls.BindableObjectExtensions.SetAppThemeColor(this Microsoft.Maui.Controls.BindableObject self, Microsoft.Maui.Controls.BindableProperty targetProperty, Microsoft.Maui.Graphics.Color light, Microsoft.Maui.Graphics.Color dark) -> void +~static Microsoft.Maui.Controls.BindableObjectExtensions.SetBinding(this Microsoft.Maui.Controls.BindableObject self, Microsoft.Maui.Controls.BindableProperty targetProperty, string path, Microsoft.Maui.Controls.BindingMode mode = Microsoft.Maui.Controls.BindingMode.Default, Microsoft.Maui.Controls.IValueConverter converter = null, string stringFormat = null) -> void +~static Microsoft.Maui.Controls.BindableProperty.Create(string propertyName, System.Type returnType, System.Type declaringType, object defaultValue = null, Microsoft.Maui.Controls.BindingMode defaultBindingMode = Microsoft.Maui.Controls.BindingMode.OneWay, Microsoft.Maui.Controls.BindableProperty.ValidateValueDelegate validateValue = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangedDelegate propertyChanged = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangingDelegate propertyChanging = null, Microsoft.Maui.Controls.BindableProperty.CoerceValueDelegate coerceValue = null, Microsoft.Maui.Controls.BindableProperty.CreateDefaultValueDelegate defaultValueCreator = null) -> Microsoft.Maui.Controls.BindableProperty +~static Microsoft.Maui.Controls.BindableProperty.CreateAttached(string propertyName, System.Type returnType, System.Type declaringType, object defaultValue, Microsoft.Maui.Controls.BindingMode defaultBindingMode = Microsoft.Maui.Controls.BindingMode.OneWay, Microsoft.Maui.Controls.BindableProperty.ValidateValueDelegate validateValue = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangedDelegate propertyChanged = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangingDelegate propertyChanging = null, Microsoft.Maui.Controls.BindableProperty.CoerceValueDelegate coerceValue = null, Microsoft.Maui.Controls.BindableProperty.CreateDefaultValueDelegate defaultValueCreator = null) -> Microsoft.Maui.Controls.BindableProperty +~static Microsoft.Maui.Controls.BindableProperty.CreateAttachedReadOnly(string propertyName, System.Type returnType, System.Type declaringType, object defaultValue, Microsoft.Maui.Controls.BindingMode defaultBindingMode = Microsoft.Maui.Controls.BindingMode.OneWayToSource, Microsoft.Maui.Controls.BindableProperty.ValidateValueDelegate validateValue = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangedDelegate propertyChanged = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangingDelegate propertyChanging = null, Microsoft.Maui.Controls.BindableProperty.CoerceValueDelegate coerceValue = null, Microsoft.Maui.Controls.BindableProperty.CreateDefaultValueDelegate defaultValueCreator = null) -> Microsoft.Maui.Controls.BindablePropertyKey +~static Microsoft.Maui.Controls.BindableProperty.CreateReadOnly(string propertyName, System.Type returnType, System.Type declaringType, object defaultValue, Microsoft.Maui.Controls.BindingMode defaultBindingMode = Microsoft.Maui.Controls.BindingMode.OneWayToSource, Microsoft.Maui.Controls.BindableProperty.ValidateValueDelegate validateValue = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangedDelegate propertyChanged = null, Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangingDelegate propertyChanging = null, Microsoft.Maui.Controls.BindableProperty.CoerceValueDelegate coerceValue = null, Microsoft.Maui.Controls.BindableProperty.CreateDefaultValueDelegate defaultValueCreator = null) -> Microsoft.Maui.Controls.BindablePropertyKey +~static Microsoft.Maui.Controls.BindingBase.DisableCollectionSynchronization(System.Collections.IEnumerable collection) -> void +~static Microsoft.Maui.Controls.BindingBase.EnableCollectionSynchronization(System.Collections.IEnumerable collection, object context, Microsoft.Maui.Controls.CollectionSynchronizationCallback callback) -> void +~static Microsoft.Maui.Controls.BoundsConstraint.FromExpression(System.Linq.Expressions.Expression> expression, System.Collections.Generic.IEnumerable parents = null) -> Microsoft.Maui.Controls.BoundsConstraint +~static Microsoft.Maui.Controls.Brush.AliceBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.AntiqueWhite.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Aqua.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Aquamarine.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Azure.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Beige.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Bisque.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Black.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.BlanchedAlmond.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Blue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.BlueViolet.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Brown.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.BurlyWood.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.CadetBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Chartreuse.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Chocolate.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Coral.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.CornflowerBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Cornsilk.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Crimson.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Cyan.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkCyan.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkGoldenrod.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkGray.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkKhaki.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkMagenta.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkOliveGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkOrange.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkOrchid.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkRed.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkSalmon.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkSeaGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkSlateBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkSlateGray.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkTurquoise.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DarkViolet.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DeepPink.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DeepSkyBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Default.get -> Microsoft.Maui.Controls.Brush +~static Microsoft.Maui.Controls.Brush.DimGray.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.DodgerBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Firebrick.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.FloralWhite.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.ForestGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Fuchsia.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Gainsboro.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.GhostWhite.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Gold.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Goldenrod.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Gray.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Green.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.GreenYellow.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Honeydew.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.HotPink.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.implicit operator Microsoft.Maui.Controls.Brush(Microsoft.Maui.Graphics.Color color) -> Microsoft.Maui.Controls.Brush +~static Microsoft.Maui.Controls.Brush.implicit operator Microsoft.Maui.Controls.Brush(Microsoft.Maui.Graphics.Paint paint) -> Microsoft.Maui.Controls.Brush +~static Microsoft.Maui.Controls.Brush.implicit operator Microsoft.Maui.Graphics.Paint(Microsoft.Maui.Controls.Brush brush) -> Microsoft.Maui.Graphics.Paint +~static Microsoft.Maui.Controls.Brush.IndianRed.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Indigo.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.IsNullOrEmpty(Microsoft.Maui.Controls.Brush brush) -> bool +~static Microsoft.Maui.Controls.Brush.Ivory.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Khaki.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Lavender.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LavenderBlush.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LawnGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LemonChiffon.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightCoral.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightCyan.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightGoldenrodYellow.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightGray.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightPink.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightSalmon.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightSeaGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightSkyBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightSlateGray.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightSteelBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LightYellow.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Lime.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.LimeGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Linen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Magenta.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Maroon.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumAquamarine.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumOrchid.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumPurple.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumSeaGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumSlateBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumSpringGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumTurquoise.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MediumVioletRed.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MidnightBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MintCream.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.MistyRose.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Moccasin.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.NavajoWhite.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Navy.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.OldLace.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Olive.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.OliveDrab.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Orange.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.OrangeRed.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Orchid.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.PaleGoldenrod.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.PaleGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.PaleTurquoise.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.PaleVioletRed.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.PapayaWhip.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.PeachPuff.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Peru.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Pink.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Plum.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.PowderBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Purple.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Red.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.RosyBrown.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.RoyalBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SaddleBrown.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Salmon.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SandyBrown.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SeaGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SeaShell.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Sienna.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Silver.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SkyBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SlateBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SlateGray.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Snow.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SpringGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.SteelBlue.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Tan.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Teal.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Thistle.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Tomato.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Transparent.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Turquoise.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Violet.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Wheat.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.White.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.WhiteSmoke.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.Yellow.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Brush.YellowGreen.get -> Microsoft.Maui.Controls.SolidColorBrush +~static Microsoft.Maui.Controls.Button.ControlsButtonMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Button.MapContentLayout(Microsoft.Maui.Handlers.ButtonHandler handler, Microsoft.Maui.Controls.Button button) -> void +~static Microsoft.Maui.Controls.Button.MapContentLayout(Microsoft.Maui.Handlers.IButtonHandler handler, Microsoft.Maui.Controls.Button button) -> void +~static Microsoft.Maui.Controls.Button.MapLineBreakMode(Microsoft.Maui.Handlers.ButtonHandler handler, Microsoft.Maui.Controls.Button button) -> void +~static Microsoft.Maui.Controls.Button.MapLineBreakMode(Microsoft.Maui.Handlers.IButtonHandler handler, Microsoft.Maui.Controls.Button button) -> void +~static Microsoft.Maui.Controls.Button.MapText(Microsoft.Maui.Handlers.ButtonHandler handler, Microsoft.Maui.Controls.Button button) -> void +~static Microsoft.Maui.Controls.Button.MapText(Microsoft.Maui.Handlers.IButtonHandler handler, Microsoft.Maui.Controls.Button button) -> void +~static Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.GetLayoutBounds(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Graphics.Rect +~static Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.GetLayoutFlags(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Layouts.AbsoluteLayoutFlags +~static Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.SetLayoutBounds(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Graphics.Rect bounds) -> void +~static Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.SetLayoutFlags(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Layouts.AbsoluteLayoutFlags flags) -> void +~static Microsoft.Maui.Controls.Compatibility.Constraint.Constant(double size) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.Constraint.FromExpression(System.Linq.Expressions.Expression> expression) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.Constraint.RelativeToParent(System.Func measure) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.Constraint.RelativeToView(Microsoft.Maui.Controls.View view, System.Func measure) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.GetAlignSelf(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Layouts.FlexAlignSelf +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.GetBasis(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Layouts.FlexBasis +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.GetGrow(Microsoft.Maui.Controls.BindableObject bindable) -> float +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.GetOrder(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.GetShrink(Microsoft.Maui.Controls.BindableObject bindable) -> float +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.SetAlignSelf(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Layouts.FlexAlignSelf value) -> void +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.SetBasis(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Layouts.FlexBasis value) -> void +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.SetGrow(Microsoft.Maui.Controls.BindableObject bindable, float value) -> void +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.SetOrder(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Compatibility.FlexLayout.SetShrink(Microsoft.Maui.Controls.BindableObject bindable, float value) -> void +~static Microsoft.Maui.Controls.Compatibility.Grid.GetColumn(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Compatibility.Grid.GetColumnSpan(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Compatibility.Grid.GetRow(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Compatibility.Grid.GetRowSpan(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Compatibility.Grid.SetColumn(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Compatibility.Grid.SetColumnSpan(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Compatibility.Grid.SetRow(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Compatibility.Grid.SetRowSpan(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Compatibility.Layout.LayoutChildIntoBoundingRegion(Microsoft.Maui.Controls.VisualElement child, Microsoft.Maui.Graphics.Rect region) -> void +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.GetBoundsConstraint(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.BoundsConstraint +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.GetHeightConstraint(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.GetWidthConstraint(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.GetXConstraint(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.GetYConstraint(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.Compatibility.Constraint +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.SetBoundsConstraint(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.BoundsConstraint value) -> void +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.SetHeightConstraint(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.Compatibility.Constraint value) -> void +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.SetWidthConstraint(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.Compatibility.Constraint value) -> void +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.SetXConstraint(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.Compatibility.Constraint value) -> void +~static Microsoft.Maui.Controls.Compatibility.RelativeLayout.SetYConstraint(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.Compatibility.Constraint value) -> void +~static Microsoft.Maui.Controls.CompressedLayout.GetHeadlessOffset(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Graphics.Point +~static Microsoft.Maui.Controls.CompressedLayout.GetIsHeadless(Microsoft.Maui.Controls.BindableObject bindable) -> bool +~static Microsoft.Maui.Controls.CompressedLayout.SetIsHeadless(Microsoft.Maui.Controls.BindableObject bindable, bool value) -> void +~static Microsoft.Maui.Controls.Configuration.Create(TElement element) -> Microsoft.Maui.Controls.Configuration +~static Microsoft.Maui.Controls.ContentPresenter.ContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static Microsoft.Maui.Controls.ControlsColorExtensions.IsDefault(this Microsoft.Maui.Graphics.Color color) -> bool +~static Microsoft.Maui.Controls.ControlsColorExtensions.IsNotDefault(this Microsoft.Maui.Graphics.Color color) -> bool +~static Microsoft.Maui.Controls.DatePicker.ControlsDatePickerMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.DependencyService.Get(Microsoft.Maui.Controls.DependencyFetchTarget fetchTarget = Microsoft.Maui.Controls.DependencyFetchTarget.GlobalInstance) -> T +~static Microsoft.Maui.Controls.DependencyService.Register(System.Reflection.Assembly[] assemblies) -> void +~static Microsoft.Maui.Controls.DependencyService.Register() -> void +~static Microsoft.Maui.Controls.DependencyService.Register() -> void +~static Microsoft.Maui.Controls.DependencyService.RegisterSingleton(T instance) -> void +~static Microsoft.Maui.Controls.DependencyService.Resolve(Microsoft.Maui.Controls.DependencyFetchTarget fallbackFetchTarget = Microsoft.Maui.Controls.DependencyFetchTarget.GlobalInstance) -> T +~static Microsoft.Maui.Controls.Device.BeginInvokeOnMainThread(System.Action action) -> void +~static Microsoft.Maui.Controls.Device.DefaultRendererAssembly.get -> System.Reflection.Assembly +~static Microsoft.Maui.Controls.Device.DefaultRendererAssembly.set -> void +~static Microsoft.Maui.Controls.Device.GetMainThreadSynchronizationContextAsync() -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Device.GetNamedSize(Microsoft.Maui.Controls.NamedSize size, Microsoft.Maui.Controls.Element targetElement) -> double +~static Microsoft.Maui.Controls.Device.GetNamedSize(Microsoft.Maui.Controls.NamedSize size, System.Type targetElementType, bool useOldSizes) -> double +~static Microsoft.Maui.Controls.Device.GetNamedSize(Microsoft.Maui.Controls.NamedSize size, System.Type targetElementType) -> double +~static Microsoft.Maui.Controls.Device.InvokeOnMainThreadAsync(System.Action action) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Device.InvokeOnMainThreadAsync(System.Func funcTask) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Device.InvokeOnMainThreadAsync(System.Func> funcTask) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Device.InvokeOnMainThreadAsync(System.Func func) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Device.RuntimePlatform.get -> string +~static Microsoft.Maui.Controls.Device.StartTimer(System.TimeSpan interval, System.Func callback) -> void +~static Microsoft.Maui.Controls.DoubleCollection.implicit operator Microsoft.Maui.Controls.DoubleCollection(double[] d) -> Microsoft.Maui.Controls.DoubleCollection +~static Microsoft.Maui.Controls.DoubleCollection.implicit operator Microsoft.Maui.Controls.DoubleCollection(float[] f) -> Microsoft.Maui.Controls.DoubleCollection +~static Microsoft.Maui.Controls.Editor.ControlsEditorMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Editor.MapText(Microsoft.Maui.Handlers.EditorHandler handler, Microsoft.Maui.Controls.Editor editor) -> void +~static Microsoft.Maui.Controls.Editor.MapText(Microsoft.Maui.Handlers.IEditorHandler handler, Microsoft.Maui.Controls.Editor editor) -> void +~static Microsoft.Maui.Controls.Effect.Resolve(string name) -> Microsoft.Maui.Controls.Effect +~static Microsoft.Maui.Controls.EffectiveVisualExtensions.IsDefault(this Microsoft.Maui.Controls.IVisual visual) -> bool +~static Microsoft.Maui.Controls.EffectiveVisualExtensions.IsMatchParent(this Microsoft.Maui.Controls.IVisual visual) -> bool +~static Microsoft.Maui.Controls.EffectiveVisualExtensions.IsMaterial(this Microsoft.Maui.Controls.IVisual visual) -> bool +~static Microsoft.Maui.Controls.Element.ControlsElementMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Element.MapAutomationPropertiesExcludedWithChildren(Microsoft.Maui.IElementHandler handler, Microsoft.Maui.Controls.Element element) -> void +~static Microsoft.Maui.Controls.Element.MapAutomationPropertiesIsInAccessibleTree(Microsoft.Maui.IElementHandler handler, Microsoft.Maui.Controls.Element element) -> void +~static Microsoft.Maui.Controls.Entry.ControlsEntryMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Entry.MapText(Microsoft.Maui.Handlers.EntryHandler handler, Microsoft.Maui.Controls.Entry entry) -> void +~static Microsoft.Maui.Controls.Entry.MapText(Microsoft.Maui.Handlers.IEntryHandler handler, Microsoft.Maui.Controls.Entry entry) -> void +~static Microsoft.Maui.Controls.FileImageSource.implicit operator Microsoft.Maui.Controls.FileImageSource(string file) -> Microsoft.Maui.Controls.FileImageSource +~static Microsoft.Maui.Controls.FileImageSource.implicit operator string(Microsoft.Maui.Controls.FileImageSource file) -> string +~static Microsoft.Maui.Controls.FlexLayout.GetAlignSelf(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Layouts.FlexAlignSelf +~static Microsoft.Maui.Controls.FlexLayout.GetBasis(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Layouts.FlexBasis +~static Microsoft.Maui.Controls.FlexLayout.GetGrow(Microsoft.Maui.Controls.BindableObject bindable) -> float +~static Microsoft.Maui.Controls.FlexLayout.GetOrder(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.FlexLayout.GetShrink(Microsoft.Maui.Controls.BindableObject bindable) -> float +~static Microsoft.Maui.Controls.FlexLayout.SetAlignSelf(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Layouts.FlexAlignSelf value) -> void +~static Microsoft.Maui.Controls.FlexLayout.SetBasis(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Layouts.FlexBasis value) -> void +~static Microsoft.Maui.Controls.FlexLayout.SetGrow(Microsoft.Maui.Controls.BindableObject bindable, float value) -> void +~static Microsoft.Maui.Controls.FlexLayout.SetOrder(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.FlexLayout.SetShrink(Microsoft.Maui.Controls.BindableObject bindable, float value) -> void +~static Microsoft.Maui.Controls.FlyoutBase.GetContextFlyout(Microsoft.Maui.Controls.BindableObject b) -> Microsoft.Maui.Controls.FlyoutBase +~static Microsoft.Maui.Controls.FlyoutBase.SetContextFlyout(Microsoft.Maui.Controls.BindableObject b, Microsoft.Maui.Controls.FlyoutBase value) -> void +~static Microsoft.Maui.Controls.FlyoutItem.GetIsVisible(Microsoft.Maui.Controls.BindableObject obj) -> bool +~static Microsoft.Maui.Controls.FlyoutItem.SetIsVisible(Microsoft.Maui.Controls.BindableObject obj, bool isVisible) -> void +~static Microsoft.Maui.Controls.FormattedString.explicit operator string(Microsoft.Maui.Controls.FormattedString formatted) -> string +~static Microsoft.Maui.Controls.FormattedString.implicit operator Microsoft.Maui.Controls.FormattedString(string text) -> Microsoft.Maui.Controls.FormattedString +~static Microsoft.Maui.Controls.Grid.GetColumn(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Grid.GetColumnSpan(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Grid.GetRow(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Grid.GetRowSpan(Microsoft.Maui.Controls.BindableObject bindable) -> int +~static Microsoft.Maui.Controls.Grid.SetColumn(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Grid.SetColumnSpan(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Grid.SetRow(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.Grid.SetRowSpan(Microsoft.Maui.Controls.BindableObject bindable, int value) -> void +~static Microsoft.Maui.Controls.GridExtensions.Add(this Microsoft.Maui.Controls.Grid grid, Microsoft.Maui.IView view, int column = 0, int row = 0) -> void +~static Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.MapCurrentItem(Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler handler, Microsoft.Maui.Controls.CarouselView carouselView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.MapIsBounceEnabled(Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler handler, Microsoft.Maui.Controls.CarouselView carouselView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.MapIsSwipeEnabled(Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler handler, Microsoft.Maui.Controls.CarouselView carouselView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.MapLoop(Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler handler, Microsoft.Maui.Controls.CarouselView carouselView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.MapPeekAreaInsets(Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler handler, Microsoft.Maui.Controls.CarouselView carouselView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.Mapper -> Microsoft.Maui.PropertyMapper +~static Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.MapPosition(Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler handler, Microsoft.Maui.Controls.CarouselView carouselView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.CollectionViewHandler.Mapper -> Microsoft.Maui.PropertyMapper +~static Microsoft.Maui.Controls.Handlers.Items.GroupableItemsViewHandler.GroupableItemsViewMapper -> Microsoft.Maui.PropertyMapper> +~static Microsoft.Maui.Controls.Handlers.Items.GroupableItemsViewHandler.MapIsGrouped(Microsoft.Maui.Controls.Handlers.Items.GroupableItemsViewHandler handler, Microsoft.Maui.Controls.GroupableItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.ItemsViewMapper -> Microsoft.Maui.PropertyMapper> +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapEmptyView(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapEmptyViewTemplate(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapFlowDirection(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapHorizontalScrollBarVisibility(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapIsVisible(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapItemsSource(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapItemsUpdatingScrollMode(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapItemTemplate(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.MapVerticalScrollBarVisibility(Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler handler, Microsoft.Maui.Controls.ItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ReorderableItemsViewHandler.MapCanReorderItems(Microsoft.Maui.Controls.Handlers.Items.ReorderableItemsViewHandler handler, Microsoft.Maui.Controls.ReorderableItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.ReorderableItemsViewHandler.ReorderableItemsViewMapper -> Microsoft.Maui.PropertyMapper> +~static Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler.MapSelectedItem(Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler handler, Microsoft.Maui.Controls.SelectableItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler.MapSelectedItems(Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler handler, Microsoft.Maui.Controls.SelectableItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler.MapSelectionMode(Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler handler, Microsoft.Maui.Controls.SelectableItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler.SelectableItemsViewMapper -> Microsoft.Maui.PropertyMapper> +~static Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.MapFooterTemplate(Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler handler, Microsoft.Maui.Controls.StructuredItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.MapHeaderTemplate(Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler handler, Microsoft.Maui.Controls.StructuredItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.MapItemSizingStrategy(Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler handler, Microsoft.Maui.Controls.StructuredItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.MapItemsLayout(Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler handler, Microsoft.Maui.Controls.StructuredItemsView itemsView) -> void +~static Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.StructuredItemsViewMapper -> Microsoft.Maui.PropertyMapper> +~static Microsoft.Maui.Controls.Handlers.LineHandler.Mapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Handlers.LineHandler.MapX1(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Line line) -> void +~static Microsoft.Maui.Controls.Handlers.LineHandler.MapX2(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Line line) -> void +~static Microsoft.Maui.Controls.Handlers.LineHandler.MapY1(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Line line) -> void +~static Microsoft.Maui.Controls.Handlers.LineHandler.MapY2(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Line line) -> void +~static Microsoft.Maui.Controls.Handlers.PathHandler.MapData(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Path path) -> void +~static Microsoft.Maui.Controls.Handlers.PathHandler.Mapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Handlers.PathHandler.MapRenderTransform(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Path path) -> void +~static Microsoft.Maui.Controls.Handlers.PathHandler.MapShape(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Path path) -> void +~static Microsoft.Maui.Controls.Handlers.PolygonHandler.MapFillRule(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Polygon polygon) -> void +~static Microsoft.Maui.Controls.Handlers.PolygonHandler.Mapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Handlers.PolygonHandler.MapPoints(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Polygon polygon) -> void +~static Microsoft.Maui.Controls.Handlers.PolygonHandler.MapShape(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Polygon polygon) -> void +~static Microsoft.Maui.Controls.Handlers.PolylineHandler.MapFillRule(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Polyline polyline) -> void +~static Microsoft.Maui.Controls.Handlers.PolylineHandler.Mapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Handlers.PolylineHandler.MapPoints(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Polyline polyline) -> void +~static Microsoft.Maui.Controls.Handlers.PolylineHandler.MapShape(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Polyline polyline) -> void +~static Microsoft.Maui.Controls.Handlers.RectangleHandler.Mapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Handlers.RectangleHandler.MapRadiusX(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Rectangle rectangle) -> void +~static Microsoft.Maui.Controls.Handlers.RectangleHandler.MapRadiusY(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.Rectangle rectangle) -> void +~static Microsoft.Maui.Controls.Handlers.RoundRectangleHandler.MapCornerRadius(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.Controls.Shapes.RoundRectangle roundRectangle) -> void +~static Microsoft.Maui.Controls.Handlers.RoundRectangleHandler.Mapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions.ConfigureEffects(this Microsoft.Maui.Hosting.MauiAppBuilder builder, System.Action configureDelegate) -> Microsoft.Maui.Hosting.MauiAppBuilder +~static Microsoft.Maui.Controls.ImageSource.FromFile(string file) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.FromResource(string resource, System.Reflection.Assembly sourceAssembly = null) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.FromResource(string resource, System.Type resolvingType) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.FromStream(System.Func stream) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.FromStream(System.Func> stream) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.FromUri(System.Uri uri) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.implicit operator Microsoft.Maui.Controls.ImageSource(string source) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.implicit operator Microsoft.Maui.Controls.ImageSource(System.Uri uri) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.ImageSource.IsNullOrEmpty(Microsoft.Maui.Controls.ImageSource imageSource) -> bool +~static Microsoft.Maui.Controls.Internals.AsyncValue.Null.get -> Microsoft.Maui.Controls.Internals.AsyncValue +~static Microsoft.Maui.Controls.Internals.AsyncValueExtensions.AsAsyncValue(this System.Threading.Tasks.Task valueTask, T defaultValue = default(T)) -> Microsoft.Maui.Controls.Internals.AsyncValue +~static Microsoft.Maui.Controls.Internals.CellExtensions.GetGroup(this TItem cell) -> Microsoft.Maui.Controls.ITemplatedItemsList +~static Microsoft.Maui.Controls.Internals.CellExtensions.GetGroupHeaderContent(this TItem cell) -> TItem +~static Microsoft.Maui.Controls.Internals.CellExtensions.GetIndex(this TItem cell) -> int +~static Microsoft.Maui.Controls.Internals.CellExtensions.GetIsGroupHeader(this TItem cell) -> bool +~static Microsoft.Maui.Controls.Internals.CellExtensions.GetPath(this Microsoft.Maui.Controls.Cell cell) -> System.Tuple +~static Microsoft.Maui.Controls.Internals.CellExtensions.SetIsGroupHeader(this TItem cell, bool value) -> void +~static Microsoft.Maui.Controls.Internals.ContentPageEx.Data -> System.Collections.Generic.List +~static Microsoft.Maui.Controls.Internals.ContentPageEx.LoadProfile(this Microsoft.Maui.Controls.ContentPage page) -> void +~static Microsoft.Maui.Controls.Internals.DataTemplateExtensions.CreateContent(this Microsoft.Maui.Controls.DataTemplate self, object item, Microsoft.Maui.Controls.BindableObject container) -> object +~static Microsoft.Maui.Controls.Internals.DataTemplateExtensions.SelectDataTemplate(this Microsoft.Maui.Controls.DataTemplate self, object item, Microsoft.Maui.Controls.BindableObject container) -> Microsoft.Maui.Controls.DataTemplate +~static Microsoft.Maui.Controls.Internals.DependencyResolver.ResolveUsing(System.Func resolver) -> void +~static Microsoft.Maui.Controls.Internals.DependencyResolver.ResolveUsing(System.Func resolver) -> void +~static Microsoft.Maui.Controls.Internals.EffectUtilities.RegisterEffectControlProvider(Microsoft.Maui.Controls.IEffectControlProvider self, Microsoft.Maui.Controls.IElementController oldElement, Microsoft.Maui.Controls.IElementController newElement) -> void +~static Microsoft.Maui.Controls.Internals.EffectUtilities.UnregisterEffectControlProvider(Microsoft.Maui.Controls.IEffectControlProvider self, Microsoft.Maui.Controls.IElementController element) -> void +~static Microsoft.Maui.Controls.Internals.ExpressionSearch.Default.get -> Microsoft.Maui.Controls.Internals.IExpressionSearch +~static Microsoft.Maui.Controls.Internals.ExpressionSearch.Default.set -> void +~static Microsoft.Maui.Controls.Internals.GIFBitmap.CreateBitmapAsync(Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader stream, Microsoft.Maui.Controls.Internals.GIFHeader header, Microsoft.Maui.Controls.Internals.GIFBitmapDecoder decoder, Microsoft.Maui.Controls.Internals.GIFBitmap previousBitmap, bool ignoreImageData = false) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Internals.GIFColorTable.CreateColorTableAsync(Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader stream, short size) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Internals.GIFHeader.CreateHeaderAsync(Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader stream, bool skipTypeIdentifier = false) -> System.Threading.Tasks.Task +~static Microsoft.Maui.Controls.Internals.NameScope.GetNameScope(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.Internals.INameScope +~static Microsoft.Maui.Controls.Internals.NameScope.SetNameScope(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.Internals.INameScope value) -> void +~static Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsExtensions.Apply(this System.Collections.Specialized.NotifyCollectionChangedEventArgs self, System.Action insert, System.Action removeAt, System.Action reset) -> System.Collections.Specialized.NotifyCollectionChangedAction +~static Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsExtensions.Apply(this System.Collections.Specialized.NotifyCollectionChangedEventArgs self, System.Collections.Generic.IList from, System.Collections.Generic.IList to) -> void +~static Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsExtensions.WithCount(this System.Collections.Specialized.NotifyCollectionChangedEventArgs e, int count) -> Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx +~static Microsoft.Maui.Controls.Internals.PageExtensions.AncestorToRoot(this Microsoft.Maui.Controls.Page page) -> Microsoft.Maui.Controls.Page +~static Microsoft.Maui.Controls.Internals.Performance.Provider.get -> Microsoft.Maui.Controls.Internals.IPerformanceProvider +~static Microsoft.Maui.Controls.Internals.Performance.SetProvider(Microsoft.Maui.Controls.Internals.IPerformanceProvider instance) -> void +~static Microsoft.Maui.Controls.Internals.Performance.Start(out string reference, string tag = null, string path = null, string member = null) -> void +~static Microsoft.Maui.Controls.Internals.Performance.Start(string reference, string tag = null, string path = null, string member = null) -> void +~static Microsoft.Maui.Controls.Internals.Performance.Stop(string reference, string tag = null, string path = null, string member = null) -> void +~static Microsoft.Maui.Controls.Internals.Profile.Data -> System.Collections.Generic.List +~static Microsoft.Maui.Controls.Internals.Profile.FrameBegin(string name = "", int line = 0) -> void +~static Microsoft.Maui.Controls.Internals.Profile.FrameEnd(string name = "") -> void +~static Microsoft.Maui.Controls.Internals.Profile.FramePartition(string id, int line = 0) -> void +~static Microsoft.Maui.Controls.Internals.PropertyPropagationExtensions.PropagatePropertyChanged(string propertyName, Microsoft.Maui.Controls.Element target, Microsoft.Maui.Controls.Element source) -> void +~static Microsoft.Maui.Controls.Internals.Registrar.ExtraAssemblies.get -> System.Collections.Generic.IEnumerable +~static Microsoft.Maui.Controls.Internals.Registrar.ExtraAssemblies.set -> void +~static Microsoft.Maui.Controls.Internals.Registrar.RegisterAll(System.Type[] attrTypes, Microsoft.Maui.Controls.InitializationFlags flags, Microsoft.Maui.IFontRegistrar fontRegistrar = null) -> void +~static Microsoft.Maui.Controls.Internals.Registrar.RegisterAll(System.Type[] attrTypes, Microsoft.Maui.IFontRegistrar fontRegistrar = null) -> void +~static Microsoft.Maui.Controls.Internals.Registrar.Registered.get -> Microsoft.Maui.Controls.Internals.Registrar +~static Microsoft.Maui.Controls.Internals.Registrar.RegisterEffect(string resolutionName, string id, System.Type effectType) -> void +~static Microsoft.Maui.Controls.Internals.Registrar.RegisterEffects(string resolutionName, Microsoft.Maui.Controls.ExportEffectAttribute[] effectAttributes) -> void +~static Microsoft.Maui.Controls.Internals.Registrar.RegisterRenderers(Microsoft.Maui.Controls.HandlerAttribute[] attributes) -> void +~static Microsoft.Maui.Controls.Internals.Registrar.RegisterRendererToHandlerShim(System.Func handlerShim) -> void +~static Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceProvider2.get -> System.Func +~static Microsoft.Maui.Controls.Internals.TextTransformUtilites.GetTransformedText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~static Microsoft.Maui.Controls.Internals.TextTransformUtilites.SetPlainText(Microsoft.Maui.Controls.InputView inputView, string platformText) -> void +~static Microsoft.Maui.Controls.KnownColor.Accent.get -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.KnownColor.Default.get -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.KnownColor.SetAccent(Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.KnownColor.Transparent.get -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Label.ControlsLabelMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Label.MapLineBreakMode(Microsoft.Maui.Handlers.ILabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Label.MapLineBreakMode(Microsoft.Maui.Handlers.LabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Label.MapMaxLines(Microsoft.Maui.Handlers.ILabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Label.MapMaxLines(Microsoft.Maui.Handlers.LabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Label.MapText(Microsoft.Maui.Handlers.ILabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Label.MapText(Microsoft.Maui.Handlers.LabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Label.MapTextType(Microsoft.Maui.Handlers.ILabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Label.MapTextType(Microsoft.Maui.Handlers.LabelHandler handler, Microsoft.Maui.Controls.Label label) -> void +~static Microsoft.Maui.Controls.Layout.ControlsLayoutMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Layout.MapInputTransparent(Microsoft.Maui.Handlers.LayoutHandler handler, Microsoft.Maui.Controls.Layout layout) -> void +~static Microsoft.Maui.Controls.Layout.MapInputTransparent(Microsoft.Maui.ILayoutHandler handler, Microsoft.Maui.Controls.Layout layout) -> void +~static Microsoft.Maui.Controls.MenuItem.GetAccelerator(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.Accelerator +~static Microsoft.Maui.Controls.MenuItem.SetAccelerator(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.Accelerator value) -> void +~static Microsoft.Maui.Controls.MessagingCenter.Instance.get -> Microsoft.Maui.Controls.IMessagingCenter +~static Microsoft.Maui.Controls.MessagingCenter.Send(TSender sender, string message, TArgs args) -> void +~static Microsoft.Maui.Controls.MessagingCenter.Send(TSender sender, string message) -> void +~static Microsoft.Maui.Controls.MessagingCenter.Subscribe(object subscriber, string message, System.Action callback, TSender source = null) -> void +~static Microsoft.Maui.Controls.MessagingCenter.Subscribe(object subscriber, string message, System.Action callback, TSender source = null) -> void +~static Microsoft.Maui.Controls.MessagingCenter.Unsubscribe(object subscriber, string message) -> void +~static Microsoft.Maui.Controls.MessagingCenter.Unsubscribe(object subscriber, string message) -> void +~static Microsoft.Maui.Controls.MultiPage.GetIndex(T page) -> int +~static Microsoft.Maui.Controls.MultiPage.SetIndex(Microsoft.Maui.Controls.Page page, int index) -> void +~static Microsoft.Maui.Controls.NameScopeExtensions.FindByName(this Microsoft.Maui.Controls.Element element, string name) -> T +~static Microsoft.Maui.Controls.NavigationPage.ControlsNavigationPageMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.NavigationPage.GetBackButtonTitle(Microsoft.Maui.Controls.BindableObject page) -> string +~static Microsoft.Maui.Controls.NavigationPage.GetHasBackButton(Microsoft.Maui.Controls.Page page) -> bool +~static Microsoft.Maui.Controls.NavigationPage.GetHasNavigationBar(Microsoft.Maui.Controls.BindableObject page) -> bool +~static Microsoft.Maui.Controls.NavigationPage.GetIconColor(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.NavigationPage.GetTitleIconImageSource(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.ImageSource +~static Microsoft.Maui.Controls.NavigationPage.GetTitleView(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.NavigationPage.SetBackButtonTitle(Microsoft.Maui.Controls.BindableObject page, string value) -> void +~static Microsoft.Maui.Controls.NavigationPage.SetHasBackButton(Microsoft.Maui.Controls.Page page, bool value) -> void +~static Microsoft.Maui.Controls.NavigationPage.SetHasNavigationBar(Microsoft.Maui.Controls.BindableObject page, bool value) -> void +~static Microsoft.Maui.Controls.NavigationPage.SetIconColor(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.NavigationPage.SetTitleIconImageSource(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.ImageSource value) -> void +~static Microsoft.Maui.Controls.NavigationPage.SetTitleView(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.OnIdiom.implicit operator T(Microsoft.Maui.Controls.OnIdiom onIdiom) -> T +~static Microsoft.Maui.Controls.OnPlatform.implicit operator T(Microsoft.Maui.Controls.OnPlatform onPlatform) -> T +~static Microsoft.Maui.Controls.PanGestureRecognizer.CurrentId.get -> Microsoft.Maui.Controls.Internals.AutoId +~static Microsoft.Maui.Controls.Picker.ControlsPickerMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Platform.ButtonExtensions.UpdateContentLayout(this object platformButton, Microsoft.Maui.Controls.Button button) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.GetSendAppearingEventOnResume(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.GetSendAppearingEventOnResume(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.GetSendDisappearingEventOnPause(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.GetSendDisappearingEventOnPause(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.GetShouldPreserveKeyboardOnResume(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.GetShouldPreserveKeyboardOnResume(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.SendAppearingEventOnResume(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.SendDisappearingEventOnPause(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.SetSendAppearingEventOnResume(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.SetSendDisappearingEventOnPause(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.SetShouldPreserveKeyboardOnResume(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.ShouldPreserveKeyboardOnResume(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.NavigationPage.GetBarHeight(Microsoft.Maui.Controls.BindableObject element) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.NavigationPage.GetBarHeight(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.NavigationPage.SetBarHeight(Microsoft.Maui.Controls.BindableObject element, int value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.NavigationPage.SetBarHeight(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, int value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Application.GetWindowSoftInputModeAdjust(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Application.GetWindowSoftInputModeAdjust(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Application.SetWindowSoftInputModeAdjust(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Application.UseWindowSoftInputModeAdjust(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.GetUseDefaultPadding(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.GetUseDefaultShadow(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.SetUseDefaultPadding(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.SetUseDefaultPadding(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.SetUseDefaultShadow(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.SetUseDefaultShadow(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.UseDefaultPadding(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.UseDefaultShadow(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Entry.GetImeOptions(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Entry.ImeOptions(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Entry.SetImeOptions(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Entry.SetImeOptions(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetIsShadowEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetIsShadowEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetShadowColor(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetShadowColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetShadowOffset(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Size +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetShadowOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Size +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetShadowRadius(Microsoft.Maui.Controls.BindableObject element) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.GetShadowRadius(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetIsShadowEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetIsShadowEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetShadowColor(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetShadowColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Color value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetShadowOffset(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Size value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetShadowOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Size value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetShadowRadius(Microsoft.Maui.Controls.BindableObject element, double value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.SetShadowRadius(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, double value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ListView.GetIsFastScrollEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ListView.IsFastScrollEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ListView.SetIsFastScrollEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ListView.SetIsFastScrollEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.SwipeView.GetSwipeTransitionMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.SwipeTransitionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.SwipeView.GetSwipeTransitionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.SwipeTransitionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.SwipeView.SetSwipeTransitionMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.SwipeTransitionMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.SwipeView.SetSwipeTransitionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.SwipeTransitionMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.DisableSmoothScroll(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.DisableSwipePaging(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.EnableSmoothScroll(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.EnableSwipePaging(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.GetIsSmoothScrollEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.GetIsSwipePagingEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.GetMaxItemCount(Microsoft.Maui.Controls.BindableObject element) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.GetMaxItemCount(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.GetOffscreenPageLimit(Microsoft.Maui.Controls.BindableObject element) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.GetToolbarPlacement(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.GetToolbarPlacement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.IsSmoothScrollEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.IsSwipePagingEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.OffscreenPageLimit(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetIsSmoothScrollEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetIsSmoothScrollEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetIsSwipePagingEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetIsSwipePagingEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetOffscreenPageLimit(Microsoft.Maui.Controls.BindableObject element, int value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetOffscreenPageLimit(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, int value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetToolbarPlacement(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.SetToolbarPlacement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ViewCell.GetIsContextActionsLegacyModeEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ViewCell.GetIsContextActionsLegacyModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ViewCell.SetIsContextActionsLegacyModeEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ViewCell.SetIsContextActionsLegacyModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.GetElevation(Microsoft.Maui.Controls.VisualElement element) -> float? +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.GetElevation(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> float? +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.GetIsLegacyColorModeEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.GetIsLegacyColorModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.SetElevation(Microsoft.Maui.Controls.VisualElement element, float? value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.SetElevation(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, float? value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.SetIsLegacyColorModeEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.SetIsLegacyColorModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.DisplayZoomControls(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.EnableZoomControls(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.GetDisplayZoomControls(Microsoft.Maui.Controls.WebView element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.GetEnableZoomControls(Microsoft.Maui.Controls.WebView element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.GetMixedContentMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.MixedContentMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.SetDisplayZoomControls(Microsoft.Maui.Controls.WebView element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.SetDisplayZoomControls(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.SetEnableZoomControls(Microsoft.Maui.Controls.WebView element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.SetEnableZoomControls(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.SetMixedContentMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.SetMixedContentMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.ZoomControlsDisplayed(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.ZoomControlsEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.BoxView.GetHasCornerRadius(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.BoxView.GetHasCornerRadius(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.BoxView.SetHasCornerRadius(Microsoft.Maui.Controls.BindableObject element, bool tabPosition) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.BoxView.SetHasCornerRadius(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.NavigationPage.GetBackButtonIcon(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.NavigationPage.GetBackButtonIcon(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.NavigationPage.SetBackButtonIcon(Microsoft.Maui.Controls.BindableObject element, string backButtonIcon) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.NavigationPage.SetBackButtonIcon(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabbedPage.GetTabPosition(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabbedPage.GetTabPosition(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabbedPage.SetTabPosition(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition tabPosition) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabbedPage.SetTabPosition(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.GetEnableAccessibilityScalingForNamedFontSizes(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.GetEnableAccessibilityScalingForNamedFontSizes(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.GetHandleControlUpdatesOnMainThread(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.GetHandleControlUpdatesOnMainThread(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.GetPanGestureRecognizerShouldRecognizeSimultaneously(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.GetPanGestureRecognizerShouldRecognizeSimultaneously(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.SetEnableAccessibilityScalingForNamedFontSizes(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.SetEnableAccessibilityScalingForNamedFontSizes(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.SetHandleControlUpdatesOnMainThread(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.SetHandleControlUpdatesOnMainThread(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.SetPanGestureRecognizerShouldRecognizeSimultaneously(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.SetPanGestureRecognizerShouldRecognizeSimultaneously(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Cell.DefaultBackgroundColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Cell.GetDefaultBackgroundColor(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Cell.SetDefaultBackgroundColor(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Cell.SetDefaultBackgroundColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Color value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.DatePicker.GetUpdateMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.DatePicker.SetUpdateMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.DatePicker.SetUpdateMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.DatePicker.UpdateMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.AdjustsFontSizeToFitWidth(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.DisableAdjustsFontSizeToFitWidth(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.EnableAdjustsFontSizeToFitWidth(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.GetAdjustsFontSizeToFitWidth(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.GetCursorColor(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.GetCursorColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.SetAdjustsFontSizeToFitWidth(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.SetAdjustsFontSizeToFitWidth(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.SetCursorColor(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.SetCursorColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Color value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.FlyoutPage.GetApplyShadow(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.FlyoutPage.GetApplyShadow(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.FlyoutPage.SetApplyShadow(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.FlyoutPage.SetApplyShadow(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.GetGroupHeaderStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.GetGroupHeaderStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.GetRowAnimationsEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.GetSeparatorStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.GetSeparatorStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.RowAnimationsEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.SetGroupHeaderStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.SetGroupHeaderStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.SetRowAnimationsEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.SetRowAnimationsEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.SetSeparatorStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.SetSeparatorStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.DisableTranslucentNavigationBar(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.EnableTranslucentNavigationBar(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.GetHideNavigationBarSeparator(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.GetIsNavigationBarTranslucent(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.GetPrefersLargeTitles(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.GetStatusBarTextColorMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.GetStatusBarTextColorMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.HideNavigationBarSeparator(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.IsNavigationBarTranslucent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.PrefersLargeTitles(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetHideNavigationBarSeparator(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetHideNavigationBarSeparator(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetIsNavigationBarTranslucent(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetIsNavigationBarTranslucent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetPrefersLargeTitles(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetPrefersLargeTitles(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetStatusBarTextColorMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.SetStatusBarTextColorMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetLargeTitleDisplay(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetModalPresentationStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetPreferredStatusBarUpdateAnimation(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetPrefersHomeIndicatorAutoHidden(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetPrefersStatusBarHidden(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetSafeAreaInsets(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Thickness +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetUseSafeArea(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.LargeTitleDisplay(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.ModalPresentationStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.PreferredStatusBarUpdateAnimation(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.PrefersHomeIndicatorAutoHidden(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.PrefersStatusBarHidden(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SafeAreaInsets(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Thickness +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetLargeTitleDisplay(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetLargeTitleDisplay(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetModalPresentationStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetPreferredStatusBarUpdateAnimation(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetPreferredStatusBarUpdateAnimation(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetPrefersHomeIndicatorAutoHidden(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetPrefersHomeIndicatorAutoHidden(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetPrefersStatusBarHidden(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetPrefersStatusBarHidden(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetSafeAreaInsets(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Thickness value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetUseSafeArea(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetUseSafeArea(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.UsingSafeArea(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Picker.GetUpdateMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Picker.SetUpdateMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Picker.SetUpdateMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Picker.UpdateMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ScrollView.GetShouldDelayContentTouches(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ScrollView.SetShouldDelayContentTouches(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ScrollView.SetShouldDelayContentTouches(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ScrollView.ShouldDelayContentTouches(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SearchBar.GetSearchBarStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SearchBar.GetSearchBarStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SearchBar.SetSearchBarStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle style) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SearchBar.SetSearchBarStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle style) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Slider.GetUpdateOnTap(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Slider.GetUpdateOnTap(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Slider.SetUpdateOnTap(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Slider.SetUpdateOnTap(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SwipeView.GetSwipeTransitionMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.SwipeTransitionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SwipeView.GetSwipeTransitionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.SwipeTransitionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SwipeView.SetSwipeTransitionMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.SwipeTransitionMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SwipeView.SetSwipeTransitionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.SwipeTransitionMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TabbedPage.GetTranslucencyMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TabbedPage.GetTranslucencyMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TabbedPage.SetTranslucencyMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TabbedPage.SetTranslucencyMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TimePicker.GetUpdateMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TimePicker.SetUpdateMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TimePicker.SetUpdateMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TimePicker.UpdateMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.CanBecomeFirstResponder(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetBlurEffect(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetBlurEffect(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetCanBecomeFirstResponder(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetIsLegacyColorModeEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetIsLegacyColorModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetIsShadowEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetIsShadowEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowColor(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowOffset(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Size +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Size +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowOpacity(Microsoft.Maui.Controls.BindableObject element) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowOpacity(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowRadius(Microsoft.Maui.Controls.BindableObject element) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.GetShadowRadius(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetBlurEffect(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetCanBecomeFirstResponder(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetCanBecomeFirstResponder(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetIsLegacyColorModeEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetIsLegacyColorModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetIsShadowEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetIsShadowEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowColor(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Color value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowOffset(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Size value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Size value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowOpacity(Microsoft.Maui.Controls.BindableObject element, double value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowOpacity(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, double value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowRadius(Microsoft.Maui.Controls.BindableObject element, double value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.SetShadowRadius(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, double value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.UseBlurEffect(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.GetNavigationTransitionPopStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.GetNavigationTransitionPopStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.GetNavigationTransitionPushStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.GetNavigationTransitionPushStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.SetNavigationTransitionPopStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.SetNavigationTransitionPushStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.SetNavigationTransitionStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle pushStyle, Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle popStyle) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.SetNavigationTransitionStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle pushStyle, Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle popStyle) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.Page.GetTabOrder(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.VisualElement[] +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.Page.GetTabOrder(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.VisualElement[] +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.Page.SetTabOrder(Microsoft.Maui.Controls.BindableObject element, params Microsoft.Maui.Controls.VisualElement[] value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.Page.SetTabOrder(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, params Microsoft.Maui.Controls.VisualElement[] value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.GetTabsStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.TabsStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.GetTabsStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.TabsStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.HideTabs(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.SetShowTabs(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.TabsStyle value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.SetTabsStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.TabsStyle value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.ShowTabs(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.ShowTabsOnNavigation(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.GetActiveBezelInteractionElement(Microsoft.Maui.Controls.BindableObject application) -> Microsoft.Maui.Controls.Element +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.GetActiveBezelInteractionElement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.Element +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.GetOverlayContent(Microsoft.Maui.Controls.BindableObject application) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.GetOverlayContent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.GetUseBezelInteraction(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.GetUseBezelInteraction(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.SetActiveBezelInteractionElement(Microsoft.Maui.Controls.BindableObject application, Microsoft.Maui.Controls.Element value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.SetActiveBezelInteractionElement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.Element value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.SetOverlayContent(Microsoft.Maui.Controls.BindableObject application, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.SetOverlayContent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.View value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.SetUseBezelInteraction(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.SetUseBezelInteraction(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Entry.GetFontWeight(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Entry.GetFontWeight(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Entry.SetFontWeight(Microsoft.Maui.Controls.BindableObject element, string weight) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Entry.SetFontWeight(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string weight) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.GetBlendColor(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.GetBlendColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.GetFile(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.GetFile(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.SetBlendColor(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Color color) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.SetBlendColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Color color) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.SetFile(Microsoft.Maui.Controls.BindableObject element, string file) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.SetFile(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string file) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ItemsView.GetFocusedItemScrollPosition(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.ScrollToPosition +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ItemsView.GetFocusedItemScrollPosition(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.ScrollToPosition +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ItemsView.SetFocusedItemScrollPosition(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.ScrollToPosition position) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ItemsView.SetFocusedItemScrollPosition(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.ScrollToPosition position) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Label.GetFontWeight(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Label.GetFontWeight(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Label.SetFontWeight(Microsoft.Maui.Controls.BindableObject element, string weight) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Label.SetFontWeight(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string weight) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.NavigationPage.GetHasBreadCrumbsBar(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.NavigationPage.HasBreadCrumbsBar(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.NavigationPage.SetHasBreadCrumbsBar(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.NavigationPage.SetHasBreadCrumbsBar(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Page.GetBreadCrumb(Microsoft.Maui.Controls.BindableObject page) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Page.GetBreadCrumb(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Page.SetBreadCrumb(Microsoft.Maui.Controls.BindableObject page, string value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Page.SetBreadCrumb(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBar.GetPulsingStatus(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBar.GetPulsingStatus(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBar.SetPulsingStatus(Microsoft.Maui.Controls.BindableObject element, bool isPulsing) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBar.SetPulsingStatus(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool isPulsing) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.GetHorizontalScrollStep(Microsoft.Maui.Controls.BindableObject element) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.GetHorizontalScrollStep(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.GetVerticalScrollStep(Microsoft.Maui.Controls.BindableObject element) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.GetVerticalScrollStep(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> int +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.SetHorizontalScrollStep(Microsoft.Maui.Controls.BindableObject element, int scrollStep) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.SetHorizontalScrollStep(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, int scrollStep) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.SetVerticalScrollStep(Microsoft.Maui.Controls.BindableObject element, int scrollStep) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.SetVerticalScrollStep(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, int scrollStep) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Switch.GetColor(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Switch.GetColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Switch.SetColor(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Color color) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Switch.SetColor(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Color color) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusBackView(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusBackView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusDirection(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusDirection(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusDownView(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusDownView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusForwardView(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusForwardView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusLeftView(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusLeftView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusRightView(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusRightView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusUpView(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetNextFocusUpView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetStyle(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetToolTip(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.GetToolTip(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.IsFocusAllowed(Microsoft.Maui.Controls.BindableObject element) -> bool? +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.IsFocusAllowed(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool? +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.MoveFocusBack(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.MoveFocusDown(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.MoveFocusForward(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.MoveFocusLeft(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.MoveFocusRight(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.MoveFocusUp(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetFocusAllowed(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetFocusAllowed(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusBackView(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusBackView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.View value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusDirection(Microsoft.Maui.Controls.BindableObject element, string value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusDirection(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusDownView(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusDownView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.View value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusForwardView(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusForwardView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.View value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusLeftView(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusLeftView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.View value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusRightView(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusRightView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.View value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusUpView(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetNextFocusUpView(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.View value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetStyle(Microsoft.Maui.Controls.BindableObject element, string value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetToolTip(Microsoft.Maui.Controls.BindableObject element, string value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.SetToolTip(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Application.GetImageDirectory(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Application.GetImageDirectory(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Application.SetImageDirectory(Microsoft.Maui.Controls.BindableObject element, string value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Application.SetImageDirectory(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.CollapsedPaneWidth(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, double value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.CollapsedPaneWidth(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.GetCollapsedPaneWidth(Microsoft.Maui.Controls.BindableObject element) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.GetCollapseStyle(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.GetCollapseStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.SetCollapsedPaneWidth(Microsoft.Maui.Controls.BindableObject element, double collapsedPaneWidth) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.SetCollapseStyle(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle collapseStyle) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.SetCollapseStyle(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.UsePartialCollapse(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.InputView.GetDetectReadingOrderFromContent(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.InputView.GetDetectReadingOrderFromContent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.InputView.SetDetectReadingOrderFromContent(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.InputView.SetDetectReadingOrderFromContent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Label.GetDetectReadingOrderFromContent(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Label.GetDetectReadingOrderFromContent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Label.SetDetectReadingOrderFromContent(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Label.SetDetectReadingOrderFromContent(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListView.GetSelectionMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListView.GetSelectionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListView.SetSelectionMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListView.SetSelectionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.GetToolbarDynamicOverflowEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.GetToolbarDynamicOverflowEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.GetToolbarPlacement(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.GetToolbarPlacement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.SetToolbarDynamicOverflowEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.SetToolbarDynamicOverflowEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.SetToolbarPlacement(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement toolbarPlacement) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.SetToolbarPlacement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.GetRefreshPullDirection(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.GetRefreshPullDirection(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.SetRefreshPullDirection(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.SetRefreshPullDirection(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.DisableSpellCheck(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.EnableSpellCheck(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.GetIsSpellCheckEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.GetIsSpellCheckEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.IsSpellCheckEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.SetIsSpellCheckEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.SetIsSpellCheckEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.DisableHeaderIcons(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.EnableHeaderIcons(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.GetHeaderIconsEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.GetHeaderIconsEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.GetHeaderIconsSize(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Graphics.Size +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.GetHeaderIconsSize(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Graphics.Size +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.IsHeaderIconsEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.SetHeaderIconsEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.SetHeaderIconsEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.SetHeaderIconsSize(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Graphics.Size value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.SetHeaderIconsSize(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Graphics.Size value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKey(Microsoft.Maui.Controls.BindableObject element) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKey(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> string +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKeyHorizontalOffset(Microsoft.Maui.Controls.BindableObject element) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKeyHorizontalOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKeyPlacement(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.AccessKeyPlacement +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKeyPlacement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.AccessKeyPlacement +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKeyVerticalOffset(Microsoft.Maui.Controls.BindableObject element) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetAccessKeyVerticalOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> double +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetIsLegacyColorModeEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.GetIsLegacyColorModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKey(Microsoft.Maui.Controls.BindableObject element, string value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKey(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, string value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKeyHorizontalOffset(Microsoft.Maui.Controls.BindableObject element, double value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKeyHorizontalOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, double value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKeyPlacement(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.AccessKeyPlacement value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKeyPlacement(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.AccessKeyPlacement value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKeyVerticalOffset(Microsoft.Maui.Controls.BindableObject element, double value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetAccessKeyVerticalOffset(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, double value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetIsLegacyColorModeEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.SetIsLegacyColorModeEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.GetExecutionMode(Microsoft.Maui.Controls.BindableObject element) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.GetExecutionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.GetIsJavaScriptAlertEnabled(Microsoft.Maui.Controls.BindableObject element) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.IsJavaScriptAlertEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config) -> bool +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.SetExecutionMode(Microsoft.Maui.Controls.BindableObject element, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.SetExecutionMode(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.SetIsJavaScriptAlertEnabled(Microsoft.Maui.Controls.BindableObject element, bool value) -> void +~static Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.SetIsJavaScriptAlertEnabled(this Microsoft.Maui.Controls.IPlatformElementConfiguration config, bool value) -> Microsoft.Maui.Controls.IPlatformElementConfiguration +~static Microsoft.Maui.Controls.PointCollection.implicit operator Microsoft.Maui.Controls.PointCollection(Microsoft.Maui.Graphics.Point[] d) -> Microsoft.Maui.Controls.PointCollection +~static Microsoft.Maui.Controls.RadioButton.ControlsRadioButtonMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.RadioButton.DefaultTemplate.get -> Microsoft.Maui.Controls.ControlTemplate +~static Microsoft.Maui.Controls.RadioButtonGroup.GetGroupName(Microsoft.Maui.Controls.BindableObject b) -> string +~static Microsoft.Maui.Controls.RadioButtonGroup.GetSelectedValue(Microsoft.Maui.Controls.BindableObject bindableObject) -> object +~static Microsoft.Maui.Controls.RadioButtonGroup.SetGroupName(Microsoft.Maui.Controls.BindableObject bindable, string groupName) -> void +~static Microsoft.Maui.Controls.RadioButtonGroup.SetSelectedValue(Microsoft.Maui.Controls.BindableObject bindable, object selectedValue) -> void +~static Microsoft.Maui.Controls.RefreshView.ControlsRefreshViewMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Region.FromLines(double[] lineHeights, double maxWidth, double startX, double endX, double startY) -> Microsoft.Maui.Controls.Region +~static Microsoft.Maui.Controls.RelativeBindingSource.Self.get -> Microsoft.Maui.Controls.RelativeBindingSource +~static Microsoft.Maui.Controls.RelativeBindingSource.TemplatedParent.get -> Microsoft.Maui.Controls.RelativeBindingSource +~static Microsoft.Maui.Controls.Routing.FormatRoute(string route) -> string +~static Microsoft.Maui.Controls.Routing.FormatRoute(System.Collections.Generic.List segments) -> string +~static Microsoft.Maui.Controls.Routing.GetOrCreateContent(string route, System.IServiceProvider services = null) -> Microsoft.Maui.Controls.Element +~static Microsoft.Maui.Controls.Routing.GetRoute(Microsoft.Maui.Controls.BindableObject obj) -> string +~static Microsoft.Maui.Controls.Routing.RegisterRoute(string route, Microsoft.Maui.Controls.RouteFactory factory) -> void +~static Microsoft.Maui.Controls.Routing.RegisterRoute(string route, System.Type type) -> void +~static Microsoft.Maui.Controls.Routing.SetRoute(Microsoft.Maui.Controls.Element obj, string value) -> void +~static Microsoft.Maui.Controls.Routing.UnRegisterRoute(string route) -> void +~static Microsoft.Maui.Controls.ScrollView.ControlsScrollViewMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.SearchBar.ControlsSearchBarMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.SearchBar.MapText(Microsoft.Maui.Handlers.ISearchBarHandler handler, Microsoft.Maui.Controls.SearchBar searchBar) -> void +~static Microsoft.Maui.Controls.SearchBar.MapText(Microsoft.Maui.Handlers.SearchBarHandler handler, Microsoft.Maui.Controls.SearchBar searchBar) -> void +~static Microsoft.Maui.Controls.SearchHandler.SelectedItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static Microsoft.Maui.Controls.SemanticProperties.GetDescription(Microsoft.Maui.Controls.BindableObject bindable) -> string +~static Microsoft.Maui.Controls.SemanticProperties.GetHeadingLevel(Microsoft.Maui.Controls.BindableObject bindable) -> Microsoft.Maui.SemanticHeadingLevel +~static Microsoft.Maui.Controls.SemanticProperties.GetHint(Microsoft.Maui.Controls.BindableObject bindable) -> string +~static Microsoft.Maui.Controls.SemanticProperties.SetDescription(Microsoft.Maui.Controls.BindableObject bindable, string value) -> void +~static Microsoft.Maui.Controls.SemanticProperties.SetHeadingLevel(Microsoft.Maui.Controls.BindableObject bindable, Microsoft.Maui.SemanticHeadingLevel value) -> void +~static Microsoft.Maui.Controls.SemanticProperties.SetHint(Microsoft.Maui.Controls.BindableObject bindable, string value) -> void +~static Microsoft.Maui.Controls.SettersExtensions.Add(this System.Collections.Generic.IList setters, Microsoft.Maui.Controls.BindableProperty property, object value) -> void +~static Microsoft.Maui.Controls.SettersExtensions.AddBinding(this System.Collections.Generic.IList setters, Microsoft.Maui.Controls.BindableProperty property, Microsoft.Maui.Controls.Binding binding) -> void +~static Microsoft.Maui.Controls.SettersExtensions.AddDynamicResource(this System.Collections.Generic.IList setters, Microsoft.Maui.Controls.BindableProperty property, string key) -> void +~static Microsoft.Maui.Controls.Shapes.GeometryHelper.FlattenArc(System.Collections.Generic.List points, Microsoft.Maui.Graphics.Point pt1, Microsoft.Maui.Graphics.Point pt2, double radiusX, double radiusY, double angleRotation, bool isLargeArc, bool isCounterclockwise, double tolerance) -> void +~static Microsoft.Maui.Controls.Shapes.GeometryHelper.FlattenCubicBezier(System.Collections.Generic.List points, Microsoft.Maui.Graphics.Point ptStart, Microsoft.Maui.Graphics.Point ptCtrl1, Microsoft.Maui.Graphics.Point ptCtrl2, Microsoft.Maui.Graphics.Point ptEnd, double tolerance) -> void +~static Microsoft.Maui.Controls.Shapes.GeometryHelper.FlattenGeometry(Microsoft.Maui.Controls.Shapes.Geometry geoSrc, double tolerance) -> Microsoft.Maui.Controls.Shapes.PathGeometry +~static Microsoft.Maui.Controls.Shapes.GeometryHelper.FlattenGeometry(Microsoft.Maui.Controls.Shapes.PathGeometry pathGeoDst, Microsoft.Maui.Controls.Shapes.Geometry geoSrc, double tolerance, Microsoft.Maui.Controls.Shapes.Matrix matxPrevious) -> void +~static Microsoft.Maui.Controls.Shapes.GeometryHelper.FlattenQuadraticBezier(System.Collections.Generic.List points, Microsoft.Maui.Graphics.Point ptStart, Microsoft.Maui.Graphics.Point ptCtrl, Microsoft.Maui.Graphics.Point ptEnd, double tolerance) -> void +~static Microsoft.Maui.Controls.Shapes.PathFigureCollectionConverter.ParseStringToPathFigureCollection(Microsoft.Maui.Controls.Shapes.PathFigureCollection pathFigureCollection, string pathString) -> void +~static Microsoft.Maui.Controls.Shapes.Shape.ControlsShapeViewMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.Shapes.Shape.MapStrokeDashArray(Microsoft.Maui.Handlers.IShapeViewHandler handler, Microsoft.Maui.IShapeView shapeView) -> void +~static Microsoft.Maui.Controls.Shell.Current.get -> Microsoft.Maui.Controls.Shell +~static Microsoft.Maui.Controls.Shell.GetBackButtonBehavior(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Controls.BackButtonBehavior +~static Microsoft.Maui.Controls.Shell.GetBackgroundColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetDisabledColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetFlyoutBackdrop(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Controls.Brush +~static Microsoft.Maui.Controls.Shell.GetFlyoutBehavior(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.FlyoutBehavior +~static Microsoft.Maui.Controls.Shell.GetFlyoutHeight(Microsoft.Maui.Controls.BindableObject obj) -> double +~static Microsoft.Maui.Controls.Shell.GetFlyoutItemIsVisible(Microsoft.Maui.Controls.BindableObject obj) -> bool +~static Microsoft.Maui.Controls.Shell.GetFlyoutWidth(Microsoft.Maui.Controls.BindableObject obj) -> double +~static Microsoft.Maui.Controls.Shell.GetForegroundColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetItemTemplate(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Controls.DataTemplate +~static Microsoft.Maui.Controls.Shell.GetMenuItemTemplate(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Controls.DataTemplate +~static Microsoft.Maui.Controls.Shell.GetNavBarHasShadow(Microsoft.Maui.Controls.BindableObject obj) -> bool +~static Microsoft.Maui.Controls.Shell.GetNavBarIsVisible(Microsoft.Maui.Controls.BindableObject obj) -> bool +~static Microsoft.Maui.Controls.Shell.GetPresentationMode(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Controls.PresentationMode +~static Microsoft.Maui.Controls.Shell.GetSearchHandler(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Controls.SearchHandler +~static Microsoft.Maui.Controls.Shell.GetTabBarBackgroundColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetTabBarDisabledColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetTabBarForegroundColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetTabBarIsVisible(Microsoft.Maui.Controls.BindableObject obj) -> bool +~static Microsoft.Maui.Controls.Shell.GetTabBarTitleColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetTabBarUnselectedColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetTitleColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.GetTitleView(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Controls.View +~static Microsoft.Maui.Controls.Shell.GetUnselectedColor(Microsoft.Maui.Controls.BindableObject obj) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Controls.Shell.SetBackButtonBehavior(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Controls.BackButtonBehavior behavior) -> void +~static Microsoft.Maui.Controls.Shell.SetBackgroundColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetDisabledColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetFlyoutBackdrop(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Controls.Brush value) -> void +~static Microsoft.Maui.Controls.Shell.SetFlyoutBehavior(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.FlyoutBehavior value) -> void +~static Microsoft.Maui.Controls.Shell.SetFlyoutHeight(Microsoft.Maui.Controls.BindableObject obj, double value) -> void +~static Microsoft.Maui.Controls.Shell.SetFlyoutItemIsVisible(Microsoft.Maui.Controls.BindableObject obj, bool isVisible) -> void +~static Microsoft.Maui.Controls.Shell.SetFlyoutWidth(Microsoft.Maui.Controls.BindableObject obj, double value) -> void +~static Microsoft.Maui.Controls.Shell.SetForegroundColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetItemTemplate(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Controls.DataTemplate itemTemplate) -> void +~static Microsoft.Maui.Controls.Shell.SetMenuItemTemplate(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Controls.DataTemplate menuItemTemplate) -> void +~static Microsoft.Maui.Controls.Shell.SetNavBarHasShadow(Microsoft.Maui.Controls.BindableObject obj, bool value) -> void +~static Microsoft.Maui.Controls.Shell.SetNavBarIsVisible(Microsoft.Maui.Controls.BindableObject obj, bool value) -> void +~static Microsoft.Maui.Controls.Shell.SetPresentationMode(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Controls.PresentationMode presentationMode) -> void +~static Microsoft.Maui.Controls.Shell.SetSearchHandler(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Controls.SearchHandler handler) -> void +~static Microsoft.Maui.Controls.Shell.SetTabBarBackgroundColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetTabBarDisabledColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetTabBarForegroundColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetTabBarIsVisible(Microsoft.Maui.Controls.BindableObject obj, bool value) -> void +~static Microsoft.Maui.Controls.Shell.SetTabBarTitleColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetTabBarUnselectedColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetTitleColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.Shell.SetTitleView(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Controls.View value) -> void +~static Microsoft.Maui.Controls.Shell.SetUnselectedColor(Microsoft.Maui.Controls.BindableObject obj, Microsoft.Maui.Graphics.Color value) -> void +~static Microsoft.Maui.Controls.ShellAppearance.operator !=(Microsoft.Maui.Controls.ShellAppearance appearance1, Microsoft.Maui.Controls.ShellAppearance appearance2) -> bool +~static Microsoft.Maui.Controls.ShellAppearance.operator ==(Microsoft.Maui.Controls.ShellAppearance appearance1, Microsoft.Maui.Controls.ShellAppearance appearance2) -> bool +~static Microsoft.Maui.Controls.ShellContent.implicit operator Microsoft.Maui.Controls.ShellContent(Microsoft.Maui.Controls.TemplatedPage page) -> Microsoft.Maui.Controls.ShellContent +~static Microsoft.Maui.Controls.ShellItem.implicit operator Microsoft.Maui.Controls.ShellItem(Microsoft.Maui.Controls.MenuItem menuItem) -> Microsoft.Maui.Controls.ShellItem +~static Microsoft.Maui.Controls.ShellItem.implicit operator Microsoft.Maui.Controls.ShellItem(Microsoft.Maui.Controls.ShellContent shellContent) -> Microsoft.Maui.Controls.ShellItem +~static Microsoft.Maui.Controls.ShellItem.implicit operator Microsoft.Maui.Controls.ShellItem(Microsoft.Maui.Controls.ShellSection shellSection) -> Microsoft.Maui.Controls.ShellItem +~static Microsoft.Maui.Controls.ShellItem.implicit operator Microsoft.Maui.Controls.ShellItem(Microsoft.Maui.Controls.TemplatedPage page) -> Microsoft.Maui.Controls.ShellItem +~static Microsoft.Maui.Controls.ShellNavigationState.implicit operator Microsoft.Maui.Controls.ShellNavigationState(string value) -> Microsoft.Maui.Controls.ShellNavigationState +~static Microsoft.Maui.Controls.ShellNavigationState.implicit operator Microsoft.Maui.Controls.ShellNavigationState(System.Uri uri) -> Microsoft.Maui.Controls.ShellNavigationState +~static Microsoft.Maui.Controls.ShellSection.implicit operator Microsoft.Maui.Controls.ShellSection(Microsoft.Maui.Controls.ShellContent shellContent) -> Microsoft.Maui.Controls.ShellSection +~static Microsoft.Maui.Controls.ShellSection.implicit operator Microsoft.Maui.Controls.ShellSection(Microsoft.Maui.Controls.TemplatedPage page) -> Microsoft.Maui.Controls.ShellSection +~static Microsoft.Maui.Controls.ShellTemplatedViewManager.OnViewDataChanged(Microsoft.Maui.Controls.DataTemplate currentViewTemplate, ref Microsoft.Maui.Controls.View localViewRef, object newViewData, System.Action OnChildRemoved, System.Action OnChildAdded) -> void +~static Microsoft.Maui.Controls.ShellTemplatedViewManager.OnViewTemplateChanged(Microsoft.Maui.Controls.DataTemplate newViewTemplate, ref Microsoft.Maui.Controls.View localViewRef, object currentViewData, System.Action OnChildRemoved, System.Action OnChildAdded, Microsoft.Maui.Controls.Shell shell) -> void +~static Microsoft.Maui.Controls.ShellTemplatedViewManager.SetView(ref Microsoft.Maui.Controls.View localView, Microsoft.Maui.Controls.View newView, System.Action OnChildRemoved, System.Action OnChildAdded) -> void +~static Microsoft.Maui.Controls.StyleSheets.StyleSheet.FromReader(System.IO.TextReader reader) -> Microsoft.Maui.Controls.StyleSheets.StyleSheet +~static Microsoft.Maui.Controls.StyleSheets.StyleSheet.FromResource(string resourcePath, System.Reflection.Assembly assembly, System.Xml.IXmlLineInfo lineInfo = null) -> Microsoft.Maui.Controls.StyleSheets.StyleSheet +~static Microsoft.Maui.Controls.StyleSheets.StyleSheet.FromString(string stylesheet) -> Microsoft.Maui.Controls.StyleSheets.StyleSheet +~static Microsoft.Maui.Controls.TabbedPage.ControlsTabbedPageMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.TemplateExtensions.SetBinding(this Microsoft.Maui.Controls.DataTemplate self, Microsoft.Maui.Controls.BindableProperty targetProperty, string path) -> void +~static Microsoft.Maui.Controls.TimePicker.ControlsTimePickerMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.VisualElement.ControlsVisualElementMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.VisualElement.MapBackgroundColor(Microsoft.Maui.IViewHandler handler, Microsoft.Maui.IView view) -> void +~static Microsoft.Maui.Controls.VisualElement.MapBackgroundImageSource(Microsoft.Maui.IViewHandler handler, Microsoft.Maui.IView view) -> void +~static Microsoft.Maui.Controls.VisualMarker.Default.get -> Microsoft.Maui.Controls.IVisual +~static Microsoft.Maui.Controls.VisualMarker.MatchParent.get -> Microsoft.Maui.Controls.IVisual +~static Microsoft.Maui.Controls.VisualStateManager.GetVisualStateGroups(Microsoft.Maui.Controls.VisualElement visualElement) -> System.Collections.Generic.IList +~static Microsoft.Maui.Controls.VisualStateManager.GoToState(Microsoft.Maui.Controls.VisualElement visualElement, string name) -> bool +~static Microsoft.Maui.Controls.VisualStateManager.HasVisualStateGroups(this Microsoft.Maui.Controls.VisualElement element) -> bool +~static Microsoft.Maui.Controls.VisualStateManager.SetVisualStateGroups(Microsoft.Maui.Controls.VisualElement visualElement, Microsoft.Maui.Controls.VisualStateGroupList value) -> void +~static Microsoft.Maui.Controls.WebView.ControlsWebViewMapper -> Microsoft.Maui.IPropertyMapper +~static Microsoft.Maui.Controls.WebViewSource.implicit operator Microsoft.Maui.Controls.WebViewSource(string url) -> Microsoft.Maui.Controls.WebViewSource +~static Microsoft.Maui.Controls.WebViewSource.implicit operator Microsoft.Maui.Controls.WebViewSource(System.Uri url) -> Microsoft.Maui.Controls.WebViewSource +~static Microsoft.Maui.Controls.Window.ControlsWindowMapper -> Microsoft.Maui.IPropertyMapper +~static readonly Microsoft.Maui.Controls.AbsoluteLayout.LayoutBoundsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AbsoluteLayout.LayoutFlagsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ActivityIndicator.ColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ActivityIndicator.IsRunningProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AppLinkEntry.AppLinkUriProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AppLinkEntry.DescriptionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AppLinkEntry.IsLinkActiveProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AppLinkEntry.ThumbnailProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AppLinkEntry.TitleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AutomationProperties.ExcludedWithChildrenProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AutomationProperties.HelpTextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AutomationProperties.IsInAccessibleTreeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AutomationProperties.LabeledByProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.AutomationProperties.NameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BackButtonBehavior.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BackButtonBehavior.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BackButtonBehavior.IconOverrideProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BackButtonBehavior.IsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BackButtonBehavior.IsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BackButtonBehavior.TextOverrideProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BaseShellItem.FlyoutIconProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BaseShellItem.IconProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BaseShellItem.IsCheckedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BaseShellItem.IsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BaseShellItem.IsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BaseShellItem.TitleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BaseShellItem.WindowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BindableLayout.EmptyViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BindableLayout.EmptyViewTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BindableLayout.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BindableLayout.ItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BindableLayout.ItemTemplateSelectorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BindableObject.BindingContextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BindableProperty.UnsetValue -> object +~static readonly Microsoft.Maui.Controls.Binding.DoNothing -> object +~static readonly Microsoft.Maui.Controls.BoxView.ColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.BoxView.CornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.BorderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.BorderWidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.ContentLayoutProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.CornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.ImageSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.IsPressedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.LineBreakModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.PaddingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Button.TextTransformProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.CurrentItemChangedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.CurrentItemChangedCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.CurrentItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.IsBounceEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.IsDraggingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.IsScrollAnimatedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.IsSwipeEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.ItemsLayoutProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.LoopProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.PeekAreaInsetsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.PositionChangedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.PositionChangedCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.PositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CarouselView.VisibleViewsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Cell.IsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CheckBox.ColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CheckBox.IsCheckedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ClickGestureRecognizer.ButtonsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ClickGestureRecognizer.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ClickGestureRecognizer.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ClickGestureRecognizer.NumberOfClicksRequiredProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ColumnDefinition.WidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CompareStateTrigger.PropertyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CompareStateTrigger.ValueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.LayoutBoundsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.LayoutFlagsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.AlignContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.AlignItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.AlignSelfProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.BasisProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.DirectionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.GrowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.JustifyContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.OrderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.PositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.ShrinkProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.FlexLayout.WrapProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.ColumnDefinitionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.ColumnProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.ColumnSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.ColumnSpanProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.RowDefinitionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.RowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.RowSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Grid.RowSpanProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Layout.CascadeInputTransparentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Layout.IsClippedToBoundsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.Layout.PaddingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.RelativeLayout.BoundsConstraintProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.RelativeLayout.HeightConstraintProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.RelativeLayout.WidthConstraintProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.RelativeLayout.XConstraintProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.RelativeLayout.YConstraintProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.StackLayout.OrientationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Compatibility.StackLayout.SpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CompressedLayout.HeadlessOffsetProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.CompressedLayout.IsHeadlessProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ContentPage.ContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ContentView.ContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.DateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.FormatProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.MaximumDateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.MinimumDateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DatePicker.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Device.Styles.BodyStyle -> Microsoft.Maui.Controls.Style +~static readonly Microsoft.Maui.Controls.Device.Styles.BodyStyleKey -> string +~static readonly Microsoft.Maui.Controls.Device.Styles.CaptionStyle -> Microsoft.Maui.Controls.Style +~static readonly Microsoft.Maui.Controls.Device.Styles.CaptionStyleKey -> string +~static readonly Microsoft.Maui.Controls.Device.Styles.ListItemDetailTextStyle -> Microsoft.Maui.Controls.Style +~static readonly Microsoft.Maui.Controls.Device.Styles.ListItemDetailTextStyleKey -> string +~static readonly Microsoft.Maui.Controls.Device.Styles.ListItemTextStyle -> Microsoft.Maui.Controls.Style +~static readonly Microsoft.Maui.Controls.Device.Styles.ListItemTextStyleKey -> string +~static readonly Microsoft.Maui.Controls.Device.Styles.SubtitleStyle -> Microsoft.Maui.Controls.Style +~static readonly Microsoft.Maui.Controls.Device.Styles.SubtitleStyleKey -> string +~static readonly Microsoft.Maui.Controls.Device.Styles.TitleStyle -> Microsoft.Maui.Controls.Style +~static readonly Microsoft.Maui.Controls.Device.Styles.TitleStyleKey -> string +~static readonly Microsoft.Maui.Controls.DeviceStateTrigger.DeviceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DropGestureRecognizer.AllowDropProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DropGestureRecognizer.DragLeaveCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DropGestureRecognizer.DragLeaveCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DropGestureRecognizer.DragOverCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DropGestureRecognizer.DragOverCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DropGestureRecognizer.DropCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.DropGestureRecognizer.DropCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.AutoSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.CursorPositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.HorizontalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.IsTextPredictionEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.PlaceholderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.PlaceholderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.SelectionLengthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Editor.VerticalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Element.AutomationIdProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Element.ClassIdProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.ClearButtonVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.CursorPositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.HorizontalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.IsPasswordProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.IsTextPredictionEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.KeyboardProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.PlaceholderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.PlaceholderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.ReturnCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.ReturnCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.ReturnTypeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.SelectionLengthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Entry.VerticalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.EntryCell.HorizontalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.EntryCell.KeyboardProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.EntryCell.LabelColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.EntryCell.LabelProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.EntryCell.PlaceholderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.EntryCell.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.EntryCell.VerticalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FileImageSource.FileProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.AlignContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.AlignItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.AlignSelfProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.BasisProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.DirectionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.GrowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.JustifyContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.OrderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.PositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.ShrinkProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlexLayout.WrapProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlyoutBase.ContextFlyoutProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlyoutItem.IsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlyoutPage.FlyoutLayoutBehaviorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlyoutPage.IsGestureEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FlyoutPage.IsPresentedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FontImageSource.ColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FontImageSource.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FontImageSource.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FontImageSource.GlyphProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.FontImageSource.SizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Frame.BorderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Frame.CornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Frame.HasShadowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GradientBrush.GradientStopsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GradientStop.ColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GradientStop.OffsetProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GraphicsView.DrawableProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.ColumnDefinitionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.ColumnProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.ColumnSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.ColumnSpanProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.RowDefinitionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.RowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.RowSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Grid.RowSpanProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GridItemsLayout.HorizontalItemSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GridItemsLayout.SpanProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GridItemsLayout.VerticalItemSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GroupableItemsView.GroupFooterTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GroupableItemsView.GroupHeaderTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.GroupableItemsView.IsGroupedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.HtmlWebViewSource.BaseUrlProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.HtmlWebViewSource.HtmlProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Image.AspectProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Image.IsAnimationPlayingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Image.IsLoadingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Image.IsOpaqueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Image.SourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.AspectProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.BorderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.BorderWidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.CornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.IsLoadingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.IsOpaqueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.IsPressedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.PaddingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageButton.SourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ImageCell.ImageSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.CountProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.HideSingleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.IndicatorColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.IndicatorSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.IndicatorsShapeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.IndicatorTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.MaximumVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.PositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.IndicatorView.SelectedIndicatorColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.IsReadOnlyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.IsSpellCheckEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.KeyboardProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.MaxLengthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.PlaceholderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.PlaceholderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.TextTransformProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Internals.NameScope.NameScopeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Internals.ResourcesChangedEventArgs.StyleSheets -> Microsoft.Maui.Controls.Internals.ResourcesChangedEventArgs +~static readonly Microsoft.Maui.Controls.Internals.TemplatedItemsList.NameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Internals.TemplatedItemsList.ShortNameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsLayout.SnapPointsAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsLayout.SnapPointsTypeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.EmptyViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.EmptyViewTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.HorizontalScrollBarVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.ItemsUpdatingScrollModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.ItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdReachedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdReachedCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.VerticalScrollBarVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ItemsView.ItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.FormattedTextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.HorizontalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.LineBreakModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.LineHeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.MaxLinesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.PaddingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.TextDecorationsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.TextTransformProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.TextTypeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Label.VerticalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Layout.CascadeInputTransparentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Layout.IsClippedToBoundsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Layout.PaddingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.LinearGradientBrush.EndPointProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.LinearGradientBrush.StartPointProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.LinearItemsLayout.CarouselVertical -> Microsoft.Maui.Controls.IItemsLayout +~static readonly Microsoft.Maui.Controls.LinearItemsLayout.Horizontal -> Microsoft.Maui.Controls.IItemsLayout +~static readonly Microsoft.Maui.Controls.LinearItemsLayout.ItemSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.LinearItemsLayout.Vertical -> Microsoft.Maui.Controls.IItemsLayout +~static readonly Microsoft.Maui.Controls.ListView.FooterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.FooterTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.GroupHeaderTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.HasUnevenRowsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.HeaderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.HeaderTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.HorizontalScrollBarVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.IsGroupingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.IsPullToRefreshEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.IsRefreshingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.RefreshCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.RefreshControlColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.RowHeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.SelectedItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.SelectionModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.SeparatorColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.SeparatorVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ListView.VerticalScrollBarVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuBar.IsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuBarItem.IsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuBarItem.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuItem.AcceleratorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuItem.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuItem.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuItem.IconImageSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuItem.IsDestructiveProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuItem.IsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MenuItem.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MultiPage.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MultiPage.ItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.MultiPage.SelectedItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigableElement.NavigationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigableElement.StyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.BackButtonTitleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.BarBackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.BarBackgroundProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.BarTextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.CurrentPageProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.HasBackButtonProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.HasNavigationBarProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.IconColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.RootPageProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.TitleIconImageSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.NavigationPage.TitleViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.OpenGLView.HasRenderLoopProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.OrientationStateTrigger.OrientationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Page.BackgroundImageSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Page.IconImageSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Page.IsBusyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Page.PaddingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Page.TitleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PanGestureRecognizer.TouchPointsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.HorizontalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.SelectedIndexProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.SelectedItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.TitleColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.TitleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Picker.VerticalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.SendAppearingEventOnResumeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.SendDisappearingEventOnPauseProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application.ShouldPreserveKeyboardOnResumeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.NavigationPage.BarHeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Application.WindowSoftInputModeAdjustProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.UseDefaultPaddingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button.UseDefaultShadowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Entry.ImeOptionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.IsShadowEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.ShadowColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.ShadowOffsetProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton.ShadowRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ListView.IsFastScrollEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.SwipeView.SwipeTransitionModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.IsSmoothScrollEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.IsSwipePagingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.OffscreenPageLimitProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage.ToolbarPlacementProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ViewCell.IsContextActionsLegacyModeEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.ElevationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement.IsLegacyColorModeEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.DisplayZoomControlsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.EnableZoomControlsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView.MixedContentModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.BoxView.HasCornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.NavigationPage.BackButtonIconProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabbedPage.TabPositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.EnableAccessibilityScalingForNamedFontSizesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.HandleControlUpdatesOnMainThreadProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application.PanGestureRecognizerShouldRecognizeSimultaneouslyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Cell.DefaultBackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.DatePicker.UpdateModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.AdjustsFontSizeToFitWidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry.CursorColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.FlyoutPage.ApplyShadowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.GroupHeaderStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.RowAnimationsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView.SeparatorStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.HideNavigationBarSeparatorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.IsNavigationBarTranslucentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.PrefersLargeTitlesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage.StatusBarTextColorModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.LargeTitleDisplayProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.ModalPresentationStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.PreferredStatusBarUpdateAnimationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.PrefersHomeIndicatorAutoHiddenProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.PrefersStatusBarHiddenProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SafeAreaInsetsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.UseSafeAreaProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Picker.UpdateModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ScrollView.ShouldDelayContentTouchesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SearchBar.SearchBarStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Slider.UpdateOnTapProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SwipeView.SwipeTransitionModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TabbedPage.TranslucencyModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TimePicker.UpdateModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.BlurEffectProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.CanBecomeFirstResponderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.IsLegacyColorModeEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.IsShadowEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.ShadowColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.ShadowOffsetProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.ShadowOpacityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.ShadowRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.NavigationTransitionPopStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage.NavigationTransitionPushStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.Page.TabOrderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage.TabsStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.ActiveBezelInteractionElementPropertyKey -> Microsoft.Maui.Controls.BindablePropertyKey +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.OverlayContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application.UseBezelInteractionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Entry.FontWeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.BlendColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image.FileProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ItemsView.FocusedItemScrollPositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Label.FontWeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.NavigationPage.HasBreadCrumbsBarProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Page.BreadCrumbProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBar.ProgressBarPulsingStatusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.HorizontalScrollStepProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView.VerticalScrollStepProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Switch.ColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.IsFocusAllowedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.NextFocusBackViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.NextFocusDirectionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.NextFocusDownViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.NextFocusForwardViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.NextFocusLeftViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.NextFocusRightViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.NextFocusUpViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.StyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement.ToolTipProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Application.ImageDirectoryProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.CollapsedPaneWidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage.CollapseStyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.InputView.DetectReadingOrderFromContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Label.DetectReadingOrderFromContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListView.SelectionModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.ToolbarDynamicOverflowEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page.ToolbarPlacementProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirectionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar.IsSpellCheckEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.HeaderIconsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage.HeaderIconsSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.AccessKeyHorizontalOffsetProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.AccessKeyPlacementProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.AccessKeyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.AccessKeyVerticalOffsetProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement.IsLegacyColorModeEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.ExecutionModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView.IsJavaScriptAlertEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ProgressBar.ProgressColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ProgressBar.ProgressProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadialGradientBrush.CenterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadialGradientBrush.RadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.BorderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.BorderWidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.ContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.CornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.GroupNameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.IsCheckedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.TextTransformProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButton.ValueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButtonGroup.GroupNameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RadioButtonGroup.SelectedValueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RefreshView.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RefreshView.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RefreshView.IsRefreshingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RefreshView.RefreshColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ReorderableItemsView.CanMixGroupsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ReorderableItemsView.CanReorderItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Routing.RouteProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.RowDefinition.HeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ScrollView.ContentSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ScrollView.HorizontalScrollBarVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ScrollView.OrientationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ScrollView.ScrollXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ScrollView.ScrollYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ScrollView.VerticalScrollBarVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.CancelButtonColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.CursorPositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.HorizontalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.IsTextPredictionEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.PlaceholderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.PlaceholderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.SearchCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.SearchCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.SelectionLengthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchBar.VerticalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.AutomationIdProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.BackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.CancelButtonColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearIconHelpTextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearIconNameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearIconProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderHelpTextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderIconProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderNameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.DisplayMemberNameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.HorizontalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.IsFocusedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.IsFocusedPropertyKey -> Microsoft.Maui.Controls.BindablePropertyKey +~static readonly Microsoft.Maui.Controls.SearchHandler.IsSearchEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.KeyboardProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.PlaceholderColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.PlaceholderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.QueryIconHelpTextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.QueryIconNameProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.QueryIconProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.QueryProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.SearchBoxVisibilityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.ShowsResultsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.TextTransformProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SearchHandler.VerticalTextAlignmentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SelectableItemsView.SelectedItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SelectableItemsView.SelectedItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SelectableItemsView.SelectionChangedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SelectableItemsView.SelectionChangedCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SelectableItemsView.SelectionModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SemanticProperties.DescriptionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SemanticProperties.HeadingLevelProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SemanticProperties.HintProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shadow.BrushProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shadow.OffsetProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shadow.OpacityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shadow.RadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ArcSegment.IsLargeArcProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ArcSegment.PointProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ArcSegment.RotationAngleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ArcSegment.SizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ArcSegment.SweepDirectionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.BezierSegment.Point1Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.BezierSegment.Point2Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.BezierSegment.Point3Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.CenterXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.CenterYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.RotationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.ScaleXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.ScaleYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.SkewXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.SkewYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.TranslateXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.CompositeTransform.TranslateYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.EllipseGeometry.CenterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.EllipseGeometry.RadiusXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.EllipseGeometry.RadiusYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.GeometryGroup.ChildrenProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.GeometryGroup.FillRuleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Line.X1Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Line.X2Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Line.Y1Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Line.Y2Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.LineGeometry.EndPointProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.LineGeometry.StartPointProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.LineSegment.PointProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.MatrixTransform.MatrixProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Path.DataProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Path.RenderTransformProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PathFigure.IsClosedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PathFigure.IsFilledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PathFigure.SegmentsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PathFigure.StartPointProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PathGeometry.FiguresProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PathGeometry.FillRuleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PolyBezierSegment.PointsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Polygon.FillRuleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Polygon.PointsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Polyline.FillRuleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Polyline.PointsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PolyLineSegment.PointsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.PolyQuadraticBezierSegment.PointsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.Point1Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.Point2Property -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Rectangle.RadiusXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Rectangle.RadiusYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.RectangleGeometry.RectProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.RotateTransform.AngleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.RotateTransform.CenterXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.RotateTransform.CenterYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.RoundRectangle.CornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.CornerRadiusProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.RectProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ScaleTransform.CenterXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ScaleTransform.CenterYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.SkewTransform.AngleXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.SkewTransform.AngleYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.SkewTransform.CenterXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.SkewTransform.CenterYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.Transform.ValueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.TransformGroup.ChildrenProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.TranslateTransform.XProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shapes.TranslateTransform.YProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.BackButtonBehaviorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.BackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.CurrentItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.CurrentStateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.DisabledColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutBackdropProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutBackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutBackgroundImageAspectProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutBackgroundImageProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutBackgroundProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutBehaviorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutContentTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutFooterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutFooterTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutHeaderBehaviorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutHeaderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutHeaderTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutHeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutIconProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutIsPresentedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutItemIsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutVerticalScrollModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.FlyoutWidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.ForegroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.ItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.ItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.MenuItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.NavBarHasShadowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.NavBarIsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.PresentationModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.SearchHandlerProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TabBarBackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TabBarDisabledColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TabBarForegroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TabBarIsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TabBarTitleColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TabBarUnselectedColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TitleColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.TitleViewProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Shell.UnselectedColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellContent.ContentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellContent.ContentTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellContent.MenuItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellGroupItem.FlyoutDisplayOptionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellItem.CurrentItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellItem.ItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellSection.CurrentItemProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.ShellSection.ItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.DragCompletedCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.DragStartedCommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.MaximumProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.MaximumTrackColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.MinimumProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.MinimumTrackColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.ThumbColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.ThumbImageSourceProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Slider.ValueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SolidColorBrush.ColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.BackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.LineHeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.StyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.TextDecorationsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Span.TextTransformProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StackBase.SpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StackLayout.OrientationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StateTrigger.IsActiveProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Stepper.IncrementProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Stepper.MaximumProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Stepper.MinimumProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Stepper.ValueProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StreamImageSource.StreamProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StructuredItemsView.FooterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StructuredItemsView.FooterTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StructuredItemsView.HeaderProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StructuredItemsView.HeaderTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StructuredItemsView.ItemSizingStrategyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.StructuredItemsView.ItemsLayoutProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeGestureRecognizer.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeGestureRecognizer.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeGestureRecognizer.DirectionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeGestureRecognizer.ThresholdProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeItem.BackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeItem.IsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeItems.ModeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeItems.SwipeBehaviorOnInvokedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeItemView.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeItemView.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeView.BottomItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeView.LeftItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeView.RightItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeView.ThresholdProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwipeView.TopItemsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Switch.IsToggledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Switch.OnColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.Switch.ThumbColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwitchCell.OnColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwitchCell.OnProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.SwitchCell.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TabbedPage.BarBackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TabbedPage.BarBackgroundProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TabbedPage.BarTextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TabbedPage.SelectedTabColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TabbedPage.UnselectedTabColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TableSectionBase.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TableSectionBase.TitleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TableView.HasUnevenRowsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TableView.RowHeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TemplatedPage.ControlTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TemplatedView.ControlTemplateProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TextCell.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TextCell.CommandProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TextCell.DetailColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TextCell.DetailProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TextCell.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TextCell.TextProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.CharacterSpacingProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.FormatProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.TextColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.TimePicker.TimeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.UriImageSource.CacheValidityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.UriImageSource.CachingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.UriImageSource.UriProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.UrlWebViewSource.UrlProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.View.HorizontalOptionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.View.MarginProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.View.VerticalOptionsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.AnchorXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.AnchorYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.BackgroundColorProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.BackgroundProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.BehaviorsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.ClipProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.FlowDirectionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.HeightProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.HeightRequestProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.InputTransparentProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.IsEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.IsFocusedProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.IsFocusedPropertyKey -> Microsoft.Maui.Controls.BindablePropertyKey +~static readonly Microsoft.Maui.Controls.VisualElement.IsVisibleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.MaximumHeightRequestProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.MaximumWidthRequestProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.MinimumHeightRequestProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.MinimumWidthRequestProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.NavigationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.OpacityProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.RotationProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.RotationXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.RotationYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.ScaleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.ScaleXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.ScaleYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.StyleProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.TranslationXProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.TranslationYProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.TriggersProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.VisualProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.WidthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.WidthRequestProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.WindowProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.XProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualElement.YProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.VisualStateManager.VisualStateGroupsProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.WebView.CanGoBackProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.WebView.CanGoForwardProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.WebView.CookiesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.WebView.SourceProperty -> Microsoft.Maui.Controls.BindableProperty +~virtual Microsoft.Maui.Controls.Behavior.OnAttachedTo(Microsoft.Maui.Controls.BindableObject bindable) -> void +~virtual Microsoft.Maui.Controls.Behavior.OnDetachingFrom(Microsoft.Maui.Controls.BindableObject bindable) -> void +~virtual Microsoft.Maui.Controls.Behavior.OnAttachedTo(T bindable) -> void +~virtual Microsoft.Maui.Controls.Behavior.OnDetachingFrom(T bindable) -> void +~virtual Microsoft.Maui.Controls.BindableObject.OnPropertyChanged(string propertyName = null) -> void +~virtual Microsoft.Maui.Controls.BindableObject.OnPropertyChanging(string propertyName = null) -> void +~virtual Microsoft.Maui.Controls.Button.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.CarouselView.OnCurrentItemChanged(System.EventArgs args) -> void +~virtual Microsoft.Maui.Controls.CarouselView.OnPositionChanged(Microsoft.Maui.Controls.PositionChangedEventArgs args) -> void +~virtual Microsoft.Maui.Controls.Compatibility.Layout.ShouldInvalidateOnChildAdded(Microsoft.Maui.Controls.View child) -> bool +~virtual Microsoft.Maui.Controls.Compatibility.Layout.ShouldInvalidateOnChildRemoved(Microsoft.Maui.Controls.View child) -> bool +~virtual Microsoft.Maui.Controls.Compatibility.Layout.OnAdded(T view) -> void +~virtual Microsoft.Maui.Controls.Compatibility.Layout.OnRemoved(T view) -> void +~virtual Microsoft.Maui.Controls.DatePicker.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.Element.OnChildAdded(Microsoft.Maui.Controls.Element child) -> void +~virtual Microsoft.Maui.Controls.Element.OnChildRemoved(Microsoft.Maui.Controls.Element child, int oldLogicalIndex) -> void +~virtual Microsoft.Maui.Controls.Element.OnHandlerChanging(Microsoft.Maui.Controls.HandlerChangingEventArgs args) -> void +~virtual Microsoft.Maui.Controls.Element.OnParentChanging(Microsoft.Maui.Controls.ParentChangingEventArgs args) -> void +~virtual Microsoft.Maui.Controls.ImageSource.Cancel() -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.GetModalStack() -> System.Collections.Generic.IReadOnlyList +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.GetNavigationStack() -> System.Collections.Generic.IReadOnlyList +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.OnInsertPageBefore(Microsoft.Maui.Controls.Page page, Microsoft.Maui.Controls.Page before) -> void +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.OnPopAsync(bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.OnPopModal(bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.OnPopToRootAsync(bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.OnPushAsync(Microsoft.Maui.Controls.Page page, bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.OnPushModal(Microsoft.Maui.Controls.Page modal, bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.Internals.NavigationProxy.OnRemovePage(Microsoft.Maui.Controls.Page page) -> void +~virtual Microsoft.Maui.Controls.Internals.TableModel.GetCell(int section, int row) -> Microsoft.Maui.Controls.Cell +~virtual Microsoft.Maui.Controls.Internals.TableModel.GetHeaderCell(int section) -> Microsoft.Maui.Controls.Cell +~virtual Microsoft.Maui.Controls.Internals.TableModel.GetSectionIndexTitles() -> string[] +~virtual Microsoft.Maui.Controls.Internals.TableModel.GetSectionTextColor(int section) -> Microsoft.Maui.Graphics.Color +~virtual Microsoft.Maui.Controls.Internals.TableModel.GetSectionTitle(int section) -> string +~virtual Microsoft.Maui.Controls.Internals.TableModel.OnRowLongPressed(object item) -> void +~virtual Microsoft.Maui.Controls.Internals.TableModel.OnRowSelected(object item) -> void +~virtual Microsoft.Maui.Controls.ItemsView.OnScrolled(Microsoft.Maui.Controls.ItemsViewScrolledEventArgs e) -> void +~virtual Microsoft.Maui.Controls.ItemsView.OnScrollToRequested(Microsoft.Maui.Controls.ScrollToRequestEventArgs e) -> void +~virtual Microsoft.Maui.Controls.Label.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.Layout.OnAdd(int index, Microsoft.Maui.IView view) -> void +~virtual Microsoft.Maui.Controls.Layout.OnInsert(int index, Microsoft.Maui.IView view) -> void +~virtual Microsoft.Maui.Controls.Layout.OnRemove(int index, Microsoft.Maui.IView view) -> void +~virtual Microsoft.Maui.Controls.Layout.OnUpdate(int index, Microsoft.Maui.IView view, Microsoft.Maui.IView oldView) -> void +~virtual Microsoft.Maui.Controls.MultiPage.OnPagesChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) -> void +~virtual Microsoft.Maui.Controls.MultiPage.SetupContent(T content, int index) -> void +~virtual Microsoft.Maui.Controls.MultiPage.UnhookContent(T content) -> void +~virtual Microsoft.Maui.Controls.Page.GetParentWindow() -> Microsoft.Maui.Controls.Window +~virtual Microsoft.Maui.Controls.Page.OnChildMeasureInvalidated(object sender, System.EventArgs e) -> void +~virtual Microsoft.Maui.Controls.Page.OnNavigatedFrom(Microsoft.Maui.Controls.NavigatedFromEventArgs args) -> void +~virtual Microsoft.Maui.Controls.Page.OnNavigatedTo(Microsoft.Maui.Controls.NavigatedToEventArgs args) -> void +~virtual Microsoft.Maui.Controls.Page.OnNavigatingFrom(Microsoft.Maui.Controls.NavigatingFromEventArgs args) -> void +~virtual Microsoft.Maui.Controls.Picker.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.PlatformEffect.OnElementPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args) -> void +~virtual Microsoft.Maui.Controls.PropertyChangingEventArgs.PropertyName.get -> string +~virtual Microsoft.Maui.Controls.RadioButton.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.SearchHandler.OnItemSelected(object item) -> void +~virtual Microsoft.Maui.Controls.SearchHandler.OnQueryChanged(string oldValue, string newValue) -> void +~virtual Microsoft.Maui.Controls.SearchHandler.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.SelectableItemsView.OnSelectionChanged(Microsoft.Maui.Controls.SelectionChangedEventArgs args) -> void +~virtual Microsoft.Maui.Controls.Shell.OnNavigated(Microsoft.Maui.Controls.ShellNavigatedEventArgs args) -> void +~virtual Microsoft.Maui.Controls.Shell.OnNavigating(Microsoft.Maui.Controls.ShellNavigatingEventArgs args) -> void +~virtual Microsoft.Maui.Controls.ShellSection.GetNavigationStack() -> System.Collections.Generic.IReadOnlyList +~virtual Microsoft.Maui.Controls.ShellSection.OnInsertPageBefore(Microsoft.Maui.Controls.Page page, Microsoft.Maui.Controls.Page before) -> void +~virtual Microsoft.Maui.Controls.ShellSection.OnPopAsync(bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.ShellSection.OnPopToRootAsync(bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.ShellSection.OnPushAsync(Microsoft.Maui.Controls.Page page, bool animated) -> System.Threading.Tasks.Task +~virtual Microsoft.Maui.Controls.ShellSection.OnRemovePage(Microsoft.Maui.Controls.Page page) -> void +~virtual Microsoft.Maui.Controls.SolidColorBrush.Color.get -> Microsoft.Maui.Graphics.Color +~virtual Microsoft.Maui.Controls.SolidColorBrush.Color.set -> void +~virtual Microsoft.Maui.Controls.Span.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.StreamImageSource.Stream.get -> System.Func> +~virtual Microsoft.Maui.Controls.StreamImageSource.Stream.set -> void +~virtual Microsoft.Maui.Controls.TemplatedView.ResolveControlTemplate() -> Microsoft.Maui.Controls.ControlTemplate +~virtual Microsoft.Maui.Controls.TimePicker.UpdateFormsText(string source, Microsoft.Maui.TextTransform textTransform) -> string +~virtual Microsoft.Maui.Controls.Toolbar.BarTextColor.get -> Microsoft.Maui.Graphics.Color +~virtual Microsoft.Maui.Controls.Toolbar.BarTextColor.set -> void +~virtual Microsoft.Maui.Controls.Toolbar.IconColor.get -> Microsoft.Maui.Graphics.Color +~virtual Microsoft.Maui.Controls.Toolbar.IconColor.set -> void +~virtual Microsoft.Maui.Controls.Toolbar.Title.get -> string +~virtual Microsoft.Maui.Controls.Toolbar.Title.set -> void +~virtual Microsoft.Maui.Controls.Toolbar.TitleView.get -> Microsoft.Maui.Controls.VisualElement +~virtual Microsoft.Maui.Controls.Toolbar.TitleView.set -> void +~virtual Microsoft.Maui.Controls.View.GetChildElements(Microsoft.Maui.Graphics.Point point) -> System.Collections.Generic.IList +abstract Microsoft.Maui.Controls.Brush.IsEmpty.get -> bool +abstract Microsoft.Maui.Controls.Compatibility.Layout.LayoutChildren(double x, double y, double width, double height) -> void +abstract Microsoft.Maui.Controls.Internals.GIFImageParser.FinishedParsing() -> void +abstract Microsoft.Maui.Controls.Internals.GIFImageParser.StartParsing() -> void +abstract Microsoft.Maui.Controls.Internals.TableModel.GetRowCount(int section) -> int +abstract Microsoft.Maui.Controls.Internals.TableModel.GetSectionCount() -> int +abstract Microsoft.Maui.Controls.Shapes.Shape.GetPath() -> Microsoft.Maui.Graphics.PathF! +const Microsoft.Maui.Controls.Cell.DefaultCellHeight = 40 -> int +Microsoft.Maui.Controls.AbsoluteLayout +Microsoft.Maui.Controls.AbsoluteLayout.AbsoluteLayout() -> void +Microsoft.Maui.Controls.Accelerator +Microsoft.Maui.Controls.AcceleratorTypeConverter +Microsoft.Maui.Controls.AcceleratorTypeConverter.AcceleratorTypeConverter() -> void +Microsoft.Maui.Controls.AccessKeyPlacement +Microsoft.Maui.Controls.AccessKeyPlacement.Auto = 0 -> Microsoft.Maui.Controls.AccessKeyPlacement +Microsoft.Maui.Controls.AccessKeyPlacement.Bottom = 2 -> Microsoft.Maui.Controls.AccessKeyPlacement +Microsoft.Maui.Controls.AccessKeyPlacement.Center = 5 -> Microsoft.Maui.Controls.AccessKeyPlacement +Microsoft.Maui.Controls.AccessKeyPlacement.Left = 4 -> Microsoft.Maui.Controls.AccessKeyPlacement +Microsoft.Maui.Controls.AccessKeyPlacement.Right = 3 -> Microsoft.Maui.Controls.AccessKeyPlacement +Microsoft.Maui.Controls.AccessKeyPlacement.Top = 1 -> Microsoft.Maui.Controls.AccessKeyPlacement +Microsoft.Maui.Controls.ActivityIndicator +Microsoft.Maui.Controls.ActivityIndicator.ActivityIndicator() -> void +Microsoft.Maui.Controls.ActivityIndicator.IsRunning.get -> bool +Microsoft.Maui.Controls.ActivityIndicator.IsRunning.set -> void +Microsoft.Maui.Controls.AdaptiveTrigger +Microsoft.Maui.Controls.AdaptiveTrigger.AdaptiveTrigger() -> void +Microsoft.Maui.Controls.AdaptiveTrigger.MinWindowHeight.get -> double +Microsoft.Maui.Controls.AdaptiveTrigger.MinWindowHeight.set -> void +Microsoft.Maui.Controls.AdaptiveTrigger.MinWindowWidth.get -> double +Microsoft.Maui.Controls.AdaptiveTrigger.MinWindowWidth.set -> void +Microsoft.Maui.Controls.AndExpandLayoutManager +Microsoft.Maui.Controls.AndExpandLayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.AndExpandLayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Animation +Microsoft.Maui.Controls.Animation.Animation() -> void +Microsoft.Maui.Controls.Animation.IsEnabled.get -> bool +Microsoft.Maui.Controls.AnimationExtensions +Microsoft.Maui.Controls.Application +Microsoft.Maui.Controls.Application.Application() -> void +Microsoft.Maui.Controls.Application.AppLinks.get -> Microsoft.Maui.Controls.IAppLinks! +Microsoft.Maui.Controls.Application.MainPage.get -> Microsoft.Maui.Controls.Page? +Microsoft.Maui.Controls.Application.MainPage.set -> void +Microsoft.Maui.Controls.Application.ModalPopped -> System.EventHandler? +Microsoft.Maui.Controls.Application.ModalPopping -> System.EventHandler? +Microsoft.Maui.Controls.Application.ModalPushed -> System.EventHandler? +Microsoft.Maui.Controls.Application.ModalPushing -> System.EventHandler? +Microsoft.Maui.Controls.Application.NavigationProxy.get -> Microsoft.Maui.Controls.Internals.NavigationProxy? +Microsoft.Maui.Controls.Application.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration! +Microsoft.Maui.Controls.Application.PageAppearing -> System.EventHandler? +Microsoft.Maui.Controls.Application.PageDisappearing -> System.EventHandler? +Microsoft.Maui.Controls.Application.PlatformAppTheme.get -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.Controls.Application.Properties.get -> System.Collections.Generic.IDictionary! +Microsoft.Maui.Controls.Application.Quit() -> void +Microsoft.Maui.Controls.Application.RequestedTheme.get -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.Controls.Application.RequestedThemeChanged -> System.EventHandler! +Microsoft.Maui.Controls.Application.Resources.get -> Microsoft.Maui.Controls.ResourceDictionary! +Microsoft.Maui.Controls.Application.Resources.set -> void +Microsoft.Maui.Controls.Application.SavePropertiesAsync() -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.Application.SendOnAppLinkRequestReceived(System.Uri! uri) -> void +Microsoft.Maui.Controls.Application.SetAppIndexingProvider(Microsoft.Maui.Controls.IAppIndexingProvider! provider) -> void +Microsoft.Maui.Controls.Application.UserAppTheme.get -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.Controls.Application.UserAppTheme.set -> void +Microsoft.Maui.Controls.Application.Windows.get -> System.Collections.Generic.IReadOnlyList! +Microsoft.Maui.Controls.AppLinkEntry +Microsoft.Maui.Controls.AppLinkEntry.AppLinkEntry() -> void +Microsoft.Maui.Controls.AppLinkEntry.IsLinkActive.get -> bool +Microsoft.Maui.Controls.AppLinkEntry.IsLinkActive.set -> void +Microsoft.Maui.Controls.AppThemeChangedEventArgs +Microsoft.Maui.Controls.AppThemeChangedEventArgs.AppThemeChangedEventArgs(Microsoft.Maui.ApplicationModel.AppTheme appTheme) -> void +Microsoft.Maui.Controls.AppThemeChangedEventArgs.RequestedTheme.get -> Microsoft.Maui.ApplicationModel.AppTheme +Microsoft.Maui.Controls.AutomationProperties +Microsoft.Maui.Controls.AutomationProperties.AutomationProperties() -> void +Microsoft.Maui.Controls.BackButtonBehavior +Microsoft.Maui.Controls.BackButtonBehavior.BackButtonBehavior() -> void +Microsoft.Maui.Controls.BackButtonBehavior.IsEnabled.get -> bool +Microsoft.Maui.Controls.BackButtonBehavior.IsEnabled.set -> void +Microsoft.Maui.Controls.BackButtonBehavior.IsVisible.get -> bool +Microsoft.Maui.Controls.BackButtonBehavior.IsVisible.set -> void +Microsoft.Maui.Controls.BackButtonPressedEventArgs +Microsoft.Maui.Controls.BackButtonPressedEventArgs.BackButtonPressedEventArgs() -> void +Microsoft.Maui.Controls.BackButtonPressedEventArgs.Handled.get -> bool +Microsoft.Maui.Controls.BackButtonPressedEventArgs.Handled.set -> void +Microsoft.Maui.Controls.BackgroundingEventArgs +Microsoft.Maui.Controls.BaseMenuItem +Microsoft.Maui.Controls.BaseMenuItem.BaseMenuItem() -> void +Microsoft.Maui.Controls.BaseShellItem +Microsoft.Maui.Controls.BaseShellItem.Appearing -> System.EventHandler +Microsoft.Maui.Controls.BaseShellItem.BaseShellItem() -> void +Microsoft.Maui.Controls.BaseShellItem.Disappearing -> System.EventHandler +Microsoft.Maui.Controls.BaseShellItem.FlyoutItemIsVisible.get -> bool +Microsoft.Maui.Controls.BaseShellItem.FlyoutItemIsVisible.set -> void +Microsoft.Maui.Controls.BaseShellItem.IsChecked.get -> bool +Microsoft.Maui.Controls.BaseShellItem.IsEnabled.get -> bool +Microsoft.Maui.Controls.BaseShellItem.IsEnabled.set -> void +Microsoft.Maui.Controls.BaseShellItem.IsVisible.get -> bool +Microsoft.Maui.Controls.BaseShellItem.IsVisible.set -> void +Microsoft.Maui.Controls.BaseSwipeEventArgs +Microsoft.Maui.Controls.BaseSwipeEventArgs.BaseSwipeEventArgs(Microsoft.Maui.SwipeDirection swipeDirection) -> void +Microsoft.Maui.Controls.BaseSwipeEventArgs.SwipeDirection.get -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.Controls.BaseSwipeEventArgs.SwipeDirection.set -> void +Microsoft.Maui.Controls.Behavior +Microsoft.Maui.Controls.Behavior.Behavior() -> void +Microsoft.Maui.Controls.Behavior.Behavior() -> void +Microsoft.Maui.Controls.BindableLayout +Microsoft.Maui.Controls.BindableObject +Microsoft.Maui.Controls.BindableObject.ApplyBindings() -> void +Microsoft.Maui.Controls.BindableObject.BindableObject() -> void +Microsoft.Maui.Controls.BindableObject.BindingContextChanged -> System.EventHandler +Microsoft.Maui.Controls.BindableObject.PropertyChanged -> System.ComponentModel.PropertyChangedEventHandler +Microsoft.Maui.Controls.BindableObject.PropertyChanging -> Microsoft.Maui.Controls.PropertyChangingEventHandler +Microsoft.Maui.Controls.BindableObject.UnapplyBindings() -> void +Microsoft.Maui.Controls.BindableObjectExtensions +Microsoft.Maui.Controls.BindableProperty +Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangedDelegate +Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangedDelegate +Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangingDelegate +Microsoft.Maui.Controls.BindableProperty.BindingPropertyChangingDelegate +Microsoft.Maui.Controls.BindableProperty.CoerceValueDelegate +Microsoft.Maui.Controls.BindableProperty.CoerceValueDelegate +Microsoft.Maui.Controls.BindableProperty.CreateDefaultValueDelegate +Microsoft.Maui.Controls.BindableProperty.CreateDefaultValueDelegate +Microsoft.Maui.Controls.BindableProperty.DefaultBindingMode.get -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.BindableProperty.IsReadOnly.get -> bool +Microsoft.Maui.Controls.BindableProperty.ValidateValueDelegate +Microsoft.Maui.Controls.BindableProperty.ValidateValueDelegate +Microsoft.Maui.Controls.BindablePropertyConverter +Microsoft.Maui.Controls.BindablePropertyConverter.BindablePropertyConverter() -> void +Microsoft.Maui.Controls.BindablePropertyKey +Microsoft.Maui.Controls.Binding +Microsoft.Maui.Controls.Binding.Binding() -> void +Microsoft.Maui.Controls.BindingBase +Microsoft.Maui.Controls.BindingBase.Mode.get -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.BindingBase.Mode.set -> void +Microsoft.Maui.Controls.BindingCondition +Microsoft.Maui.Controls.BindingCondition.BindingCondition() -> void +Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.BindingMode.Default = 0 -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.BindingMode.OneTime = 4 -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.BindingMode.OneWay = 2 -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.BindingMode.OneWayToSource = 3 -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.BindingMode.TwoWay = 1 -> Microsoft.Maui.Controls.BindingMode +Microsoft.Maui.Controls.Border +Microsoft.Maui.Controls.Border.Border() -> void +Microsoft.Maui.Controls.Border.Content.get -> Microsoft.Maui.Controls.View? +Microsoft.Maui.Controls.Border.Content.set -> void +Microsoft.Maui.Controls.Border.CrossPlatformArrange(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Border.CrossPlatformMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Border.OnPaddingPropertyChanged(Microsoft.Maui.Thickness oldValue, Microsoft.Maui.Thickness newValue) -> void +Microsoft.Maui.Controls.Border.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.Border.Padding.set -> void +Microsoft.Maui.Controls.Border.PaddingDefaultValueCreator() -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.Border.Stroke.get -> Microsoft.Maui.Controls.Brush? +Microsoft.Maui.Controls.Border.Stroke.set -> void +Microsoft.Maui.Controls.Border.StrokeDashArray.get -> Microsoft.Maui.Controls.DoubleCollection? +Microsoft.Maui.Controls.Border.StrokeDashArray.set -> void +Microsoft.Maui.Controls.Border.StrokeDashOffset.get -> double +Microsoft.Maui.Controls.Border.StrokeDashOffset.set -> void +Microsoft.Maui.Controls.Border.StrokeDashPattern.get -> float[]? +Microsoft.Maui.Controls.Border.StrokeLineCap.get -> Microsoft.Maui.Controls.Shapes.PenLineCap +Microsoft.Maui.Controls.Border.StrokeLineCap.set -> void +Microsoft.Maui.Controls.Border.StrokeLineJoin.get -> Microsoft.Maui.Controls.Shapes.PenLineJoin +Microsoft.Maui.Controls.Border.StrokeLineJoin.set -> void +Microsoft.Maui.Controls.Border.StrokeMiterLimit.get -> double +Microsoft.Maui.Controls.Border.StrokeMiterLimit.set -> void +Microsoft.Maui.Controls.Border.StrokeShape.get -> Microsoft.Maui.Graphics.IShape? +Microsoft.Maui.Controls.Border.StrokeShape.set -> void +Microsoft.Maui.Controls.Border.StrokeThickness.get -> double +Microsoft.Maui.Controls.Border.StrokeThickness.set -> void +Microsoft.Maui.Controls.BoundsConstraint +Microsoft.Maui.Controls.BoundsTypeConverter +Microsoft.Maui.Controls.BoundsTypeConverter.BoundsTypeConverter() -> void +Microsoft.Maui.Controls.BoxView +Microsoft.Maui.Controls.BoxView.BoxView() -> void +Microsoft.Maui.Controls.BoxView.CornerRadius.get -> Microsoft.Maui.CornerRadius +Microsoft.Maui.Controls.BoxView.CornerRadius.set -> void +Microsoft.Maui.Controls.Brush +Microsoft.Maui.Controls.Brush.Brush() -> void +Microsoft.Maui.Controls.BrushTypeConverter +Microsoft.Maui.Controls.BrushTypeConverter.BrushTypeConverter() -> void +Microsoft.Maui.Controls.BrushTypeConverter.GradientBrushParser +Microsoft.Maui.Controls.Button +Microsoft.Maui.Controls.Button.BorderWidth.get -> double +Microsoft.Maui.Controls.Button.BorderWidth.set -> void +Microsoft.Maui.Controls.Button.Button() -> void +Microsoft.Maui.Controls.Button.ButtonContentLayout +Microsoft.Maui.Controls.Button.ButtonContentLayout.ButtonContentLayout(Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition position, double spacing) -> void +Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition +Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition.Bottom = 3 -> Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition +Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition.Left = 0 -> Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition +Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition.Right = 2 -> Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition +Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition.Top = 1 -> Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition +Microsoft.Maui.Controls.Button.ButtonContentLayout.Position.get -> Microsoft.Maui.Controls.Button.ButtonContentLayout.ImagePosition +Microsoft.Maui.Controls.Button.ButtonContentLayout.Spacing.get -> double +Microsoft.Maui.Controls.Button.ButtonContentTypeConverter +Microsoft.Maui.Controls.Button.ButtonContentTypeConverter.ButtonContentTypeConverter() -> void +Microsoft.Maui.Controls.Button.CharacterSpacing.get -> double +Microsoft.Maui.Controls.Button.CharacterSpacing.set -> void +Microsoft.Maui.Controls.Button.Clicked -> System.EventHandler +Microsoft.Maui.Controls.Button.CornerRadius.get -> int +Microsoft.Maui.Controls.Button.CornerRadius.set -> void +Microsoft.Maui.Controls.Button.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.Button.FontAttributes.set -> void +Microsoft.Maui.Controls.Button.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.Button.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.Button.FontSize.get -> double +Microsoft.Maui.Controls.Button.FontSize.set -> void +Microsoft.Maui.Controls.Button.IsPressed.get -> bool +Microsoft.Maui.Controls.Button.LineBreakMode.get -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.Controls.Button.LineBreakMode.set -> void +Microsoft.Maui.Controls.Button.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.Button.Padding.set -> void +Microsoft.Maui.Controls.Button.Pressed -> System.EventHandler +Microsoft.Maui.Controls.Button.Released -> System.EventHandler +Microsoft.Maui.Controls.Button.SendClicked() -> void +Microsoft.Maui.Controls.Button.SendPressed() -> void +Microsoft.Maui.Controls.Button.SendReleased() -> void +Microsoft.Maui.Controls.Button.TextTransform.get -> Microsoft.Maui.TextTransform +Microsoft.Maui.Controls.Button.TextTransform.set -> void +Microsoft.Maui.Controls.ButtonsMask +Microsoft.Maui.Controls.ButtonsMask.Primary = 1 -> Microsoft.Maui.Controls.ButtonsMask +Microsoft.Maui.Controls.ButtonsMask.Secondary = 2 -> Microsoft.Maui.Controls.ButtonsMask +Microsoft.Maui.Controls.CarouselLayoutTypeConverter +Microsoft.Maui.Controls.CarouselLayoutTypeConverter.CarouselLayoutTypeConverter() -> void +Microsoft.Maui.Controls.CarouselView +Microsoft.Maui.Controls.CarouselView.CarouselView() -> void +Microsoft.Maui.Controls.CarouselView.CurrentItemChanged -> System.EventHandler +Microsoft.Maui.Controls.CarouselView.IsBounceEnabled.get -> bool +Microsoft.Maui.Controls.CarouselView.IsBounceEnabled.set -> void +Microsoft.Maui.Controls.CarouselView.IsDragging.get -> bool +Microsoft.Maui.Controls.CarouselView.IsScrollAnimated.get -> bool +Microsoft.Maui.Controls.CarouselView.IsScrollAnimated.set -> void +Microsoft.Maui.Controls.CarouselView.IsScrolling.get -> bool +Microsoft.Maui.Controls.CarouselView.IsScrolling.set -> void +Microsoft.Maui.Controls.CarouselView.IsSwipeEnabled.get -> bool +Microsoft.Maui.Controls.CarouselView.IsSwipeEnabled.set -> void +Microsoft.Maui.Controls.CarouselView.Loop.get -> bool +Microsoft.Maui.Controls.CarouselView.Loop.set -> void +Microsoft.Maui.Controls.CarouselView.PeekAreaInsets.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.CarouselView.PeekAreaInsets.set -> void +Microsoft.Maui.Controls.CarouselView.Position.get -> int +Microsoft.Maui.Controls.CarouselView.Position.set -> void +Microsoft.Maui.Controls.CarouselView.PositionChanged -> System.EventHandler +Microsoft.Maui.Controls.CarouselView.SetIsDragging(bool value) -> void +Microsoft.Maui.Controls.Cell +Microsoft.Maui.Controls.Cell.Appearing -> System.EventHandler +Microsoft.Maui.Controls.Cell.Cell() -> void +Microsoft.Maui.Controls.Cell.Disappearing -> System.EventHandler +Microsoft.Maui.Controls.Cell.ForceUpdateSize() -> void +Microsoft.Maui.Controls.Cell.ForceUpdateSizeRequested -> System.EventHandler +Microsoft.Maui.Controls.Cell.HasContextActions.get -> bool +Microsoft.Maui.Controls.Cell.Height.get -> double +Microsoft.Maui.Controls.Cell.Height.set -> void +Microsoft.Maui.Controls.Cell.IsContextActionsLegacyModeEnabled.get -> bool +Microsoft.Maui.Controls.Cell.IsContextActionsLegacyModeEnabled.set -> void +Microsoft.Maui.Controls.Cell.IsEnabled.get -> bool +Microsoft.Maui.Controls.Cell.IsEnabled.set -> void +Microsoft.Maui.Controls.Cell.RenderHeight.get -> double +Microsoft.Maui.Controls.Cell.SendAppearing() -> void +Microsoft.Maui.Controls.Cell.SendDisappearing() -> void +Microsoft.Maui.Controls.Cell.Tapped -> System.EventHandler +Microsoft.Maui.Controls.CheckBox +Microsoft.Maui.Controls.CheckBox.CheckBox() -> void +Microsoft.Maui.Controls.CheckBox.CheckedChanged -> System.EventHandler +Microsoft.Maui.Controls.CheckBox.IsChecked.get -> bool +Microsoft.Maui.Controls.CheckBox.IsChecked.set -> void +Microsoft.Maui.Controls.CheckedChangedEventArgs +Microsoft.Maui.Controls.CheckedChangedEventArgs.CheckedChangedEventArgs(bool value) -> void +Microsoft.Maui.Controls.CheckedChangedEventArgs.Value.get -> bool +Microsoft.Maui.Controls.ChildGestureRecognizer +Microsoft.Maui.Controls.ChildGestureRecognizer.ChildGestureRecognizer() -> void +Microsoft.Maui.Controls.ChildGestureRecognizer.PropertyChanged -> System.ComponentModel.PropertyChangedEventHandler +Microsoft.Maui.Controls.ClickedEventArgs +Microsoft.Maui.Controls.ClickedEventArgs.Buttons.get -> Microsoft.Maui.Controls.ButtonsMask +Microsoft.Maui.Controls.ClickGestureRecognizer +Microsoft.Maui.Controls.ClickGestureRecognizer.Buttons.get -> Microsoft.Maui.Controls.ButtonsMask +Microsoft.Maui.Controls.ClickGestureRecognizer.Buttons.set -> void +Microsoft.Maui.Controls.ClickGestureRecognizer.Clicked -> System.EventHandler +Microsoft.Maui.Controls.ClickGestureRecognizer.ClickGestureRecognizer() -> void +Microsoft.Maui.Controls.ClickGestureRecognizer.NumberOfClicksRequired.get -> int +Microsoft.Maui.Controls.ClickGestureRecognizer.NumberOfClicksRequired.set -> void +Microsoft.Maui.Controls.CloseRequestedEventArgs +Microsoft.Maui.Controls.CloseRequestedEventArgs.Animated.get -> bool +Microsoft.Maui.Controls.CloseRequestedEventArgs.Animated.set -> void +Microsoft.Maui.Controls.CloseRequestedEventArgs.CloseRequestedEventArgs(bool animated) -> void +Microsoft.Maui.Controls.CollectionSynchronizationCallback +Microsoft.Maui.Controls.CollectionView +Microsoft.Maui.Controls.CollectionView.CollectionView() -> void +Microsoft.Maui.Controls.ColumnDefinition +Microsoft.Maui.Controls.ColumnDefinition.ColumnDefinition() -> void +Microsoft.Maui.Controls.ColumnDefinition.ColumnDefinition(Microsoft.Maui.GridLength width) -> void +Microsoft.Maui.Controls.ColumnDefinition.SizeChanged -> System.EventHandler +Microsoft.Maui.Controls.ColumnDefinition.Width.get -> Microsoft.Maui.GridLength +Microsoft.Maui.Controls.ColumnDefinition.Width.set -> void +Microsoft.Maui.Controls.ColumnDefinitionCollection +Microsoft.Maui.Controls.ColumnDefinitionCollection.ColumnDefinitionCollection() -> void +Microsoft.Maui.Controls.ColumnDefinitionCollectionTypeConverter +Microsoft.Maui.Controls.ColumnDefinitionCollectionTypeConverter.ColumnDefinitionCollectionTypeConverter() -> void +Microsoft.Maui.Controls.Command +Microsoft.Maui.Controls.Command.CanExecuteChanged -> System.EventHandler +Microsoft.Maui.Controls.Command.ChangeCanExecute() -> void +Microsoft.Maui.Controls.Command +Microsoft.Maui.Controls.CompareStateTrigger +Microsoft.Maui.Controls.CompareStateTrigger.CompareStateTrigger() -> void +Microsoft.Maui.Controls.Compatibility.AbsoluteLayout +Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.AbsoluteLayout() -> void +Microsoft.Maui.Controls.Compatibility.Constraint +Microsoft.Maui.Controls.Compatibility.Constraint.Constraint() -> void +Microsoft.Maui.Controls.Compatibility.ConstraintExpression +Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Constant.get -> double +Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Constant.set -> void +Microsoft.Maui.Controls.Compatibility.ConstraintExpression.ConstraintExpression() -> void +Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Factor.get -> double +Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Factor.set -> void +Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Type.get -> Microsoft.Maui.Controls.ConstraintType +Microsoft.Maui.Controls.Compatibility.ConstraintExpression.Type.set -> void +Microsoft.Maui.Controls.Compatibility.ConstraintTypeConverter +Microsoft.Maui.Controls.Compatibility.ConstraintTypeConverter.ConstraintTypeConverter() -> void +Microsoft.Maui.Controls.Compatibility.FlexLayout +Microsoft.Maui.Controls.Compatibility.FlexLayout.AlignContent.get -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Controls.Compatibility.FlexLayout.AlignContent.set -> void +Microsoft.Maui.Controls.Compatibility.FlexLayout.AlignItems.get -> Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.Controls.Compatibility.FlexLayout.AlignItems.set -> void +Microsoft.Maui.Controls.Compatibility.FlexLayout.Direction.get -> Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.Controls.Compatibility.FlexLayout.Direction.set -> void +Microsoft.Maui.Controls.Compatibility.FlexLayout.FlexLayout() -> void +Microsoft.Maui.Controls.Compatibility.FlexLayout.JustifyContent.get -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Controls.Compatibility.FlexLayout.JustifyContent.set -> void +Microsoft.Maui.Controls.Compatibility.FlexLayout.Position.get -> Microsoft.Maui.Layouts.FlexPosition +Microsoft.Maui.Controls.Compatibility.FlexLayout.Position.set -> void +Microsoft.Maui.Controls.Compatibility.FlexLayout.Wrap.get -> Microsoft.Maui.Layouts.FlexWrap +Microsoft.Maui.Controls.Compatibility.FlexLayout.Wrap.set -> void +Microsoft.Maui.Controls.Compatibility.Grid +Microsoft.Maui.Controls.Compatibility.Grid.ColumnSpacing.get -> double +Microsoft.Maui.Controls.Compatibility.Grid.ColumnSpacing.set -> void +Microsoft.Maui.Controls.Compatibility.Grid.Grid() -> void +Microsoft.Maui.Controls.Compatibility.Grid.InvalidateMeasureInernalNonVirtual(Microsoft.Maui.Controls.Internals.InvalidationTrigger trigger) -> void +Microsoft.Maui.Controls.Compatibility.Grid.RowSpacing.get -> double +Microsoft.Maui.Controls.Compatibility.Grid.RowSpacing.set -> void +Microsoft.Maui.Controls.Compatibility.INativeElementView +Microsoft.Maui.Controls.Compatibility.Layout +Microsoft.Maui.Controls.Compatibility.Layout.CascadeInputTransparent.get -> bool +Microsoft.Maui.Controls.Compatibility.Layout.CascadeInputTransparent.set -> void +Microsoft.Maui.Controls.Compatibility.Layout.CrossPlatformArrange(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Compatibility.Layout.CrossPlatformMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Compatibility.Layout.ForceLayout() -> void +Microsoft.Maui.Controls.Compatibility.Layout.IsClippedToBounds.get -> bool +Microsoft.Maui.Controls.Compatibility.Layout.IsClippedToBounds.set -> void +Microsoft.Maui.Controls.Compatibility.Layout.Layout() -> void +Microsoft.Maui.Controls.Compatibility.Layout.LayoutChanged -> System.EventHandler +Microsoft.Maui.Controls.Compatibility.Layout.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.Compatibility.Layout.Padding.set -> void +Microsoft.Maui.Controls.Compatibility.Layout.UpdateChildrenLayout() -> void +Microsoft.Maui.Controls.Compatibility.Layout.Layout() -> void +Microsoft.Maui.Controls.Compatibility.RelativeLayout +Microsoft.Maui.Controls.Compatibility.RelativeLayout.RelativeLayout() -> void +Microsoft.Maui.Controls.Compatibility.StackLayout +Microsoft.Maui.Controls.Compatibility.StackLayout.Orientation.get -> Microsoft.Maui.Controls.StackOrientation +Microsoft.Maui.Controls.Compatibility.StackLayout.Orientation.set -> void +Microsoft.Maui.Controls.Compatibility.StackLayout.Spacing.get -> double +Microsoft.Maui.Controls.Compatibility.StackLayout.Spacing.set -> void +Microsoft.Maui.Controls.Compatibility.StackLayout.StackLayout() -> void +Microsoft.Maui.Controls.CompressedLayout +Microsoft.Maui.Controls.Condition +Microsoft.Maui.Controls.ConstraintType +Microsoft.Maui.Controls.ConstraintType.Constant = 2 -> Microsoft.Maui.Controls.ConstraintType +Microsoft.Maui.Controls.ConstraintType.RelativeToParent = 0 -> Microsoft.Maui.Controls.ConstraintType +Microsoft.Maui.Controls.ConstraintType.RelativeToView = 1 -> Microsoft.Maui.Controls.ConstraintType +Microsoft.Maui.Controls.ContentPage +Microsoft.Maui.Controls.ContentPage.ContentPage() -> void +Microsoft.Maui.Controls.ContentPresenter +Microsoft.Maui.Controls.ContentPresenter.ContentPresenter() -> void +Microsoft.Maui.Controls.ContentPropertyAttribute +Microsoft.Maui.Controls.ContentView +Microsoft.Maui.Controls.ContentView.ContentView() -> void +Microsoft.Maui.Controls.ControlsColorExtensions +Microsoft.Maui.Controls.ControlTemplate +Microsoft.Maui.Controls.ControlTemplate.ControlTemplate() -> void +Microsoft.Maui.Controls.CurrentItemChangedEventArgs +Microsoft.Maui.Controls.DataPackage +Microsoft.Maui.Controls.DataPackage.DataPackage() -> void +Microsoft.Maui.Controls.DataPackageOperation +Microsoft.Maui.Controls.DataPackageOperation.Copy = 1 -> Microsoft.Maui.Controls.DataPackageOperation +Microsoft.Maui.Controls.DataPackageOperation.None = 0 -> Microsoft.Maui.Controls.DataPackageOperation +Microsoft.Maui.Controls.DataPackagePropertySet +Microsoft.Maui.Controls.DataPackagePropertySet.Count.get -> int +Microsoft.Maui.Controls.DataPackagePropertySet.DataPackagePropertySet() -> void +Microsoft.Maui.Controls.DataPackagePropertySetView +Microsoft.Maui.Controls.DataPackagePropertySetView.Count.get -> int +Microsoft.Maui.Controls.DataPackageView +Microsoft.Maui.Controls.DataTemplate +Microsoft.Maui.Controls.DataTemplate.DataTemplate() -> void +Microsoft.Maui.Controls.DataTemplateSelector +Microsoft.Maui.Controls.DataTemplateSelector.DataTemplateSelector() -> void +Microsoft.Maui.Controls.DataTrigger +Microsoft.Maui.Controls.DateChangedEventArgs +Microsoft.Maui.Controls.DateChangedEventArgs.DateChangedEventArgs(System.DateTime oldDate, System.DateTime newDate) -> void +Microsoft.Maui.Controls.DateChangedEventArgs.NewDate.get -> System.DateTime +Microsoft.Maui.Controls.DateChangedEventArgs.OldDate.get -> System.DateTime +Microsoft.Maui.Controls.DatePicker +Microsoft.Maui.Controls.DatePicker.CharacterSpacing.get -> double +Microsoft.Maui.Controls.DatePicker.CharacterSpacing.set -> void +Microsoft.Maui.Controls.DatePicker.Date.get -> System.DateTime +Microsoft.Maui.Controls.DatePicker.Date.set -> void +Microsoft.Maui.Controls.DatePicker.DatePicker() -> void +Microsoft.Maui.Controls.DatePicker.DateSelected -> System.EventHandler +Microsoft.Maui.Controls.DatePicker.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.DatePicker.FontAttributes.set -> void +Microsoft.Maui.Controls.DatePicker.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.DatePicker.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.DatePicker.FontSize.get -> double +Microsoft.Maui.Controls.DatePicker.FontSize.set -> void +Microsoft.Maui.Controls.DatePicker.MaximumDate.get -> System.DateTime +Microsoft.Maui.Controls.DatePicker.MaximumDate.set -> void +Microsoft.Maui.Controls.DatePicker.MinimumDate.get -> System.DateTime +Microsoft.Maui.Controls.DatePicker.MinimumDate.set -> void +Microsoft.Maui.Controls.DefinitionCollection.Add(T item) -> void +Microsoft.Maui.Controls.DefinitionCollection.Clear() -> void +Microsoft.Maui.Controls.DefinitionCollection.Contains(T item) -> bool +Microsoft.Maui.Controls.DefinitionCollection.Count.get -> int +Microsoft.Maui.Controls.DefinitionCollection.IndexOf(T item) -> int +Microsoft.Maui.Controls.DefinitionCollection.Insert(int index, T item) -> void +Microsoft.Maui.Controls.DefinitionCollection.IsReadOnly.get -> bool +Microsoft.Maui.Controls.DefinitionCollection.ItemSizeChanged -> System.EventHandler +Microsoft.Maui.Controls.DefinitionCollection.Remove(T item) -> bool +Microsoft.Maui.Controls.DefinitionCollection.RemoveAt(int index) -> void +Microsoft.Maui.Controls.DefinitionCollection.this[int index].get -> T +Microsoft.Maui.Controls.DefinitionCollection.this[int index].set -> void +Microsoft.Maui.Controls.DependencyAttribute +Microsoft.Maui.Controls.DependencyFetchTarget +Microsoft.Maui.Controls.DependencyFetchTarget.GlobalInstance = 0 -> Microsoft.Maui.Controls.DependencyFetchTarget +Microsoft.Maui.Controls.DependencyFetchTarget.NewInstance = 1 -> Microsoft.Maui.Controls.DependencyFetchTarget +Microsoft.Maui.Controls.DependencyService +Microsoft.Maui.Controls.DesignMode +Microsoft.Maui.Controls.Device +Microsoft.Maui.Controls.Device.Styles +Microsoft.Maui.Controls.DeviceStateTrigger +Microsoft.Maui.Controls.DeviceStateTrigger.DeviceStateTrigger() -> void +Microsoft.Maui.Controls.DisplayDensityChangedEventArgs +Microsoft.Maui.Controls.DisplayDensityChangedEventArgs.DisplayDensity.get -> float +Microsoft.Maui.Controls.DisplayDensityChangedEventArgs.DisplayDensityChangedEventArgs(float displayDensity) -> void +Microsoft.Maui.Controls.DoubleCollection +Microsoft.Maui.Controls.DoubleCollection.DoubleCollection() -> void +Microsoft.Maui.Controls.DoubleCollectionConverter +Microsoft.Maui.Controls.DoubleCollectionConverter.DoubleCollectionConverter() -> void +Microsoft.Maui.Controls.DragEventArgs +Microsoft.Maui.Controls.DragEventArgs.AcceptedOperation.get -> Microsoft.Maui.Controls.DataPackageOperation +Microsoft.Maui.Controls.DragEventArgs.AcceptedOperation.set -> void +Microsoft.Maui.Controls.DragGestureRecognizer +Microsoft.Maui.Controls.DragGestureRecognizer.CanDrag.get -> bool +Microsoft.Maui.Controls.DragGestureRecognizer.CanDrag.set -> void +Microsoft.Maui.Controls.DragGestureRecognizer.DragGestureRecognizer() -> void +Microsoft.Maui.Controls.DragStartingEventArgs +Microsoft.Maui.Controls.DragStartingEventArgs.Cancel.get -> bool +Microsoft.Maui.Controls.DragStartingEventArgs.Cancel.set -> void +Microsoft.Maui.Controls.DragStartingEventArgs.DragStartingEventArgs() -> void +Microsoft.Maui.Controls.DragStartingEventArgs.Handled.get -> bool +Microsoft.Maui.Controls.DragStartingEventArgs.Handled.set -> void +Microsoft.Maui.Controls.DropCompletedEventArgs +Microsoft.Maui.Controls.DropCompletedEventArgs.DropCompletedEventArgs() -> void +Microsoft.Maui.Controls.DropEventArgs +Microsoft.Maui.Controls.DropEventArgs.Handled.get -> bool +Microsoft.Maui.Controls.DropEventArgs.Handled.set -> void +Microsoft.Maui.Controls.DropGestureRecognizer +Microsoft.Maui.Controls.DropGestureRecognizer.AllowDrop.get -> bool +Microsoft.Maui.Controls.DropGestureRecognizer.AllowDrop.set -> void +Microsoft.Maui.Controls.DropGestureRecognizer.DragLeave -> System.EventHandler +Microsoft.Maui.Controls.DropGestureRecognizer.DragOver -> System.EventHandler +Microsoft.Maui.Controls.DropGestureRecognizer.Drop -> System.EventHandler +Microsoft.Maui.Controls.DropGestureRecognizer.DropGestureRecognizer() -> void +Microsoft.Maui.Controls.Editor +Microsoft.Maui.Controls.Editor.AutoSize.get -> Microsoft.Maui.Controls.EditorAutoSizeOption +Microsoft.Maui.Controls.Editor.AutoSize.set -> void +Microsoft.Maui.Controls.Editor.Completed -> System.EventHandler +Microsoft.Maui.Controls.Editor.CursorPosition.get -> int +Microsoft.Maui.Controls.Editor.CursorPosition.set -> void +Microsoft.Maui.Controls.Editor.Editor() -> void +Microsoft.Maui.Controls.Editor.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.Editor.FontAttributes.set -> void +Microsoft.Maui.Controls.Editor.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.Editor.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.Editor.FontSize.get -> double +Microsoft.Maui.Controls.Editor.FontSize.set -> void +Microsoft.Maui.Controls.Editor.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Editor.HorizontalTextAlignment.set -> void +Microsoft.Maui.Controls.Editor.OnHorizontalTextAlignmentPropertyChanged(Microsoft.Maui.TextAlignment oldValue, Microsoft.Maui.TextAlignment newValue) -> void +Microsoft.Maui.Controls.Editor.SelectionLength.get -> int +Microsoft.Maui.Controls.Editor.SelectionLength.set -> void +Microsoft.Maui.Controls.Editor.SendCompleted() -> void +Microsoft.Maui.Controls.Editor.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Editor.VerticalTextAlignment.set -> void +Microsoft.Maui.Controls.EditorAutoSizeOption +Microsoft.Maui.Controls.EditorAutoSizeOption.Disabled = 0 -> Microsoft.Maui.Controls.EditorAutoSizeOption +Microsoft.Maui.Controls.EditorAutoSizeOption.TextChanges = 1 -> Microsoft.Maui.Controls.EditorAutoSizeOption +Microsoft.Maui.Controls.Effect +Microsoft.Maui.Controls.Effect.IsAttached.get -> bool +Microsoft.Maui.Controls.EffectiveFlowDirection +Microsoft.Maui.Controls.EffectiveFlowDirection.Explicit = 2 -> Microsoft.Maui.Controls.EffectiveFlowDirection +Microsoft.Maui.Controls.EffectiveFlowDirection.RightToLeft = 1 -> Microsoft.Maui.Controls.EffectiveFlowDirection +Microsoft.Maui.Controls.EffectiveVisualExtensions +Microsoft.Maui.Controls.Element +Microsoft.Maui.Controls.Element.ChildAdded -> System.EventHandler +Microsoft.Maui.Controls.Element.ChildRemoved -> System.EventHandler +Microsoft.Maui.Controls.Element.DescendantAdded -> System.EventHandler +Microsoft.Maui.Controls.Element.DescendantRemoved -> System.EventHandler +Microsoft.Maui.Controls.Element.Element() -> void +Microsoft.Maui.Controls.Element.HandlerChanged -> System.EventHandler +Microsoft.Maui.Controls.Element.HandlerChanging -> System.EventHandler +Microsoft.Maui.Controls.Element.Id.get -> System.Guid +Microsoft.Maui.Controls.Element.ParentChanged -> System.EventHandler +Microsoft.Maui.Controls.Element.ParentChanging -> System.EventHandler +Microsoft.Maui.Controls.ElementEventArgs +Microsoft.Maui.Controls.ElementTemplate +Microsoft.Maui.Controls.Entry +Microsoft.Maui.Controls.Entry.ClearButtonVisibility.get -> Microsoft.Maui.ClearButtonVisibility +Microsoft.Maui.Controls.Entry.ClearButtonVisibility.set -> void +Microsoft.Maui.Controls.Entry.Completed -> System.EventHandler +Microsoft.Maui.Controls.Entry.CursorPosition.get -> int +Microsoft.Maui.Controls.Entry.CursorPosition.set -> void +Microsoft.Maui.Controls.Entry.Entry() -> void +Microsoft.Maui.Controls.Entry.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.Entry.FontAttributes.set -> void +Microsoft.Maui.Controls.Entry.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.Entry.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.Entry.FontSize.get -> double +Microsoft.Maui.Controls.Entry.FontSize.set -> void +Microsoft.Maui.Controls.Entry.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Entry.HorizontalTextAlignment.set -> void +Microsoft.Maui.Controls.Entry.IsPassword.get -> bool +Microsoft.Maui.Controls.Entry.IsPassword.set -> void +Microsoft.Maui.Controls.Entry.ReturnType.get -> Microsoft.Maui.ReturnType +Microsoft.Maui.Controls.Entry.ReturnType.set -> void +Microsoft.Maui.Controls.Entry.SelectionLength.get -> int +Microsoft.Maui.Controls.Entry.SelectionLength.set -> void +Microsoft.Maui.Controls.Entry.SendCompleted() -> void +Microsoft.Maui.Controls.Entry.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Entry.VerticalTextAlignment.set -> void +Microsoft.Maui.Controls.EntryCell +Microsoft.Maui.Controls.EntryCell.Completed -> System.EventHandler +Microsoft.Maui.Controls.EntryCell.EntryCell() -> void +Microsoft.Maui.Controls.EntryCell.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.EntryCell.HorizontalTextAlignment.set -> void +Microsoft.Maui.Controls.EntryCell.SendCompleted() -> void +Microsoft.Maui.Controls.EntryCell.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.EntryCell.VerticalTextAlignment.set -> void +Microsoft.Maui.Controls.EventTrigger +Microsoft.Maui.Controls.EventTrigger.EventTrigger() -> void +Microsoft.Maui.Controls.ExportEffectAttribute +Microsoft.Maui.Controls.ExportFontAttribute +Microsoft.Maui.Controls.FileImageSource +Microsoft.Maui.Controls.FileImageSource.FileImageSource() -> void +Microsoft.Maui.Controls.FileImageSourceConverter +Microsoft.Maui.Controls.FileImageSourceConverter.FileImageSourceConverter() -> void +Microsoft.Maui.Controls.FlexLayout +Microsoft.Maui.Controls.FlexLayout.AlignContent.get -> Microsoft.Maui.Layouts.FlexAlignContent +Microsoft.Maui.Controls.FlexLayout.AlignContent.set -> void +Microsoft.Maui.Controls.FlexLayout.AlignItems.get -> Microsoft.Maui.Layouts.FlexAlignItems +Microsoft.Maui.Controls.FlexLayout.AlignItems.set -> void +Microsoft.Maui.Controls.FlexLayout.Direction.get -> Microsoft.Maui.Layouts.FlexDirection +Microsoft.Maui.Controls.FlexLayout.Direction.set -> void +Microsoft.Maui.Controls.FlexLayout.FlexLayout() -> void +Microsoft.Maui.Controls.FlexLayout.JustifyContent.get -> Microsoft.Maui.Layouts.FlexJustify +Microsoft.Maui.Controls.FlexLayout.JustifyContent.set -> void +Microsoft.Maui.Controls.FlexLayout.Layout(double width, double height) -> void +Microsoft.Maui.Controls.FlexLayout.Position.get -> Microsoft.Maui.Layouts.FlexPosition +Microsoft.Maui.Controls.FlexLayout.Position.set -> void +Microsoft.Maui.Controls.FlexLayout.Wrap.get -> Microsoft.Maui.Layouts.FlexWrap +Microsoft.Maui.Controls.FlexLayout.Wrap.set -> void +Microsoft.Maui.Controls.FlowDirectionConverter +Microsoft.Maui.Controls.FlowDirectionConverter.FlowDirectionConverter() -> void +Microsoft.Maui.Controls.FlyoutBase +Microsoft.Maui.Controls.FlyoutBase.FlyoutBase() -> void +Microsoft.Maui.Controls.FlyoutDisplayOptions +Microsoft.Maui.Controls.FlyoutDisplayOptions.AsMultipleItems = 1 -> Microsoft.Maui.Controls.FlyoutDisplayOptions +Microsoft.Maui.Controls.FlyoutDisplayOptions.AsSingleItem = 0 -> Microsoft.Maui.Controls.FlyoutDisplayOptions +Microsoft.Maui.Controls.FlyoutHeaderBehavior +Microsoft.Maui.Controls.FlyoutHeaderBehavior.CollapseOnScroll = 3 -> Microsoft.Maui.Controls.FlyoutHeaderBehavior +Microsoft.Maui.Controls.FlyoutHeaderBehavior.Default = 0 -> Microsoft.Maui.Controls.FlyoutHeaderBehavior +Microsoft.Maui.Controls.FlyoutHeaderBehavior.Fixed = 1 -> Microsoft.Maui.Controls.FlyoutHeaderBehavior +Microsoft.Maui.Controls.FlyoutHeaderBehavior.Scroll = 2 -> Microsoft.Maui.Controls.FlyoutHeaderBehavior +Microsoft.Maui.Controls.FlyoutItem +Microsoft.Maui.Controls.FlyoutItem.FlyoutItem() -> void +Microsoft.Maui.Controls.FlyoutLayoutBehavior +Microsoft.Maui.Controls.FlyoutLayoutBehavior.Default = 0 -> Microsoft.Maui.Controls.FlyoutLayoutBehavior +Microsoft.Maui.Controls.FlyoutLayoutBehavior.Popover = 3 -> Microsoft.Maui.Controls.FlyoutLayoutBehavior +Microsoft.Maui.Controls.FlyoutLayoutBehavior.Split = 2 -> Microsoft.Maui.Controls.FlyoutLayoutBehavior +Microsoft.Maui.Controls.FlyoutLayoutBehavior.SplitOnLandscape = 1 -> Microsoft.Maui.Controls.FlyoutLayoutBehavior +Microsoft.Maui.Controls.FlyoutLayoutBehavior.SplitOnPortrait = 4 -> Microsoft.Maui.Controls.FlyoutLayoutBehavior +Microsoft.Maui.Controls.FlyoutPage +Microsoft.Maui.Controls.FlyoutPage.BackButtonPressed -> System.EventHandler +Microsoft.Maui.Controls.FlyoutPage.FlyoutLayoutBehavior.get -> Microsoft.Maui.Controls.FlyoutLayoutBehavior +Microsoft.Maui.Controls.FlyoutPage.FlyoutLayoutBehavior.set -> void +Microsoft.Maui.Controls.FlyoutPage.FlyoutPage() -> void +Microsoft.Maui.Controls.FlyoutPage.IsGestureEnabled.get -> bool +Microsoft.Maui.Controls.FlyoutPage.IsGestureEnabled.set -> void +Microsoft.Maui.Controls.FlyoutPage.IsPresented.get -> bool +Microsoft.Maui.Controls.FlyoutPage.IsPresented.set -> void +Microsoft.Maui.Controls.FlyoutPage.IsPresentedChanged -> System.EventHandler +Microsoft.Maui.Controls.FlyoutPage.UpdateFlyoutLayoutBehavior() -> void +Microsoft.Maui.Controls.FocusEventArgs +Microsoft.Maui.Controls.FocusEventArgs.IsFocused.get -> bool +Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.FontAttributes.Bold = 1 -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.FontAttributes.Italic = 2 -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.FontAttributes.None = 0 -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.FontAttributesConverter +Microsoft.Maui.Controls.FontAttributesConverter.FontAttributesConverter() -> void +Microsoft.Maui.Controls.FontExtensions +Microsoft.Maui.Controls.FontImageSource +Microsoft.Maui.Controls.FontImageSource.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.FontImageSource.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.FontImageSource.FontImageSource() -> void +Microsoft.Maui.Controls.FontImageSource.Size.get -> double +Microsoft.Maui.Controls.FontImageSource.Size.set -> void +Microsoft.Maui.Controls.FontSizeConverter +Microsoft.Maui.Controls.FontSizeConverter.FontSizeConverter() -> void +Microsoft.Maui.Controls.FormattedString +Microsoft.Maui.Controls.FormattedString.FormattedString() -> void +Microsoft.Maui.Controls.Frame +Microsoft.Maui.Controls.Frame.CornerRadius.get -> float +Microsoft.Maui.Controls.Frame.CornerRadius.set -> void +Microsoft.Maui.Controls.Frame.Frame() -> void +Microsoft.Maui.Controls.Frame.HasShadow.get -> bool +Microsoft.Maui.Controls.Frame.HasShadow.set -> void +Microsoft.Maui.Controls.GestureElement +Microsoft.Maui.Controls.GestureElement.GestureElement() -> void +Microsoft.Maui.Controls.GestureRecognizer +Microsoft.Maui.Controls.GestureRecognizer.GestureRecognizer() -> void +Microsoft.Maui.Controls.GestureState +Microsoft.Maui.Controls.GestureState.Began = 0 -> Microsoft.Maui.Controls.GestureState +Microsoft.Maui.Controls.GestureState.Cancelled = 4 -> Microsoft.Maui.Controls.GestureState +Microsoft.Maui.Controls.GestureState.Ended = 2 -> Microsoft.Maui.Controls.GestureState +Microsoft.Maui.Controls.GestureState.Failed = 3 -> Microsoft.Maui.Controls.GestureState +Microsoft.Maui.Controls.GestureState.Possible = 5 -> Microsoft.Maui.Controls.GestureState +Microsoft.Maui.Controls.GestureState.Update = 1 -> Microsoft.Maui.Controls.GestureState +Microsoft.Maui.Controls.GradientBrush +Microsoft.Maui.Controls.GradientBrush.GradientBrush() -> void +Microsoft.Maui.Controls.GradientBrush.InvalidateGradientBrushRequested -> System.EventHandler +Microsoft.Maui.Controls.GradientStop +Microsoft.Maui.Controls.GradientStop.GradientStop() -> void +Microsoft.Maui.Controls.GradientStop.Offset.get -> float +Microsoft.Maui.Controls.GradientStop.Offset.set -> void +Microsoft.Maui.Controls.GradientStopCollection +Microsoft.Maui.Controls.GradientStopCollection.GradientStopCollection() -> void +Microsoft.Maui.Controls.GraphicsView +Microsoft.Maui.Controls.GraphicsView.CancelInteraction -> System.EventHandler +Microsoft.Maui.Controls.GraphicsView.DragInteraction -> System.EventHandler +Microsoft.Maui.Controls.GraphicsView.EndHoverInteraction -> System.EventHandler +Microsoft.Maui.Controls.GraphicsView.EndInteraction -> System.EventHandler +Microsoft.Maui.Controls.GraphicsView.GraphicsView() -> void +Microsoft.Maui.Controls.GraphicsView.Invalidate() -> void +Microsoft.Maui.Controls.GraphicsView.MoveHoverInteraction -> System.EventHandler +Microsoft.Maui.Controls.GraphicsView.StartHoverInteraction -> System.EventHandler +Microsoft.Maui.Controls.GraphicsView.StartInteraction -> System.EventHandler +Microsoft.Maui.Controls.Grid +Microsoft.Maui.Controls.Grid.ColumnSpacing.get -> double +Microsoft.Maui.Controls.Grid.ColumnSpacing.set -> void +Microsoft.Maui.Controls.Grid.Grid() -> void +Microsoft.Maui.Controls.Grid.RowSpacing.get -> double +Microsoft.Maui.Controls.Grid.RowSpacing.set -> void +Microsoft.Maui.Controls.GridExtensions +Microsoft.Maui.Controls.GridItemsLayout +Microsoft.Maui.Controls.GridItemsLayout.GridItemsLayout(int span, Microsoft.Maui.Controls.ItemsLayoutOrientation orientation) -> void +Microsoft.Maui.Controls.GridItemsLayout.GridItemsLayout(Microsoft.Maui.Controls.ItemsLayoutOrientation orientation) -> void +Microsoft.Maui.Controls.GridItemsLayout.HorizontalItemSpacing.get -> double +Microsoft.Maui.Controls.GridItemsLayout.HorizontalItemSpacing.set -> void +Microsoft.Maui.Controls.GridItemsLayout.Span.get -> int +Microsoft.Maui.Controls.GridItemsLayout.Span.set -> void +Microsoft.Maui.Controls.GridItemsLayout.VerticalItemSpacing.get -> double +Microsoft.Maui.Controls.GridItemsLayout.VerticalItemSpacing.set -> void +Microsoft.Maui.Controls.GridLengthTypeConverter +Microsoft.Maui.Controls.GridLengthTypeConverter.GridLengthTypeConverter() -> void +Microsoft.Maui.Controls.GroupableItemsView +Microsoft.Maui.Controls.GroupableItemsView.GroupableItemsView() -> void +Microsoft.Maui.Controls.GroupableItemsView.IsGrouped.get -> bool +Microsoft.Maui.Controls.GroupableItemsView.IsGrouped.set -> void +Microsoft.Maui.Controls.HandlerAttribute +Microsoft.Maui.Controls.HandlerAttribute.Priority.get -> short +Microsoft.Maui.Controls.HandlerAttribute.Priority.set -> void +Microsoft.Maui.Controls.HandlerChangingEventArgs +Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler +Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler.CarouselViewHandler() -> void +Microsoft.Maui.Controls.Handlers.Items.CollectionViewHandler +Microsoft.Maui.Controls.Handlers.Items.CollectionViewHandler.CollectionViewHandler() -> void +Microsoft.Maui.Controls.Handlers.Items.GroupableItemsViewHandler.GroupableItemsViewHandler() -> void +Microsoft.Maui.Controls.Handlers.Items.ItemsViewHandler.ItemsViewHandler() -> void +Microsoft.Maui.Controls.Handlers.Items.ReorderableItemsViewHandler.ReorderableItemsViewHandler() -> void +Microsoft.Maui.Controls.Handlers.Items.SelectableItemsViewHandler.SelectableItemsViewHandler() -> void +Microsoft.Maui.Controls.Handlers.Items.StructuredItemsViewHandler.StructuredItemsViewHandler() -> void +Microsoft.Maui.Controls.Handlers.LineHandler +Microsoft.Maui.Controls.Handlers.LineHandler.LineHandler() -> void +Microsoft.Maui.Controls.Handlers.PathHandler +Microsoft.Maui.Controls.Handlers.PathHandler.PathHandler() -> void +Microsoft.Maui.Controls.Handlers.PolygonHandler +Microsoft.Maui.Controls.Handlers.PolygonHandler.PolygonHandler() -> void +Microsoft.Maui.Controls.Handlers.PolylineHandler +Microsoft.Maui.Controls.Handlers.PolylineHandler.PolylineHandler() -> void +Microsoft.Maui.Controls.Handlers.RectangleHandler +Microsoft.Maui.Controls.Handlers.RectangleHandler.RectangleHandler() -> void +Microsoft.Maui.Controls.Handlers.RoundRectangleHandler +Microsoft.Maui.Controls.Handlers.RoundRectangleHandler.RoundRectangleHandler() -> void +Microsoft.Maui.Controls.HorizontalStackLayout +Microsoft.Maui.Controls.HorizontalStackLayout.HorizontalStackLayout() -> void +Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions +Microsoft.Maui.Controls.Hosting.IEffectsBuilder +Microsoft.Maui.Controls.HtmlWebViewSource +Microsoft.Maui.Controls.HtmlWebViewSource.HtmlWebViewSource() -> void +Microsoft.Maui.Controls.IAnimatable +Microsoft.Maui.Controls.IAnimatable.BatchBegin() -> void +Microsoft.Maui.Controls.IAnimatable.BatchCommit() -> void +Microsoft.Maui.Controls.IAppearanceObserver +Microsoft.Maui.Controls.IAppIndexingProvider +Microsoft.Maui.Controls.IApplicationController +Microsoft.Maui.Controls.IAppLinkEntry +Microsoft.Maui.Controls.IAppLinkEntry.IsLinkActive.get -> bool +Microsoft.Maui.Controls.IAppLinkEntry.IsLinkActive.set -> void +Microsoft.Maui.Controls.IAppLinks +Microsoft.Maui.Controls.IBindableLayout +Microsoft.Maui.Controls.IBorderElement +Microsoft.Maui.Controls.IBorderElement.BorderWidth.get -> double +Microsoft.Maui.Controls.IBorderElement.BorderWidthDefaultValue.get -> double +Microsoft.Maui.Controls.IBorderElement.CornerRadius.get -> int +Microsoft.Maui.Controls.IBorderElement.CornerRadiusDefaultValue.get -> int +Microsoft.Maui.Controls.IBorderElement.IsBackgroundColorSet() -> bool +Microsoft.Maui.Controls.IBorderElement.IsBackgroundSet() -> bool +Microsoft.Maui.Controls.IBorderElement.IsBorderColorSet() -> bool +Microsoft.Maui.Controls.IBorderElement.IsBorderWidthSet() -> bool +Microsoft.Maui.Controls.IBorderElement.IsCornerRadiusSet() -> bool +Microsoft.Maui.Controls.IButtonController +Microsoft.Maui.Controls.IButtonController.SendClicked() -> void +Microsoft.Maui.Controls.IButtonController.SendPressed() -> void +Microsoft.Maui.Controls.IButtonController.SendReleased() -> void +Microsoft.Maui.Controls.ICellController +Microsoft.Maui.Controls.ICellController.ForceUpdateSizeRequested -> System.EventHandler +Microsoft.Maui.Controls.ICellController.SendAppearing() -> void +Microsoft.Maui.Controls.ICellController.SendDisappearing() -> void +Microsoft.Maui.Controls.IConfigPlatform +Microsoft.Maui.Controls.IDecorableTextElement +Microsoft.Maui.Controls.IDecorableTextElement.TextDecorations.get -> Microsoft.Maui.TextDecorations +Microsoft.Maui.Controls.IDecorableTextElement.TextDecorations.set -> void +Microsoft.Maui.Controls.IDefinition +Microsoft.Maui.Controls.IDefinition.SizeChanged -> System.EventHandler +Microsoft.Maui.Controls.IEditorController +Microsoft.Maui.Controls.IEditorController.SendCompleted() -> void +Microsoft.Maui.Controls.IEffectControlProvider +Microsoft.Maui.Controls.IElementController +Microsoft.Maui.Controls.IElementExtensions +Microsoft.Maui.Controls.IEntryCellController +Microsoft.Maui.Controls.IEntryCellController.SendCompleted() -> void +Microsoft.Maui.Controls.IEntryController +Microsoft.Maui.Controls.IEntryController.SendCompleted() -> void +Microsoft.Maui.Controls.IExtendedTypeConverter +Microsoft.Maui.Controls.IFlyoutBehaviorObserver +Microsoft.Maui.Controls.IFlyoutBehaviorObserver.OnFlyoutBehaviorChanged(Microsoft.Maui.FlyoutBehavior behavior) -> void +Microsoft.Maui.Controls.IFlyoutPageController +Microsoft.Maui.Controls.IFlyoutPageController.BackButtonPressed -> System.EventHandler +Microsoft.Maui.Controls.IFlyoutPageController.CanChangeIsPresented.get -> bool +Microsoft.Maui.Controls.IFlyoutPageController.CanChangeIsPresented.set -> void +Microsoft.Maui.Controls.IFlyoutPageController.DetailBounds.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.IFlyoutPageController.DetailBounds.set -> void +Microsoft.Maui.Controls.IFlyoutPageController.FlyoutBounds.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.IFlyoutPageController.FlyoutBounds.set -> void +Microsoft.Maui.Controls.IFlyoutPageController.ShouldShowSplitMode.get -> bool +Microsoft.Maui.Controls.IFlyoutPageController.UpdateFlyoutLayoutBehavior() -> void +Microsoft.Maui.Controls.IGestureRecognizer +Microsoft.Maui.Controls.IGestureRecognizers +Microsoft.Maui.Controls.IGridController +Microsoft.Maui.Controls.IGridController.InvalidateMeasureInernalNonVirtual(Microsoft.Maui.Controls.Internals.InvalidationTrigger trigger) -> void +Microsoft.Maui.Controls.IImageController +Microsoft.Maui.Controls.IImageController.GetLoadAsAnimation() -> bool +Microsoft.Maui.Controls.IImageController.SetIsLoading(bool isLoading) -> void +Microsoft.Maui.Controls.IImageElement +Microsoft.Maui.Controls.IImageElement.Aspect.get -> Microsoft.Maui.Aspect +Microsoft.Maui.Controls.IImageElement.IsAnimationPlaying.get -> bool +Microsoft.Maui.Controls.IImageElement.IsLoading.get -> bool +Microsoft.Maui.Controls.IImageElement.IsOpaque.get -> bool +Microsoft.Maui.Controls.IImageElement.RaiseImageSourcePropertyChanged() -> void +Microsoft.Maui.Controls.IItemsLayout +Microsoft.Maui.Controls.IItemViewController +Microsoft.Maui.Controls.IItemViewController.Count.get -> int +Microsoft.Maui.Controls.ILayout +Microsoft.Maui.Controls.ILayout.LayoutChanged -> System.EventHandler +Microsoft.Maui.Controls.ILayoutController +Microsoft.Maui.Controls.ILayoutManagerFactory +Microsoft.Maui.Controls.IListProxy +Microsoft.Maui.Controls.IListProxy.CollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.IListViewController +Microsoft.Maui.Controls.IListViewController.CachingStrategy.get -> Microsoft.Maui.Controls.ListViewCachingStrategy +Microsoft.Maui.Controls.IListViewController.RefreshAllowed.get -> bool +Microsoft.Maui.Controls.IListViewController.ScrollToRequested -> System.EventHandler +Microsoft.Maui.Controls.IListViewController.SendRefreshing() -> void +Microsoft.Maui.Controls.Image +Microsoft.Maui.Controls.Image.Aspect.get -> Microsoft.Maui.Aspect +Microsoft.Maui.Controls.Image.Aspect.set -> void +Microsoft.Maui.Controls.Image.Image() -> void +Microsoft.Maui.Controls.Image.IsAnimationPlaying.get -> bool +Microsoft.Maui.Controls.Image.IsAnimationPlaying.set -> void +Microsoft.Maui.Controls.Image.IsLoading.get -> bool +Microsoft.Maui.Controls.Image.IsOpaque.get -> bool +Microsoft.Maui.Controls.Image.IsOpaque.set -> void +Microsoft.Maui.Controls.ImageButton +Microsoft.Maui.Controls.ImageButton.Aspect.get -> Microsoft.Maui.Aspect +Microsoft.Maui.Controls.ImageButton.Aspect.set -> void +Microsoft.Maui.Controls.ImageButton.BorderWidth.get -> double +Microsoft.Maui.Controls.ImageButton.BorderWidth.set -> void +Microsoft.Maui.Controls.ImageButton.Clicked -> System.EventHandler +Microsoft.Maui.Controls.ImageButton.CornerRadius.get -> int +Microsoft.Maui.Controls.ImageButton.CornerRadius.set -> void +Microsoft.Maui.Controls.ImageButton.ImageButton() -> void +Microsoft.Maui.Controls.ImageButton.IsLoading.get -> bool +Microsoft.Maui.Controls.ImageButton.IsOpaque.get -> bool +Microsoft.Maui.Controls.ImageButton.IsOpaque.set -> void +Microsoft.Maui.Controls.ImageButton.IsPressed.get -> bool +Microsoft.Maui.Controls.ImageButton.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.ImageButton.Padding.set -> void +Microsoft.Maui.Controls.ImageButton.Pressed -> System.EventHandler +Microsoft.Maui.Controls.ImageButton.PropagateUpClicked() -> void +Microsoft.Maui.Controls.ImageButton.PropagateUpPressed() -> void +Microsoft.Maui.Controls.ImageButton.PropagateUpReleased() -> void +Microsoft.Maui.Controls.ImageButton.RaiseImageSourcePropertyChanged() -> void +Microsoft.Maui.Controls.ImageButton.Released -> System.EventHandler +Microsoft.Maui.Controls.ImageButton.SendClicked() -> void +Microsoft.Maui.Controls.ImageButton.SendPressed() -> void +Microsoft.Maui.Controls.ImageButton.SendReleased() -> void +Microsoft.Maui.Controls.ImageButton.SetIsLoading(bool isLoading) -> void +Microsoft.Maui.Controls.ImageButton.SetIsPressed(bool isPressed) -> void +Microsoft.Maui.Controls.ImageCell +Microsoft.Maui.Controls.ImageCell.ImageCell() -> void +Microsoft.Maui.Controls.ImageSource +Microsoft.Maui.Controls.ImageSource.ImageSource() -> void +Microsoft.Maui.Controls.ImageSource.OnSourceChanged() -> void +Microsoft.Maui.Controls.ImageSourceConverter +Microsoft.Maui.Controls.ImageSourceConverter.ImageSourceConverter() -> void +Microsoft.Maui.Controls.IMenuItemController +Microsoft.Maui.Controls.IMenuItemController.Activate() -> void +Microsoft.Maui.Controls.IMenuItemController.IsEnabled.get -> bool +Microsoft.Maui.Controls.IMenuItemController.IsEnabled.set -> void +Microsoft.Maui.Controls.IMessagingCenter +Microsoft.Maui.Controls.IMultiPageController +Microsoft.Maui.Controls.IMultiPageController.GetPageByIndex(int index) -> T +Microsoft.Maui.Controls.IMultiValueConverter +Microsoft.Maui.Controls.INavigation +Microsoft.Maui.Controls.INavigationPageController +Microsoft.Maui.Controls.INavigationPageController.InsertPageBeforeRequested -> System.EventHandler +Microsoft.Maui.Controls.INavigationPageController.PopRequested -> System.EventHandler +Microsoft.Maui.Controls.INavigationPageController.PopToRootRequested -> System.EventHandler +Microsoft.Maui.Controls.INavigationPageController.PushRequested -> System.EventHandler +Microsoft.Maui.Controls.INavigationPageController.RemovePageRequested -> System.EventHandler +Microsoft.Maui.Controls.INavigationPageController.StackDepth.get -> int +Microsoft.Maui.Controls.IndicatorShape +Microsoft.Maui.Controls.IndicatorShape.Circle = 0 -> Microsoft.Maui.Controls.IndicatorShape +Microsoft.Maui.Controls.IndicatorShape.Square = 1 -> Microsoft.Maui.Controls.IndicatorShape +Microsoft.Maui.Controls.IndicatorView +Microsoft.Maui.Controls.IndicatorView.Count.get -> int +Microsoft.Maui.Controls.IndicatorView.Count.set -> void +Microsoft.Maui.Controls.IndicatorView.HideSingle.get -> bool +Microsoft.Maui.Controls.IndicatorView.HideSingle.set -> void +Microsoft.Maui.Controls.IndicatorView.IndicatorSize.get -> double +Microsoft.Maui.Controls.IndicatorView.IndicatorSize.set -> void +Microsoft.Maui.Controls.IndicatorView.IndicatorsShape.get -> Microsoft.Maui.Controls.IndicatorShape +Microsoft.Maui.Controls.IndicatorView.IndicatorsShape.set -> void +Microsoft.Maui.Controls.IndicatorView.IndicatorView() -> void +Microsoft.Maui.Controls.IndicatorView.MaximumVisible.get -> int +Microsoft.Maui.Controls.IndicatorView.MaximumVisible.set -> void +Microsoft.Maui.Controls.IndicatorView.Position.get -> int +Microsoft.Maui.Controls.IndicatorView.Position.set -> void +Microsoft.Maui.Controls.InitializationFlags +Microsoft.Maui.Controls.InitializationFlags.DisableCss = 1 -> Microsoft.Maui.Controls.InitializationFlags +Microsoft.Maui.Controls.InitializationFlags.SkipRenderers = 2 -> Microsoft.Maui.Controls.InitializationFlags +Microsoft.Maui.Controls.InputView +Microsoft.Maui.Controls.InputView.CharacterSpacing.get -> double +Microsoft.Maui.Controls.InputView.CharacterSpacing.set -> void +Microsoft.Maui.Controls.InputView.IsReadOnly.get -> bool +Microsoft.Maui.Controls.InputView.IsReadOnly.set -> void +Microsoft.Maui.Controls.InputView.IsSpellCheckEnabled.get -> bool +Microsoft.Maui.Controls.InputView.IsSpellCheckEnabled.set -> void +Microsoft.Maui.Controls.InputView.MaxLength.get -> int +Microsoft.Maui.Controls.InputView.MaxLength.set -> void +Microsoft.Maui.Controls.InputView.OnTextTransformChanged(Microsoft.Maui.TextTransform oldValue, Microsoft.Maui.TextTransform newValue) -> void +Microsoft.Maui.Controls.InputView.TextChanged -> System.EventHandler +Microsoft.Maui.Controls.InputView.TextTransform.get -> Microsoft.Maui.TextTransform +Microsoft.Maui.Controls.InputView.TextTransform.set -> void +Microsoft.Maui.Controls.Internals.ActionSheetArguments +Microsoft.Maui.Controls.Internals.ActionSheetArguments.FlowDirection.get -> Microsoft.Maui.FlowDirection +Microsoft.Maui.Controls.Internals.ActionSheetArguments.FlowDirection.set -> void +Microsoft.Maui.Controls.Internals.AlertArguments +Microsoft.Maui.Controls.Internals.AlertArguments.FlowDirection.get -> Microsoft.Maui.FlowDirection +Microsoft.Maui.Controls.Internals.AlertArguments.FlowDirection.set -> void +Microsoft.Maui.Controls.Internals.AlertArguments.SetResult(bool result) -> void +Microsoft.Maui.Controls.Internals.AsyncValue +Microsoft.Maui.Controls.Internals.AsyncValue.IsRunning.get -> bool +Microsoft.Maui.Controls.Internals.AsyncValue.IsRunning.set -> void +Microsoft.Maui.Controls.Internals.AsyncValue.PropertyChanged -> System.ComponentModel.PropertyChangedEventHandler +Microsoft.Maui.Controls.Internals.AsyncValue.Value.get -> T +Microsoft.Maui.Controls.Internals.AsyncValueExtensions +Microsoft.Maui.Controls.Internals.AutoId +Microsoft.Maui.Controls.Internals.AutoId.AutoId() -> void +Microsoft.Maui.Controls.Internals.AutoId.Increment() -> int +Microsoft.Maui.Controls.Internals.AutoId.Value.get -> int +Microsoft.Maui.Controls.Internals.CellExtensions +Microsoft.Maui.Controls.Internals.ContentPageEx +Microsoft.Maui.Controls.Internals.DataTemplateExtensions +Microsoft.Maui.Controls.Internals.DependencyResolver +Microsoft.Maui.Controls.Internals.DynamicResource +Microsoft.Maui.Controls.Internals.EffectUtilities +Microsoft.Maui.Controls.Internals.EvalRequested +Microsoft.Maui.Controls.Internals.EvaluateJavaScriptDelegate +Microsoft.Maui.Controls.Internals.EventArg +Microsoft.Maui.Controls.Internals.EventArg.Data.get -> T +Microsoft.Maui.Controls.Internals.EventArg.EventArg(T data) -> void +Microsoft.Maui.Controls.Internals.ExpressionSearch +Microsoft.Maui.Controls.Internals.ExpressionSearch.ExpressionSearch() -> void +Microsoft.Maui.Controls.Internals.GIFBitmap +Microsoft.Maui.Controls.Internals.GIFBitmap.BackgroundColor.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmap.DataPosition.get -> long +Microsoft.Maui.Controls.Internals.GIFBitmap.Delay.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmap.Dispose.get -> Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod +Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod +Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod.LeaveInPlace = 1 -> Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod +Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod.NoAction = 0 -> Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod +Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod.RestoreToBackground = 2 -> Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod +Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod.RestoreToPrevious = 3 -> Microsoft.Maui.Controls.Internals.GIFBitmap.DisposeMethod +Microsoft.Maui.Controls.Internals.GIFBitmap.IsInterlaced.get -> bool +Microsoft.Maui.Controls.Internals.GIFBitmap.IsTransparent.get -> bool +Microsoft.Maui.Controls.Internals.GIFBitmap.LoopCount.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmap.Rect +Microsoft.Maui.Controls.Internals.GIFBitmap.Rect.Height.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmap.Rect.Rect(int x, int y, int width, int height) -> void +Microsoft.Maui.Controls.Internals.GIFBitmap.Rect.Width.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmap.Rect.X.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmap.Rect.Y.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmap.TransparencyIndex.get -> int +Microsoft.Maui.Controls.Internals.GIFBitmapDecoder +Microsoft.Maui.Controls.Internals.GIFBitmapDecoder.GIFBitmapDecoder() -> void +Microsoft.Maui.Controls.Internals.GIFColorTable +Microsoft.Maui.Controls.Internals.GIFColorTable.ResetTransparency() -> void +Microsoft.Maui.Controls.Internals.GIFColorTable.SetTransparency(int transparencyIndex) -> void +Microsoft.Maui.Controls.Internals.GIFDecoderFormatException +Microsoft.Maui.Controls.Internals.GIFDecoderFormatException.GIFDecoderFormatException() -> void +Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader +Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.CurrentBlockSize.get -> int +Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.CurrentPosition.get -> long +Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.Read() -> int +Microsoft.Maui.Controls.Internals.GIFDecoderStreamReader.ReadShort() -> int +Microsoft.Maui.Controls.Internals.GIFHeader +Microsoft.Maui.Controls.Internals.GIFHeader.BackgroundColor.get -> int +Microsoft.Maui.Controls.Internals.GIFHeader.BackgroundColorIndex.get -> int +Microsoft.Maui.Controls.Internals.GIFHeader.Height.get -> int +Microsoft.Maui.Controls.Internals.GIFHeader.IsGIFHeader.get -> bool +Microsoft.Maui.Controls.Internals.GIFHeader.PixelAspectRatio.get -> int +Microsoft.Maui.Controls.Internals.GIFHeader.Width.get -> int +Microsoft.Maui.Controls.Internals.GIFImageParser +Microsoft.Maui.Controls.Internals.GIFImageParser.GIFImageParser() -> void +Microsoft.Maui.Controls.Internals.IDataTemplateController +Microsoft.Maui.Controls.Internals.IDataTemplateController.Id.get -> int +Microsoft.Maui.Controls.Internals.IDynamicResourceHandler +Microsoft.Maui.Controls.Internals.IExpressionSearch +Microsoft.Maui.Controls.Internals.IFontElement +Microsoft.Maui.Controls.Internals.IFontElement.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.Internals.IFontElement.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.Internals.IFontElement.FontSize.get -> double +Microsoft.Maui.Controls.Internals.IFontElement.FontSizeDefaultValueCreator() -> double +Microsoft.Maui.Controls.Internals.IFontElement.OnFontAttributesChanged(Microsoft.Maui.Controls.FontAttributes oldValue, Microsoft.Maui.Controls.FontAttributes newValue) -> void +Microsoft.Maui.Controls.Internals.IFontElement.OnFontAutoScalingEnabledChanged(bool oldValue, bool newValue) -> void +Microsoft.Maui.Controls.Internals.IFontElement.OnFontSizeChanged(double oldValue, double newValue) -> void +Microsoft.Maui.Controls.Internals.IFontNamedSizeService +Microsoft.Maui.Controls.Internals.IGestureController +Microsoft.Maui.Controls.Internals.INameScope +Microsoft.Maui.Controls.Internals.INavigationProxy +Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.InvalidationTrigger.HorizontalOptionsChanged = 2 -> Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.InvalidationTrigger.MarginChanged = 32 -> Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.InvalidationTrigger.MeasureChanged = 1 -> Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.InvalidationTrigger.RendererReady = 16 -> Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.InvalidationTrigger.SizeRequestChanged = 8 -> Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.InvalidationTrigger.Undefined = 0 -> Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.InvalidationTrigger.VerticalOptionsChanged = 4 -> Microsoft.Maui.Controls.Internals.InvalidationTrigger +Microsoft.Maui.Controls.Internals.IPerformanceProvider +Microsoft.Maui.Controls.Internals.IPlatformSizeService +Microsoft.Maui.Controls.Internals.IResourceDictionary +Microsoft.Maui.Controls.Internals.IResourceDictionary.ValuesChanged -> System.EventHandler +Microsoft.Maui.Controls.Internals.ISpatialElement +Microsoft.Maui.Controls.Internals.ISpatialElement.Region.get -> Microsoft.Maui.Controls.Region +Microsoft.Maui.Controls.Internals.ISpatialElement.Region.set -> void +Microsoft.Maui.Controls.Internals.ISystemResourcesProvider +Microsoft.Maui.Controls.Internals.NameScope +Microsoft.Maui.Controls.Internals.NameScope.NameScope() -> void +Microsoft.Maui.Controls.Internals.NavigationProxy +Microsoft.Maui.Controls.Internals.NavigationProxy.NavigationProxy() -> void +Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs +Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.Animated.get -> bool +Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.Animated.set -> void +Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.RequestType.get -> Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NavigationRequestedEventArgs.RequestType.set -> void +Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NavigationRequestType.Insert = 4 -> Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NavigationRequestType.Pop = 2 -> Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NavigationRequestType.PopToRoot = 3 -> Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NavigationRequestType.Push = 1 -> Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NavigationRequestType.Remove = 5 -> Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NavigationRequestType.Unknown = 0 -> Microsoft.Maui.Controls.Internals.NavigationRequestType +Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx +Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.Count.get -> int +Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsEx.NotifyCollectionChangedEventArgsEx(int count, System.Collections.Specialized.NotifyCollectionChangedAction action) -> void +Microsoft.Maui.Controls.Internals.NotifyCollectionChangedEventArgsExtensions +Microsoft.Maui.Controls.Internals.PageExtensions +Microsoft.Maui.Controls.Internals.Performance +Microsoft.Maui.Controls.Internals.Performance.Performance() -> void +Microsoft.Maui.Controls.Internals.PreserveAttribute +Microsoft.Maui.Controls.Internals.PreserveAttribute.AllMembers -> bool +Microsoft.Maui.Controls.Internals.PreserveAttribute.Conditional -> bool +Microsoft.Maui.Controls.Internals.PreserveAttribute.PreserveAttribute() -> void +Microsoft.Maui.Controls.Internals.PreserveAttribute.PreserveAttribute(bool allMembers, bool conditional) -> void +Microsoft.Maui.Controls.Internals.Profile +Microsoft.Maui.Controls.Internals.Profile.Datum +Microsoft.Maui.Controls.Internals.Profile.Datum.Datum() -> void +Microsoft.Maui.Controls.Internals.Profile.Datum.Depth -> int +Microsoft.Maui.Controls.Internals.Profile.Datum.Line -> int +Microsoft.Maui.Controls.Internals.Profile.Datum.Ticks -> long +Microsoft.Maui.Controls.Internals.Profile.Dispose() -> void +Microsoft.Maui.Controls.Internals.Profile.Profile() -> void +Microsoft.Maui.Controls.Internals.ProfileDatum +Microsoft.Maui.Controls.Internals.ProfileDatum.Depth -> int +Microsoft.Maui.Controls.Internals.ProfileDatum.Line -> int +Microsoft.Maui.Controls.Internals.ProfileDatum.ProfileDatum() -> void +Microsoft.Maui.Controls.Internals.ProfileDatum.SubTicks -> long +Microsoft.Maui.Controls.Internals.ProfileDatum.Ticks -> long +Microsoft.Maui.Controls.Internals.PromptArguments +Microsoft.Maui.Controls.Internals.PromptArguments.MaxLength.get -> int +Microsoft.Maui.Controls.Internals.PropertyPropagationExtensions +Microsoft.Maui.Controls.Internals.Registrar +Microsoft.Maui.Controls.Internals.Registrar.Registrar() -> void +Microsoft.Maui.Controls.Internals.ResourceLoader +Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery +Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery.ResourceLoadingQuery() -> void +Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingResponse +Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingResponse.ResourceLoadingResponse() -> void +Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingResponse.UseDesignProperties.get -> bool +Microsoft.Maui.Controls.Internals.ResourceLoader.ResourceLoadingResponse.UseDesignProperties.set -> void +Microsoft.Maui.Controls.Internals.ResourcesChangedEventArgs +Microsoft.Maui.Controls.Internals.SetValueFlags +Microsoft.Maui.Controls.Internals.SetValueFlags.ClearDynamicResource = 4 -> Microsoft.Maui.Controls.Internals.SetValueFlags +Microsoft.Maui.Controls.Internals.SetValueFlags.ClearOneWayBindings = 1 -> Microsoft.Maui.Controls.Internals.SetValueFlags +Microsoft.Maui.Controls.Internals.SetValueFlags.ClearTwoWayBindings = 2 -> Microsoft.Maui.Controls.Internals.SetValueFlags +Microsoft.Maui.Controls.Internals.SetValueFlags.None = 0 -> Microsoft.Maui.Controls.Internals.SetValueFlags +Microsoft.Maui.Controls.Internals.SetValueFlags.RaiseOnEqual = 8 -> Microsoft.Maui.Controls.Internals.SetValueFlags +Microsoft.Maui.Controls.Internals.TableModel +Microsoft.Maui.Controls.Internals.TableModel.ItemLongPressed -> System.EventHandler> +Microsoft.Maui.Controls.Internals.TableModel.ItemSelected -> System.EventHandler> +Microsoft.Maui.Controls.Internals.TableModel.RowLongPressed(int section, int row) -> void +Microsoft.Maui.Controls.Internals.TableModel.RowSelected(int section, int row) -> void +Microsoft.Maui.Controls.Internals.TableModel.TableModel() -> void +Microsoft.Maui.Controls.Internals.TemplatedItemsList.CollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.Internals.TemplatedItemsList.Count.get -> int +Microsoft.Maui.Controls.Internals.TemplatedItemsList.Dispose() -> void +Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetDescendantCount() -> int +Microsoft.Maui.Controls.Internals.TemplatedItemsList.GetGroupIndexFromGlobal(int globalIndex, out int leftOver) -> int +Microsoft.Maui.Controls.Internals.TemplatedItemsList.GroupedCollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.Internals.TemplatedItemsList.IsGroupingEnabled.get -> bool +Microsoft.Maui.Controls.Internals.TextTransformUtilites +Microsoft.Maui.Controls.Internals.TypedBinding +Microsoft.Maui.Controls.Internals.TypedBindingBase +Microsoft.Maui.Controls.InvalidNavigationException +Microsoft.Maui.Controls.InvalidNavigationException.InvalidNavigationException() -> void +Microsoft.Maui.Controls.IOpenGlViewController +Microsoft.Maui.Controls.IOpenGlViewController.DisplayRequested -> System.EventHandler +Microsoft.Maui.Controls.IPaddingElement +Microsoft.Maui.Controls.IPaddingElement.OnPaddingPropertyChanged(Microsoft.Maui.Thickness oldValue, Microsoft.Maui.Thickness newValue) -> void +Microsoft.Maui.Controls.IPaddingElement.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.IPaddingElement.PaddingDefaultValueCreator() -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.IPageController +Microsoft.Maui.Controls.IPageController.ContainerArea.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.IPageController.ContainerArea.set -> void +Microsoft.Maui.Controls.IPageController.IgnoresContainerArea.get -> bool +Microsoft.Maui.Controls.IPageController.IgnoresContainerArea.set -> void +Microsoft.Maui.Controls.IPageController.SendAppearing() -> void +Microsoft.Maui.Controls.IPageController.SendDisappearing() -> void +Microsoft.Maui.Controls.IPanGestureController +Microsoft.Maui.Controls.IPinchGestureController +Microsoft.Maui.Controls.IPinchGestureController.IsPinching.get -> bool +Microsoft.Maui.Controls.IPinchGestureController.IsPinching.set -> void +Microsoft.Maui.Controls.IQueryAttributable +Microsoft.Maui.Controls.IRegisterable +Microsoft.Maui.Controls.IScrollViewController +Microsoft.Maui.Controls.IScrollViewController.LayoutAreaOverride.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.IScrollViewController.LayoutAreaOverride.set -> void +Microsoft.Maui.Controls.IScrollViewController.ScrollToRequested -> System.EventHandler +Microsoft.Maui.Controls.IScrollViewController.SendScrollFinished() -> void +Microsoft.Maui.Controls.IScrollViewController.SetScrolledPosition(double x, double y) -> void +Microsoft.Maui.Controls.ISearchBarController +Microsoft.Maui.Controls.ISearchBarController.OnSearchButtonPressed() -> void +Microsoft.Maui.Controls.ISearchHandlerController +Microsoft.Maui.Controls.ISearchHandlerController.ClearPlaceholderClicked() -> void +Microsoft.Maui.Controls.ISearchHandlerController.ListProxyChanged -> System.EventHandler +Microsoft.Maui.Controls.ISearchHandlerController.QueryConfirmed() -> void +Microsoft.Maui.Controls.IShellAppearanceElement +Microsoft.Maui.Controls.IShellContentController +Microsoft.Maui.Controls.IShellContentController.IsPageVisibleChanged -> System.EventHandler +Microsoft.Maui.Controls.IShellContentInsetObserver +Microsoft.Maui.Controls.IShellContentInsetObserver.OnInsetChanged(Microsoft.Maui.Thickness inset, double tabThickness) -> void +Microsoft.Maui.Controls.IShellController +Microsoft.Maui.Controls.IShellController.FlyoutItemsChanged -> System.EventHandler +Microsoft.Maui.Controls.IShellController.ItemsCollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.IShellController.StructureChanged -> System.EventHandler +Microsoft.Maui.Controls.IShellController.UpdateCurrentState(Microsoft.Maui.Controls.ShellNavigationSource source) -> void +Microsoft.Maui.Controls.IShellItemController +Microsoft.Maui.Controls.IShellItemController.ItemsCollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.IShellItemController.ShowTabs.get -> bool +Microsoft.Maui.Controls.IShellSectionController +Microsoft.Maui.Controls.IShellSectionController.ItemsCollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.IShellSectionController.NavigationRequested -> System.EventHandler +Microsoft.Maui.Controls.IShellSectionController.SendInsetChanged(Microsoft.Maui.Thickness inset, double tabThickness) -> void +Microsoft.Maui.Controls.IShellSectionController.SendPopped() -> void +Microsoft.Maui.Controls.ISliderController +Microsoft.Maui.Controls.ISliderController.SendDragCompleted() -> void +Microsoft.Maui.Controls.ISliderController.SendDragStarted() -> void +Microsoft.Maui.Controls.ISwipeGestureController +Microsoft.Maui.Controls.ISwipeItem +Microsoft.Maui.Controls.ISwipeItem.Invoked -> System.EventHandler +Microsoft.Maui.Controls.ISwipeItem.IsVisible.get -> bool +Microsoft.Maui.Controls.ISwipeItem.IsVisible.set -> void +Microsoft.Maui.Controls.ISwipeViewController +Microsoft.Maui.Controls.ISwipeViewController.IsOpen.get -> bool +Microsoft.Maui.Controls.ISwipeViewController.IsOpen.set -> void +Microsoft.Maui.Controls.ITableModel +Microsoft.Maui.Controls.ITableModel.GetRowCount(int section) -> int +Microsoft.Maui.Controls.ITableModel.GetSectionCount() -> int +Microsoft.Maui.Controls.ITableModel.RowLongPressed(int section, int row) -> void +Microsoft.Maui.Controls.ITableModel.RowSelected(int section, int row) -> void +Microsoft.Maui.Controls.ITableViewController +Microsoft.Maui.Controls.ITableViewController.ModelChanged -> System.EventHandler +Microsoft.Maui.Controls.ITemplatedItemsList.GetGroupIndexFromGlobal(int globalIndex, out int leftOver) -> int +Microsoft.Maui.Controls.ITemplatedItemsList.GroupedCollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.ITemplatedItemsList.PropertyChanged -> System.ComponentModel.PropertyChangedEventHandler +Microsoft.Maui.Controls.ITemplatedItemsListScrollToRequestedEventArgs +Microsoft.Maui.Controls.ITemplatedItemsView.PropertyChanged -> System.ComponentModel.PropertyChangedEventHandler +Microsoft.Maui.Controls.ItemSizingStrategy +Microsoft.Maui.Controls.ItemSizingStrategy.MeasureAllItems = 0 -> Microsoft.Maui.Controls.ItemSizingStrategy +Microsoft.Maui.Controls.ItemSizingStrategy.MeasureFirstItem = 1 -> Microsoft.Maui.Controls.ItemSizingStrategy +Microsoft.Maui.Controls.ItemsLayout +Microsoft.Maui.Controls.ItemsLayout.ItemsLayout(Microsoft.Maui.Controls.ItemsLayoutOrientation orientation) -> void +Microsoft.Maui.Controls.ItemsLayout.Orientation.get -> Microsoft.Maui.Controls.ItemsLayoutOrientation +Microsoft.Maui.Controls.ItemsLayout.SnapPointsAlignment.get -> Microsoft.Maui.Controls.SnapPointsAlignment +Microsoft.Maui.Controls.ItemsLayout.SnapPointsAlignment.set -> void +Microsoft.Maui.Controls.ItemsLayout.SnapPointsType.get -> Microsoft.Maui.Controls.SnapPointsType +Microsoft.Maui.Controls.ItemsLayout.SnapPointsType.set -> void +Microsoft.Maui.Controls.ItemsLayoutOrientation +Microsoft.Maui.Controls.ItemsLayoutOrientation.Horizontal = 1 -> Microsoft.Maui.Controls.ItemsLayoutOrientation +Microsoft.Maui.Controls.ItemsLayoutOrientation.Vertical = 0 -> Microsoft.Maui.Controls.ItemsLayoutOrientation +Microsoft.Maui.Controls.ItemsLayoutTypeConverter +Microsoft.Maui.Controls.ItemsLayoutTypeConverter.ItemsLayoutTypeConverter() -> void +Microsoft.Maui.Controls.ItemsUpdatingScrollMode +Microsoft.Maui.Controls.ItemsUpdatingScrollMode.KeepItemsInView = 0 -> Microsoft.Maui.Controls.ItemsUpdatingScrollMode +Microsoft.Maui.Controls.ItemsUpdatingScrollMode.KeepLastItemInView = 2 -> Microsoft.Maui.Controls.ItemsUpdatingScrollMode +Microsoft.Maui.Controls.ItemsUpdatingScrollMode.KeepScrollOffset = 1 -> Microsoft.Maui.Controls.ItemsUpdatingScrollMode +Microsoft.Maui.Controls.ItemsView +Microsoft.Maui.Controls.ItemsView.HorizontalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.Controls.ItemsView.HorizontalScrollBarVisibility.set -> void +Microsoft.Maui.Controls.ItemsView.ItemsUpdatingScrollMode.get -> Microsoft.Maui.Controls.ItemsUpdatingScrollMode +Microsoft.Maui.Controls.ItemsView.ItemsUpdatingScrollMode.set -> void +Microsoft.Maui.Controls.ItemsView.ItemsView() -> void +Microsoft.Maui.Controls.ItemsView.RemainingItemsThreshold.get -> int +Microsoft.Maui.Controls.ItemsView.RemainingItemsThreshold.set -> void +Microsoft.Maui.Controls.ItemsView.RemainingItemsThresholdReached -> System.EventHandler +Microsoft.Maui.Controls.ItemsView.Scrolled -> System.EventHandler +Microsoft.Maui.Controls.ItemsView.ScrollTo(int index, int groupIndex = -1, Microsoft.Maui.Controls.ScrollToPosition position = Microsoft.Maui.Controls.ScrollToPosition.MakeVisible, bool animate = true) -> void +Microsoft.Maui.Controls.ItemsView.ScrollToRequested -> System.EventHandler +Microsoft.Maui.Controls.ItemsView.SendRemainingItemsThresholdReached() -> void +Microsoft.Maui.Controls.ItemsView.VerticalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.Controls.ItemsView.VerticalScrollBarVisibility.set -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.CenterItemIndex.get -> int +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.CenterItemIndex.set -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.FirstVisibleItemIndex.get -> int +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.FirstVisibleItemIndex.set -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.HorizontalDelta.get -> double +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.HorizontalDelta.set -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.HorizontalOffset.get -> double +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.HorizontalOffset.set -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.ItemsViewScrolledEventArgs() -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.LastVisibleItemIndex.get -> int +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.LastVisibleItemIndex.set -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.VerticalDelta.get -> double +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.VerticalDelta.set -> void +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.VerticalOffset.get -> double +Microsoft.Maui.Controls.ItemsViewScrolledEventArgs.VerticalOffset.set -> void +Microsoft.Maui.Controls.ItemTappedEventArgs +Microsoft.Maui.Controls.ItemTappedEventArgs.ItemIndex.get -> int +Microsoft.Maui.Controls.ItemVisibilityEventArgs +Microsoft.Maui.Controls.ItemVisibilityEventArgs.ItemIndex.get -> int +Microsoft.Maui.Controls.IValueConverter +Microsoft.Maui.Controls.IViewController +Microsoft.Maui.Controls.IVisual +Microsoft.Maui.Controls.IVisualElementController +Microsoft.Maui.Controls.IVisualElementController.BatchCommitted -> System.EventHandler> +Microsoft.Maui.Controls.IVisualElementController.Batched.get -> bool +Microsoft.Maui.Controls.IVisualElementController.DisableLayout.get -> bool +Microsoft.Maui.Controls.IVisualElementController.DisableLayout.set -> void +Microsoft.Maui.Controls.IVisualElementController.EffectiveFlowDirection.get -> Microsoft.Maui.Controls.EffectiveFlowDirection +Microsoft.Maui.Controls.IVisualElementController.FocusChangeRequested -> System.EventHandler +Microsoft.Maui.Controls.IVisualElementController.InvalidateMeasure(Microsoft.Maui.Controls.Internals.InvalidationTrigger trigger) -> void +Microsoft.Maui.Controls.IVisualElementController.IsInPlatformLayout.get -> bool +Microsoft.Maui.Controls.IVisualElementController.IsInPlatformLayout.set -> void +Microsoft.Maui.Controls.IVisualElementController.IsPlatformEnabled.get -> bool +Microsoft.Maui.Controls.IVisualElementController.IsPlatformEnabled.set -> void +Microsoft.Maui.Controls.IVisualElementController.IsPlatformStateConsistent.get -> bool +Microsoft.Maui.Controls.IVisualElementController.IsPlatformStateConsistent.set -> void +Microsoft.Maui.Controls.IVisualElementController.PlatformSizeChanged() -> void +Microsoft.Maui.Controls.IWebViewController +Microsoft.Maui.Controls.IWebViewController.CanGoBack.get -> bool +Microsoft.Maui.Controls.IWebViewController.CanGoBack.set -> void +Microsoft.Maui.Controls.IWebViewController.CanGoForward.get -> bool +Microsoft.Maui.Controls.IWebViewController.CanGoForward.set -> void +Microsoft.Maui.Controls.IWebViewController.EvalRequested -> System.EventHandler +Microsoft.Maui.Controls.IWebViewController.EvaluateJavaScriptRequested -> Microsoft.Maui.Controls.Internals.EvaluateJavaScriptDelegate +Microsoft.Maui.Controls.IWebViewController.GoBackRequested -> System.EventHandler +Microsoft.Maui.Controls.IWebViewController.GoForwardRequested -> System.EventHandler +Microsoft.Maui.Controls.IWebViewController.ReloadRequested -> System.EventHandler +Microsoft.Maui.Controls.KnownColor +Microsoft.Maui.Controls.Label +Microsoft.Maui.Controls.Label.CharacterSpacing.get -> double +Microsoft.Maui.Controls.Label.CharacterSpacing.set -> void +Microsoft.Maui.Controls.Label.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.Label.FontAttributes.set -> void +Microsoft.Maui.Controls.Label.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.Label.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.Label.FontSize.get -> double +Microsoft.Maui.Controls.Label.FontSize.set -> void +Microsoft.Maui.Controls.Label.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Label.HorizontalTextAlignment.set -> void +Microsoft.Maui.Controls.Label.Label() -> void +Microsoft.Maui.Controls.Label.LineBreakMode.get -> Microsoft.Maui.LineBreakMode +Microsoft.Maui.Controls.Label.LineBreakMode.set -> void +Microsoft.Maui.Controls.Label.LineHeight.get -> double +Microsoft.Maui.Controls.Label.LineHeight.set -> void +Microsoft.Maui.Controls.Label.MaxLines.get -> int +Microsoft.Maui.Controls.Label.MaxLines.set -> void +Microsoft.Maui.Controls.Label.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.Label.Padding.set -> void +Microsoft.Maui.Controls.Label.TextDecorations.get -> Microsoft.Maui.TextDecorations +Microsoft.Maui.Controls.Label.TextDecorations.set -> void +Microsoft.Maui.Controls.Label.TextTransform.get -> Microsoft.Maui.TextTransform +Microsoft.Maui.Controls.Label.TextTransform.set -> void +Microsoft.Maui.Controls.Label.TextType.get -> Microsoft.Maui.TextType +Microsoft.Maui.Controls.Label.TextType.set -> void +Microsoft.Maui.Controls.Label.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Label.VerticalTextAlignment.set -> void +Microsoft.Maui.Controls.Layout +Microsoft.Maui.Controls.Layout.CascadeInputTransparent.get -> bool +Microsoft.Maui.Controls.Layout.CascadeInputTransparent.set -> void +Microsoft.Maui.Controls.Layout.Clear() -> void +Microsoft.Maui.Controls.Layout.Count.get -> int +Microsoft.Maui.Controls.Layout.CrossPlatformArrange(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Layout.CrossPlatformMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Layout.IgnoreSafeArea.get -> bool +Microsoft.Maui.Controls.Layout.IgnoreSafeArea.set -> void +Microsoft.Maui.Controls.Layout.IsClippedToBounds.get -> bool +Microsoft.Maui.Controls.Layout.IsClippedToBounds.set -> void +Microsoft.Maui.Controls.Layout.IsReadOnly.get -> bool +Microsoft.Maui.Controls.Layout.Layout() -> void +Microsoft.Maui.Controls.Layout.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.Layout.Padding.set -> void +Microsoft.Maui.Controls.Layout.RemoveAt(int index) -> void +Microsoft.Maui.Controls.LayoutAlignment +Microsoft.Maui.Controls.LayoutAlignment.Center = 1 -> Microsoft.Maui.Controls.LayoutAlignment +Microsoft.Maui.Controls.LayoutAlignment.End = 2 -> Microsoft.Maui.Controls.LayoutAlignment +Microsoft.Maui.Controls.LayoutAlignment.Fill = Microsoft.Maui.Controls.LayoutAlignment.Center | Microsoft.Maui.Controls.LayoutAlignment.End -> Microsoft.Maui.Controls.LayoutAlignment +Microsoft.Maui.Controls.LayoutAlignment.Start = 0 -> Microsoft.Maui.Controls.LayoutAlignment +Microsoft.Maui.Controls.LayoutDirectionExtensions +Microsoft.Maui.Controls.LayoutOptions +Microsoft.Maui.Controls.LayoutOptions.Alignment.get -> Microsoft.Maui.Controls.LayoutAlignment +Microsoft.Maui.Controls.LayoutOptions.Alignment.set -> void +Microsoft.Maui.Controls.LayoutOptions.Expands.get -> bool +Microsoft.Maui.Controls.LayoutOptions.Expands.set -> void +Microsoft.Maui.Controls.LayoutOptions.LayoutOptions() -> void +Microsoft.Maui.Controls.LayoutOptions.LayoutOptions(Microsoft.Maui.Controls.LayoutAlignment alignment, bool expands) -> void +Microsoft.Maui.Controls.LayoutOptionsConverter +Microsoft.Maui.Controls.LayoutOptionsConverter.LayoutOptionsConverter() -> void +Microsoft.Maui.Controls.LinearGradientBrush +Microsoft.Maui.Controls.LinearGradientBrush.EndPoint.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.LinearGradientBrush.EndPoint.set -> void +Microsoft.Maui.Controls.LinearGradientBrush.LinearGradientBrush() -> void +Microsoft.Maui.Controls.LinearGradientBrush.StartPoint.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.LinearGradientBrush.StartPoint.set -> void +Microsoft.Maui.Controls.LinearItemsLayout +Microsoft.Maui.Controls.LinearItemsLayout.ItemSpacing.get -> double +Microsoft.Maui.Controls.LinearItemsLayout.ItemSpacing.set -> void +Microsoft.Maui.Controls.LinearItemsLayout.LinearItemsLayout(Microsoft.Maui.Controls.ItemsLayoutOrientation orientation) -> void +Microsoft.Maui.Controls.ListProxyChangedEventArgs +Microsoft.Maui.Controls.ListStringTypeConverter +Microsoft.Maui.Controls.ListStringTypeConverter.ListStringTypeConverter() -> void +Microsoft.Maui.Controls.ListView +Microsoft.Maui.Controls.ListView.BeginRefresh() -> void +Microsoft.Maui.Controls.ListView.CachingStrategy.get -> Microsoft.Maui.Controls.ListViewCachingStrategy +Microsoft.Maui.Controls.ListView.EndRefresh() -> void +Microsoft.Maui.Controls.ListView.HasUnevenRows.get -> bool +Microsoft.Maui.Controls.ListView.HasUnevenRows.set -> void +Microsoft.Maui.Controls.ListView.HorizontalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.Controls.ListView.HorizontalScrollBarVisibility.set -> void +Microsoft.Maui.Controls.ListView.IsGroupingEnabled.get -> bool +Microsoft.Maui.Controls.ListView.IsGroupingEnabled.set -> void +Microsoft.Maui.Controls.ListView.IsPullToRefreshEnabled.get -> bool +Microsoft.Maui.Controls.ListView.IsPullToRefreshEnabled.set -> void +Microsoft.Maui.Controls.ListView.IsRefreshing.get -> bool +Microsoft.Maui.Controls.ListView.IsRefreshing.set -> void +Microsoft.Maui.Controls.ListView.ItemAppearing -> System.EventHandler +Microsoft.Maui.Controls.ListView.ItemDisappearing -> System.EventHandler +Microsoft.Maui.Controls.ListView.ItemSelected -> System.EventHandler +Microsoft.Maui.Controls.ListView.ItemTapped -> System.EventHandler +Microsoft.Maui.Controls.ListView.ListView() -> void +Microsoft.Maui.Controls.ListView.ListView(Microsoft.Maui.Controls.ListViewCachingStrategy cachingStrategy) -> void +Microsoft.Maui.Controls.ListView.RefreshAllowed.get -> bool +Microsoft.Maui.Controls.ListView.RefreshAllowed.set -> void +Microsoft.Maui.Controls.ListView.Refreshing -> System.EventHandler +Microsoft.Maui.Controls.ListView.RowHeight.get -> int +Microsoft.Maui.Controls.ListView.RowHeight.set -> void +Microsoft.Maui.Controls.ListView.Scrolled -> System.EventHandler +Microsoft.Maui.Controls.ListView.ScrollToRequested -> System.EventHandler +Microsoft.Maui.Controls.ListView.SelectionMode.get -> Microsoft.Maui.Controls.ListViewSelectionMode +Microsoft.Maui.Controls.ListView.SelectionMode.set -> void +Microsoft.Maui.Controls.ListView.SendRefreshing() -> void +Microsoft.Maui.Controls.ListView.SeparatorVisibility.get -> Microsoft.Maui.Controls.SeparatorVisibility +Microsoft.Maui.Controls.ListView.SeparatorVisibility.set -> void +Microsoft.Maui.Controls.ListView.VerticalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.Controls.ListView.VerticalScrollBarVisibility.set -> void +Microsoft.Maui.Controls.ListViewCachingStrategy +Microsoft.Maui.Controls.ListViewCachingStrategy.RecycleElement = 1 -> Microsoft.Maui.Controls.ListViewCachingStrategy +Microsoft.Maui.Controls.ListViewCachingStrategy.RecycleElementAndDataTemplate = 3 -> Microsoft.Maui.Controls.ListViewCachingStrategy +Microsoft.Maui.Controls.ListViewCachingStrategy.RetainElement = 0 -> Microsoft.Maui.Controls.ListViewCachingStrategy +Microsoft.Maui.Controls.ListViewSelectionMode +Microsoft.Maui.Controls.ListViewSelectionMode.None = 0 -> Microsoft.Maui.Controls.ListViewSelectionMode +Microsoft.Maui.Controls.ListViewSelectionMode.Single = 1 -> Microsoft.Maui.Controls.ListViewSelectionMode +Microsoft.Maui.Controls.MarshalingObservableCollection +Microsoft.Maui.Controls.MarshalingObservableCollection.CollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.MeasureFlags +Microsoft.Maui.Controls.MeasureFlags.IncludeMargins = 1 -> Microsoft.Maui.Controls.MeasureFlags +Microsoft.Maui.Controls.MeasureFlags.None = 0 -> Microsoft.Maui.Controls.MeasureFlags +Microsoft.Maui.Controls.MenuBar +Microsoft.Maui.Controls.MenuBar.Clear() -> void +Microsoft.Maui.Controls.MenuBar.Count.get -> int +Microsoft.Maui.Controls.MenuBar.IsEnabled.get -> bool +Microsoft.Maui.Controls.MenuBar.IsEnabled.set -> void +Microsoft.Maui.Controls.MenuBar.IsReadOnly.get -> bool +Microsoft.Maui.Controls.MenuBar.MenuBar() -> void +Microsoft.Maui.Controls.MenuBar.RemoveAt(int index) -> void +Microsoft.Maui.Controls.MenuBarItem +Microsoft.Maui.Controls.MenuBarItem.Clear() -> void +Microsoft.Maui.Controls.MenuBarItem.Count.get -> int +Microsoft.Maui.Controls.MenuBarItem.IsEnabled.get -> bool +Microsoft.Maui.Controls.MenuBarItem.IsEnabled.set -> void +Microsoft.Maui.Controls.MenuBarItem.IsReadOnly.get -> bool +Microsoft.Maui.Controls.MenuBarItem.MenuBarItem() -> void +Microsoft.Maui.Controls.MenuBarItem.Priority.get -> int +Microsoft.Maui.Controls.MenuBarItem.Priority.set -> void +Microsoft.Maui.Controls.MenuBarItem.RemoveAt(int index) -> void +Microsoft.Maui.Controls.MenuFlyout +Microsoft.Maui.Controls.MenuFlyout.Clear() -> void +Microsoft.Maui.Controls.MenuFlyout.Count.get -> int +Microsoft.Maui.Controls.MenuFlyout.IsReadOnly.get -> bool +Microsoft.Maui.Controls.MenuFlyout.MenuFlyout() -> void +Microsoft.Maui.Controls.MenuFlyout.RemoveAt(int index) -> void +Microsoft.Maui.Controls.MenuFlyoutItem +Microsoft.Maui.Controls.MenuFlyoutItem.MenuFlyoutItem() -> void +Microsoft.Maui.Controls.MenuFlyoutSeparator +Microsoft.Maui.Controls.MenuFlyoutSeparator.MenuFlyoutSeparator() -> void +Microsoft.Maui.Controls.MenuFlyoutSubItem +Microsoft.Maui.Controls.MenuFlyoutSubItem.Clear() -> void +Microsoft.Maui.Controls.MenuFlyoutSubItem.Count.get -> int +Microsoft.Maui.Controls.MenuFlyoutSubItem.IsReadOnly.get -> bool +Microsoft.Maui.Controls.MenuFlyoutSubItem.MenuFlyoutSubItem() -> void +Microsoft.Maui.Controls.MenuFlyoutSubItem.RemoveAt(int index) -> void +Microsoft.Maui.Controls.MenuItem +Microsoft.Maui.Controls.MenuItem.Clicked -> System.EventHandler +Microsoft.Maui.Controls.MenuItem.IsDestructive.get -> bool +Microsoft.Maui.Controls.MenuItem.IsDestructive.set -> void +Microsoft.Maui.Controls.MenuItem.IsEnabled.get -> bool +Microsoft.Maui.Controls.MenuItem.IsEnabled.set -> void +Microsoft.Maui.Controls.MenuItem.MenuItem() -> void +Microsoft.Maui.Controls.MenuItemCollection +Microsoft.Maui.Controls.MenuItemCollection.Clear() -> void +Microsoft.Maui.Controls.MenuItemCollection.Count.get -> int +Microsoft.Maui.Controls.MenuItemCollection.IsReadOnly.get -> bool +Microsoft.Maui.Controls.MenuItemCollection.MenuItemCollection() -> void +Microsoft.Maui.Controls.MenuItemCollection.RemoveAt(int index) -> void +Microsoft.Maui.Controls.MessagingCenter +Microsoft.Maui.Controls.MessagingCenter.MessagingCenter() -> void +Microsoft.Maui.Controls.ModalEventArgs +Microsoft.Maui.Controls.ModalPoppedEventArgs +Microsoft.Maui.Controls.ModalPoppingEventArgs +Microsoft.Maui.Controls.ModalPoppingEventArgs.Cancel.get -> bool +Microsoft.Maui.Controls.ModalPoppingEventArgs.Cancel.set -> void +Microsoft.Maui.Controls.ModalPushedEventArgs +Microsoft.Maui.Controls.ModalPushingEventArgs +Microsoft.Maui.Controls.MultiBinding +Microsoft.Maui.Controls.MultiBinding.MultiBinding() -> void +Microsoft.Maui.Controls.MultiPage.CurrentPageChanged -> System.EventHandler +Microsoft.Maui.Controls.MultiPage.MultiPage() -> void +Microsoft.Maui.Controls.MultiPage.PagesChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.MultiTrigger +Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Body = 5 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Caption = 9 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Default = 0 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Header = 6 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Large = 4 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Medium = 3 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Micro = 1 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Small = 2 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Subtitle = 8 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NamedSize.Title = 7 -> Microsoft.Maui.Controls.NamedSize +Microsoft.Maui.Controls.NameScopeExtensions +Microsoft.Maui.Controls.NavigableElement +Microsoft.Maui.Controls.NavigatedFromEventArgs +Microsoft.Maui.Controls.NavigatedToEventArgs +Microsoft.Maui.Controls.NavigatingFromEventArgs +Microsoft.Maui.Controls.NavigatingFromEventArgs.NavigatingFromEventArgs() -> void +Microsoft.Maui.Controls.NavigationEventArgs +Microsoft.Maui.Controls.NavigationPage +Microsoft.Maui.Controls.NavigationPage.NavigationPage() -> void +Microsoft.Maui.Controls.NavigationPage.Popped -> System.EventHandler +Microsoft.Maui.Controls.NavigationPage.PoppedToRoot -> System.EventHandler +Microsoft.Maui.Controls.NavigationPage.Pushed -> System.EventHandler +Microsoft.Maui.Controls.NullEffect +Microsoft.Maui.Controls.NullEffect.NullEffect() -> void +Microsoft.Maui.Controls.On +Microsoft.Maui.Controls.On.On() -> void +Microsoft.Maui.Controls.OnIdiom +Microsoft.Maui.Controls.OnIdiom.Default.get -> T +Microsoft.Maui.Controls.OnIdiom.Default.set -> void +Microsoft.Maui.Controls.OnIdiom.Desktop.get -> T +Microsoft.Maui.Controls.OnIdiom.Desktop.set -> void +Microsoft.Maui.Controls.OnIdiom.OnIdiom() -> void +Microsoft.Maui.Controls.OnIdiom.Phone.get -> T +Microsoft.Maui.Controls.OnIdiom.Phone.set -> void +Microsoft.Maui.Controls.OnIdiom.Tablet.get -> T +Microsoft.Maui.Controls.OnIdiom.Tablet.set -> void +Microsoft.Maui.Controls.OnIdiom.TV.get -> T +Microsoft.Maui.Controls.OnIdiom.TV.set -> void +Microsoft.Maui.Controls.OnIdiom.Watch.get -> T +Microsoft.Maui.Controls.OnIdiom.Watch.set -> void +Microsoft.Maui.Controls.OnPlatform +Microsoft.Maui.Controls.OnPlatform.Default.get -> T +Microsoft.Maui.Controls.OnPlatform.Default.set -> void +Microsoft.Maui.Controls.OnPlatform.OnPlatform() -> void +Microsoft.Maui.Controls.OpenGLView +Microsoft.Maui.Controls.OpenGLView.Display() -> void +Microsoft.Maui.Controls.OpenGLView.DisplayRequested -> System.EventHandler +Microsoft.Maui.Controls.OpenGLView.HasRenderLoop.get -> bool +Microsoft.Maui.Controls.OpenGLView.HasRenderLoop.set -> void +Microsoft.Maui.Controls.OpenGLView.OpenGLView() -> void +Microsoft.Maui.Controls.OpenRequestedEventArgs +Microsoft.Maui.Controls.OpenRequestedEventArgs.Animated.get -> bool +Microsoft.Maui.Controls.OpenRequestedEventArgs.Animated.set -> void +Microsoft.Maui.Controls.OpenRequestedEventArgs.OpenRequestedEventArgs(Microsoft.Maui.OpenSwipeItem openSwipeItem, bool animated) -> void +Microsoft.Maui.Controls.OpenRequestedEventArgs.OpenSwipeItem.get -> Microsoft.Maui.OpenSwipeItem +Microsoft.Maui.Controls.OpenRequestedEventArgs.OpenSwipeItem.set -> void +Microsoft.Maui.Controls.OrientationStateTrigger +Microsoft.Maui.Controls.OrientationStateTrigger.Orientation.get -> Microsoft.Maui.Devices.DisplayOrientation +Microsoft.Maui.Controls.OrientationStateTrigger.Orientation.set -> void +Microsoft.Maui.Controls.OrientationStateTrigger.OrientationStateTrigger() -> void +Microsoft.Maui.Controls.Page +Microsoft.Maui.Controls.Page.Appearing -> System.EventHandler +Microsoft.Maui.Controls.Page.ContainerArea.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.Page.ContainerArea.set -> void +Microsoft.Maui.Controls.Page.Disappearing -> System.EventHandler +Microsoft.Maui.Controls.Page.ForceLayout() -> void +Microsoft.Maui.Controls.Page.IgnoresContainerArea.get -> bool +Microsoft.Maui.Controls.Page.IgnoresContainerArea.set -> void +Microsoft.Maui.Controls.Page.IsBusy.get -> bool +Microsoft.Maui.Controls.Page.IsBusy.set -> void +Microsoft.Maui.Controls.Page.LayoutChanged -> System.EventHandler +Microsoft.Maui.Controls.Page.NavigatedFrom -> System.EventHandler +Microsoft.Maui.Controls.Page.NavigatedTo -> System.EventHandler +Microsoft.Maui.Controls.Page.NavigatingFrom -> System.EventHandler +Microsoft.Maui.Controls.Page.Padding.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.Page.Padding.set -> void +Microsoft.Maui.Controls.Page.Page() -> void +Microsoft.Maui.Controls.Page.SendAppearing() -> void +Microsoft.Maui.Controls.Page.SendBackButtonPressed() -> bool +Microsoft.Maui.Controls.Page.SendDisappearing() -> void +Microsoft.Maui.Controls.Page.UpdateChildrenLayout() -> void +Microsoft.Maui.Controls.PanGestureRecognizer +Microsoft.Maui.Controls.PanGestureRecognizer.PanGestureRecognizer() -> void +Microsoft.Maui.Controls.PanGestureRecognizer.PanUpdated -> System.EventHandler +Microsoft.Maui.Controls.PanGestureRecognizer.TouchPoints.get -> int +Microsoft.Maui.Controls.PanGestureRecognizer.TouchPoints.set -> void +Microsoft.Maui.Controls.PanUpdatedEventArgs +Microsoft.Maui.Controls.PanUpdatedEventArgs.GestureId.get -> int +Microsoft.Maui.Controls.PanUpdatedEventArgs.PanUpdatedEventArgs(Microsoft.Maui.GestureStatus type, int gestureId, double totalx, double totaly) -> void +Microsoft.Maui.Controls.PanUpdatedEventArgs.PanUpdatedEventArgs(Microsoft.Maui.GestureStatus type, int gestureId) -> void +Microsoft.Maui.Controls.PanUpdatedEventArgs.StatusType.get -> Microsoft.Maui.GestureStatus +Microsoft.Maui.Controls.PanUpdatedEventArgs.TotalX.get -> double +Microsoft.Maui.Controls.PanUpdatedEventArgs.TotalY.get -> double +Microsoft.Maui.Controls.ParentChangingEventArgs +Microsoft.Maui.Controls.Picker +Microsoft.Maui.Controls.Picker.CharacterSpacing.get -> double +Microsoft.Maui.Controls.Picker.CharacterSpacing.set -> void +Microsoft.Maui.Controls.Picker.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.Picker.FontAttributes.set -> void +Microsoft.Maui.Controls.Picker.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.Picker.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.Picker.FontSize.get -> double +Microsoft.Maui.Controls.Picker.FontSize.set -> void +Microsoft.Maui.Controls.Picker.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Picker.HorizontalTextAlignment.set -> void +Microsoft.Maui.Controls.Picker.Picker() -> void +Microsoft.Maui.Controls.Picker.SelectedIndex.get -> int +Microsoft.Maui.Controls.Picker.SelectedIndex.set -> void +Microsoft.Maui.Controls.Picker.SelectedIndexChanged -> System.EventHandler +Microsoft.Maui.Controls.Picker.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.Picker.VerticalTextAlignment.set -> void +Microsoft.Maui.Controls.PinchGestureRecognizer +Microsoft.Maui.Controls.PinchGestureRecognizer.PinchGestureRecognizer() -> void +Microsoft.Maui.Controls.PinchGestureRecognizer.PinchUpdated -> System.EventHandler +Microsoft.Maui.Controls.PinchGestureUpdatedEventArgs +Microsoft.Maui.Controls.PinchGestureUpdatedEventArgs.PinchGestureUpdatedEventArgs(Microsoft.Maui.GestureStatus status, double scale, Microsoft.Maui.Graphics.Point origin) -> void +Microsoft.Maui.Controls.PinchGestureUpdatedEventArgs.PinchGestureUpdatedEventArgs(Microsoft.Maui.GestureStatus status) -> void +Microsoft.Maui.Controls.PinchGestureUpdatedEventArgs.Scale.get -> double +Microsoft.Maui.Controls.PinchGestureUpdatedEventArgs.ScaleOrigin.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.PinchGestureUpdatedEventArgs.Status.get -> Microsoft.Maui.GestureStatus +Microsoft.Maui.Controls.Platform.ButtonExtensions +Microsoft.Maui.Controls.Platform.ElementChangedEventArgs +Microsoft.Maui.Controls.Platform.ElementChangedEventArgs.ElementChangedEventArgs(TElement? oldElement, TElement? newElement) -> void +Microsoft.Maui.Controls.Platform.ElementChangedEventArgs.NewElement.get -> TElement? +Microsoft.Maui.Controls.Platform.ElementChangedEventArgs.OldElement.get -> TElement? +Microsoft.Maui.Controls.Platform.PageExtensions +Microsoft.Maui.Controls.Platform.PlatformEffect +Microsoft.Maui.Controls.Platform.PlatformEffect.PlatformEffect() -> void +Microsoft.Maui.Controls.Platform.SemanticExtensions +Microsoft.Maui.Controls.Platform.VisualElementChangedEventArgs +Microsoft.Maui.Controls.Platform.VisualElementChangedEventArgs.VisualElementChangedEventArgs(Microsoft.Maui.Controls.VisualElement? oldElement, Microsoft.Maui.Controls.VisualElement? newElement) -> void +Microsoft.Maui.Controls.PlatformBehavior +Microsoft.Maui.Controls.PlatformBehavior.PlatformBehavior() -> void +Microsoft.Maui.Controls.PlatformBehavior +Microsoft.Maui.Controls.PlatformBehavior.PlatformBehavior() -> void +Microsoft.Maui.Controls.PlatformConfiguration.Android +Microsoft.Maui.Controls.PlatformConfiguration.Android.Android() -> void +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.Application +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat.NavigationPage +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Application +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Button +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.Entry +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImageButton +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.Done = 6 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.Go = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.ImeMaskAction = 255 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.Next = 5 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.NoAccessoryAction = 536870912 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.NoExtractUi = 268435456 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.NoFullscreen = 33554432 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.None = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.NoPersonalizedLearning = 16777216 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.Previous = 7 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.Search = 3 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags.Send = 4 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ImeFlags +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ListView +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling.AlwaysAllow = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling.CompatibilityMode = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling.NeverAllow = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.MixedContentHandling +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ShellItem +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.SwipeView +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.TabbedPage +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement.Bottom = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement.Top = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.ViewCell +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.VisualElement +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WebView +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust.Pan = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust.Resize = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust +Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust.Unspecified = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust +Microsoft.Maui.Controls.PlatformConfiguration.GTK +Microsoft.Maui.Controls.PlatformConfiguration.GTK.GTK() -> void +Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.BoxView +Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.NavigationPage +Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabbedPage +Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition +Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition.Bottom = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition +Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition +Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition.Top = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific.TabPosition +Microsoft.Maui.Controls.PlatformConfiguration.iOS +Microsoft.Maui.Controls.PlatformConfiguration.iOS.iOS() -> void +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Application +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle.Dark = 3 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle.ExtraLight = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle.Light = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle.None = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.BlurEffectStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Cell +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.DatePicker +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Entry +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.FlyoutPage +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle.Grouped = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle.Plain = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.GroupHeaderStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode.Always = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode.Automatic = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode.Never = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.LargeTitleDisplayMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ListView +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.NavigationPage +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Picker +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.ScrollView +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SearchBar +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle.FullWidth = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SeparatorStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Slider +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode.False = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode.True = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarHiddenMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode.DoNotAdjust = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode.MatchNavigationBarTextLuminosity = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.StatusBarTextColorMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.SwipeView +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TabbedPage +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TimePicker +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode.Opaque = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode.Translucent = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.TranslucencyMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle.Automatic = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle.FormSheet = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle.FullScreen = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle.OverFullScreen = 3 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle.PageSheet = 4 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIModalPresentationStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle.Minimal = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle.Prominent = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UISearchBarStyle +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation.Fade = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation.None = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation.Slide = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UIStatusBarAnimation +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode.Immediately = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode.WhenFinished = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.UpdateMode +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.ShadowEffect +Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.VisualElement.ShadowEffect.ShadowEffect() -> void +Microsoft.Maui.Controls.PlatformConfiguration.macOS +Microsoft.Maui.Controls.PlatformConfiguration.macOS.macOS() -> void +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationPage +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.Crossfade = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.None = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.SlideBackward = 7 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.SlideDown = 3 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.SlideForward = 6 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.SlideLeft = 4 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.SlideRight = 5 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle.SlideUp = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.NavigationTransitionStyle +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.Page +Microsoft.Maui.Controls.PlatformConfiguration.macOSSpecific.TabbedPage +Microsoft.Maui.Controls.PlatformConfiguration.Tizen +Microsoft.Maui.Controls.PlatformConfiguration.Tizen.Tizen() -> void +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Application +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ButtonStyle +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Entry +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FocusDirection +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.FontWeight +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Image +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ItemsView +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Label +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.NavigationPage +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Page +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBar +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ProgressBarStyle +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.ScrollView +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.Switch +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.SwitchStyle +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.TabbedPageStyle +Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific.VisualElement +Microsoft.Maui.Controls.PlatformConfiguration.Windows +Microsoft.Maui.Controls.PlatformConfiguration.Windows.Windows() -> void +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Application +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle.Full = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle.Partial = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.CollapseStyle +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.FlyoutPage +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.InputView +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Label +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListView +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode.Accessible = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode.Inaccessible = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ListViewSelectionMode +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.Page +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection.BottomToTop = 3 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection.LeftToRight = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection.RightToLeft = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection.TopToBottom = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.RefreshView.RefreshPullDirection +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.SearchBar +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.TabbedPage +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement.Bottom = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement.Default = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement.Top = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.ToolbarPlacement +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.VisualElement +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebView +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode.SameThread = 0 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode.SeparateProcess = 2 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode +Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode.SeparateThread = 1 -> Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific.WebViewExecutionMode +Microsoft.Maui.Controls.PlatformEffect.PlatformEffect() -> void +Microsoft.Maui.Controls.PointCollection +Microsoft.Maui.Controls.PointCollection.PointCollection() -> void +Microsoft.Maui.Controls.PointerEventArgs +Microsoft.Maui.Controls.PointerEventArgs.PointerEventArgs() -> void +Microsoft.Maui.Controls.PointerGestureRecognizer +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEntered -> System.EventHandler? +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommand.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommand.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommandParameter.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommandParameter.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExited -> System.EventHandler? +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommand.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommand.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommandParameter.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommandParameter.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerGestureRecognizer() -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMoved -> System.EventHandler? +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommand.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommand.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommandParameter.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommandParameter.set -> void +Microsoft.Maui.Controls.PoppedToRootEventArgs +Microsoft.Maui.Controls.PositionChangedEventArgs +Microsoft.Maui.Controls.PositionChangedEventArgs.CurrentPosition.get -> int +Microsoft.Maui.Controls.PositionChangedEventArgs.PreviousPosition.get -> int +Microsoft.Maui.Controls.PresentationMode +Microsoft.Maui.Controls.PresentationMode.Animated = 2 -> Microsoft.Maui.Controls.PresentationMode +Microsoft.Maui.Controls.PresentationMode.Modal = 4 -> Microsoft.Maui.Controls.PresentationMode +Microsoft.Maui.Controls.PresentationMode.ModalAnimated = Microsoft.Maui.Controls.PresentationMode.Animated | Microsoft.Maui.Controls.PresentationMode.Modal -> Microsoft.Maui.Controls.PresentationMode +Microsoft.Maui.Controls.PresentationMode.ModalNotAnimated = Microsoft.Maui.Controls.PresentationMode.NotAnimated | Microsoft.Maui.Controls.PresentationMode.Modal -> Microsoft.Maui.Controls.PresentationMode +Microsoft.Maui.Controls.PresentationMode.NotAnimated = 1 -> Microsoft.Maui.Controls.PresentationMode +Microsoft.Maui.Controls.ProgressBar +Microsoft.Maui.Controls.ProgressBar.Progress.get -> double +Microsoft.Maui.Controls.ProgressBar.Progress.set -> void +Microsoft.Maui.Controls.ProgressBar.ProgressBar() -> void +Microsoft.Maui.Controls.PropertyChangingEventArgs +Microsoft.Maui.Controls.PropertyChangingEventHandler +Microsoft.Maui.Controls.PropertyCondition +Microsoft.Maui.Controls.PropertyCondition.PropertyCondition() -> void +Microsoft.Maui.Controls.QueryPropertyAttribute +Microsoft.Maui.Controls.RadialGradientBrush +Microsoft.Maui.Controls.RadialGradientBrush.Center.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.RadialGradientBrush.Center.set -> void +Microsoft.Maui.Controls.RadialGradientBrush.RadialGradientBrush() -> void +Microsoft.Maui.Controls.RadialGradientBrush.Radius.get -> double +Microsoft.Maui.Controls.RadialGradientBrush.Radius.set -> void +Microsoft.Maui.Controls.RadioButton +Microsoft.Maui.Controls.RadioButton.BorderWidth.get -> double +Microsoft.Maui.Controls.RadioButton.BorderWidth.set -> void +Microsoft.Maui.Controls.RadioButton.CharacterSpacing.get -> double +Microsoft.Maui.Controls.RadioButton.CharacterSpacing.set -> void +Microsoft.Maui.Controls.RadioButton.CheckedChanged -> System.EventHandler +Microsoft.Maui.Controls.RadioButton.CornerRadius.get -> int +Microsoft.Maui.Controls.RadioButton.CornerRadius.set -> void +Microsoft.Maui.Controls.RadioButton.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.RadioButton.FontAttributes.set -> void +Microsoft.Maui.Controls.RadioButton.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.RadioButton.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.RadioButton.FontSize.get -> double +Microsoft.Maui.Controls.RadioButton.FontSize.set -> void +Microsoft.Maui.Controls.RadioButton.IsChecked.get -> bool +Microsoft.Maui.Controls.RadioButton.IsChecked.set -> void +Microsoft.Maui.Controls.RadioButton.RadioButton() -> void +Microsoft.Maui.Controls.RadioButton.TextTransform.get -> Microsoft.Maui.TextTransform +Microsoft.Maui.Controls.RadioButton.TextTransform.set -> void +Microsoft.Maui.Controls.RadioButtonGroup +Microsoft.Maui.Controls.ReferenceTypeConverter +Microsoft.Maui.Controls.ReferenceTypeConverter.ReferenceTypeConverter() -> void +Microsoft.Maui.Controls.RefreshView +Microsoft.Maui.Controls.RefreshView.IsRefreshing.get -> bool +Microsoft.Maui.Controls.RefreshView.IsRefreshing.set -> void +Microsoft.Maui.Controls.RefreshView.Refreshing -> System.EventHandler +Microsoft.Maui.Controls.RefreshView.RefreshView() -> void +Microsoft.Maui.Controls.Region +Microsoft.Maui.Controls.Region.Contains(double x, double y) -> bool +Microsoft.Maui.Controls.Region.Contains(Microsoft.Maui.Graphics.Point pt) -> bool +Microsoft.Maui.Controls.Region.Deflate() -> Microsoft.Maui.Controls.Region +Microsoft.Maui.Controls.Region.Inflate(double left, double top, double right, double bottom) -> Microsoft.Maui.Controls.Region +Microsoft.Maui.Controls.Region.Inflate(double size) -> Microsoft.Maui.Controls.Region +Microsoft.Maui.Controls.Region.Region() -> void +Microsoft.Maui.Controls.RelativeBindingSource +Microsoft.Maui.Controls.RelativeBindingSource.AncestorLevel.get -> int +Microsoft.Maui.Controls.RelativeBindingSource.Mode.get -> Microsoft.Maui.Controls.RelativeBindingSourceMode +Microsoft.Maui.Controls.RelativeBindingSourceMode +Microsoft.Maui.Controls.RelativeBindingSourceMode.FindAncestor = 3 -> Microsoft.Maui.Controls.RelativeBindingSourceMode +Microsoft.Maui.Controls.RelativeBindingSourceMode.FindAncestorBindingContext = 4 -> Microsoft.Maui.Controls.RelativeBindingSourceMode +Microsoft.Maui.Controls.RelativeBindingSourceMode.Self = 2 -> Microsoft.Maui.Controls.RelativeBindingSourceMode +Microsoft.Maui.Controls.RelativeBindingSourceMode.TemplatedParent = 1 -> Microsoft.Maui.Controls.RelativeBindingSourceMode +Microsoft.Maui.Controls.RenderWithAttribute +Microsoft.Maui.Controls.ReorderableItemsView +Microsoft.Maui.Controls.ReorderableItemsView.CanMixGroups.get -> bool +Microsoft.Maui.Controls.ReorderableItemsView.CanMixGroups.set -> void +Microsoft.Maui.Controls.ReorderableItemsView.CanReorderItems.get -> bool +Microsoft.Maui.Controls.ReorderableItemsView.CanReorderItems.set -> void +Microsoft.Maui.Controls.ReorderableItemsView.ReorderableItemsView() -> void +Microsoft.Maui.Controls.ReorderableItemsView.ReorderCompleted -> System.EventHandler +Microsoft.Maui.Controls.ReorderableItemsView.SendReorderCompleted() -> void +Microsoft.Maui.Controls.ResolutionGroupNameAttribute +Microsoft.Maui.Controls.ResourceDictionary +Microsoft.Maui.Controls.ResourceDictionary.Clear() -> void +Microsoft.Maui.Controls.ResourceDictionary.Count.get -> int +Microsoft.Maui.Controls.ResourceDictionary.RDSourceTypeConverter +Microsoft.Maui.Controls.ResourceDictionary.RDSourceTypeConverter.RDSourceTypeConverter() -> void +Microsoft.Maui.Controls.ResourceDictionary.ResourceDictionary() -> void +Microsoft.Maui.Controls.RouteFactory +Microsoft.Maui.Controls.RouteFactory.RouteFactory() -> void +Microsoft.Maui.Controls.Routing +Microsoft.Maui.Controls.RoutingEffect +Microsoft.Maui.Controls.RoutingEffect.RoutingEffect() -> void +Microsoft.Maui.Controls.RowDefinition +Microsoft.Maui.Controls.RowDefinition.Height.get -> Microsoft.Maui.GridLength +Microsoft.Maui.Controls.RowDefinition.Height.set -> void +Microsoft.Maui.Controls.RowDefinition.RowDefinition() -> void +Microsoft.Maui.Controls.RowDefinition.RowDefinition(Microsoft.Maui.GridLength height) -> void +Microsoft.Maui.Controls.RowDefinition.SizeChanged -> System.EventHandler +Microsoft.Maui.Controls.RowDefinitionCollection +Microsoft.Maui.Controls.RowDefinitionCollection.RowDefinitionCollection() -> void +Microsoft.Maui.Controls.RowDefinitionCollectionTypeConverter +Microsoft.Maui.Controls.RowDefinitionCollectionTypeConverter.RowDefinitionCollectionTypeConverter() -> void +Microsoft.Maui.Controls.ScrolledEventArgs +Microsoft.Maui.Controls.ScrolledEventArgs.ScrolledEventArgs(double x, double y) -> void +Microsoft.Maui.Controls.ScrolledEventArgs.ScrollX.get -> double +Microsoft.Maui.Controls.ScrolledEventArgs.ScrollY.get -> double +Microsoft.Maui.Controls.ScrollMode +Microsoft.Maui.Controls.ScrollMode.Auto = 2 -> Microsoft.Maui.Controls.ScrollMode +Microsoft.Maui.Controls.ScrollMode.Disabled = 0 -> Microsoft.Maui.Controls.ScrollMode +Microsoft.Maui.Controls.ScrollMode.Enabled = 1 -> Microsoft.Maui.Controls.ScrollMode +Microsoft.Maui.Controls.ScrollToMode +Microsoft.Maui.Controls.ScrollToMode.Element = 0 -> Microsoft.Maui.Controls.ScrollToMode +Microsoft.Maui.Controls.ScrollToMode.Position = 1 -> Microsoft.Maui.Controls.ScrollToMode +Microsoft.Maui.Controls.ScrollToPosition +Microsoft.Maui.Controls.ScrollToPosition.Center = 2 -> Microsoft.Maui.Controls.ScrollToPosition +Microsoft.Maui.Controls.ScrollToPosition.End = 3 -> Microsoft.Maui.Controls.ScrollToPosition +Microsoft.Maui.Controls.ScrollToPosition.MakeVisible = 0 -> Microsoft.Maui.Controls.ScrollToPosition +Microsoft.Maui.Controls.ScrollToPosition.Start = 1 -> Microsoft.Maui.Controls.ScrollToPosition +Microsoft.Maui.Controls.ScrollToRequestedEventArgs +Microsoft.Maui.Controls.ScrollToRequestedEventArgs.Mode.get -> Microsoft.Maui.Controls.ScrollToMode +Microsoft.Maui.Controls.ScrollToRequestedEventArgs.Position.get -> Microsoft.Maui.Controls.ScrollToPosition +Microsoft.Maui.Controls.ScrollToRequestedEventArgs.ScrollX.get -> double +Microsoft.Maui.Controls.ScrollToRequestedEventArgs.ScrollY.get -> double +Microsoft.Maui.Controls.ScrollToRequestedEventArgs.ShouldAnimate.get -> bool +Microsoft.Maui.Controls.ScrollToRequestEventArgs +Microsoft.Maui.Controls.ScrollToRequestEventArgs.GroupIndex.get -> int +Microsoft.Maui.Controls.ScrollToRequestEventArgs.Index.get -> int +Microsoft.Maui.Controls.ScrollToRequestEventArgs.IsAnimated.get -> bool +Microsoft.Maui.Controls.ScrollToRequestEventArgs.Mode.get -> Microsoft.Maui.Controls.ScrollToMode +Microsoft.Maui.Controls.ScrollToRequestEventArgs.ScrollToPosition.get -> Microsoft.Maui.Controls.ScrollToPosition +Microsoft.Maui.Controls.ScrollToRequestEventArgs.ScrollToRequestEventArgs(int index, int groupIndex, Microsoft.Maui.Controls.ScrollToPosition scrollToPosition, bool isAnimated) -> void +Microsoft.Maui.Controls.ScrollView +Microsoft.Maui.Controls.ScrollView.ContentSize.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.ScrollView.HorizontalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.Controls.ScrollView.HorizontalScrollBarVisibility.set -> void +Microsoft.Maui.Controls.ScrollView.LayoutAreaOverride.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.ScrollView.LayoutAreaOverride.set -> void +Microsoft.Maui.Controls.ScrollView.Orientation.get -> Microsoft.Maui.ScrollOrientation +Microsoft.Maui.Controls.ScrollView.Orientation.set -> void +Microsoft.Maui.Controls.ScrollView.Scrolled -> System.EventHandler +Microsoft.Maui.Controls.ScrollView.ScrollToRequested -> System.EventHandler +Microsoft.Maui.Controls.ScrollView.ScrollView() -> void +Microsoft.Maui.Controls.ScrollView.ScrollX.get -> double +Microsoft.Maui.Controls.ScrollView.ScrollY.get -> double +Microsoft.Maui.Controls.ScrollView.SendScrollFinished() -> void +Microsoft.Maui.Controls.ScrollView.SetScrolledPosition(double x, double y) -> void +Microsoft.Maui.Controls.ScrollView.VerticalScrollBarVisibility.get -> Microsoft.Maui.ScrollBarVisibility +Microsoft.Maui.Controls.ScrollView.VerticalScrollBarVisibility.set -> void +Microsoft.Maui.Controls.SearchBar +Microsoft.Maui.Controls.SearchBar.CursorPosition.get -> int +Microsoft.Maui.Controls.SearchBar.CursorPosition.set -> void +Microsoft.Maui.Controls.SearchBar.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.SearchBar.FontAttributes.set -> void +Microsoft.Maui.Controls.SearchBar.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.SearchBar.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.SearchBar.FontSize.get -> double +Microsoft.Maui.Controls.SearchBar.FontSize.set -> void +Microsoft.Maui.Controls.SearchBar.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.SearchBar.HorizontalTextAlignment.set -> void +Microsoft.Maui.Controls.SearchBar.OnSearchButtonPressed() -> void +Microsoft.Maui.Controls.SearchBar.SearchBar() -> void +Microsoft.Maui.Controls.SearchBar.SearchButtonPressed -> System.EventHandler +Microsoft.Maui.Controls.SearchBar.SelectionLength.get -> int +Microsoft.Maui.Controls.SearchBar.SelectionLength.set -> void +Microsoft.Maui.Controls.SearchBar.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.SearchBar.VerticalTextAlignment.set -> void +Microsoft.Maui.Controls.SearchBoxVisibility +Microsoft.Maui.Controls.SearchBoxVisibility.Collapsible = 1 -> Microsoft.Maui.Controls.SearchBoxVisibility +Microsoft.Maui.Controls.SearchBoxVisibility.Expanded = 2 -> Microsoft.Maui.Controls.SearchBoxVisibility +Microsoft.Maui.Controls.SearchBoxVisibility.Hidden = 0 -> Microsoft.Maui.Controls.SearchBoxVisibility +Microsoft.Maui.Controls.SearchHandler +Microsoft.Maui.Controls.SearchHandler.CharacterSpacing.get -> double +Microsoft.Maui.Controls.SearchHandler.CharacterSpacing.set -> void +Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderEnabled.get -> bool +Microsoft.Maui.Controls.SearchHandler.ClearPlaceholderEnabled.set -> void +Microsoft.Maui.Controls.SearchHandler.Focus() -> bool +Microsoft.Maui.Controls.SearchHandler.FocusChangeRequested -> System.EventHandler +Microsoft.Maui.Controls.SearchHandler.Focused -> System.EventHandler +Microsoft.Maui.Controls.SearchHandler.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.SearchHandler.FontAttributes.set -> void +Microsoft.Maui.Controls.SearchHandler.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.SearchHandler.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.SearchHandler.FontSize.get -> double +Microsoft.Maui.Controls.SearchHandler.FontSize.set -> void +Microsoft.Maui.Controls.SearchHandler.HorizontalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.SearchHandler.HorizontalTextAlignment.set -> void +Microsoft.Maui.Controls.SearchHandler.IsFocused.get -> bool +Microsoft.Maui.Controls.SearchHandler.IsSearchEnabled.get -> bool +Microsoft.Maui.Controls.SearchHandler.IsSearchEnabled.set -> void +Microsoft.Maui.Controls.SearchHandler.SearchBoxVisibility.get -> Microsoft.Maui.Controls.SearchBoxVisibility +Microsoft.Maui.Controls.SearchHandler.SearchBoxVisibility.set -> void +Microsoft.Maui.Controls.SearchHandler.SearchHandler() -> void +Microsoft.Maui.Controls.SearchHandler.SetIsFocused(bool value) -> void +Microsoft.Maui.Controls.SearchHandler.ShowsResults.get -> bool +Microsoft.Maui.Controls.SearchHandler.ShowsResults.set -> void +Microsoft.Maui.Controls.SearchHandler.TextTransform.get -> Microsoft.Maui.TextTransform +Microsoft.Maui.Controls.SearchHandler.TextTransform.set -> void +Microsoft.Maui.Controls.SearchHandler.Unfocus() -> void +Microsoft.Maui.Controls.SearchHandler.Unfocused -> System.EventHandler +Microsoft.Maui.Controls.SearchHandler.VerticalTextAlignment.get -> Microsoft.Maui.TextAlignment +Microsoft.Maui.Controls.SearchHandler.VerticalTextAlignment.set -> void +Microsoft.Maui.Controls.SelectableItemsView +Microsoft.Maui.Controls.SelectableItemsView.SelectableItemsView() -> void +Microsoft.Maui.Controls.SelectableItemsView.SelectionChanged -> System.EventHandler +Microsoft.Maui.Controls.SelectableItemsView.SelectionMode.get -> Microsoft.Maui.Controls.SelectionMode +Microsoft.Maui.Controls.SelectableItemsView.SelectionMode.set -> void +Microsoft.Maui.Controls.SelectedItemChangedEventArgs +Microsoft.Maui.Controls.SelectedItemChangedEventArgs.SelectedItemIndex.get -> int +Microsoft.Maui.Controls.SelectedPositionChangedEventArgs +Microsoft.Maui.Controls.SelectedPositionChangedEventArgs.SelectedPositionChangedEventArgs(int selectedPosition) -> void +Microsoft.Maui.Controls.SelectionChangedEventArgs +Microsoft.Maui.Controls.SelectionMode +Microsoft.Maui.Controls.SelectionMode.Multiple = 2 -> Microsoft.Maui.Controls.SelectionMode +Microsoft.Maui.Controls.SelectionMode.None = 0 -> Microsoft.Maui.Controls.SelectionMode +Microsoft.Maui.Controls.SelectionMode.Single = 1 -> Microsoft.Maui.Controls.SelectionMode +Microsoft.Maui.Controls.SemanticProperties +Microsoft.Maui.Controls.SemanticProperties.SemanticProperties() -> void +Microsoft.Maui.Controls.SeparatorVisibility +Microsoft.Maui.Controls.SeparatorVisibility.Default = 0 -> Microsoft.Maui.Controls.SeparatorVisibility +Microsoft.Maui.Controls.SeparatorVisibility.None = 1 -> Microsoft.Maui.Controls.SeparatorVisibility +Microsoft.Maui.Controls.Setter +Microsoft.Maui.Controls.Setter.Setter() -> void +Microsoft.Maui.Controls.SettersExtensions +Microsoft.Maui.Controls.Shadow +Microsoft.Maui.Controls.Shadow.Offset.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shadow.Offset.set -> void +Microsoft.Maui.Controls.Shadow.Opacity.get -> float +Microsoft.Maui.Controls.Shadow.Opacity.set -> void +Microsoft.Maui.Controls.Shadow.Radius.get -> float +Microsoft.Maui.Controls.Shadow.Radius.set -> void +Microsoft.Maui.Controls.Shadow.Shadow() -> void +Microsoft.Maui.Controls.Shapes.ArcSegment +Microsoft.Maui.Controls.Shapes.ArcSegment.ArcSegment() -> void +Microsoft.Maui.Controls.Shapes.ArcSegment.ArcSegment(Microsoft.Maui.Graphics.Point point, Microsoft.Maui.Graphics.Size size, double rotationAngle, Microsoft.Maui.Controls.SweepDirection sweepDirection, bool isLargeArc) -> void +Microsoft.Maui.Controls.Shapes.ArcSegment.IsLargeArc.get -> bool +Microsoft.Maui.Controls.Shapes.ArcSegment.IsLargeArc.set -> void +Microsoft.Maui.Controls.Shapes.ArcSegment.Point.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.ArcSegment.Point.set -> void +Microsoft.Maui.Controls.Shapes.ArcSegment.RotationAngle.get -> double +Microsoft.Maui.Controls.Shapes.ArcSegment.RotationAngle.set -> void +Microsoft.Maui.Controls.Shapes.ArcSegment.Size.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Shapes.ArcSegment.Size.set -> void +Microsoft.Maui.Controls.Shapes.ArcSegment.SweepDirection.get -> Microsoft.Maui.Controls.SweepDirection +Microsoft.Maui.Controls.Shapes.ArcSegment.SweepDirection.set -> void +Microsoft.Maui.Controls.Shapes.BezierSegment +Microsoft.Maui.Controls.Shapes.BezierSegment.BezierSegment() -> void +Microsoft.Maui.Controls.Shapes.BezierSegment.BezierSegment(Microsoft.Maui.Graphics.Point point1, Microsoft.Maui.Graphics.Point point2, Microsoft.Maui.Graphics.Point point3) -> void +Microsoft.Maui.Controls.Shapes.BezierSegment.Point1.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.BezierSegment.Point1.set -> void +Microsoft.Maui.Controls.Shapes.BezierSegment.Point2.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.BezierSegment.Point2.set -> void +Microsoft.Maui.Controls.Shapes.BezierSegment.Point3.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.BezierSegment.Point3.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform +Microsoft.Maui.Controls.Shapes.CompositeTransform.CenterX.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.CenterX.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.CenterY.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.CenterY.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.CompositeTransform() -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.Rotation.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.Rotation.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.ScaleX.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.ScaleX.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.ScaleY.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.ScaleY.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.SkewX.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.SkewX.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.SkewY.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.SkewY.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.TranslateX.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.TranslateX.set -> void +Microsoft.Maui.Controls.Shapes.CompositeTransform.TranslateY.get -> double +Microsoft.Maui.Controls.Shapes.CompositeTransform.TranslateY.set -> void +Microsoft.Maui.Controls.Shapes.Ellipse +Microsoft.Maui.Controls.Shapes.Ellipse.Ellipse() -> void +Microsoft.Maui.Controls.Shapes.EllipseGeometry +Microsoft.Maui.Controls.Shapes.EllipseGeometry.Center.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.EllipseGeometry.Center.set -> void +Microsoft.Maui.Controls.Shapes.EllipseGeometry.EllipseGeometry() -> void +Microsoft.Maui.Controls.Shapes.EllipseGeometry.EllipseGeometry(Microsoft.Maui.Graphics.Point center, double radiusX, double radiusY) -> void +Microsoft.Maui.Controls.Shapes.EllipseGeometry.RadiusX.get -> double +Microsoft.Maui.Controls.Shapes.EllipseGeometry.RadiusX.set -> void +Microsoft.Maui.Controls.Shapes.EllipseGeometry.RadiusY.get -> double +Microsoft.Maui.Controls.Shapes.EllipseGeometry.RadiusY.set -> void +Microsoft.Maui.Controls.Shapes.FillRule +Microsoft.Maui.Controls.Shapes.FillRule.EvenOdd = 0 -> Microsoft.Maui.Controls.Shapes.FillRule +Microsoft.Maui.Controls.Shapes.FillRule.Nonzero = 1 -> Microsoft.Maui.Controls.Shapes.FillRule +Microsoft.Maui.Controls.Shapes.Geometry +Microsoft.Maui.Controls.Shapes.Geometry.Geometry() -> void +Microsoft.Maui.Controls.Shapes.GeometryCollection +Microsoft.Maui.Controls.Shapes.GeometryCollection.GeometryCollection() -> void +Microsoft.Maui.Controls.Shapes.GeometryGroup +Microsoft.Maui.Controls.Shapes.GeometryGroup.FillRule.get -> Microsoft.Maui.Controls.Shapes.FillRule +Microsoft.Maui.Controls.Shapes.GeometryGroup.FillRule.set -> void +Microsoft.Maui.Controls.Shapes.GeometryGroup.GeometryGroup() -> void +Microsoft.Maui.Controls.Shapes.GeometryGroup.InvalidateGeometryRequested -> System.EventHandler +Microsoft.Maui.Controls.Shapes.GeometryHelper +Microsoft.Maui.Controls.Shapes.IGeometry +Microsoft.Maui.Controls.Shapes.Line +Microsoft.Maui.Controls.Shapes.Line.Line() -> void +Microsoft.Maui.Controls.Shapes.Line.Line(double x1, double y1, double x2, double y2) -> void +Microsoft.Maui.Controls.Shapes.Line.X1.get -> double +Microsoft.Maui.Controls.Shapes.Line.X1.set -> void +Microsoft.Maui.Controls.Shapes.Line.X2.get -> double +Microsoft.Maui.Controls.Shapes.Line.X2.set -> void +Microsoft.Maui.Controls.Shapes.Line.Y1.get -> double +Microsoft.Maui.Controls.Shapes.Line.Y1.set -> void +Microsoft.Maui.Controls.Shapes.Line.Y2.get -> double +Microsoft.Maui.Controls.Shapes.Line.Y2.set -> void +Microsoft.Maui.Controls.Shapes.LineGeometry +Microsoft.Maui.Controls.Shapes.LineGeometry.EndPoint.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.LineGeometry.EndPoint.set -> void +Microsoft.Maui.Controls.Shapes.LineGeometry.LineGeometry() -> void +Microsoft.Maui.Controls.Shapes.LineGeometry.LineGeometry(Microsoft.Maui.Graphics.Point startPoint, Microsoft.Maui.Graphics.Point endPoint) -> void +Microsoft.Maui.Controls.Shapes.LineGeometry.StartPoint.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.LineGeometry.StartPoint.set -> void +Microsoft.Maui.Controls.Shapes.LineSegment +Microsoft.Maui.Controls.Shapes.LineSegment.LineSegment() -> void +Microsoft.Maui.Controls.Shapes.LineSegment.LineSegment(Microsoft.Maui.Graphics.Point point) -> void +Microsoft.Maui.Controls.Shapes.LineSegment.Point.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.LineSegment.Point.set -> void +Microsoft.Maui.Controls.Shapes.Matrix +Microsoft.Maui.Controls.Shapes.Matrix.Append(Microsoft.Maui.Controls.Shapes.Matrix matrix) -> void +Microsoft.Maui.Controls.Shapes.Matrix.Determinant.get -> double +Microsoft.Maui.Controls.Shapes.Matrix.HasInverse.get -> bool +Microsoft.Maui.Controls.Shapes.Matrix.Invert() -> void +Microsoft.Maui.Controls.Shapes.Matrix.IsIdentity.get -> bool +Microsoft.Maui.Controls.Shapes.Matrix.M11.get -> double +Microsoft.Maui.Controls.Shapes.Matrix.M11.set -> void +Microsoft.Maui.Controls.Shapes.Matrix.M12.get -> double +Microsoft.Maui.Controls.Shapes.Matrix.M12.set -> void +Microsoft.Maui.Controls.Shapes.Matrix.M21.get -> double +Microsoft.Maui.Controls.Shapes.Matrix.M21.set -> void +Microsoft.Maui.Controls.Shapes.Matrix.M22.get -> double +Microsoft.Maui.Controls.Shapes.Matrix.M22.set -> void +Microsoft.Maui.Controls.Shapes.Matrix.Matrix() -> void +Microsoft.Maui.Controls.Shapes.Matrix.Matrix(double m11, double m12, double m21, double m22, double offsetX, double offsetY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.OffsetX.get -> double +Microsoft.Maui.Controls.Shapes.Matrix.OffsetX.set -> void +Microsoft.Maui.Controls.Shapes.Matrix.OffsetY.get -> double +Microsoft.Maui.Controls.Shapes.Matrix.OffsetY.set -> void +Microsoft.Maui.Controls.Shapes.Matrix.Prepend(Microsoft.Maui.Controls.Shapes.Matrix matrix) -> void +Microsoft.Maui.Controls.Shapes.Matrix.Rotate(double angle) -> void +Microsoft.Maui.Controls.Shapes.Matrix.RotateAt(double angle, double centerX, double centerY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.RotateAtPrepend(double angle, double centerX, double centerY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.RotatePrepend(double angle) -> void +Microsoft.Maui.Controls.Shapes.Matrix.Scale(double scaleX, double scaleY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.ScaleAt(double scaleX, double scaleY, double centerX, double centerY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.ScaleAtPrepend(double scaleX, double scaleY, double centerX, double centerY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.ScalePrepend(double scaleX, double scaleY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.SetIdentity() -> void +Microsoft.Maui.Controls.Shapes.Matrix.Skew(double skewX, double skewY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.SkewPrepend(double skewX, double skewY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.Transform(Microsoft.Maui.Graphics.Point point) -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.Matrix.Translate(double offsetX, double offsetY) -> void +Microsoft.Maui.Controls.Shapes.Matrix.TranslatePrepend(double offsetX, double offsetY) -> void +Microsoft.Maui.Controls.Shapes.MatrixExtensions +Microsoft.Maui.Controls.Shapes.MatrixTransform +Microsoft.Maui.Controls.Shapes.MatrixTransform.Matrix.get -> Microsoft.Maui.Controls.Shapes.Matrix +Microsoft.Maui.Controls.Shapes.MatrixTransform.Matrix.set -> void +Microsoft.Maui.Controls.Shapes.MatrixTransform.MatrixTransform() -> void +Microsoft.Maui.Controls.Shapes.MatrixTypeConverter +Microsoft.Maui.Controls.Shapes.MatrixTypeConverter.MatrixTypeConverter() -> void +Microsoft.Maui.Controls.Shapes.Path +Microsoft.Maui.Controls.Shapes.Path.Path() -> void +Microsoft.Maui.Controls.Shapes.PathFigure +Microsoft.Maui.Controls.Shapes.PathFigure.BatchBegin() -> void +Microsoft.Maui.Controls.Shapes.PathFigure.BatchCommit() -> void +Microsoft.Maui.Controls.Shapes.PathFigure.IsClosed.get -> bool +Microsoft.Maui.Controls.Shapes.PathFigure.IsClosed.set -> void +Microsoft.Maui.Controls.Shapes.PathFigure.IsFilled.get -> bool +Microsoft.Maui.Controls.Shapes.PathFigure.IsFilled.set -> void +Microsoft.Maui.Controls.Shapes.PathFigure.PathFigure() -> void +Microsoft.Maui.Controls.Shapes.PathFigure.StartPoint.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.PathFigure.StartPoint.set -> void +Microsoft.Maui.Controls.Shapes.PathFigureCollection +Microsoft.Maui.Controls.Shapes.PathFigureCollection.PathFigureCollection() -> void +Microsoft.Maui.Controls.Shapes.PathFigureCollectionConverter +Microsoft.Maui.Controls.Shapes.PathFigureCollectionConverter.PathFigureCollectionConverter() -> void +Microsoft.Maui.Controls.Shapes.PathGeometry +Microsoft.Maui.Controls.Shapes.PathGeometry.FillRule.get -> Microsoft.Maui.Controls.Shapes.FillRule +Microsoft.Maui.Controls.Shapes.PathGeometry.FillRule.set -> void +Microsoft.Maui.Controls.Shapes.PathGeometry.PathGeometry() -> void +Microsoft.Maui.Controls.Shapes.PathGeometryConverter +Microsoft.Maui.Controls.Shapes.PathGeometryConverter.PathGeometryConverter() -> void +Microsoft.Maui.Controls.Shapes.PathSegment +Microsoft.Maui.Controls.Shapes.PathSegment.BatchBegin() -> void +Microsoft.Maui.Controls.Shapes.PathSegment.BatchCommit() -> void +Microsoft.Maui.Controls.Shapes.PathSegment.PathSegment() -> void +Microsoft.Maui.Controls.Shapes.PathSegmentCollection +Microsoft.Maui.Controls.Shapes.PathSegmentCollection.PathSegmentCollection() -> void +Microsoft.Maui.Controls.Shapes.PenLineCap +Microsoft.Maui.Controls.Shapes.PenLineCap.Flat = 0 -> Microsoft.Maui.Controls.Shapes.PenLineCap +Microsoft.Maui.Controls.Shapes.PenLineCap.Round = 2 -> Microsoft.Maui.Controls.Shapes.PenLineCap +Microsoft.Maui.Controls.Shapes.PenLineCap.Square = 1 -> Microsoft.Maui.Controls.Shapes.PenLineCap +Microsoft.Maui.Controls.Shapes.PenLineJoin +Microsoft.Maui.Controls.Shapes.PenLineJoin.Bevel = 1 -> Microsoft.Maui.Controls.Shapes.PenLineJoin +Microsoft.Maui.Controls.Shapes.PenLineJoin.Miter = 0 -> Microsoft.Maui.Controls.Shapes.PenLineJoin +Microsoft.Maui.Controls.Shapes.PenLineJoin.Round = 2 -> Microsoft.Maui.Controls.Shapes.PenLineJoin +Microsoft.Maui.Controls.Shapes.PointCollectionConverter +Microsoft.Maui.Controls.Shapes.PointCollectionConverter.PointCollectionConverter() -> void +Microsoft.Maui.Controls.Shapes.PolyBezierSegment +Microsoft.Maui.Controls.Shapes.PolyBezierSegment.PolyBezierSegment() -> void +Microsoft.Maui.Controls.Shapes.Polygon +Microsoft.Maui.Controls.Shapes.Polygon.FillRule.get -> Microsoft.Maui.Controls.Shapes.FillRule +Microsoft.Maui.Controls.Shapes.Polygon.FillRule.set -> void +Microsoft.Maui.Controls.Shapes.Polygon.Polygon() -> void +Microsoft.Maui.Controls.Shapes.Polyline +Microsoft.Maui.Controls.Shapes.Polyline.FillRule.get -> Microsoft.Maui.Controls.Shapes.FillRule +Microsoft.Maui.Controls.Shapes.Polyline.FillRule.set -> void +Microsoft.Maui.Controls.Shapes.Polyline.Polyline() -> void +Microsoft.Maui.Controls.Shapes.PolyLineSegment +Microsoft.Maui.Controls.Shapes.PolyLineSegment.PolyLineSegment() -> void +Microsoft.Maui.Controls.Shapes.PolyQuadraticBezierSegment +Microsoft.Maui.Controls.Shapes.PolyQuadraticBezierSegment.PolyQuadraticBezierSegment() -> void +Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment +Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.Point1.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.Point1.set -> void +Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.Point2.get -> Microsoft.Maui.Graphics.Point +Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.Point2.set -> void +Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.QuadraticBezierSegment() -> void +Microsoft.Maui.Controls.Shapes.QuadraticBezierSegment.QuadraticBezierSegment(Microsoft.Maui.Graphics.Point point1, Microsoft.Maui.Graphics.Point point2) -> void +Microsoft.Maui.Controls.Shapes.Rectangle +Microsoft.Maui.Controls.Shapes.Rectangle.RadiusX.get -> double +Microsoft.Maui.Controls.Shapes.Rectangle.RadiusX.set -> void +Microsoft.Maui.Controls.Shapes.Rectangle.RadiusY.get -> double +Microsoft.Maui.Controls.Shapes.Rectangle.RadiusY.set -> void +Microsoft.Maui.Controls.Shapes.Rectangle.Rectangle() -> void +Microsoft.Maui.Controls.Shapes.RectangleGeometry +Microsoft.Maui.Controls.Shapes.RectangleGeometry.Rect.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.Shapes.RectangleGeometry.Rect.set -> void +Microsoft.Maui.Controls.Shapes.RectangleGeometry.RectangleGeometry() -> void +Microsoft.Maui.Controls.Shapes.RectangleGeometry.RectangleGeometry(Microsoft.Maui.Graphics.Rect rect) -> void +Microsoft.Maui.Controls.Shapes.RotateTransform +Microsoft.Maui.Controls.Shapes.RotateTransform.Angle.get -> double +Microsoft.Maui.Controls.Shapes.RotateTransform.Angle.set -> void +Microsoft.Maui.Controls.Shapes.RotateTransform.CenterX.get -> double +Microsoft.Maui.Controls.Shapes.RotateTransform.CenterX.set -> void +Microsoft.Maui.Controls.Shapes.RotateTransform.CenterY.get -> double +Microsoft.Maui.Controls.Shapes.RotateTransform.CenterY.set -> void +Microsoft.Maui.Controls.Shapes.RotateTransform.RotateTransform() -> void +Microsoft.Maui.Controls.Shapes.RotateTransform.RotateTransform(double angle, double centerX, double centerY) -> void +Microsoft.Maui.Controls.Shapes.RotateTransform.RotateTransform(double angle) -> void +Microsoft.Maui.Controls.Shapes.RoundRectangle +Microsoft.Maui.Controls.Shapes.RoundRectangle.CornerRadius.get -> Microsoft.Maui.CornerRadius +Microsoft.Maui.Controls.Shapes.RoundRectangle.CornerRadius.set -> void +Microsoft.Maui.Controls.Shapes.RoundRectangle.RoundRectangle() -> void +Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry +Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.CornerRadius.get -> Microsoft.Maui.CornerRadius +Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.CornerRadius.set -> void +Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.Rect.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.Rect.set -> void +Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.RoundRectangleGeometry() -> void +Microsoft.Maui.Controls.Shapes.RoundRectangleGeometry.RoundRectangleGeometry(Microsoft.Maui.CornerRadius cornerRadius, Microsoft.Maui.Graphics.Rect rect) -> void +Microsoft.Maui.Controls.Shapes.ScaleTransform +Microsoft.Maui.Controls.Shapes.ScaleTransform.CenterX.get -> double +Microsoft.Maui.Controls.Shapes.ScaleTransform.CenterX.set -> void +Microsoft.Maui.Controls.Shapes.ScaleTransform.CenterY.get -> double +Microsoft.Maui.Controls.Shapes.ScaleTransform.CenterY.set -> void +Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleTransform() -> void +Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleTransform(double scaleX, double scaleY, double centerX, double centerY) -> void +Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleTransform(double scaleX, double scaleY) -> void +Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleX.get -> double +Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleX.set -> void +Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleY.get -> double +Microsoft.Maui.Controls.Shapes.ScaleTransform.ScaleY.set -> void +Microsoft.Maui.Controls.Shapes.Shape +Microsoft.Maui.Controls.Shapes.Shape.Aspect.get -> Microsoft.Maui.Controls.Stretch +Microsoft.Maui.Controls.Shapes.Shape.Aspect.set -> void +Microsoft.Maui.Controls.Shapes.Shape.Fill.get -> Microsoft.Maui.Controls.Brush! +Microsoft.Maui.Controls.Shapes.Shape.Fill.set -> void +Microsoft.Maui.Controls.Shapes.Shape.Shape() -> void +Microsoft.Maui.Controls.Shapes.Shape.Stroke.get -> Microsoft.Maui.Controls.Brush! +Microsoft.Maui.Controls.Shapes.Shape.Stroke.set -> void +Microsoft.Maui.Controls.Shapes.Shape.StrokeDashArray.get -> Microsoft.Maui.Controls.DoubleCollection! +Microsoft.Maui.Controls.Shapes.Shape.StrokeDashArray.set -> void +Microsoft.Maui.Controls.Shapes.Shape.StrokeDashOffset.get -> double +Microsoft.Maui.Controls.Shapes.Shape.StrokeDashOffset.set -> void +Microsoft.Maui.Controls.Shapes.Shape.StrokeDashPattern.get -> float[]! +Microsoft.Maui.Controls.Shapes.Shape.StrokeLineCap.get -> Microsoft.Maui.Controls.Shapes.PenLineCap +Microsoft.Maui.Controls.Shapes.Shape.StrokeLineCap.set -> void +Microsoft.Maui.Controls.Shapes.Shape.StrokeLineJoin.get -> Microsoft.Maui.Controls.Shapes.PenLineJoin +Microsoft.Maui.Controls.Shapes.Shape.StrokeLineJoin.set -> void +Microsoft.Maui.Controls.Shapes.Shape.StrokeMiterLimit.get -> double +Microsoft.Maui.Controls.Shapes.Shape.StrokeMiterLimit.set -> void +Microsoft.Maui.Controls.Shapes.Shape.StrokeThickness.get -> double +Microsoft.Maui.Controls.Shapes.Shape.StrokeThickness.set -> void +Microsoft.Maui.Controls.Shapes.SkewTransform +Microsoft.Maui.Controls.Shapes.SkewTransform.AngleX.get -> double +Microsoft.Maui.Controls.Shapes.SkewTransform.AngleX.set -> void +Microsoft.Maui.Controls.Shapes.SkewTransform.AngleY.get -> double +Microsoft.Maui.Controls.Shapes.SkewTransform.AngleY.set -> void +Microsoft.Maui.Controls.Shapes.SkewTransform.CenterX.get -> double +Microsoft.Maui.Controls.Shapes.SkewTransform.CenterX.set -> void +Microsoft.Maui.Controls.Shapes.SkewTransform.CenterY.get -> double +Microsoft.Maui.Controls.Shapes.SkewTransform.CenterY.set -> void +Microsoft.Maui.Controls.Shapes.SkewTransform.SkewTransform() -> void +Microsoft.Maui.Controls.Shapes.SkewTransform.SkewTransform(double angleX, double angleY, double centerX, double centerY) -> void +Microsoft.Maui.Controls.Shapes.SkewTransform.SkewTransform(double angleX, double angleY) -> void +Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter +Microsoft.Maui.Controls.Shapes.StrokeShapeTypeConverter.StrokeShapeTypeConverter() -> void +Microsoft.Maui.Controls.Shapes.Transform +Microsoft.Maui.Controls.Shapes.Transform.Transform() -> void +Microsoft.Maui.Controls.Shapes.Transform.Value.get -> Microsoft.Maui.Controls.Shapes.Matrix +Microsoft.Maui.Controls.Shapes.Transform.Value.set -> void +Microsoft.Maui.Controls.Shapes.TransformCollection +Microsoft.Maui.Controls.Shapes.TransformCollection.TransformCollection() -> void +Microsoft.Maui.Controls.Shapes.TransformGroup +Microsoft.Maui.Controls.Shapes.TransformGroup.TransformGroup() -> void +Microsoft.Maui.Controls.Shapes.TransformTypeConverter +Microsoft.Maui.Controls.Shapes.TransformTypeConverter.TransformTypeConverter() -> void +Microsoft.Maui.Controls.Shapes.TranslateTransform +Microsoft.Maui.Controls.Shapes.TranslateTransform.TranslateTransform() -> void +Microsoft.Maui.Controls.Shapes.TranslateTransform.TranslateTransform(double x, double y) -> void +Microsoft.Maui.Controls.Shapes.TranslateTransform.X.get -> double +Microsoft.Maui.Controls.Shapes.TranslateTransform.X.set -> void +Microsoft.Maui.Controls.Shapes.TranslateTransform.Y.get -> double +Microsoft.Maui.Controls.Shapes.TranslateTransform.Y.set -> void +Microsoft.Maui.Controls.Shell +Microsoft.Maui.Controls.Shell.FlyoutBackgroundImageAspect.get -> Microsoft.Maui.Aspect +Microsoft.Maui.Controls.Shell.FlyoutBackgroundImageAspect.set -> void +Microsoft.Maui.Controls.Shell.FlyoutBehavior.get -> Microsoft.Maui.FlyoutBehavior +Microsoft.Maui.Controls.Shell.FlyoutBehavior.set -> void +Microsoft.Maui.Controls.Shell.FlyoutHeaderBehavior.get -> Microsoft.Maui.Controls.FlyoutHeaderBehavior +Microsoft.Maui.Controls.Shell.FlyoutHeaderBehavior.set -> void +Microsoft.Maui.Controls.Shell.FlyoutHeight.get -> double +Microsoft.Maui.Controls.Shell.FlyoutHeight.set -> void +Microsoft.Maui.Controls.Shell.FlyoutIsPresented.get -> bool +Microsoft.Maui.Controls.Shell.FlyoutIsPresented.set -> void +Microsoft.Maui.Controls.Shell.FlyoutVerticalScrollMode.get -> Microsoft.Maui.Controls.ScrollMode +Microsoft.Maui.Controls.Shell.FlyoutVerticalScrollMode.set -> void +Microsoft.Maui.Controls.Shell.FlyoutWidth.get -> double +Microsoft.Maui.Controls.Shell.FlyoutWidth.set -> void +Microsoft.Maui.Controls.Shell.Navigated -> System.EventHandler +Microsoft.Maui.Controls.Shell.Navigating -> System.EventHandler +Microsoft.Maui.Controls.Shell.Shell() -> void +Microsoft.Maui.Controls.ShellAppearance +Microsoft.Maui.Controls.ShellAppearance.FlyoutHeight.get -> double +Microsoft.Maui.Controls.ShellAppearance.FlyoutWidth.get -> double +Microsoft.Maui.Controls.ShellAppearance.MakeComplete() -> void +Microsoft.Maui.Controls.ShellContent +Microsoft.Maui.Controls.ShellContent.ShellContent() -> void +Microsoft.Maui.Controls.ShellGroupItem +Microsoft.Maui.Controls.ShellGroupItem.FlyoutDisplayOptions.get -> Microsoft.Maui.Controls.FlyoutDisplayOptions +Microsoft.Maui.Controls.ShellGroupItem.FlyoutDisplayOptions.set -> void +Microsoft.Maui.Controls.ShellGroupItem.ShellGroupItem() -> void +Microsoft.Maui.Controls.ShellItem +Microsoft.Maui.Controls.ShellItem.ShellItem() -> void +Microsoft.Maui.Controls.ShellNavigatedEventArgs +Microsoft.Maui.Controls.ShellNavigatedEventArgs.Source.get -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigatingDeferral +Microsoft.Maui.Controls.ShellNavigatingDeferral.Complete() -> void +Microsoft.Maui.Controls.ShellNavigatingEventArgs +Microsoft.Maui.Controls.ShellNavigatingEventArgs.CanCancel.get -> bool +Microsoft.Maui.Controls.ShellNavigatingEventArgs.Cancel() -> bool +Microsoft.Maui.Controls.ShellNavigatingEventArgs.Cancelled.get -> bool +Microsoft.Maui.Controls.ShellNavigatingEventArgs.Source.get -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.Insert = 4 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.Pop = 2 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.PopToRoot = 3 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.Push = 1 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.Remove = 5 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.ShellContentChanged = 8 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.ShellItemChanged = 6 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.ShellSectionChanged = 7 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationSource.Unknown = 0 -> Microsoft.Maui.Controls.ShellNavigationSource +Microsoft.Maui.Controls.ShellNavigationState +Microsoft.Maui.Controls.ShellNavigationState.ShellNavigationState() -> void +Microsoft.Maui.Controls.ShellSection +Microsoft.Maui.Controls.ShellSection.ShellSection() -> void +Microsoft.Maui.Controls.ShellTemplatedViewManager +Microsoft.Maui.Controls.Slider +Microsoft.Maui.Controls.Slider.DragCompleted -> System.EventHandler +Microsoft.Maui.Controls.Slider.DragStarted -> System.EventHandler +Microsoft.Maui.Controls.Slider.Maximum.get -> double +Microsoft.Maui.Controls.Slider.Maximum.set -> void +Microsoft.Maui.Controls.Slider.Minimum.get -> double +Microsoft.Maui.Controls.Slider.Minimum.set -> void +Microsoft.Maui.Controls.Slider.Slider() -> void +Microsoft.Maui.Controls.Slider.Slider(double min, double max, double val) -> void +Microsoft.Maui.Controls.Slider.Value.get -> double +Microsoft.Maui.Controls.Slider.Value.set -> void +Microsoft.Maui.Controls.Slider.ValueChanged -> System.EventHandler +Microsoft.Maui.Controls.SnapPointsAlignment +Microsoft.Maui.Controls.SnapPointsAlignment.Center = 1 -> Microsoft.Maui.Controls.SnapPointsAlignment +Microsoft.Maui.Controls.SnapPointsAlignment.End = 2 -> Microsoft.Maui.Controls.SnapPointsAlignment +Microsoft.Maui.Controls.SnapPointsAlignment.Start = 0 -> Microsoft.Maui.Controls.SnapPointsAlignment +Microsoft.Maui.Controls.SnapPointsType +Microsoft.Maui.Controls.SnapPointsType.Mandatory = 1 -> Microsoft.Maui.Controls.SnapPointsType +Microsoft.Maui.Controls.SnapPointsType.MandatorySingle = 2 -> Microsoft.Maui.Controls.SnapPointsType +Microsoft.Maui.Controls.SnapPointsType.None = 0 -> Microsoft.Maui.Controls.SnapPointsType +Microsoft.Maui.Controls.SolidColorBrush +Microsoft.Maui.Controls.SolidColorBrush.SolidColorBrush() -> void +Microsoft.Maui.Controls.Span +Microsoft.Maui.Controls.Span.CharacterSpacing.get -> double +Microsoft.Maui.Controls.Span.CharacterSpacing.set -> void +Microsoft.Maui.Controls.Span.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.Span.FontAttributes.set -> void +Microsoft.Maui.Controls.Span.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.Span.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.Span.FontSize.get -> double +Microsoft.Maui.Controls.Span.FontSize.set -> void +Microsoft.Maui.Controls.Span.LineHeight.get -> double +Microsoft.Maui.Controls.Span.LineHeight.set -> void +Microsoft.Maui.Controls.Span.Span() -> void +Microsoft.Maui.Controls.Span.TextDecorations.get -> Microsoft.Maui.TextDecorations +Microsoft.Maui.Controls.Span.TextDecorations.set -> void +Microsoft.Maui.Controls.Span.TextTransform.get -> Microsoft.Maui.TextTransform +Microsoft.Maui.Controls.Span.TextTransform.set -> void +Microsoft.Maui.Controls.StackBase +Microsoft.Maui.Controls.StackBase.Spacing.get -> double +Microsoft.Maui.Controls.StackBase.Spacing.set -> void +Microsoft.Maui.Controls.StackBase.StackBase() -> void +Microsoft.Maui.Controls.StackLayout +Microsoft.Maui.Controls.StackLayout.Orientation.get -> Microsoft.Maui.Controls.StackOrientation +Microsoft.Maui.Controls.StackLayout.Orientation.set -> void +Microsoft.Maui.Controls.StackLayout.StackLayout() -> void +Microsoft.Maui.Controls.StackLayoutManager +Microsoft.Maui.Controls.StackLayoutManager.ArrangeChildren(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.StackLayoutManager.Measure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.StackOrientation +Microsoft.Maui.Controls.StackOrientation.Horizontal = 1 -> Microsoft.Maui.Controls.StackOrientation +Microsoft.Maui.Controls.StackOrientation.Vertical = 0 -> Microsoft.Maui.Controls.StackOrientation +Microsoft.Maui.Controls.StateTrigger +Microsoft.Maui.Controls.StateTrigger.IsActive.get -> bool +Microsoft.Maui.Controls.StateTrigger.IsActive.set -> void +Microsoft.Maui.Controls.StateTrigger.StateTrigger() -> void +Microsoft.Maui.Controls.StateTriggerBase +Microsoft.Maui.Controls.StateTriggerBase.IsActive.get -> bool +Microsoft.Maui.Controls.StateTriggerBase.IsActiveChanged -> System.EventHandler +Microsoft.Maui.Controls.StateTriggerBase.IsAttached.get -> bool +Microsoft.Maui.Controls.StateTriggerBase.SetActive(bool active) -> void +Microsoft.Maui.Controls.StateTriggerBase.StateTriggerBase() -> void +Microsoft.Maui.Controls.Stepper +Microsoft.Maui.Controls.Stepper.Increment.get -> double +Microsoft.Maui.Controls.Stepper.Increment.set -> void +Microsoft.Maui.Controls.Stepper.Maximum.get -> double +Microsoft.Maui.Controls.Stepper.Maximum.set -> void +Microsoft.Maui.Controls.Stepper.Minimum.get -> double +Microsoft.Maui.Controls.Stepper.Minimum.set -> void +Microsoft.Maui.Controls.Stepper.Stepper() -> void +Microsoft.Maui.Controls.Stepper.Stepper(double min, double max, double val, double increment) -> void +Microsoft.Maui.Controls.Stepper.Value.get -> double +Microsoft.Maui.Controls.Stepper.Value.set -> void +Microsoft.Maui.Controls.Stepper.ValueChanged -> System.EventHandler +Microsoft.Maui.Controls.StreamImageSource +Microsoft.Maui.Controls.StreamImageSource.StreamImageSource() -> void +Microsoft.Maui.Controls.Stretch +Microsoft.Maui.Controls.Stretch.Fill = 1 -> Microsoft.Maui.Controls.Stretch +Microsoft.Maui.Controls.Stretch.None = 0 -> Microsoft.Maui.Controls.Stretch +Microsoft.Maui.Controls.Stretch.Uniform = 2 -> Microsoft.Maui.Controls.Stretch +Microsoft.Maui.Controls.Stretch.UniformToFill = 3 -> Microsoft.Maui.Controls.Stretch +Microsoft.Maui.Controls.StructuredItemsView +Microsoft.Maui.Controls.StructuredItemsView.ItemSizingStrategy.get -> Microsoft.Maui.Controls.ItemSizingStrategy +Microsoft.Maui.Controls.StructuredItemsView.ItemSizingStrategy.set -> void +Microsoft.Maui.Controls.StructuredItemsView.StructuredItemsView() -> void +Microsoft.Maui.Controls.Style +Microsoft.Maui.Controls.Style.ApplyToDerivedTypes.get -> bool +Microsoft.Maui.Controls.Style.ApplyToDerivedTypes.set -> void +Microsoft.Maui.Controls.Style.CanCascade.get -> bool +Microsoft.Maui.Controls.Style.CanCascade.set -> void +Microsoft.Maui.Controls.StyleSheets.StyleSheet +Microsoft.Maui.Controls.SweepDirection +Microsoft.Maui.Controls.SweepDirection.Clockwise = 1 -> Microsoft.Maui.Controls.SweepDirection +Microsoft.Maui.Controls.SweepDirection.CounterClockwise = 0 -> Microsoft.Maui.Controls.SweepDirection +Microsoft.Maui.Controls.SwipeChangingEventArgs +Microsoft.Maui.Controls.SwipeChangingEventArgs.Offset.get -> double +Microsoft.Maui.Controls.SwipeChangingEventArgs.Offset.set -> void +Microsoft.Maui.Controls.SwipeChangingEventArgs.SwipeChangingEventArgs(Microsoft.Maui.SwipeDirection swipeDirection, double offset) -> void +Microsoft.Maui.Controls.SwipedEventArgs +Microsoft.Maui.Controls.SwipedEventArgs.Direction.get -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.Controls.SwipeEndedEventArgs +Microsoft.Maui.Controls.SwipeEndedEventArgs.IsOpen.get -> bool +Microsoft.Maui.Controls.SwipeEndedEventArgs.IsOpen.set -> void +Microsoft.Maui.Controls.SwipeEndedEventArgs.SwipeEndedEventArgs(Microsoft.Maui.SwipeDirection swipeDirection, bool isOpen) -> void +Microsoft.Maui.Controls.SwipeGestureRecognizer +Microsoft.Maui.Controls.SwipeGestureRecognizer.Direction.get -> Microsoft.Maui.SwipeDirection +Microsoft.Maui.Controls.SwipeGestureRecognizer.Direction.set -> void +Microsoft.Maui.Controls.SwipeGestureRecognizer.Swiped -> System.EventHandler +Microsoft.Maui.Controls.SwipeGestureRecognizer.SwipeGestureRecognizer() -> void +Microsoft.Maui.Controls.SwipeGestureRecognizer.Threshold.get -> uint +Microsoft.Maui.Controls.SwipeGestureRecognizer.Threshold.set -> void +Microsoft.Maui.Controls.SwipeItem +Microsoft.Maui.Controls.SwipeItem.Invoked -> System.EventHandler +Microsoft.Maui.Controls.SwipeItem.IsVisible.get -> bool +Microsoft.Maui.Controls.SwipeItem.IsVisible.set -> void +Microsoft.Maui.Controls.SwipeItem.SwipeItem() -> void +Microsoft.Maui.Controls.SwipeItems +Microsoft.Maui.Controls.SwipeItems.Clear() -> void +Microsoft.Maui.Controls.SwipeItems.CollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.SwipeItems.Count.get -> int +Microsoft.Maui.Controls.SwipeItems.IsReadOnly.get -> bool +Microsoft.Maui.Controls.SwipeItems.Mode.get -> Microsoft.Maui.SwipeMode +Microsoft.Maui.Controls.SwipeItems.Mode.set -> void +Microsoft.Maui.Controls.SwipeItems.RemoveAt(int index) -> void +Microsoft.Maui.Controls.SwipeItems.SwipeBehaviorOnInvoked.get -> Microsoft.Maui.SwipeBehaviorOnInvoked +Microsoft.Maui.Controls.SwipeItems.SwipeBehaviorOnInvoked.set -> void +Microsoft.Maui.Controls.SwipeItems.SwipeItems() -> void +Microsoft.Maui.Controls.SwipeItemView +Microsoft.Maui.Controls.SwipeItemView.Invoked -> System.EventHandler +Microsoft.Maui.Controls.SwipeItemView.OnInvoked() -> void +Microsoft.Maui.Controls.SwipeItemView.SwipeItemView() -> void +Microsoft.Maui.Controls.SwipeStartedEventArgs +Microsoft.Maui.Controls.SwipeStartedEventArgs.SwipeStartedEventArgs(Microsoft.Maui.SwipeDirection swipeDirection) -> void +Microsoft.Maui.Controls.SwipeView +Microsoft.Maui.Controls.SwipeView.Close(bool animated = true) -> void +Microsoft.Maui.Controls.SwipeView.CloseRequested -> System.EventHandler +Microsoft.Maui.Controls.SwipeView.Open(Microsoft.Maui.OpenSwipeItem openSwipeItem, bool animated = true) -> void +Microsoft.Maui.Controls.SwipeView.OpenRequested -> System.EventHandler +Microsoft.Maui.Controls.SwipeView.SwipeChanging -> System.EventHandler +Microsoft.Maui.Controls.SwipeView.SwipeEnded -> System.EventHandler +Microsoft.Maui.Controls.SwipeView.SwipeStarted -> System.EventHandler +Microsoft.Maui.Controls.SwipeView.SwipeView() -> void +Microsoft.Maui.Controls.SwipeView.Threshold.get -> double +Microsoft.Maui.Controls.SwipeView.Threshold.set -> void +Microsoft.Maui.Controls.Switch +Microsoft.Maui.Controls.Switch.IsToggled.get -> bool +Microsoft.Maui.Controls.Switch.IsToggled.set -> void +Microsoft.Maui.Controls.Switch.Switch() -> void +Microsoft.Maui.Controls.Switch.Toggled -> System.EventHandler +Microsoft.Maui.Controls.SwitchCell +Microsoft.Maui.Controls.SwitchCell.On.get -> bool +Microsoft.Maui.Controls.SwitchCell.On.set -> void +Microsoft.Maui.Controls.SwitchCell.OnChanged -> System.EventHandler +Microsoft.Maui.Controls.SwitchCell.SwitchCell() -> void +Microsoft.Maui.Controls.Tab +Microsoft.Maui.Controls.Tab.Tab() -> void +Microsoft.Maui.Controls.TabBar +Microsoft.Maui.Controls.TabBar.TabBar() -> void +Microsoft.Maui.Controls.TabbedPage +Microsoft.Maui.Controls.TabbedPage.TabbedPage() -> void +Microsoft.Maui.Controls.TableIntent +Microsoft.Maui.Controls.TableIntent.Data = 3 -> Microsoft.Maui.Controls.TableIntent +Microsoft.Maui.Controls.TableIntent.Form = 2 -> Microsoft.Maui.Controls.TableIntent +Microsoft.Maui.Controls.TableIntent.Menu = 0 -> Microsoft.Maui.Controls.TableIntent +Microsoft.Maui.Controls.TableIntent.Settings = 1 -> Microsoft.Maui.Controls.TableIntent +Microsoft.Maui.Controls.TableRoot +Microsoft.Maui.Controls.TableRoot.TableRoot() -> void +Microsoft.Maui.Controls.TableSection +Microsoft.Maui.Controls.TableSection.TableSection() -> void +Microsoft.Maui.Controls.TableSectionBase +Microsoft.Maui.Controls.TableSectionBase.TableSectionBase() -> void +Microsoft.Maui.Controls.TableSectionBase.Clear() -> void +Microsoft.Maui.Controls.TableSectionBase.CollectionChanged -> System.Collections.Specialized.NotifyCollectionChangedEventHandler +Microsoft.Maui.Controls.TableSectionBase.Count.get -> int +Microsoft.Maui.Controls.TableSectionBase.RemoveAt(int index) -> void +Microsoft.Maui.Controls.TableSectionBase.TableSectionBase() -> void +Microsoft.Maui.Controls.TableView +Microsoft.Maui.Controls.TableView.HasUnevenRows.get -> bool +Microsoft.Maui.Controls.TableView.HasUnevenRows.set -> void +Microsoft.Maui.Controls.TableView.Intent.get -> Microsoft.Maui.Controls.TableIntent +Microsoft.Maui.Controls.TableView.Intent.set -> void +Microsoft.Maui.Controls.TableView.ModelChanged -> System.EventHandler +Microsoft.Maui.Controls.TableView.RowHeight.get -> int +Microsoft.Maui.Controls.TableView.RowHeight.set -> void +Microsoft.Maui.Controls.TableView.TableView() -> void +Microsoft.Maui.Controls.TabsStyle +Microsoft.Maui.Controls.TabsStyle.Default = 0 -> Microsoft.Maui.Controls.TabsStyle +Microsoft.Maui.Controls.TabsStyle.Hidden = 1 -> Microsoft.Maui.Controls.TabsStyle +Microsoft.Maui.Controls.TabsStyle.Icons = 2 -> Microsoft.Maui.Controls.TabsStyle +Microsoft.Maui.Controls.TabsStyle.OnBottom = 4 -> Microsoft.Maui.Controls.TabsStyle +Microsoft.Maui.Controls.TabsStyle.OnNavigation = 3 -> Microsoft.Maui.Controls.TabsStyle +Microsoft.Maui.Controls.TapGestureRecognizer +Microsoft.Maui.Controls.TapGestureRecognizer.Buttons.get -> Microsoft.Maui.Controls.ButtonsMask +Microsoft.Maui.Controls.TapGestureRecognizer.Buttons.set -> void +Microsoft.Maui.Controls.TapGestureRecognizer.Command.get -> System.Windows.Input.ICommand? +Microsoft.Maui.Controls.TapGestureRecognizer.Command.set -> void +Microsoft.Maui.Controls.TapGestureRecognizer.CommandParameter.get -> object? +Microsoft.Maui.Controls.TapGestureRecognizer.CommandParameter.set -> void +Microsoft.Maui.Controls.TapGestureRecognizer.NumberOfTapsRequired.get -> int +Microsoft.Maui.Controls.TapGestureRecognizer.NumberOfTapsRequired.set -> void +Microsoft.Maui.Controls.TapGestureRecognizer.TapGestureRecognizer() -> void +Microsoft.Maui.Controls.TapGestureRecognizer.Tapped -> System.EventHandler? +Microsoft.Maui.Controls.TappedEventArgs +Microsoft.Maui.Controls.TappedEventArgs.Buttons.get -> Microsoft.Maui.Controls.ButtonsMask +Microsoft.Maui.Controls.TappedEventArgs.Parameter.get -> object? +Microsoft.Maui.Controls.TappedEventArgs.TappedEventArgs(object? parameter) -> void +Microsoft.Maui.Controls.TargetIdiom +Microsoft.Maui.Controls.TargetIdiom.Desktop = 3 -> Microsoft.Maui.Controls.TargetIdiom +Microsoft.Maui.Controls.TargetIdiom.Phone = 1 -> Microsoft.Maui.Controls.TargetIdiom +Microsoft.Maui.Controls.TargetIdiom.Tablet = 2 -> Microsoft.Maui.Controls.TargetIdiom +Microsoft.Maui.Controls.TargetIdiom.TV = 4 -> Microsoft.Maui.Controls.TargetIdiom +Microsoft.Maui.Controls.TargetIdiom.Unsupported = 0 -> Microsoft.Maui.Controls.TargetIdiom +Microsoft.Maui.Controls.TargetIdiom.Watch = 5 -> Microsoft.Maui.Controls.TargetIdiom +Microsoft.Maui.Controls.TemplateBinding +Microsoft.Maui.Controls.TemplateBinding.TemplateBinding() -> void +Microsoft.Maui.Controls.TemplatedPage +Microsoft.Maui.Controls.TemplatedPage.TemplatedPage() -> void +Microsoft.Maui.Controls.TemplatedView +Microsoft.Maui.Controls.TemplatedView.TemplatedView() -> void +Microsoft.Maui.Controls.TemplateExtensions +Microsoft.Maui.Controls.TextAlignmentConverter +Microsoft.Maui.Controls.TextAlignmentConverter.TextAlignmentConverter() -> void +Microsoft.Maui.Controls.TextCell +Microsoft.Maui.Controls.TextCell.TextCell() -> void +Microsoft.Maui.Controls.TextChangedEventArgs +Microsoft.Maui.Controls.TextDecorationConverter +Microsoft.Maui.Controls.TextDecorationConverter.TextDecorationConverter() -> void +Microsoft.Maui.Controls.TimePicker +Microsoft.Maui.Controls.TimePicker.CharacterSpacing.get -> double +Microsoft.Maui.Controls.TimePicker.CharacterSpacing.set -> void +Microsoft.Maui.Controls.TimePicker.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.TimePicker.FontAttributes.set -> void +Microsoft.Maui.Controls.TimePicker.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.TimePicker.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.TimePicker.FontSize.get -> double +Microsoft.Maui.Controls.TimePicker.FontSize.set -> void +Microsoft.Maui.Controls.TimePicker.Time.get -> System.TimeSpan +Microsoft.Maui.Controls.TimePicker.Time.set -> void +Microsoft.Maui.Controls.TimePicker.TimePicker() -> void +Microsoft.Maui.Controls.ToggledEventArgs +Microsoft.Maui.Controls.ToggledEventArgs.ToggledEventArgs(bool value) -> void +Microsoft.Maui.Controls.ToggledEventArgs.Value.get -> bool +Microsoft.Maui.Controls.Toolbar +Microsoft.Maui.Controls.Toolbar.BackButtonEnabled.get -> bool +Microsoft.Maui.Controls.Toolbar.BackButtonEnabled.set -> void +Microsoft.Maui.Controls.Toolbar.BarHeight.get -> double? +Microsoft.Maui.Controls.Toolbar.BarHeight.set -> void +Microsoft.Maui.Controls.Toolbar.DynamicOverflowEnabled.get -> bool +Microsoft.Maui.Controls.Toolbar.DynamicOverflowEnabled.set -> void +Microsoft.Maui.Controls.Toolbar.IsVisible.get -> bool +Microsoft.Maui.Controls.Toolbar.IsVisible.set -> void +Microsoft.Maui.Controls.Toolbar.PropertyChanged -> System.ComponentModel.PropertyChangedEventHandler +Microsoft.Maui.Controls.ToolbarItem +Microsoft.Maui.Controls.ToolbarItem.Order.get -> Microsoft.Maui.Controls.ToolbarItemOrder +Microsoft.Maui.Controls.ToolbarItem.Order.set -> void +Microsoft.Maui.Controls.ToolbarItem.Priority.get -> int +Microsoft.Maui.Controls.ToolbarItem.Priority.set -> void +Microsoft.Maui.Controls.ToolbarItem.ToolbarItem() -> void +Microsoft.Maui.Controls.ToolbarItemOrder +Microsoft.Maui.Controls.ToolbarItemOrder.Default = 0 -> Microsoft.Maui.Controls.ToolbarItemOrder +Microsoft.Maui.Controls.ToolbarItemOrder.Primary = 1 -> Microsoft.Maui.Controls.ToolbarItemOrder +Microsoft.Maui.Controls.ToolbarItemOrder.Secondary = 2 -> Microsoft.Maui.Controls.ToolbarItemOrder +Microsoft.Maui.Controls.ToolTipProperties +Microsoft.Maui.Controls.ToolTipProperties.ToolTipProperties() -> void +Microsoft.Maui.Controls.TouchEventArgs +Microsoft.Maui.Controls.TouchEventArgs.IsInsideBounds.get -> bool +Microsoft.Maui.Controls.TouchEventArgs.TouchEventArgs() -> void +Microsoft.Maui.Controls.Trigger +Microsoft.Maui.Controls.TriggerAction +Microsoft.Maui.Controls.TriggerAction.TriggerAction() -> void +Microsoft.Maui.Controls.TriggerBase +Microsoft.Maui.Controls.TriggerBase.IsSealed.get -> bool +Microsoft.Maui.Controls.TypeTypeConverter +Microsoft.Maui.Controls.TypeTypeConverter.TypeTypeConverter() -> void +Microsoft.Maui.Controls.UnsolvableConstraintsException +Microsoft.Maui.Controls.UnsolvableConstraintsException.UnsolvableConstraintsException() -> void +Microsoft.Maui.Controls.UriImageSource +Microsoft.Maui.Controls.UriImageSource.CacheValidity.get -> System.TimeSpan +Microsoft.Maui.Controls.UriImageSource.CacheValidity.set -> void +Microsoft.Maui.Controls.UriImageSource.CachingEnabled.get -> bool +Microsoft.Maui.Controls.UriImageSource.CachingEnabled.set -> void +Microsoft.Maui.Controls.UriImageSource.UriImageSource() -> void +Microsoft.Maui.Controls.UriTypeConverter +Microsoft.Maui.Controls.UriTypeConverter.UriTypeConverter() -> void +Microsoft.Maui.Controls.UrlWebViewSource +Microsoft.Maui.Controls.UrlWebViewSource.UrlWebViewSource() -> void +Microsoft.Maui.Controls.ValueChangedEventArgs +Microsoft.Maui.Controls.ValueChangedEventArgs.NewValue.get -> double +Microsoft.Maui.Controls.ValueChangedEventArgs.OldValue.get -> double +Microsoft.Maui.Controls.ValueChangedEventArgs.ValueChangedEventArgs(double oldValue, double newValue) -> void +Microsoft.Maui.Controls.VerticalStackLayout +Microsoft.Maui.Controls.VerticalStackLayout.VerticalStackLayout() -> void +Microsoft.Maui.Controls.View +Microsoft.Maui.Controls.View.GetRendererOverrides() -> Microsoft.Maui.PropertyMapper! +Microsoft.Maui.Controls.View.HorizontalOptions.get -> Microsoft.Maui.Controls.LayoutOptions +Microsoft.Maui.Controls.View.HorizontalOptions.set -> void +Microsoft.Maui.Controls.View.Margin.get -> Microsoft.Maui.Thickness +Microsoft.Maui.Controls.View.Margin.set -> void +Microsoft.Maui.Controls.View.propertyMapper -> Microsoft.Maui.PropertyMapper! +Microsoft.Maui.Controls.View.VerticalOptions.get -> Microsoft.Maui.Controls.LayoutOptions +Microsoft.Maui.Controls.View.VerticalOptions.set -> void +Microsoft.Maui.Controls.View.View() -> void +Microsoft.Maui.Controls.ViewCell +Microsoft.Maui.Controls.ViewCell.ViewCell() -> void +Microsoft.Maui.Controls.ViewExtensions +Microsoft.Maui.Controls.ViewState +Microsoft.Maui.Controls.ViewState.Default = 0 -> Microsoft.Maui.Controls.ViewState +Microsoft.Maui.Controls.ViewState.Prelight = 1 -> Microsoft.Maui.Controls.ViewState +Microsoft.Maui.Controls.ViewState.Pressed = 2 -> Microsoft.Maui.Controls.ViewState +Microsoft.Maui.Controls.VisibilityExtensions +Microsoft.Maui.Controls.VisualAttribute +Microsoft.Maui.Controls.VisualElement +Microsoft.Maui.Controls.VisualElement.AnchorX.get -> double +Microsoft.Maui.Controls.VisualElement.AnchorX.set -> void +Microsoft.Maui.Controls.VisualElement.AnchorY.get -> double +Microsoft.Maui.Controls.VisualElement.AnchorY.set -> void +Microsoft.Maui.Controls.VisualElement.Arrange(Microsoft.Maui.Graphics.Rect bounds) -> void +Microsoft.Maui.Controls.VisualElement.BatchBegin() -> void +Microsoft.Maui.Controls.VisualElement.BatchCommit() -> void +Microsoft.Maui.Controls.VisualElement.BatchCommitted -> System.EventHandler> +Microsoft.Maui.Controls.VisualElement.Batched.get -> bool +Microsoft.Maui.Controls.VisualElement.Bounds.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.VisualElement.ChildrenReordered -> System.EventHandler +Microsoft.Maui.Controls.VisualElement.DesiredSize.get -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.VisualElement.DesiredSize.set -> void +Microsoft.Maui.Controls.VisualElement.DisableLayout.get -> bool +Microsoft.Maui.Controls.VisualElement.DisableLayout.set -> void +Microsoft.Maui.Controls.VisualElement.FlowDirection.get -> Microsoft.Maui.FlowDirection +Microsoft.Maui.Controls.VisualElement.FlowDirection.set -> void +Microsoft.Maui.Controls.VisualElement.Focus() -> bool +Microsoft.Maui.Controls.VisualElement.FocusChangeRequested -> System.EventHandler +Microsoft.Maui.Controls.VisualElement.Focused -> System.EventHandler +Microsoft.Maui.Controls.VisualElement.FocusRequestArgs +Microsoft.Maui.Controls.VisualElement.FocusRequestArgs.Focus.get -> bool +Microsoft.Maui.Controls.VisualElement.FocusRequestArgs.Focus.set -> void +Microsoft.Maui.Controls.VisualElement.FocusRequestArgs.FocusRequestArgs() -> void +Microsoft.Maui.Controls.VisualElement.FocusRequestArgs.Result.get -> bool +Microsoft.Maui.Controls.VisualElement.FocusRequestArgs.Result.set -> void +Microsoft.Maui.Controls.VisualElement.Frame.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Controls.VisualElement.Frame.set -> void +Microsoft.Maui.Controls.VisualElement.Handler.get -> Microsoft.Maui.IViewHandler? +Microsoft.Maui.Controls.VisualElement.Handler.set -> void +Microsoft.Maui.Controls.VisualElement.Height.get -> double +Microsoft.Maui.Controls.VisualElement.HeightRequest.get -> double +Microsoft.Maui.Controls.VisualElement.HeightRequest.set -> void +Microsoft.Maui.Controls.VisualElement.InputTransparent.get -> bool +Microsoft.Maui.Controls.VisualElement.InputTransparent.set -> void +Microsoft.Maui.Controls.VisualElement.InvalidateMeasureNonVirtual(Microsoft.Maui.Controls.Internals.InvalidationTrigger trigger) -> void +Microsoft.Maui.Controls.VisualElement.IsEnabled.get -> bool +Microsoft.Maui.Controls.VisualElement.IsEnabled.set -> void +Microsoft.Maui.Controls.VisualElement.IsFocused.get -> bool +Microsoft.Maui.Controls.VisualElement.IsInPlatformLayout.get -> bool +Microsoft.Maui.Controls.VisualElement.IsInPlatformLayout.set -> void +Microsoft.Maui.Controls.VisualElement.IsLoaded.get -> bool +Microsoft.Maui.Controls.VisualElement.IsPlatformEnabled.get -> bool +Microsoft.Maui.Controls.VisualElement.IsPlatformEnabled.set -> void +Microsoft.Maui.Controls.VisualElement.IsPlatformStateConsistent.get -> bool +Microsoft.Maui.Controls.VisualElement.IsPlatformStateConsistent.set -> void +Microsoft.Maui.Controls.VisualElement.IsVisible.get -> bool +Microsoft.Maui.Controls.VisualElement.IsVisible.set -> void +Microsoft.Maui.Controls.VisualElement.Layout(Microsoft.Maui.Graphics.Rect bounds) -> void +Microsoft.Maui.Controls.VisualElement.Loaded -> System.EventHandler? +Microsoft.Maui.Controls.VisualElement.MaximumHeightRequest.get -> double +Microsoft.Maui.Controls.VisualElement.MaximumHeightRequest.set -> void +Microsoft.Maui.Controls.VisualElement.MaximumWidthRequest.get -> double +Microsoft.Maui.Controls.VisualElement.MaximumWidthRequest.set -> void +Microsoft.Maui.Controls.VisualElement.MeasureInvalidated -> System.EventHandler +Microsoft.Maui.Controls.VisualElement.MinimumHeightRequest.get -> double +Microsoft.Maui.Controls.VisualElement.MinimumHeightRequest.set -> void +Microsoft.Maui.Controls.VisualElement.MinimumWidthRequest.get -> double +Microsoft.Maui.Controls.VisualElement.MinimumWidthRequest.set -> void +Microsoft.Maui.Controls.VisualElement.OnChildrenReordered() -> void +Microsoft.Maui.Controls.VisualElement.Opacity.get -> double +Microsoft.Maui.Controls.VisualElement.Opacity.set -> void +Microsoft.Maui.Controls.VisualElement.PlatformSizeChanged() -> void +Microsoft.Maui.Controls.VisualElement.Rotation.get -> double +Microsoft.Maui.Controls.VisualElement.Rotation.set -> void +Microsoft.Maui.Controls.VisualElement.RotationX.get -> double +Microsoft.Maui.Controls.VisualElement.RotationX.set -> void +Microsoft.Maui.Controls.VisualElement.RotationY.get -> double +Microsoft.Maui.Controls.VisualElement.RotationY.set -> void +Microsoft.Maui.Controls.VisualElement.Scale.get -> double +Microsoft.Maui.Controls.VisualElement.Scale.set -> void +Microsoft.Maui.Controls.VisualElement.ScaleX.get -> double +Microsoft.Maui.Controls.VisualElement.ScaleX.set -> void +Microsoft.Maui.Controls.VisualElement.ScaleY.get -> double +Microsoft.Maui.Controls.VisualElement.ScaleY.set -> void +Microsoft.Maui.Controls.VisualElement.Shadow.get -> Microsoft.Maui.Controls.Shadow! +Microsoft.Maui.Controls.VisualElement.Shadow.set -> void +Microsoft.Maui.Controls.VisualElement.SizeAllocated(double width, double height) -> void +Microsoft.Maui.Controls.VisualElement.SizeChanged -> System.EventHandler +Microsoft.Maui.Controls.VisualElement.TranslationX.get -> double +Microsoft.Maui.Controls.VisualElement.TranslationX.set -> void +Microsoft.Maui.Controls.VisualElement.TranslationY.get -> double +Microsoft.Maui.Controls.VisualElement.TranslationY.set -> void +Microsoft.Maui.Controls.VisualElement.Unfocus() -> void +Microsoft.Maui.Controls.VisualElement.Unfocused -> System.EventHandler +Microsoft.Maui.Controls.VisualElement.Unloaded -> System.EventHandler? +Microsoft.Maui.Controls.VisualElement.VisibilityConverter +Microsoft.Maui.Controls.VisualElement.VisibilityConverter.VisibilityConverter() -> void +Microsoft.Maui.Controls.VisualElement.VisualElement() -> void +Microsoft.Maui.Controls.VisualElement.Width.get -> double +Microsoft.Maui.Controls.VisualElement.WidthRequest.get -> double +Microsoft.Maui.Controls.VisualElement.WidthRequest.set -> void +Microsoft.Maui.Controls.VisualElement.X.get -> double +Microsoft.Maui.Controls.VisualElement.Y.get -> double +Microsoft.Maui.Controls.VisualElement.ZIndex.get -> int +Microsoft.Maui.Controls.VisualElement.ZIndex.set -> void +Microsoft.Maui.Controls.VisualMarker +Microsoft.Maui.Controls.VisualMarker.DefaultVisual +Microsoft.Maui.Controls.VisualMarker.DefaultVisual.DefaultVisual() -> void +Microsoft.Maui.Controls.VisualState +Microsoft.Maui.Controls.VisualState.VisualState() -> void +Microsoft.Maui.Controls.VisualStateGroup +Microsoft.Maui.Controls.VisualStateGroup.VisualStateGroup() -> void +Microsoft.Maui.Controls.VisualStateGroupList +Microsoft.Maui.Controls.VisualStateGroupList.Clear() -> void +Microsoft.Maui.Controls.VisualStateGroupList.Count.get -> int +Microsoft.Maui.Controls.VisualStateGroupList.IsReadOnly.get -> bool +Microsoft.Maui.Controls.VisualStateGroupList.RemoveAt(int index) -> void +Microsoft.Maui.Controls.VisualStateGroupList.VisualStateGroupList() -> void +Microsoft.Maui.Controls.VisualStateGroupList.VisualStateGroupList(bool isDefault) -> void +Microsoft.Maui.Controls.VisualStateManager +Microsoft.Maui.Controls.VisualStateManager.CommonStates +Microsoft.Maui.Controls.VisualStateManager.CommonStates.CommonStates() -> void +Microsoft.Maui.Controls.VisualTypeConverter +Microsoft.Maui.Controls.VisualTypeConverter.VisualTypeConverter() -> void +Microsoft.Maui.Controls.WebNavigatedEventArgs +Microsoft.Maui.Controls.WebNavigatedEventArgs.Result.get -> Microsoft.Maui.WebNavigationResult +Microsoft.Maui.Controls.WebNavigatingEventArgs +Microsoft.Maui.Controls.WebNavigatingEventArgs.Cancel.get -> bool +Microsoft.Maui.Controls.WebNavigatingEventArgs.Cancel.set -> void +Microsoft.Maui.Controls.WebNavigationEventArgs +Microsoft.Maui.Controls.WebNavigationEventArgs.NavigationEvent.get -> Microsoft.Maui.WebNavigationEvent +Microsoft.Maui.Controls.WebView +Microsoft.Maui.Controls.WebView.CanGoBack.get -> bool +Microsoft.Maui.Controls.WebView.CanGoForward.get -> bool +Microsoft.Maui.Controls.WebView.GoBack() -> void +Microsoft.Maui.Controls.WebView.GoForward() -> void +Microsoft.Maui.Controls.WebView.Navigated -> System.EventHandler +Microsoft.Maui.Controls.WebView.Navigating -> System.EventHandler +Microsoft.Maui.Controls.WebView.Reload() -> void +Microsoft.Maui.Controls.WebView.WebView() -> void +Microsoft.Maui.Controls.WebViewSource +Microsoft.Maui.Controls.WebViewSource.OnSourceChanged() -> void +Microsoft.Maui.Controls.WebViewSource.WebViewSource() -> void +Microsoft.Maui.Controls.WebViewSourceTypeConverter +Microsoft.Maui.Controls.WebViewSourceTypeConverter.WebViewSourceTypeConverter() -> void +Microsoft.Maui.Controls.Window +Microsoft.Maui.Controls.Window.Activated -> System.EventHandler? +Microsoft.Maui.Controls.Window.AddOverlay(Microsoft.Maui.IWindowOverlay! overlay) -> bool +Microsoft.Maui.Controls.Window.Backgrounding -> System.EventHandler? +Microsoft.Maui.Controls.Window.Created -> System.EventHandler? +Microsoft.Maui.Controls.Window.Deactivated -> System.EventHandler? +Microsoft.Maui.Controls.Window.Destroying -> System.EventHandler? +Microsoft.Maui.Controls.Window.DisplayDensity.get -> float +Microsoft.Maui.Controls.Window.DisplayDensityChanged -> System.EventHandler? +Microsoft.Maui.Controls.Window.FlowDirection.get -> Microsoft.Maui.FlowDirection +Microsoft.Maui.Controls.Window.FlowDirection.set -> void +Microsoft.Maui.Controls.Window.Height.get -> double +Microsoft.Maui.Controls.Window.Height.set -> void +Microsoft.Maui.Controls.Window.MaximumHeight.get -> double +Microsoft.Maui.Controls.Window.MaximumHeight.set -> void +Microsoft.Maui.Controls.Window.MaximumWidth.get -> double +Microsoft.Maui.Controls.Window.MaximumWidth.set -> void +Microsoft.Maui.Controls.Window.MinimumHeight.get -> double +Microsoft.Maui.Controls.Window.MinimumHeight.set -> void +Microsoft.Maui.Controls.Window.MinimumWidth.get -> double +Microsoft.Maui.Controls.Window.MinimumWidth.set -> void +Microsoft.Maui.Controls.Window.ModalPopped -> System.EventHandler? +Microsoft.Maui.Controls.Window.ModalPopping -> System.EventHandler? +Microsoft.Maui.Controls.Window.ModalPushed -> System.EventHandler? +Microsoft.Maui.Controls.Window.ModalPushing -> System.EventHandler? +Microsoft.Maui.Controls.Window.Overlays.get -> System.Collections.Generic.IReadOnlyCollection! +Microsoft.Maui.Controls.Window.Page.get -> Microsoft.Maui.Controls.Page? +Microsoft.Maui.Controls.Window.Page.set -> void +Microsoft.Maui.Controls.Window.PopCanceled -> System.EventHandler? +Microsoft.Maui.Controls.Window.RemoveOverlay(Microsoft.Maui.IWindowOverlay! overlay) -> bool +Microsoft.Maui.Controls.Window.Resumed -> System.EventHandler? +Microsoft.Maui.Controls.Window.SizeChanged -> System.EventHandler? +Microsoft.Maui.Controls.Window.Stopped -> System.EventHandler? +Microsoft.Maui.Controls.Window.Title.get -> string? +Microsoft.Maui.Controls.Window.Title.set -> void +Microsoft.Maui.Controls.Window.VisualDiagnosticsOverlay.get -> Microsoft.Maui.IVisualDiagnosticsOverlay! +Microsoft.Maui.Controls.Window.Width.get -> double +Microsoft.Maui.Controls.Window.Width.set -> void +Microsoft.Maui.Controls.Window.Window() -> void +Microsoft.Maui.Controls.Window.Window(Microsoft.Maui.Controls.Page! page) -> void +Microsoft.Maui.Controls.Window.X.get -> double +Microsoft.Maui.Controls.Window.X.set -> void +Microsoft.Maui.Controls.Window.Y.get -> double +Microsoft.Maui.Controls.Window.Y.set -> void +Microsoft.Maui.Controls.Xaml.AcceptEmptyServiceProviderAttribute +Microsoft.Maui.Controls.Xaml.AcceptEmptyServiceProviderAttribute.AcceptEmptyServiceProviderAttribute() -> void +Microsoft.Maui.Controls.Xaml.Diagnostics.BindingBaseErrorEventArgs +Microsoft.Maui.Controls.Xaml.Diagnostics.BindingDiagnostics +Microsoft.Maui.Controls.Xaml.Diagnostics.BindingDiagnostics.BindingDiagnostics() -> void +Microsoft.Maui.Controls.Xaml.Diagnostics.BindingErrorEventArgs +Microsoft.Maui.Controls.Xaml.IMarkupExtension +Microsoft.Maui.Controls.Xaml.IMarkupExtension +Microsoft.Maui.Controls.Xaml.Internals.INativeBindingService +Microsoft.Maui.Controls.Xaml.Internals.INativeValueConverterService +Microsoft.Maui.Controls.Xaml.IProvideValueTarget +Microsoft.Maui.Controls.Xaml.IReferenceProvider +Microsoft.Maui.Controls.Xaml.IRootObjectProvider +Microsoft.Maui.Controls.Xaml.IValueProvider +Microsoft.Maui.Controls.Xaml.IXamlTypeResolver +Microsoft.Maui.Controls.Xaml.IXmlLineInfoProvider +Microsoft.Maui.Controls.Xaml.XamlParseException +Microsoft.Maui.Controls.Xaml.XamlParseException.XamlParseException() -> void +Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute +Microsoft.Maui.Controls.Xaml.XmlLineInfo +Microsoft.Maui.Controls.Xaml.XmlLineInfo.HasLineInfo() -> bool +Microsoft.Maui.Controls.Xaml.XmlLineInfo.LineNumber.get -> int +Microsoft.Maui.Controls.Xaml.XmlLineInfo.LinePosition.get -> int +Microsoft.Maui.Controls.Xaml.XmlLineInfo.XmlLineInfo() -> void +Microsoft.Maui.Controls.Xaml.XmlLineInfo.XmlLineInfo(int linenumber, int lineposition) -> void +Microsoft.Maui.Controls.XmlnsDefinitionAttribute +Microsoft.Maui.Controls.XmlnsPrefixAttribute +Microsoft.Maui.Foldable.FoldEventArgs +Microsoft.Maui.Foldable.FoldEventArgs.FoldEventArgs() -> void +Microsoft.Maui.Foldable.FoldEventArgs.FoldingFeatureBounds.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Foldable.FoldEventArgs.FoldingFeatureBounds.set -> void +Microsoft.Maui.Foldable.FoldEventArgs.isSeparating.get -> bool +Microsoft.Maui.Foldable.FoldEventArgs.isSeparating.set -> void +Microsoft.Maui.Foldable.FoldEventArgs.WindowBounds.get -> Microsoft.Maui.Graphics.Rect +Microsoft.Maui.Foldable.FoldEventArgs.WindowBounds.set -> void +override Microsoft.Maui.Controls.AbsoluteLayout.OnClear() -> void +override Microsoft.Maui.Controls.Accelerator.GetHashCode() -> int +override Microsoft.Maui.Controls.Animation.Reset() -> void +override Microsoft.Maui.Controls.Application.OnParentSet() -> void +override Microsoft.Maui.Controls.Border.OnPropertyChanged(string? propertyName = null) -> void +override Microsoft.Maui.Controls.BoxView.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.BoxView.OnPropertyChanged(string? propertyName = null) -> void +override Microsoft.Maui.Controls.Button.ChangeVisualState() -> void +override Microsoft.Maui.Controls.Button.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Cell.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Cell.OnParentSet() -> void +override Microsoft.Maui.Controls.CheckBox.ChangeVisualState() -> void +override Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.Compatibility.FlexLayout.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.Compatibility.FlexLayout.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.Compatibility.FlexLayout.OnParentSet() -> void +override Microsoft.Maui.Controls.Compatibility.Grid.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.Compatibility.Grid.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Compatibility.Grid.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.Compatibility.Layout.ArrangeOverride(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.Compatibility.Layout.InvalidateMeasureOverride() -> void +override Microsoft.Maui.Controls.Compatibility.Layout.Measure(double widthConstraint, double heightConstraint, Microsoft.Maui.Controls.MeasureFlags flags = Microsoft.Maui.Controls.MeasureFlags.None) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.Compatibility.Layout.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.Compatibility.Layout.OnSizeAllocated(double width, double height) -> void +override Microsoft.Maui.Controls.Compatibility.RelativeLayout.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.Compatibility.RelativeLayout.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.Compatibility.StackLayout.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.Compatibility.StackLayout.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.ContentPage.ArrangeOverride(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.ContentPage.InvalidateMeasureOverride() -> void +override Microsoft.Maui.Controls.ContentPage.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.ContentPage.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.ContentPresenter.ArrangeOverride(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.ContentPresenter.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.ContentPresenter.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.ContentPresenter.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.ContentView.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Editor.ArrangeOverride(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.Editor.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.Element.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.FileImageSource.IsEmpty.get -> bool +override Microsoft.Maui.Controls.FlexLayout.OnClear() -> void +override Microsoft.Maui.Controls.FlexLayout.OnParentSet() -> void +override Microsoft.Maui.Controls.FlyoutPage.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.FlyoutPage.OnAppearing() -> void +override Microsoft.Maui.Controls.FlyoutPage.OnBackButtonPressed() -> bool +override Microsoft.Maui.Controls.FlyoutPage.OnDisappearing() -> void +override Microsoft.Maui.Controls.FlyoutPage.OnParentSet() -> void +override Microsoft.Maui.Controls.FontImageSource.IsEmpty.get -> bool +override Microsoft.Maui.Controls.FormattedString.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.GradientBrush.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.GradientStop.GetHashCode() -> int +override Microsoft.Maui.Controls.Grid.InvalidateMeasure() -> void +override Microsoft.Maui.Controls.Grid.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Grid.OnClear() -> void +override Microsoft.Maui.Controls.Image.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Image.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.ImageButton.ChangeVisualState() -> void +override Microsoft.Maui.Controls.ImageButton.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.ImageButton.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.ImageCell.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.IndicatorView.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.ItemsView.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.ItemsView.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.Label.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Layout.InvalidateMeasureOverride() -> void +override Microsoft.Maui.Controls.Layout.Measure(double widthConstraint, double heightConstraint, Microsoft.Maui.Controls.MeasureFlags flags = Microsoft.Maui.Controls.MeasureFlags.None) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.LinearGradientBrush.IsEmpty.get -> bool +override Microsoft.Maui.Controls.ListView.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.ListView.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.MultiPage.OnBackButtonPressed() -> bool +override Microsoft.Maui.Controls.NavigationPage.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.NavigationPage.OnBackButtonPressed() -> bool +override Microsoft.Maui.Controls.NullEffect.OnAttached() -> void +override Microsoft.Maui.Controls.NullEffect.OnDetached() -> void +override Microsoft.Maui.Controls.Page.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Page.OnParentSet() -> void +override Microsoft.Maui.Controls.Page.OnSizeAllocated(double width, double height) -> void +override Microsoft.Maui.Controls.RadialGradientBrush.IsEmpty.get -> bool +override Microsoft.Maui.Controls.RadioButton.ChangeVisualState() -> void +override Microsoft.Maui.Controls.RadioButton.OnApplyTemplate() -> void +override Microsoft.Maui.Controls.RadioButton.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.RefreshView.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.RoutingEffect.OnAttached() -> void +override Microsoft.Maui.Controls.RoutingEffect.OnDetached() -> void +override Microsoft.Maui.Controls.ScrollView.ArrangeOverride(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.ScrollView.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.ScrollView.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.ScrollView.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.Shapes.Shape.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.Shell.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.Shell.OnBackButtonPressed() -> bool +override Microsoft.Maui.Controls.Shell.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.ShellAppearance.GetHashCode() -> int +override Microsoft.Maui.Controls.ShellItem.OnParentSet() -> void +override Microsoft.Maui.Controls.ShellSection.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.ShellSection.OnParentSet() -> void +override Microsoft.Maui.Controls.SolidColorBrush.GetHashCode() -> int +override Microsoft.Maui.Controls.SolidColorBrush.IsEmpty.get -> bool +override Microsoft.Maui.Controls.Span.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.StreamImageSource.IsEmpty.get -> bool +override Microsoft.Maui.Controls.SwipeItems.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.SwipeView.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.SwipeView.OnChildAdded(Microsoft.Maui.Controls.Element! child) -> void +override Microsoft.Maui.Controls.SwipeView.OnChildRemoved(Microsoft.Maui.Controls.Element! child, int oldLogicalIndex) -> void +override Microsoft.Maui.Controls.Switch.ChangeVisualState() -> void +override Microsoft.Maui.Controls.TabbedPage.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.TableSectionBase.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.TableView.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.TableView.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.TemplatedView.ArrangeOverride(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.TemplatedView.LayoutChildren(double x, double y, double width, double height) -> void +override Microsoft.Maui.Controls.TemplatedView.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +override Microsoft.Maui.Controls.TemplatedView.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +override Microsoft.Maui.Controls.TextCell.OnTapped() -> void +override Microsoft.Maui.Controls.UriImageSource.IsEmpty.get -> bool +override Microsoft.Maui.Controls.View.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.VisualElement.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.VisualState.GetHashCode() -> int +override Microsoft.Maui.Controls.VisualStateGroup.GetHashCode() -> int +override Microsoft.Maui.Controls.VisualStateGroupList.GetHashCode() -> int +override Microsoft.Maui.Controls.WebView.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.Window.OnPropertyChanged(string? propertyName = null) -> void +override sealed Microsoft.Maui.Controls.PlatformBehavior.OnAttachedTo(Microsoft.Maui.Controls.BindableObject! bindable) -> void +override sealed Microsoft.Maui.Controls.PlatformBehavior.OnAttachedTo(TView! bindable) -> void +override sealed Microsoft.Maui.Controls.PlatformBehavior.OnDetachingFrom(Microsoft.Maui.Controls.BindableObject! bindable) -> void +override sealed Microsoft.Maui.Controls.PlatformBehavior.OnDetachingFrom(TView! bindable) -> void +static Microsoft.Maui.Controls.AbsoluteLayout.AutoSize -> double +static Microsoft.Maui.Controls.Application.AccentColor.get -> Microsoft.Maui.Graphics.Color? +static Microsoft.Maui.Controls.Application.AccentColor.set -> void +static Microsoft.Maui.Controls.Application.Current.get -> Microsoft.Maui.Controls.Application? +static Microsoft.Maui.Controls.Application.Current.set -> void +static Microsoft.Maui.Controls.Application.SetCurrentApplication(Microsoft.Maui.Controls.Application! value) -> void +static Microsoft.Maui.Controls.Border.ContentChanged(Microsoft.Maui.Controls.BindableObject! bindable, object! oldValue, object! newValue) -> void +static Microsoft.Maui.Controls.Border.StrokeThicknessChanged(Microsoft.Maui.Controls.BindableObject! bindable, object! oldValue, object! newValue) -> void +static Microsoft.Maui.Controls.Compatibility.AbsoluteLayout.AutoSize.get -> double +static Microsoft.Maui.Controls.DesignMode.IsDesignModeEnabled.get -> bool +static Microsoft.Maui.Controls.Device.FlowDirection.get -> Microsoft.Maui.FlowDirection +static Microsoft.Maui.Controls.Device.Idiom.get -> Microsoft.Maui.Controls.TargetIdiom +static Microsoft.Maui.Controls.Device.IsInvokeRequired.get -> bool +static Microsoft.Maui.Controls.FlyoutPage.ControlsFlyoutPageMapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Controls.FontExtensions.GetFontAttributes(this Microsoft.Maui.Font font) -> Microsoft.Maui.Controls.FontAttributes +static Microsoft.Maui.Controls.FontExtensions.ToFont(this Microsoft.Maui.Controls.Internals.IFontElement! element, double? defaultSize = null) -> Microsoft.Maui.Font +static Microsoft.Maui.Controls.FontExtensions.WithAttributes(this Microsoft.Maui.Font font, Microsoft.Maui.Controls.FontAttributes attributes) -> Microsoft.Maui.Font +static Microsoft.Maui.Controls.Internals.Profile.Enable() -> void +static Microsoft.Maui.Controls.Internals.Profile.IsEnabled.get -> bool +static Microsoft.Maui.Controls.Internals.Profile.Start() -> void +static Microsoft.Maui.Controls.Internals.Profile.Stop() -> void +static Microsoft.Maui.Controls.Internals.Registrar.RegisterStylesheets(Microsoft.Maui.Controls.InitializationFlags flags) -> void +static Microsoft.Maui.Controls.LayoutDirectionExtensions.ToFlowDirection(this Microsoft.Maui.ApplicationModel.LayoutDirection layoutDirection) -> Microsoft.Maui.FlowDirection +static Microsoft.Maui.Controls.Shapes.Matrix.Identity.get -> Microsoft.Maui.Controls.Shapes.Matrix +static Microsoft.Maui.Controls.Shapes.Matrix.Multiply(Microsoft.Maui.Controls.Shapes.Matrix trans1, Microsoft.Maui.Controls.Shapes.Matrix trans2) -> Microsoft.Maui.Controls.Shapes.Matrix +static Microsoft.Maui.Controls.Shapes.Matrix.operator *(Microsoft.Maui.Controls.Shapes.Matrix trans1, Microsoft.Maui.Controls.Shapes.Matrix trans2) -> Microsoft.Maui.Controls.Shapes.Matrix +static Microsoft.Maui.Controls.Shapes.MatrixExtensions.ToMatrix(this System.Numerics.Matrix3x2 matrix3x2) -> Microsoft.Maui.Controls.Shapes.Matrix +static Microsoft.Maui.Controls.Shapes.MatrixExtensions.ToMatrix3X2(this Microsoft.Maui.Controls.Shapes.Matrix matrix) -> System.Numerics.Matrix3x2 +static Microsoft.Maui.Controls.Toolbar.ControlsToolbarMapper -> Microsoft.Maui.IPropertyMapper! +static Microsoft.Maui.Controls.ToolTipProperties.GetText(Microsoft.Maui.Controls.BindableObject! bindable) -> object! +static Microsoft.Maui.Controls.ToolTipProperties.SetText(Microsoft.Maui.Controls.BindableObject! bindable, object! value) -> void +static Microsoft.Maui.Controls.ViewExtensions.CancelAnimations(this Microsoft.Maui.Controls.VisualElement! view) -> void +static Microsoft.Maui.Controls.ViewExtensions.FadeTo(this Microsoft.Maui.Controls.VisualElement! view, double opacity, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.LayoutTo(this Microsoft.Maui.Controls.VisualElement! view, Microsoft.Maui.Graphics.Rect bounds, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.RelRotateTo(this Microsoft.Maui.Controls.VisualElement! view, double drotation, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.RelScaleTo(this Microsoft.Maui.Controls.VisualElement! view, double dscale, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.RotateTo(this Microsoft.Maui.Controls.VisualElement! view, double rotation, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.RotateXTo(this Microsoft.Maui.Controls.VisualElement! view, double rotation, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.RotateYTo(this Microsoft.Maui.Controls.VisualElement! view, double rotation, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.ScaleTo(this Microsoft.Maui.Controls.VisualElement! view, double scale, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.ScaleXTo(this Microsoft.Maui.Controls.VisualElement! view, double scale, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.ScaleYTo(this Microsoft.Maui.Controls.VisualElement! view, double scale, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.ViewExtensions.TranslateTo(this Microsoft.Maui.Controls.VisualElement! view, double x, double y, uint length = 250, Microsoft.Maui.Easing? easing = null) -> System.Threading.Tasks.Task! +static Microsoft.Maui.Controls.VisibilityExtensions.ToVisibility(this bool isVisible) -> Microsoft.Maui.Visibility +static Microsoft.Maui.Controls.Xaml.Diagnostics.BindingDiagnostics.BindingFailed -> System.EventHandler +static readonly Microsoft.Maui.Controls.AdaptiveTrigger.MinWindowHeightProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.AdaptiveTrigger.MinWindowWidthProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.ContentProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.PaddingProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeDashArrayProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeDashOffsetProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeLineCapProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeLineJoinProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeMiterLimitProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeShapeProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Border.StrokeThicknessProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.LayoutOptions.Center -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.LayoutOptions.CenterAndExpand -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.LayoutOptions.End -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.LayoutOptions.EndAndExpand -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.LayoutOptions.Fill -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.LayoutOptions.FillAndExpand -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.LayoutOptions.Start -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.LayoutOptions.StartAndExpand -> Microsoft.Maui.Controls.LayoutOptions +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommandProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommandProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommandProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.AspectProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.FillProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.StrokeDashArrayProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.StrokeDashOffsetProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.StrokeLineCapProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.StrokeLineJoinProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.StrokeMiterLimitProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.StrokeProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Shapes.Shape.StrokeThicknessProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.TapGestureRecognizer.ButtonsProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.TapGestureRecognizer.CommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.TapGestureRecognizer.CommandProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.TapGestureRecognizer.NumberOfTapsRequiredProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.ToolTipProperties.TextProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.VisualElement.ShadowProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.VisualElement.ZIndexProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.FlowDirectionProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.HeightProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.MaximumHeightProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.MaximumWidthProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.MinimumHeightProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.MinimumWidthProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.PageProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.TitleProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.WidthProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.XProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Window.YProperty -> Microsoft.Maui.Controls.BindableProperty! +virtual Microsoft.Maui.Controls.Application.CleanUp() -> void +virtual Microsoft.Maui.Controls.Application.CloseWindow(Microsoft.Maui.Controls.Window! window) -> void +virtual Microsoft.Maui.Controls.Application.CreateWindow(Microsoft.Maui.IActivationState? activationState) -> Microsoft.Maui.Controls.Window! +virtual Microsoft.Maui.Controls.Application.OnAppLinkRequestReceived(System.Uri! uri) -> void +virtual Microsoft.Maui.Controls.Application.OnResume() -> void +virtual Microsoft.Maui.Controls.Application.OnSleep() -> void +virtual Microsoft.Maui.Controls.Application.OnStart() -> void +virtual Microsoft.Maui.Controls.Application.OpenWindow(Microsoft.Maui.Controls.Window! window) -> void +virtual Microsoft.Maui.Controls.BaseShellItem.OnAppearing() -> void +virtual Microsoft.Maui.Controls.BaseShellItem.OnDisappearing() -> void +virtual Microsoft.Maui.Controls.BindableObject.OnBindingContextChanged() -> void +virtual Microsoft.Maui.Controls.CarouselView.AnimateCurrentItemChanges.get -> bool +virtual Microsoft.Maui.Controls.CarouselView.AnimatePositionChanges.get -> bool +virtual Microsoft.Maui.Controls.Cell.OnAppearing() -> void +virtual Microsoft.Maui.Controls.Cell.OnDisappearing() -> void +virtual Microsoft.Maui.Controls.Cell.OnTapped() -> void +virtual Microsoft.Maui.Controls.Compatibility.Layout.InvalidateLayout() -> void +virtual Microsoft.Maui.Controls.Compatibility.Layout.OnChildMeasureInvalidated() -> void +virtual Microsoft.Maui.Controls.Element.OnHandlerChanged() -> void +virtual Microsoft.Maui.Controls.Element.OnParentChanged() -> void +virtual Microsoft.Maui.Controls.Element.OnParentSet() -> void +virtual Microsoft.Maui.Controls.FlyoutPage.ShouldShowToolbarButton() -> bool +virtual Microsoft.Maui.Controls.HandlerAttribute.ShouldRegister() -> bool +virtual Microsoft.Maui.Controls.ImageSource.IsEmpty.get -> bool +virtual Microsoft.Maui.Controls.ItemsView.OnRemainingItemsThresholdReached() -> void +virtual Microsoft.Maui.Controls.Layout.OnClear() -> void +virtual Microsoft.Maui.Controls.MenuItem.OnClicked() -> void +virtual Microsoft.Maui.Controls.MultiPage.OnCurrentPageChanged() -> void +virtual Microsoft.Maui.Controls.Page.LayoutChildren(double x, double y, double width, double height) -> void +virtual Microsoft.Maui.Controls.Page.OnAppearing() -> void +virtual Microsoft.Maui.Controls.Page.OnBackButtonPressed() -> bool +virtual Microsoft.Maui.Controls.Page.OnDisappearing() -> void +virtual Microsoft.Maui.Controls.PlatformBehavior.OnAttachedTo(TView! bindable, TPlatformView! platformView) -> void +virtual Microsoft.Maui.Controls.PlatformBehavior.OnDetachedFrom(TView! bindable, TPlatformView! platformView) -> void +virtual Microsoft.Maui.Controls.PointerEventArgs.GetPosition(Microsoft.Maui.Controls.Element? relativeTo) -> Microsoft.Maui.Graphics.Point? +virtual Microsoft.Maui.Controls.SearchHandler.OnClearPlaceholderClicked() -> void +virtual Microsoft.Maui.Controls.SearchHandler.OnFocused() -> void +virtual Microsoft.Maui.Controls.SearchHandler.OnQueryConfirmed() -> void +virtual Microsoft.Maui.Controls.SearchHandler.OnUnfocus() -> void +virtual Microsoft.Maui.Controls.StateTriggerBase.OnAttached() -> void +virtual Microsoft.Maui.Controls.StateTriggerBase.OnDetached() -> void +virtual Microsoft.Maui.Controls.TableView.OnModelChanged() -> void +virtual Microsoft.Maui.Controls.TappedEventArgs.GetPosition(Microsoft.Maui.Controls.Element? relativeTo) -> Microsoft.Maui.Graphics.Point? +virtual Microsoft.Maui.Controls.TemplatedPage.OnApplyTemplate() -> void +virtual Microsoft.Maui.Controls.TemplatedView.OnApplyTemplate() -> void +virtual Microsoft.Maui.Controls.Toolbar.BackButtonVisible.get -> bool +virtual Microsoft.Maui.Controls.Toolbar.BackButtonVisible.set -> void +virtual Microsoft.Maui.Controls.Toolbar.DrawerToggleVisible.get -> bool +virtual Microsoft.Maui.Controls.Toolbar.DrawerToggleVisible.set -> void +virtual Microsoft.Maui.Controls.VisualElement.ArrangeOverride(Microsoft.Maui.Graphics.Rect bounds) -> Microsoft.Maui.Graphics.Size +virtual Microsoft.Maui.Controls.VisualElement.ChangeVisualState() -> void +virtual Microsoft.Maui.Controls.VisualElement.InvalidateMeasure() -> void +virtual Microsoft.Maui.Controls.VisualElement.InvalidateMeasureOverride() -> void +virtual Microsoft.Maui.Controls.VisualElement.Measure(double widthConstraint, double heightConstraint, Microsoft.Maui.Controls.MeasureFlags flags = Microsoft.Maui.Controls.MeasureFlags.None) -> Microsoft.Maui.SizeRequest +virtual Microsoft.Maui.Controls.VisualElement.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +virtual Microsoft.Maui.Controls.VisualElement.OnMeasure(double widthConstraint, double heightConstraint) -> Microsoft.Maui.SizeRequest +virtual Microsoft.Maui.Controls.VisualElement.OnSizeAllocated(double width, double height) -> void +virtual Microsoft.Maui.Controls.Window.OnActivated() -> void +virtual Microsoft.Maui.Controls.Window.OnBackgrounding(Microsoft.Maui.IPersistedState! state) -> void +virtual Microsoft.Maui.Controls.Window.OnCreated() -> void +virtual Microsoft.Maui.Controls.Window.OnDeactivated() -> void +virtual Microsoft.Maui.Controls.Window.OnDestroying() -> void +virtual Microsoft.Maui.Controls.Window.OnDisplayDensityChanged(float displayDensity) -> void +virtual Microsoft.Maui.Controls.Window.OnResumed() -> void +virtual Microsoft.Maui.Controls.Window.OnStopped() -> void diff --git a/src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..0e8dc0530411 --- /dev/null +++ b/src/Controls/src/Core/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1,213 @@ +#nullable enable +Microsoft.Maui.Controls.DragEventArgs.PlatformArgs.get -> Microsoft.Maui.Controls.PlatformDragEventArgs? +Microsoft.Maui.Controls.PlatformDragStartingEventArgs +Microsoft.Maui.Controls.PlatformDropCompletedEventArgs +Microsoft.Maui.Controls.PlatformDragEventArgs +Microsoft.Maui.Controls.PlatformDropEventArgs +Microsoft.Maui.Controls.DragStartingEventArgs.PlatformArgs.get -> Microsoft.Maui.Controls.PlatformDragStartingEventArgs? +Microsoft.Maui.Controls.DropCompletedEventArgs.PlatformArgs.get -> Microsoft.Maui.Controls.PlatformDropCompletedEventArgs? +Microsoft.Maui.Controls.DropEventArgs.PlatformArgs.get -> Microsoft.Maui.Controls.PlatformDropEventArgs? +Microsoft.Maui.Controls.KeyboardAccelerator +Microsoft.Maui.Controls.KeyboardAccelerator.Key.get -> string? +Microsoft.Maui.Controls.KeyboardAccelerator.Key.set -> void +Microsoft.Maui.Controls.KeyboardAccelerator.KeyboardAccelerator() -> void +Microsoft.Maui.Controls.KeyboardAccelerator.Modifiers.get -> Microsoft.Maui.KeyboardAcceleratorModifiers +Microsoft.Maui.Controls.KeyboardAccelerator.Modifiers.set -> void +Microsoft.Maui.Controls.MenuFlyoutItem.KeyboardAccelerators.get -> System.Collections.Generic.IList! +Microsoft.Maui.Controls.DragEventArgs.Data.get -> Microsoft.Maui.Controls.DataPackage! +Microsoft.Maui.Controls.DragEventArgs.DragEventArgs(Microsoft.Maui.Controls.DataPackage! dataPackage) -> void +Microsoft.Maui.Controls.DragGestureRecognizer.DragStarting -> System.EventHandler? +Microsoft.Maui.Controls.DragGestureRecognizer.DragStartingCommand.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.DragGestureRecognizer.DragStartingCommand.set -> void +Microsoft.Maui.Controls.DragGestureRecognizer.DragStartingCommandParameter.get -> object! +Microsoft.Maui.Controls.DragGestureRecognizer.DragStartingCommandParameter.set -> void +Microsoft.Maui.Controls.DragGestureRecognizer.DropCompleted -> System.EventHandler? +Microsoft.Maui.Controls.DragGestureRecognizer.DropCompletedCommand.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.DragGestureRecognizer.DropCompletedCommand.set -> void +Microsoft.Maui.Controls.DragGestureRecognizer.DropCompletedCommandParameter.get -> object! +Microsoft.Maui.Controls.DragGestureRecognizer.DropCompletedCommandParameter.set -> void +Microsoft.Maui.Controls.DragStartingEventArgs.Data.get -> Microsoft.Maui.Controls.DataPackage! +Microsoft.Maui.Controls.DropEventArgs.Data.get -> Microsoft.Maui.Controls.DataPackageView! +Microsoft.Maui.Controls.DropEventArgs.DropEventArgs(Microsoft.Maui.Controls.DataPackageView! view) -> void +Microsoft.Maui.Controls.InputView.CursorPosition.get -> int +Microsoft.Maui.Controls.InputView.CursorPosition.set -> void +Microsoft.Maui.Controls.InputView.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +Microsoft.Maui.Controls.InputView.FontAttributes.set -> void +Microsoft.Maui.Controls.InputView.FontAutoScalingEnabled.get -> bool +Microsoft.Maui.Controls.InputView.FontAutoScalingEnabled.set -> void +Microsoft.Maui.Controls.InputView.FontSize.get -> double +Microsoft.Maui.Controls.InputView.FontSize.set -> void +Microsoft.Maui.Controls.InputView.SelectionLength.get -> int +Microsoft.Maui.Controls.InputView.SelectionLength.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerPressed -> System.EventHandler? +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerPressedCommand.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerPressedCommand.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerPressedCommandParameter.get -> object! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerPressedCommandParameter.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerReleased -> System.EventHandler? +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerReleasedCommand.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerReleasedCommand.set -> void +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerReleasedCommandParameter.get -> object! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerReleasedCommandParameter.set -> void +static readonly Microsoft.Maui.Controls.KeyboardAccelerator.KeyProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.KeyboardAccelerator.ModifiersProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.DragGestureRecognizer.CanDragProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.DragGestureRecognizer.DragStartingCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.DragGestureRecognizer.DragStartingCommandProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.DragGestureRecognizer.DropCompletedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.DragGestureRecognizer.DropCompletedCommandProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerPressedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerPressedCommandProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerReleasedCommandParameterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.PointerGestureRecognizer.PointerReleasedCommandProperty -> Microsoft.Maui.Controls.BindableProperty! +Microsoft.Maui.Controls.Element.ClearLogicalChildren() -> void +virtual Microsoft.Maui.Controls.DragEventArgs.GetPosition(Microsoft.Maui.Controls.Element? relativeTo) -> Microsoft.Maui.Graphics.Point? +virtual Microsoft.Maui.Controls.DragStartingEventArgs.GetPosition(Microsoft.Maui.Controls.Element? relativeTo) -> Microsoft.Maui.Graphics.Point? +virtual Microsoft.Maui.Controls.DropEventArgs.GetPosition(Microsoft.Maui.Controls.Element? relativeTo) -> Microsoft.Maui.Graphics.Point? +*REMOVED*override Microsoft.Maui.Controls.RefreshView.MeasureOverride(double widthConstraint, double heightConstraint) -> Microsoft.Maui.Graphics.Size +Microsoft.Maui.Controls.Border.~Border() -> void +Microsoft.Maui.Controls.InputView.IsTextPredictionEnabled.get -> bool +Microsoft.Maui.Controls.InputView.IsTextPredictionEnabled.set -> void +Microsoft.Maui.Controls.IWindowCreator +Microsoft.Maui.Controls.IWindowCreator.CreateWindow(Microsoft.Maui.Controls.Application! app, Microsoft.Maui.IActivationState? activationState) -> Microsoft.Maui.Controls.Window! +Microsoft.Maui.Controls.LayoutOptions.Equals(Microsoft.Maui.Controls.LayoutOptions other) -> bool +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommandParameter.get -> object! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommandParameter.get -> object! +Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommandParameter.get -> object! +*REMOVED*Microsoft.Maui.Controls.PointerGestureRecognizer.PointerEnteredCommandParameter.get -> System.Windows.Input.ICommand! +*REMOVED*Microsoft.Maui.Controls.PointerGestureRecognizer.PointerExitedCommandParameter.get -> System.Windows.Input.ICommand! +*REMOVED*Microsoft.Maui.Controls.PointerGestureRecognizer.PointerMovedCommandParameter.get -> System.Windows.Input.ICommand! +Microsoft.Maui.Controls.Region.Equals(Microsoft.Maui.Controls.Region other) -> bool +Microsoft.Maui.Controls.Shapes.Matrix.Equals(Microsoft.Maui.Controls.Shapes.Matrix other) -> bool +Microsoft.Maui.Controls.Shapes.Shape.~Shape() -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Add(string! key, object! value) -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Add(System.Collections.Generic.KeyValuePair item) -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Clear() -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Contains(System.Collections.Generic.KeyValuePair item) -> bool +Microsoft.Maui.Controls.ShellNavigationQueryParameters.ContainsKey(string! key) -> bool +Microsoft.Maui.Controls.ShellNavigationQueryParameters.CopyTo(System.Collections.Generic.KeyValuePair[]! array, int arrayIndex) -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Count.get -> int +Microsoft.Maui.Controls.ShellNavigationQueryParameters.GetEnumerator() -> System.Collections.Generic.IEnumerator>! +Microsoft.Maui.Controls.ShellNavigationQueryParameters.IsReadOnly.get -> bool +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Keys.get -> System.Collections.Generic.ICollection! +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Remove(string! key) -> bool +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Remove(System.Collections.Generic.KeyValuePair item) -> bool +Microsoft.Maui.Controls.ShellNavigationQueryParameters.ShellNavigationQueryParameters() -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.ShellNavigationQueryParameters(System.Collections.Generic.IDictionary! dictionary) -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.ShellNavigationQueryParameters(System.Collections.Generic.IEnumerable>! collection) -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.this[string! key].get -> object! +Microsoft.Maui.Controls.ShellNavigationQueryParameters.this[string! key].set -> void +Microsoft.Maui.Controls.ShellNavigationQueryParameters.TryGetValue(string! key, out object! value) -> bool +Microsoft.Maui.Controls.ShellNavigationQueryParameters.Values.get -> System.Collections.Generic.ICollection! +Microsoft.Maui.Controls.VisualElement.~VisualElement() -> void +override Microsoft.Maui.Controls.LayoutOptions.GetHashCode() -> int +override Microsoft.Maui.Controls.Region.GetHashCode() -> int +override Microsoft.Maui.Controls.Shapes.Matrix.GetHashCode() -> int +override Microsoft.Maui.Controls.Shapes.Shape.OnBindingContextChanged() -> void +override Microsoft.Maui.Controls.View.ChangeVisualState() -> void +Microsoft.Maui.Controls.Handlers.BoxViewHandler +Microsoft.Maui.Controls.Handlers.BoxViewHandler.BoxViewHandler() -> void +static Microsoft.Maui.Controls.LayoutOptions.operator !=(Microsoft.Maui.Controls.LayoutOptions left, Microsoft.Maui.Controls.LayoutOptions right) -> bool +static Microsoft.Maui.Controls.LayoutOptions.operator ==(Microsoft.Maui.Controls.LayoutOptions left, Microsoft.Maui.Controls.LayoutOptions right) -> bool +static Microsoft.Maui.Controls.Region.operator !=(Microsoft.Maui.Controls.Region left, Microsoft.Maui.Controls.Region right) -> bool +static Microsoft.Maui.Controls.Region.operator ==(Microsoft.Maui.Controls.Region left, Microsoft.Maui.Controls.Region right) -> bool +static Microsoft.Maui.Controls.Shapes.Matrix.operator !=(Microsoft.Maui.Controls.Shapes.Matrix left, Microsoft.Maui.Controls.Shapes.Matrix right) -> bool +static Microsoft.Maui.Controls.Shapes.Matrix.operator ==(Microsoft.Maui.Controls.Shapes.Matrix left, Microsoft.Maui.Controls.Shapes.Matrix right) -> bool +virtual Microsoft.Maui.Controls.VisualElement.IsEnabledCore.get -> bool +Microsoft.Maui.Controls.VisualElement.RefreshIsEnabledProperty() -> void +override Microsoft.Maui.Controls.Button.IsEnabledCore.get -> bool +override Microsoft.Maui.Controls.ImageButton.IsEnabledCore.get -> bool +override Microsoft.Maui.Controls.SearchBar.IsEnabledCore.get -> bool +~Microsoft.Maui.Controls.Element.AddLogicalChild(Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.Element.InsertLogicalChild(int index, Microsoft.Maui.Controls.Element element) -> void +~Microsoft.Maui.Controls.Element.RemoveLogicalChild(Microsoft.Maui.Controls.Element element) -> bool +~Microsoft.Maui.Controls.InputView.FontFamily.get -> string +~Microsoft.Maui.Controls.InputView.FontFamily.set -> void +~Microsoft.Maui.Controls.Shell.GoToAsync(Microsoft.Maui.Controls.ShellNavigationState state, bool animate, Microsoft.Maui.Controls.ShellNavigationQueryParameters shellNavigationQueryParameters) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.Shell.GoToAsync(Microsoft.Maui.Controls.ShellNavigationState state, Microsoft.Maui.Controls.ShellNavigationQueryParameters shellNavigationQueryParameters) -> System.Threading.Tasks.Task +~Microsoft.Maui.Controls.WebView.UserAgent.get -> string +~Microsoft.Maui.Controls.WebView.UserAgent.set -> void +~override Microsoft.Maui.Controls.ImageButton.OnPropertyChanged(string propertyName = null) -> void +~override Microsoft.Maui.Controls.LayoutOptions.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.Region.Equals(object obj) -> bool +~override Microsoft.Maui.Controls.Shapes.Matrix.Equals(object obj) -> bool +~static Microsoft.Maui.Controls.RadioButton.MapContent(Microsoft.Maui.Handlers.IRadioButtonHandler handler, Microsoft.Maui.Controls.RadioButton radioButton) -> void +~static Microsoft.Maui.Controls.RadioButton.MapContent(Microsoft.Maui.Handlers.RadioButtonHandler handler, Microsoft.Maui.Controls.RadioButton radioButton) -> void +~static Microsoft.Maui.Controls.Region.FromRectangles(System.Collections.Generic.IEnumerable rectangles) -> Microsoft.Maui.Controls.Region +~static readonly Microsoft.Maui.Controls.InputView.CursorPositionProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.FontAttributesProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.FontAutoScalingEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.FontFamilyProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.FontSizeProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.IsTextPredictionEnabledProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.InputView.SelectionLengthProperty -> Microsoft.Maui.Controls.BindableProperty +~static readonly Microsoft.Maui.Controls.WebView.UserAgentProperty -> Microsoft.Maui.Controls.BindableProperty +*REMOVED*~Microsoft.Maui.Controls.OpenGLView.On() -> Microsoft.Maui.Controls.IPlatformElementConfiguration +*REMOVED*~Microsoft.Maui.Controls.OpenGLView.OnDisplay.get -> System.Action +*REMOVED*~Microsoft.Maui.Controls.OpenGLView.OnDisplay.set -> void +*REMOVED*~static readonly Microsoft.Maui.Controls.OpenGLView.HasRenderLoopProperty -> Microsoft.Maui.Controls.BindableProperty +*REMOVED*Microsoft.Maui.Controls.IOpenGlViewController +*REMOVED*Microsoft.Maui.Controls.IOpenGlViewController.DisplayRequested -> System.EventHandler +*REMOVED*Microsoft.Maui.Controls.OpenGLView +*REMOVED*Microsoft.Maui.Controls.OpenGLView.Display() -> void +*REMOVED*Microsoft.Maui.Controls.OpenGLView.DisplayRequested -> System.EventHandler +*REMOVED*Microsoft.Maui.Controls.OpenGLView.HasRenderLoop.get -> bool +*REMOVED*Microsoft.Maui.Controls.OpenGLView.HasRenderLoop.set -> void +*REMOVED*Microsoft.Maui.Controls.OpenGLView.OpenGLView() -> void +*REMOVED*Microsoft.Maui.Controls.Application.SavePropertiesAsync() -> System.Threading.Tasks.Task! +*REMOVED*Microsoft.Maui.Controls.Application.Properties.get -> System.Collections.Generic.IDictionary! +Microsoft.Maui.Controls.IValueConverter.Convert(object? value, System.Type! targetType, object? parameter, System.Globalization.CultureInfo! culture) -> object? +Microsoft.Maui.Controls.IValueConverter.ConvertBack(object? value, System.Type! targetType, object? parameter, System.Globalization.CultureInfo! culture) -> object? +~static Microsoft.Maui.Controls.GridExtensions.Add(this Microsoft.Maui.Controls.Grid grid, Microsoft.Maui.IView view, int left, int right, int top, int bottom) -> void +~static Microsoft.Maui.Controls.GridExtensions.AddWithSpan(this Microsoft.Maui.Controls.Grid grid, Microsoft.Maui.IView view, int row = 0, int column = 0, int rowSpan = 1, int columnSpan = 1) -> void +*REMOVED*~Microsoft.Maui.Controls.ItemsView.AddLogicalChild(Microsoft.Maui.Controls.Element element) -> void +*REMOVED*~Microsoft.Maui.Controls.ItemsView.RemoveLogicalChild(Microsoft.Maui.Controls.Element element) -> void +*REMOVED*~Microsoft.Maui.Controls.Shell.AddLogicalChild(Microsoft.Maui.Controls.Element element) -> void +*REMOVED*~Microsoft.Maui.Controls.Shell.RemoveLogicalChild(Microsoft.Maui.Controls.Element element) -> void +Microsoft.Maui.Controls.PointerEventArgs.PlatformArgs.get -> Microsoft.Maui.Controls.PlatformPointerEventArgs? +Microsoft.Maui.Controls.PlatformPointerEventArgs +*REMOVED*override Microsoft.Maui.Controls.SwipeItems.OnBindingContextChanged() -> void +~static readonly Microsoft.Maui.Controls.ContentPage.HideSoftInputOnTappedProperty -> Microsoft.Maui.Controls.BindableProperty +Microsoft.Maui.Controls.ContentPage.HideSoftInputOnTapped.get -> bool +Microsoft.Maui.Controls.ContentPage.HideSoftInputOnTapped.set -> void + +*REMOVED*~Microsoft.Maui.Controls.Editor.FontFamily.get -> string +*REMOVED*~Microsoft.Maui.Controls.Editor.FontFamily.set -> void +*REMOVED*Microsoft.Maui.Controls.Editor.CursorPosition.get -> int +*REMOVED*Microsoft.Maui.Controls.Editor.CursorPosition.set -> void +*REMOVED*Microsoft.Maui.Controls.Editor.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +*REMOVED*Microsoft.Maui.Controls.Editor.FontAttributes.set -> void +*REMOVED*Microsoft.Maui.Controls.Editor.FontAutoScalingEnabled.get -> bool +*REMOVED*Microsoft.Maui.Controls.Editor.FontAutoScalingEnabled.set -> void +*REMOVED*Microsoft.Maui.Controls.Editor.FontSize.get -> double +*REMOVED*Microsoft.Maui.Controls.Editor.FontSize.set -> void +*REMOVED*Microsoft.Maui.Controls.Editor.SelectionLength.get -> int +*REMOVED*Microsoft.Maui.Controls.Editor.SelectionLength.set -> void + +*REMOVED*~Microsoft.Maui.Controls.SearchBar.FontFamily.get -> string +*REMOVED*~Microsoft.Maui.Controls.SearchBar.FontFamily.set -> void +*REMOVED*Microsoft.Maui.Controls.SearchBar.CursorPosition.get -> int +*REMOVED*Microsoft.Maui.Controls.SearchBar.CursorPosition.set -> void +*REMOVED*Microsoft.Maui.Controls.SearchBar.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +*REMOVED*Microsoft.Maui.Controls.SearchBar.FontAttributes.set -> void +*REMOVED*Microsoft.Maui.Controls.SearchBar.FontAutoScalingEnabled.get -> bool +*REMOVED*Microsoft.Maui.Controls.SearchBar.FontAutoScalingEnabled.set -> void +*REMOVED*Microsoft.Maui.Controls.SearchBar.FontSize.get -> double +*REMOVED*Microsoft.Maui.Controls.SearchBar.FontSize.set -> void +*REMOVED*Microsoft.Maui.Controls.SearchBar.SelectionLength.get -> int +*REMOVED*Microsoft.Maui.Controls.SearchBar.SelectionLength.set -> void + +*REMOVED*~Microsoft.Maui.Controls.Entry.FontFamily.get -> string +*REMOVED*~Microsoft.Maui.Controls.Entry.FontFamily.set -> void +*REMOVED*Microsoft.Maui.Controls.Entry.CursorPosition.get -> int +*REMOVED*Microsoft.Maui.Controls.Entry.CursorPosition.set -> void +*REMOVED*Microsoft.Maui.Controls.Entry.FontAttributes.get -> Microsoft.Maui.Controls.FontAttributes +*REMOVED*Microsoft.Maui.Controls.Entry.FontAttributes.set -> void +*REMOVED*Microsoft.Maui.Controls.Entry.FontAutoScalingEnabled.get -> bool +*REMOVED*Microsoft.Maui.Controls.Entry.FontAutoScalingEnabled.set -> void +*REMOVED*Microsoft.Maui.Controls.Entry.FontSize.get -> double +*REMOVED*Microsoft.Maui.Controls.Entry.FontSize.set -> void +*REMOVED*Microsoft.Maui.Controls.Entry.SelectionLength.get -> int +*REMOVED*Microsoft.Maui.Controls.Entry.SelectionLength.set -> void + diff --git a/src/Controls/src/Core/RadioButton/RadioButton.Gtk.cs b/src/Controls/src/Core/RadioButton/RadioButton.Gtk.cs new file mode 100644 index 000000000000..0865666aa1de --- /dev/null +++ b/src/Controls/src/Core/RadioButton/RadioButton.Gtk.cs @@ -0,0 +1,16 @@ +#nullable disable +namespace Microsoft.Maui.Controls +{ + public partial class RadioButton + { + [MissingMapper] + public static void MapContent(RadioButtonHandler handler, RadioButton radioButton) + => MapContent((IRadioButtonHandler)handler, radioButton); + + [MissingMapper] + public static void MapContent(IRadioButtonHandler handler, RadioButton radioButton) + { + + } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/HandlerImpl/SearchBar/SearchBar.Gtk.cs b/src/Controls/src/Core/SearchBar/SearchBar.Gtk.cs similarity index 64% rename from src/Controls/src/Core/HandlerImpl/SearchBar/SearchBar.Gtk.cs rename to src/Controls/src/Core/SearchBar/SearchBar.Gtk.cs index 9ebfd2f82644..b371368e48f2 100644 --- a/src/Controls/src/Core/HandlerImpl/SearchBar/SearchBar.Gtk.cs +++ b/src/Controls/src/Core/SearchBar/SearchBar.Gtk.cs @@ -4,7 +4,7 @@ public partial class SearchBar { - public static void MapText(SearchBarHandler handler, SearchBar searchBar) + public static void MapText(ISearchBarHandler handler, SearchBar searchBar) { SearchBarHandler.MapText(handler, searchBar); } From 1ebb238ff313b626fe40e33fb52bdf13697ede5c Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Tue, 7 Nov 2023 14:09:06 -0600 Subject: [PATCH 223/425] Revert "Ensure that viewport calculations for iOS ScrollView account for content insets (#18277)" (#18579) This reverts commit 0cb5d80b72620953b7207cef2f953ad8883ebd4a. --- .../ScrollView/ScrollViewTests.iOS.cs | 48 ----------------- .../UITests/snapshots/ios/Issue16094Test.png | Bin 186044 -> 185967 bytes .../ScrollView/ScrollViewHandler.iOS.cs | 50 +++++++++--------- 3 files changed, 25 insertions(+), 73 deletions(-) diff --git a/src/Controls/tests/DeviceTests/Elements/ScrollView/ScrollViewTests.iOS.cs b/src/Controls/tests/DeviceTests/Elements/ScrollView/ScrollViewTests.iOS.cs index afdd79b764e2..8b441eb28761 100644 --- a/src/Controls/tests/DeviceTests/Elements/ScrollView/ScrollViewTests.iOS.cs +++ b/src/Controls/tests/DeviceTests/Elements/ScrollView/ScrollViewTests.iOS.cs @@ -7,7 +7,6 @@ using Microsoft.Maui.Graphics; using Microsoft.Maui.Handlers; using Microsoft.Maui.Hosting; -using UIKit; using Xunit; namespace Microsoft.Maui.DeviceTests @@ -36,52 +35,5 @@ await scrollViewHandler.PlatformView.AttachAndRun(() => }); }); } - - [Fact] - public async Task ContentSizeExpandsToViewport() - { - EnsureHandlerCreated(builder => { builder.ConfigureMauiHandlers(handlers => { handlers.AddHandler(); }); }); - - var scrollView = new ScrollView(); - - var entry = new Entry() { Text = "In a ScrollView", HeightRequest = 10 }; - - - static CoreGraphics.CGSize getViewportSize(UIScrollView scrollView) - { - return scrollView.AdjustedContentInset.InsetRect(scrollView.Bounds).Size; - }; - - var scrollViewHandler = await InvokeOnMainThreadAsync(() => - { - return CreateHandlerAsync(scrollView); - }); - - await InvokeOnMainThreadAsync(async () => - { - await scrollViewHandler.PlatformView.AttachAndRun(async () => - { - var uiScrollView = scrollViewHandler.PlatformView; - - uiScrollView.ContentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.Always; - var parent = uiScrollView.Superview; - uiScrollView.Bounds = parent.Bounds; - uiScrollView.Center = parent.Center; - - scrollView.Content = entry; - - parent.SetNeedsLayout(); - parent.LayoutIfNeeded(); - - await Task.Yield(); - - var contentSize = uiScrollView.ContentSize; - var viewportSize = getViewportSize(uiScrollView); - - Assert.Equal(viewportSize.Height, contentSize.Height); - Assert.Equal(viewportSize.Width, contentSize.Width); - }); - }); - } } } diff --git a/src/Controls/tests/UITests/snapshots/ios/Issue16094Test.png b/src/Controls/tests/UITests/snapshots/ios/Issue16094Test.png index ec3ab47ffe9cceb9d47d88085cc31f212e598404..d0ef6eb54aab02f2b810ce2b2f9d45d3ebfdec72 100644 GIT binary patch literal 185967 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 E0utn&W&i*H diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs index 60b6964c286a..b86d4882bf44 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs @@ -1,7 +1,13 @@ using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; using CoreGraphics; using Microsoft.Maui.Graphics; using Microsoft.Maui.Layouts; +using Microsoft.Maui.Platform; +using ObjCRuntime; using UIKit; using Size = Microsoft.Maui.Graphics.Size; @@ -97,11 +103,9 @@ public static void MapOrientation(IScrollViewHandler handler, IScrollView scroll // without having to re-layout the ScrollView var fullContentSize = scrollView.PresentedContent?.DesiredSize ?? Size.Zero; - - var viewportBounds = GetViewportBounds(uiScrollView); + var viewportBounds = uiScrollView.Bounds; var viewportWidth = viewportBounds.Width; var viewportHeight = viewportBounds.Height; - SetContentSizeForOrientation(uiScrollView, viewportWidth, viewportHeight, scrollView.Orientation, fullContentSize); } @@ -123,7 +127,7 @@ public static void MapRequestScrollTo(IScrollViewHandler handler, IScrollView sc var availableScrollWidth = uiScrollView.ContentSize.Width - uiScrollView.Frame.Width; var minScrollHorizontal = Math.Min(request.HorizontalOffset, availableScrollWidth); var minScrollVertical = Math.Min(request.VerticalOffset, availableScrollHeight); - uiScrollView.SetContentOffset(new CGPoint(minScrollHorizontal, minScrollVertical), !request.Instant); + uiScrollView.SetContentOffset(new CoreGraphics.CGPoint(minScrollHorizontal, minScrollVertical), !request.Instant); if (request.Instant) { @@ -181,15 +185,16 @@ static void InsertContentView(UIScrollView platformScrollView, IScrollView scrol return; } - var contentContainer = new ContentView + var contentContainer = new ContentView() { View = scrollView.PresentedContent, - Tag = ContentPanelTag, - // This is where we normally would inject the cross-platform ScrollView's layout logic; instead, we're injecting the - // methods from this handler so it can make some adjustments for things like Padding before the default logic is invoked - CrossPlatformLayout = crossPlatformLayout + Tag = ContentPanelTag }; + // This is where we normally would inject the cross-platform ScrollView's layout logic; instead, we're injecting the + // methods from this handler so it can make some adjustments for things like Padding before the default logic is invoked + contentContainer.CrossPlatformLayout = crossPlatformLayout; + platformScrollView.ClearSubviews(); contentContainer.AddSubview(platformContent); platformScrollView.AddSubview(contentContainer); @@ -284,11 +289,6 @@ static void SetContentSizeForOrientation(UIScrollView uiScrollView, double viewp uiScrollView.ContentSize = contentSize; } - static CGRect GetViewportBounds(UIScrollView platformScrollView) - { - return platformScrollView.AdjustedContentInset.InsetRect(platformScrollView.Bounds); - } - Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double heightConstraint) { var scrollView = VirtualView; @@ -301,18 +301,17 @@ Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double he return Size.Zero; } - var viewPortBounds = GetViewportBounds(platformScrollView); - + var scrollViewBounds = platformScrollView.Bounds; var padding = scrollView.Padding; if (widthConstraint == 0) { - widthConstraint = viewPortBounds.Width; + widthConstraint = scrollViewBounds.Width; } if (heightConstraint == 0) { - heightConstraint = viewPortBounds.Height; + heightConstraint = scrollViewBounds.Height; } // Account for the ScrollView Padding before measuring the content @@ -331,28 +330,29 @@ Size ICrossPlatformLayout.CrossPlatformArrange(Rect bounds) var crossPlatformLayout = scrollView as ICrossPlatformLayout; var platformScrollView = PlatformView; + var contentSize = crossPlatformLayout.CrossPlatformArrange(bounds); + // The UIScrollView's bounds are available, so we can use them to make sure the ContentSize makes sense // for the ScrollView orientation - var viewportBounds = GetViewportBounds(platformScrollView); - - var contentSize = crossPlatformLayout.CrossPlatformArrange(viewportBounds.ToRectangle()); - + var viewportBounds = platformScrollView.Bounds; var viewportHeight = viewportBounds.Height; var viewportWidth = viewportBounds.Width; SetContentSizeForOrientation(platformScrollView, viewportWidth, viewportHeight, scrollView.Orientation, contentSize); var container = GetContentView(platformScrollView); - if (container != null) + if (container?.Superview is UIScrollView uiScrollView) { // Ensure the container is at least the size of the UIScrollView itself, so that the // cross-platform layout logic makes sense and the contents don't arrange outside the // container. (Everything will look correct if they do, but hit testing won't work properly.) + + var scrollViewBounds = uiScrollView.Bounds; var containerBounds = contentSize; container.Bounds = new CGRect(0, 0, - Math.Max(containerBounds.Width, viewportBounds.Width), - Math.Max(containerBounds.Height, viewportBounds.Height)); + Math.Max(containerBounds.Width, scrollViewBounds.Width), + Math.Max(containerBounds.Height, scrollViewBounds.Height)); container.Center = new CGPoint(container.Bounds.GetMidX(), container.Bounds.GetMidY()); } From 0a809fb80fee1e2fe17465168f76c1fa02144ade Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 21:11:19 +0100 Subject: [PATCH 224/425] Compatibility.csproj: fix build --- src/Compatibility/Core/src/Compatibility.csproj | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Compatibility/Core/src/Compatibility.csproj b/src/Compatibility/Core/src/Compatibility.csproj index 1057f87734b7..5720bc0c67b5 100644 --- a/src/Compatibility/Core/src/Compatibility.csproj +++ b/src/Compatibility/Core/src/Compatibility.csproj @@ -8,6 +8,7 @@ iOS\ Windows\ Tizen\ + Gtk\ true true true @@ -24,18 +25,16 @@ - - - + - + From 5238d10f2001ea52e64c453ad0db1601dd1d9ef4 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 21:13:01 +0100 Subject: [PATCH 225/425] Directory.Build.props: NoWarn CS1589 --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 6bccf29c4fb9..e51dd36a340e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -176,7 +176,7 @@ $(MSBuildThisFileDirectory)LICENSE.TXT $(MSBuildThisFileDirectory)THIRD-PARTY-NOTICES.TXT true - $(NoWarn);RS0016;RS0017;CA1822;CA1805;CS0649 + $(NoWarn);RS0016;RS0017;CA1822;CA1805;CS0649;CS1589 From 36cf94b4801f071b367fb81764b2405b8d43c19e Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 7 Nov 2023 21:13:38 +0100 Subject: [PATCH 226/425] Controls.Sample.Gtk.csproj: SimpleSampleGtkApplication: track api changes --- .../SimpleSampleApp/SimpleSampleGtkApplication.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs index 848e42e5d479..4a1d889e7e98 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/SimpleSampleGtkApplication.cs @@ -25,7 +25,6 @@ Widget OnTopContainerOverride(Widget nativePage) { var b = new Box(Orientation.Vertical, 0) { - Fill = true, Expand = true, Margin = 5, From 0d64894f82723172992a17bc3d1764e5af0e53d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 02:30:30 +0000 Subject: [PATCH 227/425] Move MAUI Blazor template files to match ASP.NET Blazor template (#18608) Fixes https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1910199 Co-authored-by: Eilon Lipton --- .../src/templates/maui-blazor/{ => Components}/Routes.razor | 2 +- .../src/templates/maui-blazor/{ => Components}/_Imports.razor | 0 src/Templates/src/templates/maui-blazor/MainPage.xaml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/Templates/src/templates/maui-blazor/{ => Components}/Routes.razor (87%) rename src/Templates/src/templates/maui-blazor/{ => Components}/_Imports.razor (100%) diff --git a/src/Templates/src/templates/maui-blazor/Routes.razor b/src/Templates/src/templates/maui-blazor/Components/Routes.razor similarity index 87% rename from src/Templates/src/templates/maui-blazor/Routes.razor rename to src/Templates/src/templates/maui-blazor/Components/Routes.razor index 339a6a40060e..631cf8054724 100644 --- a/src/Templates/src/templates/maui-blazor/Routes.razor +++ b/src/Templates/src/templates/maui-blazor/Components/Routes.razor @@ -1,6 +1,6 @@  - + diff --git a/src/Templates/src/templates/maui-blazor/_Imports.razor b/src/Templates/src/templates/maui-blazor/Components/_Imports.razor similarity index 100% rename from src/Templates/src/templates/maui-blazor/_Imports.razor rename to src/Templates/src/templates/maui-blazor/Components/_Imports.razor diff --git a/src/Templates/src/templates/maui-blazor/MainPage.xaml b/src/Templates/src/templates/maui-blazor/MainPage.xaml index 96a89841851c..3a086bcd3cdd 100644 --- a/src/Templates/src/templates/maui-blazor/MainPage.xaml +++ b/src/Templates/src/templates/maui-blazor/MainPage.xaml @@ -7,7 +7,7 @@ - + From 2560be78274afddbaf95f5dfba54b90b26ffe937 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 8 Nov 2023 14:37:53 +0100 Subject: [PATCH 228/425] Core.csproj: ImageSourceExtensions: add Gkt & remove obsolete ImageSourceServiceResult.cs --- .../Gtk/ImageSourceServiceResult.cs | 45 ------------------- .../src/ImageSources/ImageSourceExtensions.cs | 4 ++ 2 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs diff --git a/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs b/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs deleted file mode 100644 index d704fd8afc8b..000000000000 --- a/src/Core/src/ImageSources/Gtk/ImageSourceServiceResult.cs +++ /dev/null @@ -1,45 +0,0 @@ -#nullable enable -using System; -using NativeImage = Gdk.Pixbuf; - -namespace Microsoft.Maui -{ - - public class ImageSourceServiceResult_ : IImageSourceServiceResult - { - - Action? _dispose; - - public ImageSourceServiceResult_(NativeImage image, Action? dispose = null) - : this(image, false, dispose) - { } - - public ImageSourceServiceResult_(NativeImage image, bool resolutionDependent, Action? dispose = null) - { - Value = image; - IsResolutionDependent = resolutionDependent; - _dispose = dispose; - } - - public NativeImage Value { get; } - - public bool IsResolutionDependent { get; } - - public bool IsDisposed { get; private set; } - - public bool IsResource { get; set; } - - public void Dispose() - { - if (IsDisposed) - return; - - IsDisposed = true; - - _dispose?.Invoke(); - _dispose = null; - } - - } - -} \ No newline at end of file diff --git a/src/Core/src/ImageSources/ImageSourceExtensions.cs b/src/Core/src/ImageSources/ImageSourceExtensions.cs index bca25ab00fe7..d4f8170d7fc6 100644 --- a/src/Core/src/ImageSources/ImageSourceExtensions.cs +++ b/src/Core/src/ImageSources/ImageSourceExtensions.cs @@ -12,6 +12,8 @@ using PlatformImage = Microsoft.UI.Xaml.Media.ImageSource; #elif TIZEN using PlatformImage = Microsoft.Maui.Platform.MauiImageSource; +#elif GTK +using PlatformImage = Gdk.Pixbuf; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformImage = System.Object; #endif @@ -58,6 +60,8 @@ static async Task LoadImageResult(Task? return imageSourceService.GetImageSourceAsync(imageSource, scale); #elif TIZEN return imageSourceService.GetImageAsync(imageSource); +#elif GTK + return imageSourceService.GetImageAsync(imageSource); #else throw new NotImplementedException(); #endif From b3e4af4d6b19d656f23f6a6a47c84fd3399267df Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 8 Nov 2023 14:38:19 +0100 Subject: [PATCH 229/425] Core.csproj: remove some NotImplementedException --- src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs | 5 ++++- .../src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 80bef1eca053..70b538560392 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -116,7 +116,10 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra #endif [MissingMapper] - public void UpdateZIndex(IView view) => throw new NotImplementedException(); + public void UpdateZIndex(IView view) + { + + } [MissingMapper] public static partial void MapBackground(ILayoutHandler handler, ILayout layout) diff --git a/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs index a13e897b3acb..c99aef328692 100644 --- a/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs @@ -32,9 +32,9 @@ protected override void DisconnectHandler(NavigationView nativeView) } + [MissingMapper] public static void RequestNavigation(INavigationViewHandler arg1, IStackNavigation arg2, object? arg3) { - throw new NotImplementedException(); } } From b52ddf0e7b2c15379aea5daae20ec787ba697954 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 8 Nov 2023 14:38:46 +0100 Subject: [PATCH 230/425] Compatibility.Gtk.csproj: remove file slack --- .../Core/src/Gtk/Compatibility.Gtk.csproj | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj diff --git a/src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj b/src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj deleted file mode 100644 index ab4b528a72b4..000000000000 --- a/src/Compatibility/Core/src/Gtk/Compatibility.Gtk.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - $(MauiLinuxTargets) - Microsoft.Maui - Gtk Compatibility Backend for Microsoft.Maui - Microsoft.Maui.Controls.Compatibility.Gtk - disable - - - - - - - - - - - - - - - - - - - - - From 8df543ab62ae1c0b99db485f00d30322c7b9ecd0 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 8 Nov 2023 15:17:17 +0100 Subject: [PATCH 231/425] Core.csproj: Gtk ViewExtensions: implement OnLoaded/OnUnLoaded --- src/Core/src/Platform/Gtk/ViewExtensions.cs | 58 ++++++++++++++++++--- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index 321e935f4241..ed7054443ead 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -213,17 +213,63 @@ public static void UpdateInputTransparent(this Widget? platformView, IViewHandle public static void UpdateToolTip(this Widget? platformView, ToolTip? tooltip) { } - [MissingMapper] - internal static IDisposable OnLoaded(this Widget? platformView, Action action) + internal static IDisposable OnLoaded(this Widget? view, Action action) { - throw new NotImplementedException(); + if (view is not { }) + return new ActionDisposable(() => { }); + + if (view.IsLoaded()) + { + action(); + return new ActionDisposable(() => { }); + } + + EventHandler? routedEventHandler = null; + ActionDisposable? disposable = new ActionDisposable(() => + { + if (routedEventHandler != null) + view.Realized -= routedEventHandler; + }); + + routedEventHandler = (_, __) => + { + disposable?.Dispose(); + disposable = null; + action(); + }; + + view.Realized += routedEventHandler; + return disposable; } [MissingMapper] - internal static IDisposable OnUnloaded(this Widget? platformView, Action action) + internal static IDisposable OnUnloaded(this Widget? view, Action action) { - throw new NotImplementedException(); - } + if (view is not { }) + return new ActionDisposable(() => { }); + + if (!view.IsLoaded()) + { + action(); + return new ActionDisposable(() => { }); + } + + EventHandler? routedEventHandler = null; + ActionDisposable? disposable = new ActionDisposable(() => + { + if (routedEventHandler != null) + view.Unrealized -= routedEventHandler; + }); + + routedEventHandler = (_, __) => + { + disposable?.Dispose(); + disposable = null; + action(); + }; + + view.Unrealized += routedEventHandler; + return disposable; } public static bool IsLoaded(this Widget? platformView) { From a6797a7ac5dc20e1c4204259c09cd83859d61a89 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 8 Nov 2023 16:32:09 +0100 Subject: [PATCH 232/425] Core.csproj: fix & enhance ImageSourcePartSetter --- .../src/Handlers/Button/ButtonHandler.Gtk.cs | 8 +++++++- src/Core/src/Handlers/Image/ImageHandler.Gtk.cs | 8 +++++++- .../ImageButton/ImageButtonHandler.Gtk.cs | 10 +++++++++- .../Handlers/ImageButton/ImageButtonHandler.cs | 2 +- .../SwipeItemMenuItemHandler.Gtk.cs | 2 +- src/Core/src/Platform/Gtk/MauiImageButton.cs | 17 ++++++++++++++--- src/Core/src/Platform/IImageSourcePartSetter.cs | 2 ++ src/Core/src/Platform/ImageSourcePartLoader.cs | 2 +- src/Core/src/Platform/ImageSourcePartSetter.cs | 2 ++ 9 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs index a496e33f5eda..102c2e083745 100644 --- a/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/Button/ButtonHandler.Gtk.cs @@ -82,7 +82,13 @@ void OnButtonClicked(object? sender, EventArgs e) partial class ButtonImageSourcePartSetter { - public override void SetImageSource(object? platformImage) { } + public override void SetImageSource(Gdk.Pixbuf? platformImage) + { + if (Handler?.PlatformView is not Button button) + return; + + button.Image = new Image(platformImage); + } } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs index c985ccf1b67f..a04616acf8db 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Gtk.cs @@ -34,7 +34,13 @@ public static async Task MapSourceAsync(IImageHandler handler, IImage image) partial class ImageImageSourcePartSetter { - public override void SetImageSource(object? platformImage) { } + public override void SetImageSource(Gdk.Pixbuf? platformImage) + { + if (Handler?.PlatformView is not ImageView image) + return; + + image.Image = platformImage; + } } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs index 0922af9b2073..03888513b95d 100644 --- a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.Gtk.cs @@ -20,7 +20,15 @@ public static void MapPadding(IImageButtonHandler handler, IImageButton imageBut partial class ImageButtonImageSourcePartSetter { - public override void SetImageSource(object? platformImage) { } + public override void SetImageSource(Gdk.Pixbuf? platformImage) + { + if (Handler?.PlatformView is not MauiImageButton button) + return; + + var imageView = button.ImageView ?? new (); + imageView.Image = platformImage; + button.ImageView = imageView; + } } } } \ No newline at end of file diff --git a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs index ce8ba7d13a25..032fa10ce2c2 100644 --- a/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs +++ b/src/Core/src/Handlers/ImageButton/ImageButtonHandler.cs @@ -16,7 +16,7 @@ using PlatformImageView = Tizen.UIExtensions.NUI.Image; using PlatformView = Microsoft.Maui.Platform.MauiImageButton; #elif GTK -using PlatformImage = Gtk.Image; +using PlatformImage = Gdk.Pixbuf; using PlatformImageView = Microsoft.Maui.Platform.ImageView; using PlatformView = Microsoft.Maui.Platform.MauiImageButton; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) diff --git a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs index fe9f71cc7d80..2869cf3059f4 100644 --- a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs @@ -22,7 +22,7 @@ public static void MapVisibility(ISwipeItemMenuItemHandler handler, ISwipeItemMe partial class SwipeItemMenuItemImageSourcePartSetter { - public override void SetImageSource(object? platformImage) { } + public override void SetImageSource(Gdk.Pixbuf? platformImage) { } } } } diff --git a/src/Core/src/Platform/Gtk/MauiImageButton.cs b/src/Core/src/Platform/Gtk/MauiImageButton.cs index 5797eaee02bb..54c677d6d725 100644 --- a/src/Core/src/Platform/Gtk/MauiImageButton.cs +++ b/src/Core/src/Platform/Gtk/MauiImageButton.cs @@ -2,7 +2,18 @@ namespace Microsoft.Maui.Platform; public class MauiImageButton : Gtk.Button { - - public ImageView ImageView { get; set; } = null!; - + public ImageView ImageView + { + get + { + if (Image is ImageView image) + return image; + Image = image = new ImageView(); + return image; + } + set + { + Image = value; + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/IImageSourcePartSetter.cs b/src/Core/src/Platform/IImageSourcePartSetter.cs index 5f239f700791..acd392d8bb3c 100644 --- a/src/Core/src/Platform/IImageSourcePartSetter.cs +++ b/src/Core/src/Platform/IImageSourcePartSetter.cs @@ -6,6 +6,8 @@ using PlatformImage = Microsoft.UI.Xaml.Media.ImageSource; #elif TIZEN using PlatformImage = Microsoft.Maui.Platform.MauiImageSource; +#elif GTK +using PlatformImage = Gdk.Pixbuf; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using System; using PlatformImage = System.Object; diff --git a/src/Core/src/Platform/ImageSourcePartLoader.cs b/src/Core/src/Platform/ImageSourcePartLoader.cs index b371ed5e54dd..f36f35fcfa1e 100644 --- a/src/Core/src/Platform/ImageSourcePartLoader.cs +++ b/src/Core/src/Platform/ImageSourcePartLoader.cs @@ -74,7 +74,7 @@ public async Task UpdateImageSourceAsync() .ConfigureAwait(false); SourceManager.CompleteLoad(result); -#elif ANDROID || TIZEN +#elif ANDROID || TIZEN || GTK var result = await imageSource.UpdateSourceAsync(platformView, _imageSourceServiceProvider, Setter.SetImageSource, token) .ConfigureAwait(false); #else diff --git a/src/Core/src/Platform/ImageSourcePartSetter.cs b/src/Core/src/Platform/ImageSourcePartSetter.cs index 6afcd0d72199..414a58a8190d 100644 --- a/src/Core/src/Platform/ImageSourcePartSetter.cs +++ b/src/Core/src/Platform/ImageSourcePartSetter.cs @@ -7,6 +7,8 @@ using PlatformImage = Microsoft.UI.Xaml.Media.ImageSource; #elif TIZEN using PlatformImage = Microsoft.Maui.Platform.MauiImageSource; +#elif GTK +using PlatformImage = Gdk.Pixbuf; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformImage = System.Object; #endif From 1d4b8e54e50305aee736dc2cc7037da834b4ad2a Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 12:56:12 +0100 Subject: [PATCH 233/425] Maps.csproj: add Gtk dummy's --- src/Core/maps/src/Handlers/Map/IMapHandler.cs | 2 ++ src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs | 5 +++-- src/Core/maps/src/Handlers/Map/MapHandler.cs | 2 ++ src/Core/maps/src/Handlers/MapElement/IMapElementHandler.cs | 2 ++ src/Core/maps/src/Handlers/MapElement/MapElementHandler.cs | 2 ++ src/Core/maps/src/Handlers/MapPin/IMapPinHandler.cs | 2 ++ src/Core/maps/src/Handlers/MapPin/MapPinHandler.cs | 2 ++ 7 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Core/maps/src/Handlers/Map/IMapHandler.cs b/src/Core/maps/src/Handlers/Map/IMapHandler.cs index 9010e0565849..74f802e38e85 100644 --- a/src/Core/maps/src/Handlers/Map/IMapHandler.cs +++ b/src/Core/maps/src/Handlers/Map/IMapHandler.cs @@ -7,6 +7,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = Tizen.NUI.BaseComponents.View; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.NotImplementedView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0 && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs b/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs index 2e2057c892dc..a8dfd190a90f 100644 --- a/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs +++ b/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs @@ -1,12 +1,13 @@ using System; using Microsoft.Maui.Handlers; +using Microsoft.Maui.Platform; namespace Microsoft.Maui.Maps.Handlers { - public partial class MapHandler : ViewHandler + public partial class MapHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() => throw new NotImplementedException(); + protected override NotImplementedView CreatePlatformView() => new (); public static void MapMapType(IMapHandler handler, IMap map) => throw new NotImplementedException(); diff --git a/src/Core/maps/src/Handlers/Map/MapHandler.cs b/src/Core/maps/src/Handlers/Map/MapHandler.cs index 1d2be64b3b2f..d1395378f40e 100644 --- a/src/Core/maps/src/Handlers/Map/MapHandler.cs +++ b/src/Core/maps/src/Handlers/Map/MapHandler.cs @@ -6,6 +6,8 @@ using PlatformView = Microsoft.UI.Xaml.FrameworkElement; #elif TIZEN using PlatformView = Tizen.NUI.BaseComponents.View; +#elif GTK +using PlatformView = Microsoft.Maui.Platform.NotImplementedView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0 && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/maps/src/Handlers/MapElement/IMapElementHandler.cs b/src/Core/maps/src/Handlers/MapElement/IMapElementHandler.cs index b476b153e425..689e2b56d555 100644 --- a/src/Core/maps/src/Handlers/MapElement/IMapElementHandler.cs +++ b/src/Core/maps/src/Handlers/MapElement/IMapElementHandler.cs @@ -9,6 +9,8 @@ using PlatformView = System.Object; #elif TIZEN using PlatformView = System.Object; +#elif GTK +using PlatformView = System.Object; #elif (NETSTANDARD || !PLATFORM) || (NET6_0 && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/maps/src/Handlers/MapElement/MapElementHandler.cs b/src/Core/maps/src/Handlers/MapElement/MapElementHandler.cs index b72b5a7869eb..b18433c9e3b7 100644 --- a/src/Core/maps/src/Handlers/MapElement/MapElementHandler.cs +++ b/src/Core/maps/src/Handlers/MapElement/MapElementHandler.cs @@ -6,6 +6,8 @@ using PlatformView = System.Object; #elif TIZEN using PlatformView = System.Object; +#elif GTK +using PlatformView = System.Object; #elif (NETSTANDARD || !PLATFORM) || (NET6_0 && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/maps/src/Handlers/MapPin/IMapPinHandler.cs b/src/Core/maps/src/Handlers/MapPin/IMapPinHandler.cs index a8c6ec48acfd..9f37fff80146 100644 --- a/src/Core/maps/src/Handlers/MapPin/IMapPinHandler.cs +++ b/src/Core/maps/src/Handlers/MapPin/IMapPinHandler.cs @@ -7,6 +7,8 @@ using PlatformView = System.Object; #elif TIZEN using PlatformView = System.Object; +#elif GTK +using PlatformView = System.Object; #elif (NETSTANDARD || !PLATFORM) || (NET6_0 && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif diff --git a/src/Core/maps/src/Handlers/MapPin/MapPinHandler.cs b/src/Core/maps/src/Handlers/MapPin/MapPinHandler.cs index e3b32aa401b6..21e710c04f94 100644 --- a/src/Core/maps/src/Handlers/MapPin/MapPinHandler.cs +++ b/src/Core/maps/src/Handlers/MapPin/MapPinHandler.cs @@ -6,6 +6,8 @@ using PlatformView = System.Object; #elif TIZEN using PlatformView = System.Object; +#elif GTK +using PlatformView = System.Object; #elif (NETSTANDARD || !PLATFORM) || (NET6_0 && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif From 1a8702586acdb176deccda39f957bd20f877edc2 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 12:57:42 +0100 Subject: [PATCH 234/425] Microsoft.AspNetCore.Components.WebView.Maui.csproj BlazorWebViewHandler.Gtk.cs: track api changes --- ...lazorWebViewHandler.cs => BlazorWebViewHandler.Gtk.cs} | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) rename src/BlazorWebView/src/Maui/Gtk/{BlazorWebViewHandler.cs => BlazorWebViewHandler.Gtk.cs} (79%) diff --git a/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.cs b/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs similarity index 79% rename from src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.cs rename to src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs index ef0fe35d36f0..e74da008c2b6 100644 --- a/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.cs +++ b/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.Extensions.FileProviders; using Microsoft.Maui.Handlers; @@ -16,10 +17,15 @@ public partial class BlazorWebViewHandler : ViewHandler throw new NotSupportedException(); private void StartWebViewCoreIfPossible() { } - + #pragma warning disable CS0649 private WebViewManager? _webviewManager; #pragma warning restore CS0649 + /// + public virtual async Task TryDispatchAsync(Action workItem) + { + return await Task.FromResult(false); + } } } \ No newline at end of file From 4b650a926355b1d41462f7fff48fb169c6fa3dbd Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 12:58:06 +0100 Subject: [PATCH 235/425] Maps.csproj: add Gtk PublicAPI --- .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 132 ++++++++++++++++++ .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 1 + 2 files changed, 133 insertions(+) create mode 100644 src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt diff --git a/src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..3b0c31c72010 --- /dev/null +++ b/src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1,132 @@ +#nullable enable +Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions +Microsoft.Maui.Controls.Maps.Circle +Microsoft.Maui.Controls.Maps.Circle.Center.get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Controls.Maps.Circle.Center.set -> void +Microsoft.Maui.Controls.Maps.Circle.Circle() -> void +Microsoft.Maui.Controls.Maps.Circle.Fill.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.Controls.Maps.Circle.FillColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.Controls.Maps.Circle.FillColor.set -> void +Microsoft.Maui.Controls.Maps.Circle.Radius.get -> Microsoft.Maui.Maps.Distance +Microsoft.Maui.Controls.Maps.Circle.Radius.set -> void +Microsoft.Maui.Controls.Maps.Map +Microsoft.Maui.Controls.Maps.Map.GetEnumerator() -> System.Collections.Generic.IEnumerator! +Microsoft.Maui.Controls.Maps.Map.IsScrollEnabled.get -> bool +Microsoft.Maui.Controls.Maps.Map.IsScrollEnabled.set -> void +Microsoft.Maui.Controls.Maps.Map.IsShowingUser.get -> bool +Microsoft.Maui.Controls.Maps.Map.IsShowingUser.set -> void +Microsoft.Maui.Controls.Maps.Map.IsTrafficEnabled.get -> bool +Microsoft.Maui.Controls.Maps.Map.IsTrafficEnabled.set -> void +Microsoft.Maui.Controls.Maps.Map.IsZoomEnabled.get -> bool +Microsoft.Maui.Controls.Maps.Map.IsZoomEnabled.set -> void +Microsoft.Maui.Controls.Maps.Map.ItemsSource.get -> System.Collections.IEnumerable! +Microsoft.Maui.Controls.Maps.Map.ItemsSource.set -> void +Microsoft.Maui.Controls.Maps.Map.ItemTemplate.get -> Microsoft.Maui.Controls.DataTemplate! +Microsoft.Maui.Controls.Maps.Map.ItemTemplate.set -> void +Microsoft.Maui.Controls.Maps.Map.ItemTemplateSelector.get -> Microsoft.Maui.Controls.DataTemplateSelector! +Microsoft.Maui.Controls.Maps.Map.ItemTemplateSelector.set -> void +Microsoft.Maui.Controls.Maps.Map.Map() -> void +Microsoft.Maui.Controls.Maps.Map.Map(Microsoft.Maui.Maps.MapSpan! region) -> void +Microsoft.Maui.Controls.Maps.Map.MapClicked -> System.EventHandler? +Microsoft.Maui.Controls.Maps.Map.MapElements.get -> System.Collections.Generic.IList! +Microsoft.Maui.Controls.Maps.Map.MapType.get -> Microsoft.Maui.Maps.MapType +Microsoft.Maui.Controls.Maps.Map.MapType.set -> void +Microsoft.Maui.Controls.Maps.Map.MoveToRegion(Microsoft.Maui.Maps.MapSpan! mapSpan) -> void +Microsoft.Maui.Controls.Maps.Map.Pins.get -> System.Collections.Generic.IList! +Microsoft.Maui.Controls.Maps.Map.VisibleRegion.get -> Microsoft.Maui.Maps.MapSpan? +Microsoft.Maui.Controls.Maps.MapClickedEventArgs +Microsoft.Maui.Controls.Maps.MapClickedEventArgs.Location.get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Controls.Maps.MapClickedEventArgs.MapClickedEventArgs(Microsoft.Maui.Devices.Sensors.Location! location) -> void +Microsoft.Maui.Controls.Maps.MapElement +Microsoft.Maui.Controls.Maps.MapElement.MapElement() -> void +Microsoft.Maui.Controls.Maps.MapElement.MapElementId.get -> object? +Microsoft.Maui.Controls.Maps.MapElement.MapElementId.set -> void +Microsoft.Maui.Controls.Maps.MapElement.StrokeColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.Controls.Maps.MapElement.StrokeColor.set -> void +Microsoft.Maui.Controls.Maps.MapElement.StrokeWidth.get -> float +Microsoft.Maui.Controls.Maps.MapElement.StrokeWidth.set -> void +Microsoft.Maui.Controls.Maps.Pin +Microsoft.Maui.Controls.Maps.Pin.Address.get -> string! +Microsoft.Maui.Controls.Maps.Pin.Address.set -> void +Microsoft.Maui.Controls.Maps.Pin.InfoWindowClicked -> System.EventHandler? +Microsoft.Maui.Controls.Maps.Pin.Label.get -> string! +Microsoft.Maui.Controls.Maps.Pin.Label.set -> void +Microsoft.Maui.Controls.Maps.Pin.Location.get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Controls.Maps.Pin.Location.set -> void +Microsoft.Maui.Controls.Maps.Pin.MarkerClicked -> System.EventHandler? +Microsoft.Maui.Controls.Maps.Pin.MarkerId.get -> object? +Microsoft.Maui.Controls.Maps.Pin.MarkerId.set -> void +Microsoft.Maui.Controls.Maps.Pin.Pin() -> void +Microsoft.Maui.Controls.Maps.Pin.SendInfoWindowClick() -> bool +Microsoft.Maui.Controls.Maps.Pin.SendMarkerClick() -> bool +Microsoft.Maui.Controls.Maps.Pin.Type.get -> Microsoft.Maui.Controls.Maps.PinType +Microsoft.Maui.Controls.Maps.Pin.Type.set -> void +Microsoft.Maui.Controls.Maps.PinClickedEventArgs +Microsoft.Maui.Controls.Maps.PinClickedEventArgs.HideInfoWindow.get -> bool +Microsoft.Maui.Controls.Maps.PinClickedEventArgs.HideInfoWindow.set -> void +Microsoft.Maui.Controls.Maps.PinClickedEventArgs.PinClickedEventArgs() -> void +Microsoft.Maui.Controls.Maps.PinType +Microsoft.Maui.Controls.Maps.PinType.Generic = 0 -> Microsoft.Maui.Controls.Maps.PinType +Microsoft.Maui.Controls.Maps.PinType.Place = 1 -> Microsoft.Maui.Controls.Maps.PinType +Microsoft.Maui.Controls.Maps.PinType.SavedPin = 2 -> Microsoft.Maui.Controls.Maps.PinType +Microsoft.Maui.Controls.Maps.PinType.SearchResult = 3 -> Microsoft.Maui.Controls.Maps.PinType +Microsoft.Maui.Controls.Maps.Polygon +Microsoft.Maui.Controls.Maps.Polygon.Add(Microsoft.Maui.Devices.Sensors.Location! item) -> void +Microsoft.Maui.Controls.Maps.Polygon.Clear() -> void +Microsoft.Maui.Controls.Maps.Polygon.Contains(Microsoft.Maui.Devices.Sensors.Location! item) -> bool +Microsoft.Maui.Controls.Maps.Polygon.CopyTo(Microsoft.Maui.Devices.Sensors.Location![]! array, int arrayIndex) -> void +Microsoft.Maui.Controls.Maps.Polygon.Count.get -> int +Microsoft.Maui.Controls.Maps.Polygon.Fill.get -> Microsoft.Maui.Graphics.Paint? +Microsoft.Maui.Controls.Maps.Polygon.FillColor.get -> Microsoft.Maui.Graphics.Color! +Microsoft.Maui.Controls.Maps.Polygon.FillColor.set -> void +Microsoft.Maui.Controls.Maps.Polygon.Geopath.get -> System.Collections.Generic.IList! +Microsoft.Maui.Controls.Maps.Polygon.GetEnumerator() -> System.Collections.Generic.IEnumerator! +Microsoft.Maui.Controls.Maps.Polygon.IndexOf(Microsoft.Maui.Devices.Sensors.Location! item) -> int +Microsoft.Maui.Controls.Maps.Polygon.Insert(int index, Microsoft.Maui.Devices.Sensors.Location! item) -> void +Microsoft.Maui.Controls.Maps.Polygon.IsReadOnly.get -> bool +Microsoft.Maui.Controls.Maps.Polygon.Polygon() -> void +Microsoft.Maui.Controls.Maps.Polygon.Remove(Microsoft.Maui.Devices.Sensors.Location! item) -> bool +Microsoft.Maui.Controls.Maps.Polygon.RemoveAt(int index) -> void +Microsoft.Maui.Controls.Maps.Polygon.this[int index].get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Controls.Maps.Polygon.this[int index].set -> void +Microsoft.Maui.Controls.Maps.Polyline +Microsoft.Maui.Controls.Maps.Polyline.Add(Microsoft.Maui.Devices.Sensors.Location! item) -> void +Microsoft.Maui.Controls.Maps.Polyline.Clear() -> void +Microsoft.Maui.Controls.Maps.Polyline.Contains(Microsoft.Maui.Devices.Sensors.Location! item) -> bool +Microsoft.Maui.Controls.Maps.Polyline.CopyTo(Microsoft.Maui.Devices.Sensors.Location![]! array, int arrayIndex) -> void +Microsoft.Maui.Controls.Maps.Polyline.Count.get -> int +Microsoft.Maui.Controls.Maps.Polyline.Geopath.get -> System.Collections.Generic.IList! +Microsoft.Maui.Controls.Maps.Polyline.GetEnumerator() -> System.Collections.Generic.IEnumerator! +Microsoft.Maui.Controls.Maps.Polyline.IndexOf(Microsoft.Maui.Devices.Sensors.Location! item) -> int +Microsoft.Maui.Controls.Maps.Polyline.Insert(int index, Microsoft.Maui.Devices.Sensors.Location! item) -> void +Microsoft.Maui.Controls.Maps.Polyline.IsReadOnly.get -> bool +Microsoft.Maui.Controls.Maps.Polyline.Polyline() -> void +Microsoft.Maui.Controls.Maps.Polyline.Remove(Microsoft.Maui.Devices.Sensors.Location! item) -> bool +Microsoft.Maui.Controls.Maps.Polyline.RemoveAt(int index) -> void +Microsoft.Maui.Controls.Maps.Polyline.this[int index].get -> Microsoft.Maui.Devices.Sensors.Location! +Microsoft.Maui.Controls.Maps.Polyline.this[int index].set -> void +override Microsoft.Maui.Controls.Maps.Map.OnHandlerChanged() -> void +override Microsoft.Maui.Controls.Maps.Pin.Equals(object? obj) -> bool +override Microsoft.Maui.Controls.Maps.Pin.GetHashCode() -> int +static Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions.AddMauiMaps(this Microsoft.Maui.Hosting.IMauiHandlersCollection! handlersCollection) -> Microsoft.Maui.Hosting.IMauiHandlersCollection! +static Microsoft.Maui.Controls.Hosting.AppHostBuilderExtensions.UseMauiMaps(this Microsoft.Maui.Hosting.MauiAppBuilder! builder) -> Microsoft.Maui.Hosting.MauiAppBuilder! +static Microsoft.Maui.Controls.Maps.Pin.operator !=(Microsoft.Maui.Controls.Maps.Pin? left, Microsoft.Maui.Controls.Maps.Pin? right) -> bool +static Microsoft.Maui.Controls.Maps.Pin.operator ==(Microsoft.Maui.Controls.Maps.Pin? left, Microsoft.Maui.Controls.Maps.Pin? right) -> bool +static readonly Microsoft.Maui.Controls.Maps.Circle.CenterProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Circle.FillColorProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Circle.RadiusProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.IsScrollEnabledProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.IsShowingUserProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.IsTrafficEnabledProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.IsZoomEnabledProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.ItemsSourceProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.ItemTemplateProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.ItemTemplateSelectorProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Map.MapTypeProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.MapElement.StrokeColorProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.MapElement.StrokeWidthProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Pin.AddressProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Pin.LabelProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Pin.LocationProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Pin.TypeProperty -> Microsoft.Maui.Controls.BindableProperty! +static readonly Microsoft.Maui.Controls.Maps.Polygon.FillColorProperty -> Microsoft.Maui.Controls.BindableProperty! diff --git a/src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..7dc5c58110bf --- /dev/null +++ b/src/Controls/Maps/src/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable From 63dbfc45fc67d0b1e72723fe1119318a568a9ce1 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 14:47:56 +0100 Subject: [PATCH 236/425] Core.csproj: LayoutHandler.Gtk: fix MapBackground --- src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 70b538560392..c1874776a530 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -116,15 +116,14 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra #endif [MissingMapper] - public void UpdateZIndex(IView view) + public void UpdateZIndex(IView view) { } - [MissingMapper] public static partial void MapBackground(ILayoutHandler handler, ILayout layout) { - + handler.PlatformView?.UpdateBackground(layout); } } } \ No newline at end of file From 4b65b89c2d7978552bb81d14d14dba66609cc000 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 21:28:18 +0100 Subject: [PATCH 237/425] Directory.Build.Override.props: include android, otherwise build fails with rider --- Directory.Build.Override.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.Override.props b/Directory.Build.Override.props index 7838ede89737..3ec3a76eb25b 100644 --- a/Directory.Build.Override.props +++ b/Directory.Build.Override.props @@ -7,7 +7,7 @@ <_IncludeWindows> <_IncludeTizen> <_IncludeGtk>true - <_IncludeAndroid> + <_IncludeAndroid>true <_IncludeIos> <_IncludeMacCatalyst> <_IncludeMacOS> From 3f907e9c0250a4de74e5a93b975e20ad1ce45a22 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 22 Sep 2023 00:50:24 +0200 Subject: [PATCH 238/425] Essentials.csproj: AppActions.Gtk.cs, AppActions.Gtk.cs, FileSystem.Gtk.cs: add some implementations --- .../src/AppActions/AppActions.Gtk.cs | 10 +++- src/Essentials/src/AppInfo/AppInfo.Gtk.cs | 51 +++++++++++++++- .../src/FileSystem/FileSystem.Gtk.cs | 60 +++++++++++++++++-- 3 files changed, 112 insertions(+), 9 deletions(-) diff --git a/src/Essentials/src/AppActions/AppActions.Gtk.cs b/src/Essentials/src/AppActions/AppActions.Gtk.cs index 11b8b48a38b7..842917df0028 100644 --- a/src/Essentials/src/AppActions/AppActions.Gtk.cs +++ b/src/Essentials/src/AppActions/AppActions.Gtk.cs @@ -4,18 +4,22 @@ namespace Microsoft.Maui.ApplicationModel { + + /// partial class AppActionsImplementation : IAppActions { + public bool IsSupported => false; - public Task> GetAsync() => - throw ExceptionUtils.NotSupportedOrImplementedException; + public Task> GetAsync() => Task.FromResult>(null); public Task SetAsync(IEnumerable actions) => - throw ExceptionUtils.NotSupportedOrImplementedException; + Task.CompletedTask; #pragma warning disable CS0067 // The event is never used public event EventHandler AppActionActivated; #pragma warning restore CS0067 // The event is never used + } + } \ No newline at end of file diff --git a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs index abc5b997fe74..579c4449735b 100644 --- a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs +++ b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs @@ -1,8 +1,16 @@ +using System; +using System.Reflection; + namespace Microsoft.Maui.ApplicationModel { + + /// class AppInfoImplementation : IAppInfo { - public string PackageName => throw ExceptionUtils.NotSupportedOrImplementedException; + + static readonly Assembly _launchingAssembly = Assembly.GetEntryAssembly(); + + public string PackageName => _launchingAssembly.GetAppInfoValue("PackageName") ?? _launchingAssembly.GetCustomAttribute()?.Title ?? string.Empty; public string Name => throw ExceptionUtils.NotSupportedOrImplementedException; @@ -16,9 +24,48 @@ class AppInfoImplementation : IAppInfo public AppTheme RequestedTheme => AppTheme.Unspecified; - public AppPackagingModel PackagingModel => throw ExceptionUtils.NotSupportedOrImplementedException; + public AppPackagingModel PackagingModel => AppPackagingModel.Unpackaged; // Returning the Unknown value for LayoutDirection so that unit tests can work public LayoutDirection RequestedLayoutDirection => LayoutDirection.Unknown; + + internal static string PublisherName => _launchingAssembly.GetAppInfoValue("PublisherName") ?? _launchingAssembly.GetCustomAttribute()?.Company ?? string.Empty; + } + + static class AppInfoUtils + { + + static readonly Lazy _isPackagedAppLazy = new Lazy(() => + { + + return false; + }); + + public static bool IsPackagedApp => _isPackagedAppLazy.Value; + + public static Version GetAppInfoVersionValue(this Assembly assembly, string name) + { + if (assembly.GetAppInfoValue(name) is string value && !string.IsNullOrEmpty(value)) + return Version.Parse(value); + + return null; + } + + public static string GetAppInfoValue(this Assembly assembly, string name) => + assembly.GetMetadataAttributeValue("Microsoft.Maui.ApplicationModel.AppInfo." + name); + + public static string GetMetadataAttributeValue(this Assembly assembly, string key) + { + foreach (var attr in assembly.GetCustomAttributes()) + { + if (attr.Key == key) + return attr.Value; + } + + return null; + } + + } + } \ No newline at end of file diff --git a/src/Essentials/src/FileSystem/FileSystem.Gtk.cs b/src/Essentials/src/FileSystem/FileSystem.Gtk.cs index 9d1a5f184dcc..1ba5a169b1eb 100644 --- a/src/Essentials/src/FileSystem/FileSystem.Gtk.cs +++ b/src/Essentials/src/FileSystem/FileSystem.Gtk.cs @@ -1,26 +1,76 @@ +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Maui.ApplicationModel; namespace Microsoft.Maui.Storage { + partial class FileSystemImplementation : IFileSystem { + + static string CleanPath(string path) => + string.Join("_", path.Split(Path.GetInvalidFileNameChars())); + + static string AppSpecificPath => + Path.Combine(CleanPath(AppInfoImplementation.PublisherName), CleanPath(AppInfo.PackageName)); + string PlatformCacheDirectory - => throw ExceptionUtils.NotSupportedOrImplementedException; + => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AppSpecificPath, "Cache"); string PlatformAppDataDirectory - => throw ExceptionUtils.NotSupportedOrImplementedException; + => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), AppSpecificPath, "Data"); Task PlatformOpenAppPackageFileAsync(string filename) - => throw ExceptionUtils.NotSupportedOrImplementedException; + { + if (filename == null) + throw new ArgumentNullException(nameof(filename)); + + var file = FileSystemUtils.PlatformGetFullAppPackageFilePath(filename); + + return Task.FromResult((Stream)File.OpenRead(file)); + + } Task PlatformAppPackageFileExistsAsync(string filename) - => throw ExceptionUtils.NotSupportedOrImplementedException; + { + var file = FileSystemUtils.PlatformGetFullAppPackageFilePath(filename); + + return Task.FromResult(File.Exists(file)); + } + } + static partial class FileSystemUtils + { + + public static bool AppPackageFileExists(string filename) + { + var file = PlatformGetFullAppPackageFilePath(filename); + + return File.Exists(file); + } + + public static string PlatformGetFullAppPackageFilePath(string filename) + { + if (filename == null) + throw new ArgumentNullException(nameof(filename)); + + filename = NormalizePath(filename); + + string root; + + root = AppContext.BaseDirectory; + + return Path.Combine(root, filename); + } + + } + + /// public partial class FileBase { + static string PlatformGetContentType(string extension) => throw ExceptionUtils.NotSupportedOrImplementedException; @@ -32,5 +82,7 @@ internal virtual Task PlatformOpenReadAsync() void PlatformInit(FileBase file) => throw ExceptionUtils.NotSupportedOrImplementedException; + } + } \ No newline at end of file From 6497b7094945d1cc75ca4bc098a9f63896659386 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 23:12:15 +0100 Subject: [PATCH 239/425] Essentials.csproj: AppInfo.Gtk.cs: add some implementations --- src/Essentials/src/AppInfo/AppInfo.Gtk.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs index 579c4449735b..422011b3b19a 100644 --- a/src/Essentials/src/AppInfo/AppInfo.Gtk.cs +++ b/src/Essentials/src/AppInfo/AppInfo.Gtk.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Reflection; namespace Microsoft.Maui.ApplicationModel @@ -12,13 +13,13 @@ class AppInfoImplementation : IAppInfo public string PackageName => _launchingAssembly.GetAppInfoValue("PackageName") ?? _launchingAssembly.GetCustomAttribute()?.Title ?? string.Empty; - public string Name => throw ExceptionUtils.NotSupportedOrImplementedException; + public string Name => _launchingAssembly.GetAppInfoValue("Name") ?? _launchingAssembly.GetCustomAttribute()?.Title ?? string.Empty; - public System.Version Version => Utils.ParseVersion(VersionString); + public System.Version Version => _launchingAssembly.GetAppInfoVersionValue("Version") ?? _launchingAssembly.GetName().Version; - public string VersionString => throw ExceptionUtils.NotSupportedOrImplementedException; + public string VersionString => Version?.ToString() ?? string.Empty; - public string BuildString => throw ExceptionUtils.NotSupportedOrImplementedException; + public string BuildString => Version.Revision.ToString(CultureInfo.InvariantCulture); public void ShowSettingsUI() => throw ExceptionUtils.NotSupportedOrImplementedException; From ebdf10fed1f8bd9120c816d246fead563355fcb2 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 23:13:14 +0100 Subject: [PATCH 240/425] [Gtk] Compatibility.csproj:introduce PlatformSizeService, FontNamedSizeService --- .../Compatibility/Gtk/FontNamedSizeService.cs | 40 +++++++++++++++++++ .../Compatibility/Gtk/PlatformSizeService.cs | 21 ++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/Controls/src/Core/Compatibility/Gtk/FontNamedSizeService.cs create mode 100644 src/Controls/src/Core/Compatibility/Gtk/PlatformSizeService.cs diff --git a/src/Controls/src/Core/Compatibility/Gtk/FontNamedSizeService.cs b/src/Controls/src/Core/Compatibility/Gtk/FontNamedSizeService.cs new file mode 100644 index 000000000000..8dd8b0c4402a --- /dev/null +++ b/src/Controls/src/Core/Compatibility/Gtk/FontNamedSizeService.cs @@ -0,0 +1,40 @@ +using System; +using Microsoft.Maui.Controls.Internals; + +#pragma warning disable CS0612 // Type or member is obsolete +[assembly: Microsoft.Maui.Controls.Dependency(typeof(Microsoft.Maui.Controls.Compatibility.Platform.Gtk.FontNamedSizeService))] + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + class FontNamedSizeService : IFontNamedSizeService + { + public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSizes) + { + switch (size) + { + case NamedSize.Default: + return 11; + case NamedSize.Micro: + case NamedSize.Caption: + return 12; + case NamedSize.Medium: + return 17; + case NamedSize.Large: + return 22; + case NamedSize.Small: + case NamedSize.Body: + return 14; + case NamedSize.Header: + return 46; + case NamedSize.Subtitle: + return 20; + case NamedSize.Title: + return 24; + default: + throw new ArgumentOutOfRangeException(nameof(size)); + } + } + } +} + +#pragma warning restore CS0612 // Type or member is obsolete diff --git a/src/Controls/src/Core/Compatibility/Gtk/PlatformSizeService.cs b/src/Controls/src/Core/Compatibility/Gtk/PlatformSizeService.cs new file mode 100644 index 000000000000..9c7ff0ad2cb3 --- /dev/null +++ b/src/Controls/src/Core/Compatibility/Gtk/PlatformSizeService.cs @@ -0,0 +1,21 @@ +#nullable disable +using Microsoft.Maui.Controls.Internals; + +[assembly: Microsoft.Maui.Controls.Dependency(typeof(Microsoft.Maui.Controls.Compatibility.Platform.Gtk.PlatformSizeService))] + +namespace Microsoft.Maui.Controls.Compatibility.Platform.Gtk +{ + class PlatformSizeService : IPlatformSizeService + { + public SizeRequest GetPlatformSize(VisualElement view, double widthConstraint, double heightConstraint) + { + if (widthConstraint > 0 && heightConstraint > 0) + { + return view.Handler?.GetDesiredSize(widthConstraint, heightConstraint) ?? + new SizeRequest(); + } + + return new SizeRequest(); + } + } +} \ No newline at end of file From f9f8d95940230ca511991c776f9fba16330551c4 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 23:27:12 +0100 Subject: [PATCH 241/425] Controls.Xaml.csproj: add Gtk --- src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs b/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs index 9dd5733c06da..169ad4ea1e1f 100644 --- a/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs +++ b/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs @@ -23,6 +23,9 @@ #elif TIZEN using Microsoft.Maui.Controls.Handlers.Compatibility; using Microsoft.Maui.Controls.Compatibility.Platform.Tizen; +#elif GTK +using Microsoft.Maui.Controls.Handlers.Compatibility; +using Microsoft.Maui.Controls.Compatibility.Platform.Gtk; #endif namespace Microsoft.Maui.Controls.Hosting @@ -163,7 +166,7 @@ public static IMauiHandlersCollection AddMauiControlsHandlers(this IMauiHandlers static MauiAppBuilder SetupDefaults(this MauiAppBuilder builder) { -#if WINDOWS || ANDROID || IOS || MACCATALYST || TIZEN +#if WINDOWS || ANDROID || IOS || MACCATALYST || TIZEN || GTK // initialize compatibility DependencyService DependencyService.SetToInitialized(); DependencyService.Register(); From 8a1d9000cbe808d2c324ca222de1c8f7a461ee8c Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 9 Nov 2023 23:59:48 +0100 Subject: [PATCH 242/425] [Gtk] Core.csproj: PageHandler.Gtk: track api changes --- src/Core/src/Handlers/Page/PageHandler.Gtk.cs | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs index 38cb12b2041e..b5b136c35e2e 100644 --- a/src/Core/src/Handlers/Page/PageHandler.Gtk.cs +++ b/src/Core/src/Handlers/Page/PageHandler.Gtk.cs @@ -8,40 +8,6 @@ namespace Microsoft.Maui.Handlers public partial class PageHandler : ContentViewHandler { - public override void SetVirtualView(IView view) - { - base.SetVirtualView(view); - - _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); - _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); - _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); - - PlatformView.CrossPlatformMeasure = VirtualView.Measure; - PlatformView.CrossPlatformArrange = VirtualView.Arrange; - - } - - protected override ContentView CreatePlatformView() - { - if (VirtualView == null) - { - throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a LayoutView"); - } - - var pw = new PageView - { - CrossPlatformMeasure = VirtualView.Measure, - CrossPlatformArrange = VirtualView.Arrange - }; - - return pw; - } - - public static void MapContent(PageHandler handler, IView page) - { - handler.UpdateContent(); - } - [MissingMapper] public static void MapTitle(IPageHandler handler, IContentView page) { } From a80e1f304e1c7e83b6bbb783eb3c0694eca31256 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 00:02:13 +0100 Subject: [PATCH 243/425] [Gtk] Core.csproj: remove PageView.cs --- src/Core/src/Platform/Gtk/PageView.cs | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 src/Core/src/Platform/Gtk/PageView.cs diff --git a/src/Core/src/Platform/Gtk/PageView.cs b/src/Core/src/Platform/Gtk/PageView.cs deleted file mode 100644 index 916f7ad58b31..000000000000 --- a/src/Core/src/Platform/Gtk/PageView.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using Gtk; -using Microsoft.Maui.Graphics; - -namespace Microsoft.Maui.Platform -{ - - public class PageView : ContentView - { } - -} \ No newline at end of file From d12041f8d2df8d9c4e729da56b630f3442285654 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 01:30:28 +0100 Subject: [PATCH 244/425] [Gtk] introduce some Shell-Dummy's --- .../Core/Handlers/Shell/Gtk/ShellItemView.cs | 28 +++ .../Handlers/Shell/ShellItemHandler.Gtk.cs | 120 +++++++++++++ .../Handlers/Shell/ShellSectionHandler.Gtk.cs | 168 ++++++++++++++++++ .../Xaml/Hosting/AppHostBuilderExtensions.cs | 4 +- .../Platform/Gtk/StackNavigationManager.cs | 22 +++ 5 files changed, 340 insertions(+), 2 deletions(-) create mode 100644 src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs create mode 100644 src/Controls/src/Core/Handlers/Shell/ShellItemHandler.Gtk.cs create mode 100644 src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs create mode 100644 src/Core/src/Platform/Gtk/StackNavigationManager.cs diff --git a/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs new file mode 100644 index 000000000000..e6b2fe53a5f7 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs @@ -0,0 +1,28 @@ +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using Microsoft.Maui.Controls.Handlers.Items; +using Gtk; +using Color=Microsoft.Maui.Graphics.Color; + +namespace Microsoft.Maui.Controls.Platform +{ + public class ShellItemView : NotImplementedView + { + public ShellItemView(object view) { } + + [MissingMapper] + public void UpdateTabBar(bool b) { } + + [MissingMapper] + public void UpdateCurrentItem(object current){ } + + [MissingMapper] + public void UpdateBottomTabBarColors(Color tabBarBackgroudColor, Color tabBarTitleColor, Color tabBarUnselectedColor) + { + + } + + } +} diff --git a/src/Controls/src/Core/Handlers/Shell/ShellItemHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellItemHandler.Gtk.cs new file mode 100644 index 000000000000..e127ff7632f4 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shell/ShellItemHandler.Gtk.cs @@ -0,0 +1,120 @@ +using System; +using Microsoft.Maui.Controls.Platform; + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class ShellItemHandler : ElementHandler, IAppearanceObserver, IDisposable + { + bool _disposedValue; + + public static PropertyMapper Mapper = + new PropertyMapper(ElementMapper) + { + [nameof(ShellItem.CurrentItem)] = MapCurrentItem, + [Shell.TabBarIsVisibleProperty.PropertyName] = MapTabBarIsVisible + }; + + public static CommandMapper CommandMapper = + new CommandMapper(ElementCommandMapper); + + public ShellItemHandler() : base(Mapper, CommandMapper) + { + } + + public override void SetVirtualView(IElement view) + { + base.SetVirtualView(view); + (view.FindParentOfType() as IShellController)?.AddAppearanceObserver(this, VirtualView); + } + + protected override ShellItemView CreatePlatformElement() => new ShellItemView(VirtualView); + + protected override void ConnectHandler(ShellItemView platformView) + { + if (VirtualView.Parent is IShellController controller) + { + controller.AddAppearanceObserver(this, VirtualView); + } + base.ConnectHandler(platformView); + } + + protected override void DisconnectHandler(ShellItemView platformView) + { + if (VirtualView.Parent is IShellController controller) + { + controller.RemoveAppearanceObserver(this); + } + base.DisconnectHandler(platformView); + } + + public static void MapTabBarIsVisible(ShellItemHandler handler, ShellItem item) + { + handler.PlatformView.UpdateTabBar(Shell.GetTabBarIsVisible(item)); + } + + public static void MapCurrentItem(ShellItemHandler handler, ShellItem item) + { + handler.UpdateCurrentItem(); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + var platformView = PlatformView; + foreach (var item in VirtualView.Items) + { + if (item.Handler is IDisposable thandler) + { + thandler.Dispose(); + } + } + + (VirtualView.FindParentOfType() as IShellController)?.RemoveAppearanceObserver(this); + + (this as IElementHandler)?.DisconnectHandler(); + platformView?.Dispose(); + } + + _disposedValue = true; + } + } + + void UpdateCurrentItem() + { + PlatformView.UpdateCurrentItem(VirtualView.CurrentItem); + } + + void IAppearanceObserver.OnAppearanceChanged(ShellAppearance appearance) + { + if (appearance != null) + { + // var shellView = VirtualView?.FindParentOfType()?.Handler?.PlatformView as ShellView; + // shellView?.UpdateToolbarColors(appearance.ForegroundColor, appearance.BackgroundColor, appearance.TitleColor); + } + + if (appearance is IShellAppearanceElement shellAppearance) + { + var tabBarBackgroudColor = shellAppearance.EffectiveTabBarBackgroundColor; + var tabBarTitleColor = shellAppearance.EffectiveTabBarTitleColor; + var tabBarUnselectedColor = shellAppearance.EffectiveTabBarUnselectedColor; + + PlatformView?.UpdateBottomTabBarColors(tabBarBackgroudColor, tabBarTitleColor, tabBarUnselectedColor); + } + } + + [MissingMapper] + public void UpdateTitle() + { + } + + } +} diff --git a/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs new file mode 100644 index 000000000000..ba10051cb58c --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Maui.Controls.Internals; +using WFrame = Microsoft.Maui.Platform.NotImplementedView; + + +namespace Microsoft.Maui.Controls.Handlers +{ + public partial class ShellSectionHandler : ElementHandler, IAppearanceObserver + { + public static PropertyMapper Mapper = + new PropertyMapper(ElementMapper) + { + [nameof(ShellSection.Title)] = MapTitle, + [nameof(ShellSection.CurrentItem)] = MapCurrentItem, + }; + + public static CommandMapper CommandMapper = + new CommandMapper(ElementCommandMapper) + { + + [nameof(IStackNavigation.RequestNavigation)] = RequestNavigation + }; + + StackNavigationManager? _navigationManager; + WeakReference? _lastShell; + + public ShellSectionHandler() : base(Mapper, CommandMapper) + { + } + + protected override WFrame CreatePlatformElement() + { + _navigationManager = CreateNavigationManager(); + return new WFrame(); + } + public static void MapTitle(ShellSectionHandler handler, ShellSection item) + { + var shellItem = item.Parent as ShellItem; + var shellItemHandler = shellItem?.Handler as ShellItemHandler; + shellItemHandler?.UpdateTitle(); + } + + public static void MapCurrentItem(ShellSectionHandler handler, ShellSection item) + { + handler.SyncNavigationStack(false, null); + } + + ShellSection? _shellSection; + public override void SetVirtualView(Maui.IElement view) + { + if (_shellSection != null) + { + ((IShellSectionController)_shellSection).NavigationRequested -= OnNavigationRequested; + + if (_lastShell?.Target is IShellController shell) + { + shell.RemoveAppearanceObserver(this); + } + _lastShell = null; + } + + // If we've already connected to the navigation manager + // then we need to make sure to disconnect and connect up to + // the new incoming virtual view + if (_navigationManager?.NavigationView != null && + _navigationManager.NavigationView != view) + { + _navigationManager.Disconnect(_navigationManager.NavigationView, PlatformView); + + if (view is IStackNavigation stackNavigation) + { + _navigationManager.Connect(stackNavigation, PlatformView); + } + } + + base.SetVirtualView(view); + + _shellSection = (ShellSection)view; + if (_shellSection != null) + { + ((IShellSectionController)_shellSection).NavigationRequested += OnNavigationRequested; + + var shell = _shellSection.FindParentOfType() as IShellController; + if (shell != null) + { + _lastShell = new WeakReference(shell); + shell.AddAppearanceObserver(this, _shellSection); + } + } + } + + void OnNavigationRequested(object? sender, NavigationRequestedEventArgs e) + { + SyncNavigationStack(e.Animated, e); + } + + void SyncNavigationStack(bool animated, NavigationRequestedEventArgs? e) + { + // Current Item might transition to null while visibility is adjusting on shell + // so we just ignore this and eventually when shell knows + // the next current item it will request to sync again + if (VirtualView.CurrentItem == null || MauiContext is null) + return; + + // This is used to assign the ShellContentHandler to ShellContent + _ = VirtualView.CurrentItem.ToPlatform(MauiContext); + + List pageStack = new List() + { + (VirtualView.CurrentItem as IShellContentController).GetOrCreateContent() + }; + + // PopToRoot in the xplat code fires before the navigation stack has been updated + // Once we get shell all converted over to newer navigation APIs this will all be a bit + // less leaky + if (e?.RequestType != NavigationRequestType.PopToRoot) + { + for (var i = 1; i < VirtualView.Navigation.NavigationStack.Count; i++) + { + pageStack.Add(VirtualView.Navigation.NavigationStack[i]); + } + } + + // The point of this is to push the shell navigation over to using the INavigationStack + // work flow. Ideally we rewrite all the push/pop/etc.. parts inside ShellSection.cs + // to just use INavigationStack but that will be easier once all platforms are using + // ShellHandler + (VirtualView as IStackNavigation) + .RequestNavigation(new NavigationRequest(pageStack, animated)); + } + + // this should move to a factory method + protected virtual StackNavigationManager CreateNavigationManager() => + _navigationManager ??= new StackNavigationManager(); + + protected override void ConnectHandler(WFrame platformView) + { + _navigationManager?.Connect(VirtualView, platformView); + base.ConnectHandler(platformView); + } + + protected override void DisconnectHandler(WFrame platformView) + { + _navigationManager?.Disconnect(VirtualView, platformView); + base.DisconnectHandler(platformView); + } + + public static void RequestNavigation(ShellSectionHandler handler, IStackNavigation view, object? arg3) + { + if (arg3 is NavigationRequest nr) + { + handler._navigationManager?.NavigateTo(nr); + } + else + { + throw new InvalidOperationException("Args must be NavigationRequest"); + } + } + + void IAppearanceObserver.OnAppearanceChanged(ShellAppearance appearance) + { + // I realize this is empty but it's necessary to register the active section as + // an appearance observer so that shell fires appearance changes when shell section changes + } + } +} diff --git a/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs b/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs index 169ad4ea1e1f..6a3632a04cfb 100644 --- a/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs +++ b/src/Controls/src/Xaml/Hosting/AppHostBuilderExtensions.cs @@ -138,7 +138,7 @@ public static IMauiHandlersCollection AddMauiControlsHandlers(this IMauiHandlers handlersCollection.AddHandler(typeof(FlyoutPage), typeof(Handlers.Compatibility.PhoneFlyoutPageRenderer)); #endif -#if ANDROID || IOS || MACCATALYST || TIZEN +#if ANDROID || IOS || MACCATALYST || TIZEN || GTK handlersCollection.AddHandler(); #if ANDROID || IOS || MACCATALYST handlersCollection.AddHandler(); @@ -148,7 +148,7 @@ public static IMauiHandlersCollection AddMauiControlsHandlers(this IMauiHandlers handlersCollection.AddHandler(); #endif #endif -#if WINDOWS || ANDROID || TIZEN +#if WINDOWS || ANDROID || TIZEN || GTK handlersCollection.AddHandler(); handlersCollection.AddHandler(); handlersCollection.AddHandler(); diff --git a/src/Core/src/Platform/Gtk/StackNavigationManager.cs b/src/Core/src/Platform/Gtk/StackNavigationManager.cs new file mode 100644 index 000000000000..2c9e24d6edbe --- /dev/null +++ b/src/Core/src/Platform/Gtk/StackNavigationManager.cs @@ -0,0 +1,22 @@ +namespace Microsoft.Maui.Platform; + +public class StackNavigationManager +{ + + public StackNavigationManager() { } + + public IStackNavigation? NavigationView { get; set; } + + [MissingMapper] + public void Connect(IStackNavigation virtualView, Gtk.Widget platformView) + { } + + [MissingMapper] + public void Disconnect(IStackNavigation virtualView, Gtk.Widget platformView) + { } + + [MissingMapper] + public void NavigateTo(NavigationRequest nr) + { } + +} \ No newline at end of file From 9ac15cc2069fcca74b6b34dc882ff94327ed7c4c Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 01:48:21 +0100 Subject: [PATCH 245/425] [Gtk] Core.csproj: TabbedViewHandler: use NotImplementedView --- src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs b/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs index fae839673ad3..915ca978d24f 100644 --- a/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs +++ b/src/Core/src/Handlers/TabbedView/TabbedViewHandler.cs @@ -10,7 +10,7 @@ #elif TIZEN using PlatformView = Tizen.NUI.BaseComponents.View; #elif GTK -using PlatformView = Gtk.Widget; +using PlatformView = Microsoft.Maui.Platform.NotImplementedView; #elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID && !TIZEN) using PlatformView = System.Object; #endif From d6300e2d142a5f06c2ea851bf12e8b7a6f40ad65 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 03:01:01 +0100 Subject: [PATCH 246/425] [Gtk] Core.csproj: NotImplementedView: introduce DisplayName --- .../Core/Handlers/Shell/Gtk/ShellItemView.cs | 2 +- .../Core/Handlers/Shell/ShellHandler.Gtk.cs | 2 +- .../Handlers/Shell/ShellSectionHandler.Gtk.cs | 2 +- .../maps/src/Handlers/Map/MapHandler.Gtk.cs | 2 +- .../src/Handlers/Border/BorderHandler.Gtk.cs | 2 +- .../FlyoutView/FlyoutViewHandler.Gtk.cs | 2 +- .../IndicatorView/IndicatorViewHandler.Gtk.cs | 2 +- .../Handlers/MenuBar/MenuBarHandler.Gtk.cs | 2 +- .../MenuBarItem/MenuBarItemHandler.Gtk.cs | 2 +- .../RadioButton/RadioButtonHandler.Gtk.cs | 2 +- .../SwipeItemMenuItemHandler.Gtk.cs | 2 +- .../SwipeItemView/SwipeItemViewHandler.Gtk.cs | 2 +- .../SwipeView/SwipeViewHandler.Gtk.cs | 2 +- .../Handlers/Toolbar/ToolbarHandler.Gtk.cs | 2 +- .../Handlers/WebView/WebViewHandler.Gtk.cs | 2 +- src/Core/src/Platform/Gtk/NavigationView.cs | 4 +- .../src/Platform/Gtk/NotImplementedView.cs | 51 +++++++++++++++++-- src/Core/src/Platform/Gtk/RefreshView.cs | 4 +- 18 files changed, 65 insertions(+), 24 deletions(-) diff --git a/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs index e6b2fe53a5f7..5a2439142373 100644 --- a/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs +++ b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs @@ -10,7 +10,7 @@ namespace Microsoft.Maui.Controls.Platform { public class ShellItemView : NotImplementedView { - public ShellItemView(object view) { } + public ShellItemView(object view):base(nameof(ShellItemView)) { } [MissingMapper] public void UpdateTabBar(bool b) { } diff --git a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs index 92c23cade5d8..ade835960a04 100644 --- a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs @@ -22,7 +22,7 @@ public ShellHandler() : base(Mapper, CommandMapper) protected override Gtk.Widget CreatePlatformView() { - throw new NotImplementedException(); + return new NotImplementedView(nameof(Shell)); } } diff --git a/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs index ba10051cb58c..183cc71db6ff 100644 --- a/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs @@ -33,7 +33,7 @@ public ShellSectionHandler() : base(Mapper, CommandMapper) protected override WFrame CreatePlatformElement() { _navigationManager = CreateNavigationManager(); - return new WFrame(); + return new WFrame(nameof(ShellSection)); } public static void MapTitle(ShellSectionHandler handler, ShellSection item) { diff --git a/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs b/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs index a8dfd190a90f..ff26081bda8c 100644 --- a/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs +++ b/src/Core/maps/src/Handlers/Map/MapHandler.Gtk.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui.Maps.Handlers public partial class MapHandler : ViewHandler { - protected override NotImplementedView CreatePlatformView() => new (); + protected override NotImplementedView CreatePlatformView() => new (nameof(IMap)); public static void MapMapType(IMapHandler handler, IMap map) => throw new NotImplementedException(); diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs index ab6e22717a98..14539cb63863 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers public partial class BorderHandler : ViewHandler { [MissingMapper] - protected override NotImplementedView CreatePlatformView() => new(); + protected override NotImplementedView CreatePlatformView() => new(nameof(IBorderView)); } } diff --git a/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs b/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs index 582b85476d61..89decba47c72 100644 --- a/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Gtk.cs @@ -4,6 +4,6 @@ namespace Microsoft.Maui.Handlers { public partial class FlyoutViewHandler : ViewHandler { - protected override NotImplementedView CreatePlatformView() => new(); + protected override NotImplementedView CreatePlatformView() => new(nameof(IFlyoutView)); } } \ No newline at end of file diff --git a/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs index b31ed569ee21..8874acb6e050 100644 --- a/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/IndicatorView/IndicatorViewHandler.Gtk.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.Handlers [MissingMapper] public partial class IndicatorViewHandler : ViewHandler { - protected override NotImplementedView CreatePlatformView() => new(); + protected override NotImplementedView CreatePlatformView() => new(nameof(IIndicatorView)); public static void MapCount(IIndicatorViewHandler handler, IIndicatorView indicator) { } public static void MapPosition(IIndicatorViewHandler handler, IIndicatorView indicator) { } diff --git a/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs b/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs index 4e18f75e1dbb..9a4aaa6c0bb9 100644 --- a/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs +++ b/src/Core/src/Handlers/MenuBar/MenuBarHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class MenuBarHandler : ElementHandler, IMenuBarHandler { - protected override NotImplementedView CreatePlatformElement() => new(); + protected override NotImplementedView CreatePlatformElement() => new(nameof(IMenuBar)); public void Add(IMenuBarItem view) { diff --git a/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs index e10d6cae45d5..3606b185b07c 100644 --- a/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs +++ b/src/Core/src/Handlers/MenuBarItem/MenuBarItemHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class MenuBarItemHandler : ElementHandler, IMenuBarItemHandler { - protected override NotImplementedView CreatePlatformElement() => new(); + protected override NotImplementedView CreatePlatformElement() => new(nameof(IMenuBarItem)); public void Add(IMenuElement view) { diff --git a/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs index 5d2d303d4594..5117600c9dff 100644 --- a/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs +++ b/src/Core/src/Handlers/RadioButton/RadioButtonHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class RadioButtonHandler : ViewHandler { - protected override NotImplementedView CreatePlatformView() => new(); + protected override NotImplementedView CreatePlatformView() => new(nameof(IRadioButton)); public static void MapBackground(IRadioButtonHandler handler, IRadioButton radioButton) { } public static void MapIsChecked(IRadioButtonHandler handler, IRadioButton radioButton) { } diff --git a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs index 2869cf3059f4..634c6ea80dc9 100644 --- a/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Gtk.cs @@ -6,7 +6,7 @@ namespace Microsoft.Maui.Handlers { public partial class SwipeItemMenuItemHandler : ElementHandler { - protected override NotImplementedView CreatePlatformElement() => new(); + protected override NotImplementedView CreatePlatformElement() => new(nameof(ISwipeItemMenuItem)); public static void MapTextColor(ISwipeItemMenuItemHandler handler, ITextStyle view) { } diff --git a/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs index dfe8d39b1043..b96f429e4cea 100644 --- a/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeItemView/SwipeItemViewHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class SwipeItemViewHandler : ViewHandler, ISwipeItemViewHandler { - protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(); + protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(nameof(ISwipeItemView)); public static void MapContent(ISwipeItemViewHandler handler, ISwipeItemView page) { diff --git a/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs index 28eea34945b7..f71f697d993c 100644 --- a/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/SwipeView/SwipeViewHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class SwipeViewHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(); + protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(nameof(ISwipeView)); public static void MapContent(ISwipeViewHandler handler, ISwipeView view) { diff --git a/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs b/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs index a4458caed1ed..1b9c91340686 100644 --- a/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs +++ b/src/Core/src/Handlers/Toolbar/ToolbarHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class ToolbarHandler : ElementHandler { - protected override Gtk.Widget CreatePlatformElement() => new NotImplementedView(); + protected override Gtk.Widget CreatePlatformElement() => new NotImplementedView(nameof(IToolbar)); public static void MapTitle(IToolbarHandler arg1, IToolbar arg2) { diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs index 5be4cf64d5ac..4acbfa91a7f4 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.Gtk.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.Handlers { public partial class WebViewHandler : ViewHandler { - protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(); + protected override Gtk.Widget CreatePlatformView() => new NotImplementedView(nameof(IWebView)); public static void MapSource(IWebViewHandler handler, IWebView webView) { } public static void MapGoBack(IWebViewHandler handler, IWebView webView, object? arg) { } diff --git a/src/Core/src/Platform/Gtk/NavigationView.cs b/src/Core/src/Platform/Gtk/NavigationView.cs index 1f4792297d41..4d7358ea1d0a 100644 --- a/src/Core/src/Platform/Gtk/NavigationView.cs +++ b/src/Core/src/Platform/Gtk/NavigationView.cs @@ -1,10 +1,10 @@ namespace Microsoft.Maui.Platform { - public class NavigationView : Gtk.Box + public class NavigationView : NotImplementedView { - public NavigationView() : base(Gtk.Orientation.Horizontal, 0) { } + public NavigationView() : base(nameof(NavigationView)) { } } diff --git a/src/Core/src/Platform/Gtk/NotImplementedView.cs b/src/Core/src/Platform/Gtk/NotImplementedView.cs index 74173d0179d0..c852197bd0d5 100644 --- a/src/Core/src/Platform/Gtk/NotImplementedView.cs +++ b/src/Core/src/Platform/Gtk/NotImplementedView.cs @@ -1,9 +1,50 @@ using System; +using Cairo; +using Microsoft.Maui.Graphics.Platform.Gtk; + namespace Microsoft.Maui.Platform { -/// -/// dummy widget to mark handler as not implemented -/// but avoid -/// - public class NotImplementedView : Gtk.Widget { } + + /// + /// dummy widget to mark handler as not implemented + /// but avoid + /// + public class NotImplementedView : Gtk.EventBox + { + + protected NotImplementedView() { } + + public NotImplementedView(string name):this() + { + DisplayName = name; + + Drawn += (o, args) => + { + var cr = args.Cr; + + if (DisplayName is not { }) + return; + + var stc = this.StyleContext; + stc.RenderBackground(cr, 0, 0, Allocation.Width, Allocation.Height); + + var r = base.OnDrawn(cr); + + cr.Save(); + cr.SetSourceColor(Graphics.Colors.Red.ToCairoColor()); + cr.Rectangle(0, 0, Allocation.Width, Allocation.Height); + cr.Stroke(); + + cr.MoveTo(0, Allocation.Height - 12); + cr.ShowText(DisplayName); + cr.Restore(); + }; + } + + public string? DisplayName { get; } + + + + } + } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/RefreshView.cs b/src/Core/src/Platform/Gtk/RefreshView.cs index 6c13eb376391..7d956b86bcd8 100644 --- a/src/Core/src/Platform/Gtk/RefreshView.cs +++ b/src/Core/src/Platform/Gtk/RefreshView.cs @@ -2,10 +2,10 @@ namespace Microsoft.Maui.Platform { [MissingMapper] - public class RefreshView : Gtk.Box + public class RefreshView : NotImplementedView { - public RefreshView() : base(Gtk.Orientation.Horizontal, 0) { } + public RefreshView() : base(nameof(RefreshView)) { } } From 3544d9d48b884920f48674137b47ff1031f6380f Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 20:00:25 +0100 Subject: [PATCH 247/425] [Gtk] Core.csproj: NavigationViewHandler.Gtk.cs: draft a simple NavigationView; has to be extended with navigation --- .../Handlers/Shell/ShellSectionHandler.Gtk.cs | 14 +++---- .../src/Core/NavigationPage/NavigationPage.cs | 2 +- .../NavigationViewHandler.Gtk.cs | 25 ++++++++--- src/Core/src/Platform/Gtk/NavigationView.cs | 27 +++++++++++- .../Platform/Gtk/StackNavigationManager.cs | 42 ++++++++++++++----- 5 files changed, 84 insertions(+), 26 deletions(-) diff --git a/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs index 183cc71db6ff..94f7a5082f05 100644 --- a/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Gtk.cs @@ -2,12 +2,12 @@ using System.Collections.Generic; using System.Text; using Microsoft.Maui.Controls.Internals; -using WFrame = Microsoft.Maui.Platform.NotImplementedView; +using NavigationView = Microsoft.Maui.Platform.NavigationView; namespace Microsoft.Maui.Controls.Handlers { - public partial class ShellSectionHandler : ElementHandler, IAppearanceObserver + public partial class ShellSectionHandler : ElementHandler, IAppearanceObserver { public static PropertyMapper Mapper = new PropertyMapper(ElementMapper) @@ -30,10 +30,10 @@ public ShellSectionHandler() : base(Mapper, CommandMapper) { } - protected override WFrame CreatePlatformElement() + protected override NavigationView CreatePlatformElement() { _navigationManager = CreateNavigationManager(); - return new WFrame(nameof(ShellSection)); + return new NavigationView(); } public static void MapTitle(ShellSectionHandler handler, ShellSection item) { @@ -133,15 +133,15 @@ void SyncNavigationStack(bool animated, NavigationRequestedEventArgs? e) // this should move to a factory method protected virtual StackNavigationManager CreateNavigationManager() => - _navigationManager ??= new StackNavigationManager(); + _navigationManager ??= new StackNavigationManager(MauiContext); - protected override void ConnectHandler(WFrame platformView) + protected override void ConnectHandler(NavigationView platformView) { _navigationManager?.Connect(VirtualView, platformView); base.ConnectHandler(platformView); } - protected override void DisconnectHandler(WFrame platformView) + protected override void DisconnectHandler(NavigationView platformView) { _navigationManager?.Disconnect(VirtualView, platformView); base.DisconnectHandler(platformView); diff --git a/src/Controls/src/Core/NavigationPage/NavigationPage.cs b/src/Controls/src/Core/NavigationPage/NavigationPage.cs index 7dcf97e50b0d..66c649ce1aa0 100644 --- a/src/Controls/src/Core/NavigationPage/NavigationPage.cs +++ b/src/Controls/src/Core/NavigationPage/NavigationPage.cs @@ -56,7 +56,7 @@ public partial class NavigationPage : Page, IPageContainer, IBarElement, I partial void Init(); -#if WINDOWS || ANDROID || TIZEN +#if WINDOWS || ANDROID || TIZEN || GTK const bool UseMauiHandler = true; #else const bool UseMauiHandler = false; diff --git a/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs index c99aef328692..02acc44bbc7c 100644 --- a/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/NavigationPage/NavigationViewHandler.Gtk.cs @@ -11,8 +11,15 @@ namespace Microsoft.Maui.Handlers public partial class NavigationViewHandler : ViewHandler { + StackNavigationManager? _stackNavigationManager; + + StackNavigationManager NavigationManager + => _stackNavigationManager ??= new StackNavigationManager(MauiContext); + protected override NavigationView CreatePlatformView() { + _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + return new(); } @@ -20,22 +27,28 @@ protected override void ConnectHandler(NavigationView nativeView) { base.ConnectHandler(nativeView); - var virtualView = VirtualView; - + NavigationManager.Connect(VirtualView, nativeView); } protected override void DisconnectHandler(NavigationView nativeView) { - base.DisconnectHandler(nativeView); - var virtualView = VirtualView; + NavigationManager.Disconnect(VirtualView, nativeView); + base.DisconnectHandler(nativeView); } - [MissingMapper] - public static void RequestNavigation(INavigationViewHandler arg1, IStackNavigation arg2, object? arg3) + void RequestNavigation(NavigationRequest request) { + NavigationManager.NavigateTo(request); } + + static void RequestNavigation(INavigationViewHandler viewHandler, IStackNavigation navigation, object? request) + { + if (viewHandler is NavigationViewHandler platformHandler && request is NavigationRequest ea) + platformHandler.RequestNavigation(ea); + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/NavigationView.cs b/src/Core/src/Platform/Gtk/NavigationView.cs index 4d7358ea1d0a..1bc23eb93b60 100644 --- a/src/Core/src/Platform/Gtk/NavigationView.cs +++ b/src/Core/src/Platform/Gtk/NavigationView.cs @@ -1,10 +1,33 @@ +using Gtk; + namespace Microsoft.Maui.Platform { - public class NavigationView : NotImplementedView + public class NavigationView : Gtk.Box { - public NavigationView() : base(nameof(NavigationView)) { } + public NavigationView() : base() + { + Orientation = Orientation.Horizontal; + } + + Widget? _content; + + public Widget? Content + { + get => _content; + set + { + _content?.Unparent(); + + _content = value; + + if (_content is { }) + { + PackStart(_content, true, true, 0); + } + } + } } diff --git a/src/Core/src/Platform/Gtk/StackNavigationManager.cs b/src/Core/src/Platform/Gtk/StackNavigationManager.cs index 2c9e24d6edbe..491811f5e9e7 100644 --- a/src/Core/src/Platform/Gtk/StackNavigationManager.cs +++ b/src/Core/src/Platform/Gtk/StackNavigationManager.cs @@ -1,22 +1,44 @@ +using System; +using System.Linq; + namespace Microsoft.Maui.Platform; public class StackNavigationManager { - public StackNavigationManager() { } + public StackNavigationManager(IMauiContext? mauiContext) + { + Context = mauiContext ?? throw new ArgumentNullException(nameof(mauiContext)); + } - public IStackNavigation? NavigationView { get; set; } + public IStackNavigation? NavigationView { get; protected set; } - [MissingMapper] - public void Connect(IStackNavigation virtualView, Gtk.Widget platformView) - { } + NavigationView? PlatformView { get; set; } - [MissingMapper] - public void Disconnect(IStackNavigation virtualView, Gtk.Widget platformView) - { } + IMauiContext Context { get; } + + public void Connect(IStackNavigation virtualView, NavigationView platformView) + { + NavigationView = virtualView; + PlatformView = platformView; + + } + + public void Disconnect(IStackNavigation virtualView, NavigationView platformView) + { + NavigationView = default; + PlatformView = default; + } [MissingMapper] - public void NavigateTo(NavigationRequest nr) - { } + public void NavigateTo(NavigationRequest request) + { + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} must not be null"); + + if (request.NavigationStack.FirstOrDefault() is { } firstOrDefault && firstOrDefault.ToPlatform(Context) is { } s) + { + PlatformView.Content = s; + } + } } \ No newline at end of file From ad5728e79be5ca1594efa43d9cc79beb1d0b5cec Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 20:01:15 +0100 Subject: [PATCH 248/425] [Gtk] Controls.Core.csproj: ItemsViewHandler.Gtk.cs: use NotImplementedView --- .../src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs index 642adb16cd15..0aa720b66e78 100644 --- a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs @@ -5,11 +5,11 @@ namespace Microsoft.Maui.Controls.Handlers.Items { - public abstract partial class ItemsViewHandler : ViewHandler where TItemsView : ItemsView + public abstract partial class ItemsViewHandler : ViewHandler where TItemsView : ItemsView { - protected override Gtk.Container CreatePlatformView() + protected override NotImplementedView CreatePlatformView() { - throw new NotImplementedException(); + return new(nameof(TItemsView)); } public static void MapItemsSource(ItemsViewHandler handler, ItemsView itemsView) From 2c305fefaea8541ca63383a1ba4322bc084077d3 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 20:32:50 +0100 Subject: [PATCH 249/425] [Gtk] Core.csproj: add a bunch of MissingMapperAttribute --- .../Core/Handlers/Items/CarouselViewHandler.Gtk.cs | 11 +++++++++++ .../Handlers/Items/GroupableItemsViewHandler.Gtk.cs | 1 + .../src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs | 9 +++++++++ .../Handlers/Items/ReorderableItemsViewHandler.Gtk.cs | 3 ++- .../Handlers/Items/SelectableItemsViewHandler.Gtk.cs | 3 +++ .../Handlers/Items/StructuredItemsViewHandler.Gtk.cs | 4 ++++ 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs index 688b58da5a64..2612c93785e8 100644 --- a/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs @@ -4,11 +4,22 @@ namespace Microsoft.Maui.Controls.Handlers.Items { public partial class CarouselViewHandler : ItemsViewHandler { + [MissingMapper] public static void MapCurrentItem(CarouselViewHandler handler, CarouselView carouselView) { } + + [MissingMapper] public static void MapPosition(CarouselViewHandler handler, CarouselView carouselView) { } + + [MissingMapper] public static void MapIsBounceEnabled(CarouselViewHandler handler, CarouselView carouselView) { } + + [MissingMapper] public static void MapIsSwipeEnabled(CarouselViewHandler handler, CarouselView carouselView) { } + + [MissingMapper] public static void MapPeekAreaInsets(CarouselViewHandler handler, CarouselView carouselView) { } + + [MissingMapper] public static void MapLoop(CarouselViewHandler handler, CarouselView carouselView) { } } } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs index ccbc69c5ddcc..ec132deb9f91 100644 --- a/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs @@ -2,6 +2,7 @@ { public partial class GroupableItemsViewHandler : SelectableItemsViewHandler where TItemsView : GroupableItemsView { + [MissingMapper] public static void MapIsGrouped(GroupableItemsViewHandler handler, GroupableItemsView itemsView) { } diff --git a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs index 0aa720b66e78..df0ab77028c2 100644 --- a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs @@ -12,38 +12,47 @@ protected override NotImplementedView CreatePlatformView() return new(nameof(TItemsView)); } + [MissingMapper] public static void MapItemsSource(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapHorizontalScrollBarVisibility(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapVerticalScrollBarVisibility(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapItemTemplate(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapEmptyView(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapEmptyViewTemplate(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapFlowDirection(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapIsVisible(ItemsViewHandler handler, ItemsView itemsView) { } + [MissingMapper] public static void MapItemsUpdatingScrollMode(ItemsViewHandler handler, ItemsView itemsView) { } diff --git a/src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs index a1ae82bece13..42322975f4ee 100644 --- a/src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.Gtk.cs @@ -4,9 +4,10 @@ namespace Microsoft.Maui.Controls.Handlers.Items { public partial class ReorderableItemsViewHandler : GroupableItemsViewHandler where TItemsView : ReorderableItemsView { + [MissingMapper] public static void MapCanReorderItems(ReorderableItemsViewHandler handler, ReorderableItemsView itemsView) { - //TODO : Need to impl + } } } diff --git a/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs index bca90e8e787b..f674427e3dcb 100644 --- a/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs @@ -6,12 +6,15 @@ namespace Microsoft.Maui.Controls.Handlers.Items public partial class SelectableItemsViewHandler : StructuredItemsViewHandler where TItemsView : SelectableItemsView { + [MissingMapper] public static void MapSelectedItem(SelectableItemsViewHandler handler, SelectableItemsView itemsView) { } + [MissingMapper] public static void MapSelectedItems(SelectableItemsViewHandler handler, SelectableItemsView itemsView) { } + [MissingMapper] public static void MapSelectionMode(SelectableItemsViewHandler handler, SelectableItemsView itemsView) { } diff --git a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs index 305b09f7aac4..16f90df67976 100644 --- a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs @@ -4,18 +4,22 @@ namespace Microsoft.Maui.Controls.Handlers.Items { public partial class StructuredItemsViewHandler : ItemsViewHandler where TItemsView : StructuredItemsView { + [MissingMapper] public static void MapHeaderTemplate(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { } + [MissingMapper] public static void MapFooterTemplate(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { } + [MissingMapper] public static void MapItemsLayout(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { } + [MissingMapper] public static void MapItemSizingStrategy(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { } From 6af270e48443d146615462df1c08887d98ddd47d Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 20:33:20 +0100 Subject: [PATCH 250/425] [Gtk] Core.csproj: Shapes: implement a bunch of mappings --- .../Handlers/Shapes/Line/LineHandler.Gtk.cs | 27 ++++++++++++++++--- .../Handlers/Shapes/Path/PathHandler.Gtk.cs | 14 ++++++++-- .../Shapes/Polygon/PolygonHandler.Gtk.cs | 21 ++++++++++++--- .../Shapes/Polyline/PolylineHandler.Gtk.cs | 21 ++++++++++++--- .../Shapes/Rectangle/RectangleHandler.Gtk.cs | 12 +++++++-- .../RoundRectangleHandler.Gtk.cs | 6 ++++- 6 files changed, 86 insertions(+), 15 deletions(-) diff --git a/src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs index 1e44f130545a..a7075bce39ac 100644 --- a/src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shapes/Line/LineHandler.Gtk.cs @@ -3,11 +3,30 @@ namespace Microsoft.Maui.Controls.Handlers { + public partial class LineHandler { - public static void MapX1(IShapeViewHandler handler, Line line) { } - public static void MapY1(IShapeViewHandler handler, Line line) { } - public static void MapX2(IShapeViewHandler handler, Line line) { } - public static void MapY2(IShapeViewHandler handler, Line line) { } + + public static void MapX1(IShapeViewHandler handler, Line line) + { + handler.PlatformView?.InvalidateShape(line); + } + + public static void MapY1(IShapeViewHandler handler, Line line) + { + handler.PlatformView?.InvalidateShape(line); + } + + public static void MapX2(IShapeViewHandler handler, Line line) + { + handler.PlatformView?.InvalidateShape(line); + } + + public static void MapY2(IShapeViewHandler handler, Line line) + { + handler.PlatformView?.InvalidateShape(line); + } + } + } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs index 8e3e8c3f2886..1e72040f4b71 100644 --- a/src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shapes/Path/PathHandler.Gtk.cs @@ -5,8 +5,18 @@ namespace Microsoft.Maui.Controls.Handlers { public partial class PathHandler { - public static void MapShape(IShapeViewHandler handler, Path path) { } - public static void MapData(IShapeViewHandler handler, Path path) { } + + public static void MapShape(IShapeViewHandler handler, Path path) + { + handler.PlatformView?.UpdateShape(path); + } + + public static void MapData(IShapeViewHandler handler, Path path) + { + handler.PlatformView?.UpdateShape(path); + } + + [MissingMapper] public static void MapRenderTransform(IShapeViewHandler handler, Path path) { } } } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs index 43bfbaec436b..c79c89f1d148 100644 --- a/src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Gtk.cs @@ -3,10 +3,25 @@ namespace Microsoft.Maui.Controls.Handlers { + public partial class PolygonHandler { - public static void MapShape(IShapeViewHandler handler, Polygon polygon) { } - public static void MapPoints(IShapeViewHandler handler, Polygon polygon) { } - public static void MapFillRule(IShapeViewHandler handler, Polygon polygon) { } + + public static void MapShape(IShapeViewHandler handler, Polygon polygon) + { + handler.PlatformView?.UpdateShape(polygon); + } + + public static void MapPoints(IShapeViewHandler handler, Polygon polygon) + { + handler.PlatformView?.UpdateShape(polygon); + } + + public static void MapFillRule(IShapeViewHandler handler, Polygon polygon) + { + handler.PlatformView?.UpdateShape(polygon); + } + } + } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs index 78f0857f2b8b..4ff295efd4be 100644 --- a/src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Gtk.cs @@ -3,10 +3,25 @@ namespace Microsoft.Maui.Controls.Handlers { + public partial class PolylineHandler { - public static void MapShape(IShapeViewHandler handler, Polyline polyline) { } - public static void MapPoints(IShapeViewHandler handler, Polyline polyline) { } - public static void MapFillRule(IShapeViewHandler handler, Polyline polyline) { } + + public static void MapShape(IShapeViewHandler handler, Polyline polyline) + { + handler.PlatformView?.UpdateShape(polyline); + } + + public static void MapPoints(IShapeViewHandler handler, Polyline polyline) + { + handler.PlatformView?.UpdateShape(polyline); + } + + public static void MapFillRule(IShapeViewHandler handler, Polyline polyline) + { + handler.PlatformView?.UpdateShape(polyline); + } + } + } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs index 2ffeeadff6cc..0ef7da572003 100644 --- a/src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shapes/Rectangle/RectangleHandler.Gtk.cs @@ -4,7 +4,15 @@ namespace Microsoft.Maui.Controls.Handlers { public partial class RectangleHandler { - public static void MapRadiusX(IShapeViewHandler handler, Rectangle rectangle) { } - public static void MapRadiusY(IShapeViewHandler handler, Rectangle rectangle) { } + + public static void MapRadiusX(IShapeViewHandler handler, Rectangle rectangle) + { + handler.PlatformView?.UpdateShape(rectangle); + } + + public static void MapRadiusY(IShapeViewHandler handler, Rectangle rectangle) + { + handler.PlatformView?.UpdateShape(rectangle); + } } } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs index 7ea663622889..53d8f0bdc918 100644 --- a/src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shapes/RoundRectangle/RoundRectangleHandler.Gtk.cs @@ -4,6 +4,10 @@ namespace Microsoft.Maui.Controls.Handlers { public partial class RoundRectangleHandler { - public static void MapCornerRadius(IShapeViewHandler handler, RoundRectangle roundRectangle) { } + + public static void MapCornerRadius(IShapeViewHandler handler, RoundRectangle roundRectangle) + { + handler.PlatformView?.UpdateShape(roundRectangle); + } } } From 2099930aecf57ec756ccafe0b3017568456a29e9 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 20:53:26 +0100 Subject: [PATCH 251/425] [Gtk] Core.csproj: introduce ShellView --- .../Core/Handlers/Shell/Gtk/ShellItemView.cs | 19 ++--- .../src/Core/Handlers/Shell/Gtk/ShellView.cs | 49 +++++++++++++ .../Core/Handlers/Shell/ShellHandler.Gtk.cs | 69 ++++++++++++++++--- .../src/Core/Handlers/Shell/ShellHandler.cs | 2 +- 4 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 src/Controls/src/Core/Handlers/Shell/Gtk/ShellView.cs diff --git a/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs index 5a2439142373..3fe9eaff5ec1 100644 --- a/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs +++ b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellItemView.cs @@ -4,25 +4,28 @@ using System.Linq; using Microsoft.Maui.Controls.Handlers.Items; using Gtk; -using Color=Microsoft.Maui.Graphics.Color; +using Color = Microsoft.Maui.Graphics.Color; namespace Microsoft.Maui.Controls.Platform { + public class ShellItemView : NotImplementedView { - public ShellItemView(object view):base(nameof(ShellItemView)) { } + + public ShellItemView(object view) : base(nameof(ShellItemView)) { } [MissingMapper] - public void UpdateTabBar(bool b) { } + public void UpdateTabBar(bool b) + { } [MissingMapper] - public void UpdateCurrentItem(object current){ } + public void UpdateCurrentItem(object current) + { } [MissingMapper] public void UpdateBottomTabBarColors(Color tabBarBackgroudColor, Color tabBarTitleColor, Color tabBarUnselectedColor) - { - - } + { } } -} + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shell/Gtk/ShellView.cs b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellView.cs new file mode 100644 index 000000000000..3167814ec2a1 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Shell/Gtk/ShellView.cs @@ -0,0 +1,49 @@ +using Microsoft.Maui.Graphics; + +namespace Microsoft.Maui.Controls.Platform; + +public class ShellView : NotImplementedView +{ + + public ShellView() : base(nameof(ShellView)) { } + + [MissingMapper] + public bool IsOpened { get; set; } + + [MissingMapper] + public void UpdateFlyout(IView flyoutViewFlyout) + { } + + [MissingMapper] + public void UpdateFlyoutBehavior(FlyoutBehavior flyoutViewFlyoutBehavior) + { } + + [MissingMapper] + public void UpdateDrawerWidth(double flyoutViewFlyoutWidth) + { } + + [MissingMapper] + public void UpdateBackgroundColor(Color viewBackgroundColor) + { } + + [MissingMapper] + public void UpdateCurrentItem(ShellItem viewCurrentItem) + { } + + [MissingMapper] + public void UpdateFlyoutBackDrop(Brush viewFlyoutBackdrop) + { } + + [MissingMapper] + public void UpdateFlyoutFooter(Shell view) + { } + + [MissingMapper] + public void UpdateFlyoutHeader(Shell view) + { } + + [MissingMapper] + public void UpdateItems() + { } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs index ade835960a04..3ebcf892e7d4 100644 --- a/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Shell/ShellHandler.Gtk.cs @@ -8,21 +8,72 @@ namespace Microsoft.Maui.Controls.Handlers { - public partial class ShellHandler : ViewHandler + public partial class ShellHandler : ViewHandler { - public static PropertyMapper Mapper = - new PropertyMapper(ElementMapper); + protected override ShellView CreatePlatformView() + { + return new(); + } - public static CommandMapper CommandMapper = - new CommandMapper(ElementCommandMapper); + public static void MapFlyout(ShellHandler handler, IFlyoutView flyoutView) + { + handler.PlatformView.UpdateFlyout(flyoutView.Flyout); + } - public ShellHandler() : base(Mapper, CommandMapper) - { } + public static void MapIsPresented(ShellHandler handler, IFlyoutView flyoutView) + { + handler.PlatformView.IsOpened = flyoutView.IsPresented; + } + + public static void MapFlyoutBehavior(ShellHandler handler, IFlyoutView flyoutView) + { + handler.PlatformView.UpdateFlyoutBehavior(flyoutView.FlyoutBehavior); + } + + public static void MapFlyoutWidth(ShellHandler handler, IFlyoutView flyoutView) + { + handler.PlatformView.UpdateDrawerWidth(flyoutView.FlyoutWidth); + } + + public static void MapFlyoutBackground(ShellHandler handler, Shell view) + { + handler.PlatformView.UpdateBackgroundColor(view.BackgroundColor); + } + + public static void MapCurrentItem(ShellHandler handler, Shell view) + { + handler.PlatformView.UpdateCurrentItem(view.CurrentItem); + } + + public static void MapFlyoutBackdrop(ShellHandler handler, Shell view) + { + handler.PlatformView.UpdateFlyoutBackDrop(view.FlyoutBackdrop); + } + + public static void MapFlyoutFooter(ShellHandler handler, Shell view) + { + handler.PlatformView.UpdateFlyoutFooter(view); + } + + public static void MapFlyoutHeader(ShellHandler handler, Shell view) + { + handler.PlatformView.UpdateFlyoutHeader(view); + } + + public static void MapFlyoutHeaderBehavior(ShellHandler handler, Shell view) + { + handler.PlatformView.UpdateFlyoutHeader(view); + } + + public static void MapItems(ShellHandler handler, IFlyoutView flyoutView) + { + handler.PlatformView.UpdateItems(); + } - protected override Gtk.Widget CreatePlatformView() + public static void MapFlyoutItems(ShellHandler handler, Shell view) { - return new NotImplementedView(nameof(Shell)); + handler.PlatformView.UpdateItems(); } } diff --git a/src/Controls/src/Core/Handlers/Shell/ShellHandler.cs b/src/Controls/src/Core/Handlers/Shell/ShellHandler.cs index 491366642de9..a6e7068df1cc 100644 --- a/src/Controls/src/Core/Handlers/Shell/ShellHandler.cs +++ b/src/Controls/src/Core/Handlers/Shell/ShellHandler.cs @@ -1,5 +1,5 @@ #nullable disable -#if WINDOWS || TIZEN +#if WINDOWS || TIZEN || GTK using System; using System.Collections.Generic; using System.Text; From 9f23c3d6301fe028a4d9a9a9d991a987c50b48a9 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 21:02:20 +0100 Subject: [PATCH 252/425] [Gtk] Controls.Core.csproj: Shape.Gtk.cs: implement MapStrokeDashArray --- src/Controls/src/Core/Shape/Shape.Gtk.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Core/Shape/Shape.Gtk.cs b/src/Controls/src/Core/Shape/Shape.Gtk.cs index 544b95598e68..3faaad67bcee 100644 --- a/src/Controls/src/Core/Shape/Shape.Gtk.cs +++ b/src/Controls/src/Core/Shape/Shape.Gtk.cs @@ -11,8 +11,10 @@ namespace Microsoft.Maui.Controls.Shapes public partial class Shape { - [MissingMapper] - public static void MapStrokeDashArray(IShapeViewHandler handler, IShapeView shapeView) { } + public static void MapStrokeDashArray(IShapeViewHandler handler, IShapeView shapeView) + { + handler.PlatformView?.InvalidateShape(shapeView); + } } From 4dc9e8feffd23c93f38e46556ea94015e67a510d Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 21:07:03 +0100 Subject: [PATCH 253/425] [Gtk] Controls.Core.csproj: Layout.Gtk.cs: MapInputTransparent Obsolete --- src/Controls/src/Core/Layout/Layout.Gtk.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Controls/src/Core/Layout/Layout.Gtk.cs b/src/Controls/src/Core/Layout/Layout.Gtk.cs index 36a8afdca98c..f230a917c7d5 100644 --- a/src/Controls/src/Core/Layout/Layout.Gtk.cs +++ b/src/Controls/src/Core/Layout/Layout.Gtk.cs @@ -1,10 +1,14 @@ -namespace Microsoft.Maui.Controls +using System; + +namespace Microsoft.Maui.Controls { + public partial class Layout { - [MissingMapper] - public static void MapInputTransparent(LayoutHandler handler, Layout layout) - { - } + + [Obsolete] + public static void MapInputTransparent(ILayoutHandler handler, Layout layout) { } + } -} + +} \ No newline at end of file From 55ca87014647d1aec92d343dc8284dc0255f9bd7 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 10 Nov 2023 21:23:42 +0100 Subject: [PATCH 254/425] [Gtk] Core.csproj: ViewHandler.Gtk.cs: add MapToolbar [MissingMapper] --- src/Core/src/Handlers/View/ViewHandler.Gtk.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs index 2f5305d3729d..fd2c7022f5f3 100644 --- a/src/Core/src/Handlers/View/ViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandler.Gtk.cs @@ -37,6 +37,20 @@ public static void MapAnchorX(IViewHandler handler, IView view) { } [MissingMapper] public static void MapAnchorY(IViewHandler handler, IView view) { } + public static void MapToolbar(IViewHandler handler, IView view) + { + if (handler.VirtualView is not IToolbarElement te || te.Toolbar == null) + return; + + MapToolbar(handler, te); + } + + [MissingMapper] + internal static void MapToolbar(IElementHandler handler, IToolbarElement te) + { + + } + } } \ No newline at end of file From 1a2588c606a87fcf880ca9e853d28da1aed4b11c Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 13 Nov 2023 17:17:30 +0100 Subject: [PATCH 255/425] [Gtk] Core.csproj: add a bunch of MissingMapperAttribute --- src/Core/src/Platform/Gtk/StrokeExtensions.cs | 8 ++++++++ src/Core/src/Platform/Gtk/ViewExtensions.cs | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/Core/src/Platform/Gtk/StrokeExtensions.cs b/src/Core/src/Platform/Gtk/StrokeExtensions.cs index d5da7428064a..3d752bb86d81 100644 --- a/src/Core/src/Platform/Gtk/StrokeExtensions.cs +++ b/src/Core/src/Platform/Gtk/StrokeExtensions.cs @@ -2,20 +2,28 @@ { public static class StrokeExtensions { + [MissingMapper] public static void UpdateStrokeShape(this Gtk.Widget platformView, IBorderStroke border) { } + [MissingMapper] public static void UpdateStroke(this Gtk.Widget platformView, IBorderStroke border) { } + [MissingMapper] public static void UpdateStrokeThickness(this Gtk.Widget platformView, IBorderStroke border) { } + [MissingMapper] public static void UpdateStrokeDashPattern(this Gtk.Widget platformView, IBorderStroke border) { } + [MissingMapper] public static void UpdateStrokeDashOffset(this Gtk.Widget platformView, IBorderStroke border) { } + [MissingMapper] public static void UpdateStrokeMiterLimit(this Gtk.Widget platformView, IBorderStroke border) { } + [MissingMapper] public static void UpdateStrokeLineCap(this Gtk.Widget platformView, IBorderStroke border) { } + [MissingMapper] public static void UpdateStrokeLineJoin(this Gtk.Widget platformView, IBorderStroke border) { } } } diff --git a/src/Core/src/Platform/Gtk/ViewExtensions.cs b/src/Core/src/Platform/Gtk/ViewExtensions.cs index ed7054443ead..de59e4b39a24 100644 --- a/src/Core/src/Platform/Gtk/ViewExtensions.cs +++ b/src/Core/src/Platform/Gtk/ViewExtensions.cs @@ -201,16 +201,22 @@ internal static Matrix4x4 GetViewTransform(this Widget view) return view?.Parent; } + [MissingMapper] public static void UpdateShadow(this Widget? platformView, IView view) { } + [MissingMapper] public static void UpdateBorder(this Widget? platformView, IView view) { } + [MissingMapper] public static void Focus(this Widget? platformView, FocusRequest request) { } + [MissingMapper] public static void Unfocus(this Widget? platformView, IView view) { } + [MissingMapper] public static void UpdateInputTransparent(this Widget? platformView, IViewHandler handler, IView view) { } + [MissingMapper] public static void UpdateToolTip(this Widget? platformView, ToolTip? tooltip) { } internal static IDisposable OnLoaded(this Widget? view, Action action) From afce1169ab14bd465c8ea6ec00f10d5c2b08aa22 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 13 Nov 2023 17:45:35 +0100 Subject: [PATCH 256/425] [Gtk] Core.csproj: introduce BorderView (stub) --- src/Core/src/Handlers/Border/BorderHandler.Gtk.cs | 13 +++++++++++-- src/Core/src/Handlers/Border/BorderHandler.cs | 2 +- src/Core/src/Handlers/Border/IBorderHandler.cs | 2 +- src/Core/src/Platform/Gtk/BorderView.cs | 4 ++++ 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 src/Core/src/Platform/Gtk/BorderView.cs diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs index 14539cb63863..710bee3d69b7 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -2,10 +2,19 @@ namespace Microsoft.Maui.Handlers { - public partial class BorderHandler : ViewHandler + public partial class BorderHandler : ViewHandler { [MissingMapper] - protected override NotImplementedView CreatePlatformView() => new(nameof(IBorderView)); + protected override BorderView CreatePlatformView() => new(); + static partial void UpdateContent(IBorderHandler handler) + { + var platformView = handler.PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); + var mauiContext = handler.MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); + var virtualView = handler.VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + + if (virtualView is { Content: IView view }) + platformView.Content = view.ToPlatform(mauiContext); + } } } diff --git a/src/Core/src/Handlers/Border/BorderHandler.cs b/src/Core/src/Handlers/Border/BorderHandler.cs index d9873ee717ec..12c0f412e3b6 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.cs @@ -8,7 +8,7 @@ #elif TIZEN using PlatformView = Microsoft.Maui.Platform.ContentViewGroup; #elif GTK -using PlatformView = Gtk.Widget; +using PlatformView = Microsoft.Maui.Platform.BorderView; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Handlers/Border/IBorderHandler.cs b/src/Core/src/Handlers/Border/IBorderHandler.cs index 80e81170b1a0..9447137a4f40 100644 --- a/src/Core/src/Handlers/Border/IBorderHandler.cs +++ b/src/Core/src/Handlers/Border/IBorderHandler.cs @@ -8,7 +8,7 @@ #elif TIZEN using PlatformView = Microsoft.Maui.Platform.ContentViewGroup; #elif GTK -using PlatformView = Gtk.Widget; +using PlatformView = Microsoft.Maui.Platform.BorderView; #elif (NETSTANDARD || !PLATFORM) using PlatformView = System.Object; #endif diff --git a/src/Core/src/Platform/Gtk/BorderView.cs b/src/Core/src/Platform/Gtk/BorderView.cs new file mode 100644 index 000000000000..0278d07bdd69 --- /dev/null +++ b/src/Core/src/Platform/Gtk/BorderView.cs @@ -0,0 +1,4 @@ +namespace Microsoft.Maui.Platform; + +public class BorderView : ContentView +{ } \ No newline at end of file From 0f86ad33cd4b014a5decc7966f2de55e2dd86617 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 30 Nov 2023 23:37:03 +0100 Subject: [PATCH 257/425] Graphics.Gtk.csproj add PlatformBitmapExportService & adjust naming --- .../Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs | 2 +- src/Core/src/Graphics/PaintExtensions.Gtk.cs | 2 +- ...ExportContext.cs => PlatformBitmapExportContext.cs} | 8 ++++---- .../Graphics.Gtk/Gtk/PlatformBitmapExportService.cs | 10 ++++++++++ .../src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs | 2 +- src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs | 2 +- .../Graphics.Gtk/Gtk/{GtkImage.cs => PlatformImage.cs} | 8 ++++---- ...oadingService.cs => PlatformImageLoadingService.cs} | 4 ++-- 8 files changed, 24 insertions(+), 14 deletions(-) rename src/Graphics/src/Graphics.Gtk/Gtk/{GtkBitmapExportContext.cs => PlatformBitmapExportContext.cs} (81%) create mode 100644 src/Graphics/src/Graphics.Gtk/Gtk/PlatformBitmapExportService.cs rename src/Graphics/src/Graphics.Gtk/Gtk/{GtkImage.cs => PlatformImage.cs} (91%) rename src/Graphics/src/Graphics.Gtk/Gtk/{GtkImageLoadingService.cs => PlatformImageLoadingService.cs} (58%) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 65e863a08832..6de27453131e 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -234,7 +234,7 @@ void SetupMauiLayout() using (var stream = File.OpenRead("dotnet_bot.png")) { - image = new GtkImageLoadingService().FromStream(stream); + image = new PlatformImageLoadingService().FromStream(stream); } var paint = image.AsPaint(); diff --git a/src/Core/src/Graphics/PaintExtensions.Gtk.cs b/src/Core/src/Graphics/PaintExtensions.Gtk.cs index 0f1b3dadb9ce..b7ea5bc81b77 100644 --- a/src/Core/src/Graphics/PaintExtensions.Gtk.cs +++ b/src/Core/src/Graphics/PaintExtensions.Gtk.cs @@ -19,7 +19,7 @@ public static partial class PaintExtensions switch (paint) { - case ImagePaint { Image: GtkImage image } imagePaint: + case ImagePaint { Image: PlatformImage image } imagePaint: { var pixbuf = image.NativeImage; diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GtkBitmapExportContext.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformBitmapExportContext.cs similarity index 81% rename from src/Graphics/src/Graphics.Gtk/Gtk/GtkBitmapExportContext.cs rename to src/Graphics/src/Graphics.Gtk/Gtk/PlatformBitmapExportContext.cs index 0d12f766dea1..23eaa8912d4a 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/GtkBitmapExportContext.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformBitmapExportContext.cs @@ -3,14 +3,14 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; -public class GtkBitmapExportContext : BitmapExportContext { +public class PlatformBitmapExportContext : BitmapExportContext { private PlatformCanvas _canvas; private Cairo.ImageSurface _surface; private Cairo.Context _context; private Gdk.Pixbuf? _pixbuf; - public GtkBitmapExportContext(int width, int height, float dpi) : base(width, height, dpi) { + public PlatformBitmapExportContext(int width, int height, float dpi) : base(width, height, dpi) { _surface = new Cairo.ImageSurface(Cairo.Format.Argb32, width, height); _context = new Cairo.Context(_surface); @@ -35,13 +35,13 @@ public override void WriteToStream(Stream stream) { } } - private GtkImage? _image; + private PlatformImage? _image; public override IImage? Image { get { _pixbuf ??= _surface.CreatePixbuf(); - if (_pixbuf != null) return _image ??= new GtkImage(_pixbuf); + if (_pixbuf != null) return _image ??= new PlatformImage(_pixbuf); return _image; } diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformBitmapExportService.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformBitmapExportService.cs new file mode 100644 index 000000000000..155a850caeae --- /dev/null +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformBitmapExportService.cs @@ -0,0 +1,10 @@ +namespace Microsoft.Maui.Graphics.Platform.Gtk +{ + public class PlatformBitmapExportService : IBitmapExportService + { + public BitmapExportContext CreateContext(int width, int height, float dpi) + { + return new PlatformBitmapExportContext(width, height, dpi); + } + } +} diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs index d023eb1cd3f2..d5631ad9eeaf 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.Patterns.cs @@ -85,7 +85,7 @@ public void DrawFillPaint(Cairo.Context? context, Paint? paint, RectF rectangle) break; } - case ImagePaint {Image: GtkImage image} imagePaint: { + case ImagePaint {Image: PlatformImage image} imagePaint: { var pixbuf = image.NativeImage; if (pixbuf?.CreatePattern(DisplayScale) is { } pattern) { diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs index 3927557ca7f6..2fe661fe5dab 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformCanvas.cs @@ -247,7 +247,7 @@ public override void FillPath(PathF path, WindingMode windingMode) public override void DrawImage(IImage image, float x, float y, float width, float height) { - if (image is GtkImage { NativeImage: { } pixbuf }) + if (image is PlatformImage { NativeImage: { } pixbuf }) { DrawPixbuf(Context, pixbuf, x, y, width, height); } diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformImage.cs similarity index 91% rename from src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs rename to src/Graphics/src/Graphics.Gtk/Gtk/PlatformImage.cs index 2644df04fda7..e2a5cf989134 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImage.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformImage.cs @@ -5,9 +5,9 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; -public class GtkImage : IImage +public class PlatformImage : IImage { - public GtkImage(Gdk.Pixbuf pix) + public PlatformImage(Gdk.Pixbuf pix) { _pixbuf = pix; } @@ -62,7 +62,7 @@ public async Task SaveAsync(Stream stream, ImageFormat format = ImageFormat.Png, public IImage ToImage(int width, int height, float scale = 1f) { - using var context = new GtkBitmapExportContext(width, height, scale); + using var context = new PlatformBitmapExportContext(width, height, scale); context.Canvas.Scale(scale, scale); Draw(context.Canvas, new RectF(0, 0, (float)width / scale, (float)height / scale)); return context.Image; @@ -74,6 +74,6 @@ public static IImage FromStream(Stream stream, ImageFormat formatHint) { var platformHint = formatHint.ToImageExtension(); var pix = new Gdk.Pixbuf(stream); - return new GtkImage(pix); + return new PlatformImage(pix); } } \ No newline at end of file diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImageLoadingService.cs b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformImageLoadingService.cs similarity index 58% rename from src/Graphics/src/Graphics.Gtk/Gtk/GtkImageLoadingService.cs rename to src/Graphics/src/Graphics.Gtk/Gtk/PlatformImageLoadingService.cs index a681173d3aff..7d09255d06ea 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/GtkImageLoadingService.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/PlatformImageLoadingService.cs @@ -2,11 +2,11 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; - public class GtkImageLoadingService : IImageLoadingService + public class PlatformImageLoadingService : IImageLoadingService { public IImage FromStream(Stream stream, ImageFormat formatHint = ImageFormat.Png) { - return GtkImage.FromStream(stream, formatHint); + return PlatformImage.FromStream(stream, formatHint); } } From f45aaaa07f1bec73e41b01862de531cea4ea5218 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 1 Dec 2023 19:29:10 +0100 Subject: [PATCH 258/425] [Gtk] Core.csproj GraphicsViewHandler.Gtk.cs, PlatformTouchGraphicsView.cs: implement IGraphicsView - Interactions (first draft) --- .../GraphicsView/GraphicsViewHandler.Gtk.cs | 12 ++- .../Platform/Gtk/PlatformTouchGraphicsView.cs | 89 ++++++++++++++++++- 2 files changed, 92 insertions(+), 9 deletions(-) diff --git a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs index 488be696034e..e850fbb28cbf 100644 --- a/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/GraphicsView/GraphicsViewHandler.Gtk.cs @@ -5,22 +5,20 @@ namespace Microsoft.Maui.Handlers public partial class GraphicsViewHandler : ViewHandler { - protected override PlatformTouchGraphicsView CreatePlatformView() => new(); public static void MapDrawable(IGraphicsViewHandler handler, IGraphicsView graphicsView) { - if (handler.PlatformView is { } nativeView) - { - nativeView.Drawable = graphicsView.Drawable; - } + handler.PlatformView?.UpdateDrawable(graphicsView); } [MissingMapper] public static void MapFlowDirection(IGraphicsViewHandler handler, IGraphicsView graphicsView) { } - [MissingMapper] - public static void MapInvalidate(IGraphicsViewHandler handler, IGraphicsView graphicsView, object? arg) { } + public static void MapInvalidate(IGraphicsViewHandler handler, IGraphicsView graphicsView, object? arg) + { + handler.PlatformView?.QueueDraw(); + } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs index 0399b858f218..6e4a38303fde 100644 --- a/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs +++ b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs @@ -1,10 +1,95 @@ +using Gdk; +using Gtk; +using Microsoft.Maui.Graphics; + namespace Microsoft.Maui.Platform; public class PlatformTouchGraphicsView : Microsoft.Maui.Graphics.Platform.Gtk.GtkGraphicsView { + IGraphicsView? _graphicsView; + bool _isTouching; + bool _isInBounds; + + PointF[] GetViewPoints(EventButton e) + { + return new[] { new PointF((float)e.X, (float)e.Y) }; + } + + PointF[] GetViewPoints(EventMotion e) + { + return new[] { new PointF((float)e.X, (float)e.Y) }; + } + + PointF[] GetViewPoints(EventCrossing e) + { + return new[] { new PointF((float)e.X, (float)e.Y) }; + } + + + protected override bool OnButtonPressEvent(EventButton e) + { + _isTouching = true; + _graphicsView?.StartInteraction(GetViewPoints(e)); + return base.OnButtonPressEvent(e); + } + + protected override bool OnButtonReleaseEvent(EventButton e) + { + _isTouching = false; + _graphicsView?.EndInteraction(GetViewPoints(e), _isInBounds); + + return base.OnButtonReleaseEvent(e); + } + + protected override bool OnTouchEvent(Event evnt) + { + _isTouching = true; + return base.OnTouchEvent(evnt); + } + + protected override bool OnEnterNotifyEvent(EventCrossing e) + { + _isInBounds = true; + _graphicsView?.StartHoverInteraction(GetViewPoints(e)); + return base.OnEnterNotifyEvent(e); + } + + protected override bool OnMotionNotifyEvent(EventMotion e) + { + _graphicsView?.MoveHoverInteraction(GetViewPoints(e)); + return base.OnMotionNotifyEvent(e); + } + + protected override bool OnLeaveNotifyEvent(EventCrossing e) + { + _isInBounds = false; + + _graphicsView?.EndHoverInteraction(); + + if (_isTouching) + { + _isTouching = false; + _graphicsView?.EndInteraction(GetViewPoints(e), _isInBounds); + } + + return base.OnLeaveNotifyEvent(e); + } - public void Connect(IGraphicsView graphicsView) { } + public void Connect(IGraphicsView graphicsView) + { + _graphicsView = graphicsView; + Events |= EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.PointerMotionMask | + EventMask.ButtonMotionMask | EventMask.LeaveNotifyMask | EventMask.EnterNotifyMask + ; + } - public void Disconnect() { } + public void Disconnect() + { + _graphicsView = null; + } + public void UpdateDrawable(IGraphicsView graphicsView) + { + Drawable = graphicsView.Drawable; + } } \ No newline at end of file From 5817e95bff6dfda17fda102d390c2ac5bd8989de Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 1 Dec 2023 19:30:41 +0100 Subject: [PATCH 259/425] [Gtk] Core.csproj GraphicsViewHandler.Gtk.cs, PlatformTouchGraphicsView.cs: introduce GraphicsViewExtensions --- src/Core/src/Platform/Gtk/GraphicsViewExtensions.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/Core/src/Platform/Gtk/GraphicsViewExtensions.cs diff --git a/src/Core/src/Platform/Gtk/GraphicsViewExtensions.cs b/src/Core/src/Platform/Gtk/GraphicsViewExtensions.cs new file mode 100644 index 000000000000..6deddcb2445d --- /dev/null +++ b/src/Core/src/Platform/Gtk/GraphicsViewExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.Maui.Graphics.Platform; + +namespace Microsoft.Maui.Platform +{ + public static class GraphicsViewExtensions + { + public static void UpdateDrawable(this PlatformTouchGraphicsView PlatformGraphicsView, IGraphicsView graphicsView) + { + PlatformGraphicsView.Drawable = graphicsView.Drawable; + } + } +} \ No newline at end of file From 64a4f7cb154d1c964ba8cc029015d79541628b4c Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 1 Dec 2023 19:34:41 +0100 Subject: [PATCH 260/425] [Gtk] Core.csproj PlatformTouchGraphicsView.cs: remove UpdateDrawable (is in extension) --- src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs index 6e4a38303fde..5371010368de 100644 --- a/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs +++ b/src/Core/src/Platform/Gtk/PlatformTouchGraphicsView.cs @@ -87,9 +87,4 @@ public void Disconnect() { _graphicsView = null; } - - public void UpdateDrawable(IGraphicsView graphicsView) - { - Drawable = graphicsView.Drawable; - } } \ No newline at end of file From a9d69870a540ef4baa0c83bfa1f62ff76e8fc51f Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 1 Dec 2023 20:59:09 +0100 Subject: [PATCH 261/425] [Gtk] Core.csproj LayoutView.cs: add remark (possible error) --- src/Core/src/Platform/Gtk/LayoutView.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 2ff10fcd1add..bdb4650a8c2e 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -341,7 +341,11 @@ protected Size MeasureMinimum() Measure(0, double.PositiveInfinity); - var desiredMinimum = virtualView.Aggregate(new Size(), (s, c) => new Size(Math.Max(s.Width, c.DesiredSize.Width), s.Height + c.DesiredSize.Height)); + var desiredMinimum = virtualView.Aggregate(new Size(), + (s, c) => new Size( + // this is only true if Layout is vertical? + Math.Max(s.Width, c.DesiredSize.Width), + s.Height + c.DesiredSize.Height)); MeasuredMinimum = Measure(desiredMinimum.Width, double.PositiveInfinity); From 562585e58abadba84ad88de7b21c2c672eb112ba Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 5 Dec 2023 16:53:19 +0100 Subject: [PATCH 262/425] Graphics.Gtk.csproj: fix build for netstandard --- src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj index 8817406fde30..24e816afbcad 100644 --- a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj +++ b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj @@ -1,7 +1,7 @@ - $(_MauiDotNetTfm)-gtk + netstandard2.1;netstandard2.0;$(_MauiDotNetTfm)-gtk Microsoft.Maui.Graphics.Gtk @@ -11,5 +11,8 @@ + + + From 7f6c9c36a0a706759fa8123c0f76403a4cc9ca50 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 5 Dec 2023 16:59:29 +0100 Subject: [PATCH 263/425] Directory.Build.props: GtkTargetFrameworkVersion: raise to 3.24.24.95 --- Directory.Build.props | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index e51dd36a340e..67036aab353e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,12 +1,12 @@ - + <_MauiDotNetVersionMajor Condition="'$(_MauiDotNetVersionMajor)' == ''">7 <_MauiDotNetVersionMinor Condition="'$(_MauiDotNetVersionMinor)' == ''">0 <_MauiDotNetVersion Condition="'$(_MauiDotNetVersion)' == ''">$(_MauiDotNetVersionMajor).$(_MauiDotNetVersionMinor) <_MauiDotNetTfm Condition="'$(_MauiDotNetTfm)' == ''">net$(_MauiDotNetVersion) - + <_MauiPreviousDotNetVersionMajor Condition="'$(_MauiPreviousDotNetVersionMajor)' == ''">7 <_MauiPreviousDotNetVersionMinor Condition="'$(_MauiPreviousDotNetVersionMinor)' == ''">0 <_MauiPreviousDotNetVersion Condition="'$(_MauiPreviousDotNetVersion)' == ''">$(_MauiPreviousDotNetVersionMajor).$(_MauiPreviousDotNetVersionMinor) @@ -97,10 +97,10 @@ 10.0.19041 10.0.20348 6.5 - 3.24.24.64 + 3.24.24.95 - + @@ -179,12 +179,12 @@ $(NoWarn);RS0016;RS0017;CA1822;CA1805;CS0649;CS1589 - - - - + + + + - + @@ -193,6 +193,6 @@ true - + From b6a0720a7e011a32292d19e64d7dcdfe64669222 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 6 Dec 2023 01:53:25 +0100 Subject: [PATCH 264/425] [Gtk] fix GtkSharpPackageVersion --- eng/Versions.props | 2 +- src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index da905622107c..06b6df8e7252 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -84,7 +84,7 @@ 0.9.0 0.5.13 1.2.0 - 3.24.24.64 + 3.24.24.95 $([System.Text.RegularExpressions.Regex]::Match($(MicrosoftDotnetSdkInternalPackageVersion), `^\d+\.\d+\.\d`))00 diff --git a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj index 24e816afbcad..df7c4f66e06f 100644 --- a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj +++ b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj @@ -12,7 +12,7 @@ - + From d76b2ca4f88dab4a11980078b5cd191832e63044 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 6 Dec 2023 01:54:00 +0100 Subject: [PATCH 265/425] GraphicsTester.Gtk.csproj track api changes --- .../samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj | 2 +- src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj index 07b5e81457de..58c1f63440ad 100644 --- a/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj +++ b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj @@ -2,7 +2,7 @@ WinExe - $(_MauiDotNetTfm) + $(_MauiDotNetTfm)-gtk GraphicsTester.Gtk GraphicsTester.Gtk diff --git a/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs b/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs index 4ed5163c3e01..2e5ffbd95c62 100644 --- a/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs +++ b/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs @@ -31,7 +31,7 @@ public MainWindow() : base(WindowType.Toplevel) Titlebar = headerBar; - var hpanned = new HPaned { Position = 300 }; + var hpanned = new Paned(Orientation.Horizontal) { Position = 300 }; _treeView = new TreeView { HeadersVisible = false }; From b92e5e052d4dceb3897187f3cdbf6bf2c981adc5 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 6 Dec 2023 02:48:13 +0100 Subject: [PATCH 266/425] GraphicsTester.Gtk.csproj: track api changes --- .../samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj | 2 +- src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj index 07b5e81457de..58c1f63440ad 100644 --- a/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj +++ b/src/Graphics/samples/GraphicsTester.Gtk/GraphicsTester.Gtk.csproj @@ -2,7 +2,7 @@ WinExe - $(_MauiDotNetTfm) + $(_MauiDotNetTfm)-gtk GraphicsTester.Gtk GraphicsTester.Gtk diff --git a/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs b/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs index 4ed5163c3e01..2e5ffbd95c62 100644 --- a/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs +++ b/src/Graphics/samples/GraphicsTester.Gtk/MainWindow.cs @@ -31,7 +31,7 @@ public MainWindow() : base(WindowType.Toplevel) Titlebar = headerBar; - var hpanned = new HPaned { Position = 300 }; + var hpanned = new Paned(Orientation.Horizontal) { Position = 300 }; _treeView = new TreeView { HeadersVisible = false }; From 2dbef6f38d30e7142d57019b7a70bc5b6105fa84 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 6 Dec 2023 03:45:59 +0100 Subject: [PATCH 267/425] Graphics.Gtk.csproj & Versions.props: fix GtkSharp package reference --- eng/Versions.props | 2 +- src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index da905622107c..755a1d7694a1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -84,7 +84,7 @@ 0.9.0 0.5.13 1.2.0 - 3.24.24.64 + 3.24.24.94 $([System.Text.RegularExpressions.Regex]::Match($(MicrosoftDotnetSdkInternalPackageVersion), `^\d+\.\d+\.\d`))00 diff --git a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj index 24e816afbcad..df7c4f66e06f 100644 --- a/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj +++ b/src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj @@ -12,7 +12,7 @@ - + From 7b4fc5a0c694eb10cc7d4f1975948e3fee1649c7 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 7 Dec 2023 19:17:19 +0100 Subject: [PATCH 268/425] Versions.props, Directory.Build.props: fix 8.-series --- Directory.Build.props | 2 +- eng/Versions.props | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 0e6a14b574f7..d1d3e8d5304e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ - <_MauiDotNetVersionMajor Condition="'$(_MauiDotNetVersionMajor)' == ''">7 + <_MauiDotNetVersionMajor Condition="'$(_MauiDotNetVersionMajor)' == ''">8 <_MauiDotNetVersionMinor Condition="'$(_MauiDotNetVersionMinor)' == ''">0 <_MauiDotNetVersion Condition="'$(_MauiDotNetVersion)' == ''">$(_MauiDotNetVersionMajor).$(_MauiDotNetVersionMinor) <_MauiDotNetTfm Condition="'$(_MauiDotNetTfm)' == ''">net$(_MauiDotNetVersion) diff --git a/eng/Versions.props b/eng/Versions.props index e6be694cd8ec..82f5e1e92c55 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -3,7 +3,7 @@ 7.0.101 - 8.0.100-rtm.23530.12 + 8.0.100 8.0.0 $(MicrosoftNETCoreAppRefPackageVersion) @@ -51,7 +51,7 @@ 8.0.0 8.0.0 - 8.0.0-preview1.23067.2 + 8.0.0 3.3.4 3.3.4 4.5.0 @@ -96,6 +96,6 @@ $(DotNetVersionBand) $(DotNetVersionBand) $(DotNetVersionBand) - 8.0.100-rc.2 + $(DotNetVersionBand) From 1ab7f36ac33754aa9d2ee8b6d32cc4729ac6d8f4 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 7 Dec 2023 19:31:12 +0100 Subject: [PATCH 269/425] Core.csproj: fix warning & Controls.Core.csproj: fix Label.Gtk.cs --- src/Controls/src/Core/Label/Label.Gtk.cs | 9 --------- src/Core/src/Core.csproj | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/Controls/src/Core/Label/Label.Gtk.cs b/src/Controls/src/Core/Label/Label.Gtk.cs index 6199444d75b5..f24562ecbeac 100644 --- a/src/Controls/src/Core/Label/Label.Gtk.cs +++ b/src/Controls/src/Core/Label/Label.Gtk.cs @@ -2,15 +2,8 @@ namespace Microsoft.Maui.Controls { - public partial class Label { - - public static void MapTextType(ILabelHandler handler, Label label) - { - handler.PlatformView?.UpdateText(label, label.TextType); - } - public static void MapText(ILabelHandler handler, Label label) { handler.PlatformView?.UpdateText(label, label.TextType); @@ -25,7 +18,5 @@ public static void MapMaxLines(ILabelHandler handler, Label label) { handler.PlatformView?.UpdateText(label, label.TextType); } - } - } \ No newline at end of file diff --git a/src/Core/src/Core.csproj b/src/Core/src/Core.csproj index 07dae71f6d8c..f69df3af067e 100644 --- a/src/Core/src/Core.csproj +++ b/src/Core/src/Core.csproj @@ -8,7 +8,7 @@ false true true - $(NoWarn);CS1591;RS0041;RS0026;RS0027 + $(NoWarn);CS1591;RS0041;RS0026;RS0027;CA1859 From 6b5aa11916f7381c43144bb3198260d73a94b5c4 Mon Sep 17 00:00:00 2001 From: lytico Date: Thu, 7 Dec 2023 19:39:45 +0100 Subject: [PATCH 270/425] remove outdated Maui.Graphics.Gtk-dlls --- .../Microsoft.Maui.Graphics.Gtk.deps.json | 224 ------------------ .../Microsoft.Maui.Graphics.Gtk.dll | Bin 53248 -> 0 bytes .../Microsoft.Maui.Graphics.dll | Bin 186368 -> 0 bytes .../ref/Microsoft.Maui.Graphics.Gtk.dll | Bin 26112 -> 0 bytes 4 files changed, 224 deletions(-) delete mode 100644 src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json delete mode 100644 src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll delete mode 100644 src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.dll delete mode 100644 src/Microsoft.Maui.Graphics.Gtk/ref/Microsoft.Maui.Graphics.Gtk.dll diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json deleted file mode 100644 index cf0f489f5326..000000000000 --- a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.deps.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETStandard,Version=v2.0/", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETStandard,Version=v2.0": {}, - ".NETStandard,Version=v2.0/": { - "Microsoft.Maui.Graphics.Gtk/6.0.100": { - "dependencies": { - "GitInfo": "2.1.2", - "GtkSharp": "3.24.24.34", - "MSBuilder.GenerateAssemblyInfo": "0.2.2", - "Microsoft.Maui.Graphics": "0.0.1-alpha1", - "NETStandard.Library": "2.0.3" - }, - "runtime": { - "Microsoft.Maui.Graphics.Gtk.dll": {} - } - }, - "AtkSharp/3.24.24.34": { - "dependencies": { - "GLibSharp": "3.24.24.34" - }, - "runtime": { - "lib/netstandard2.0/AtkSharp.dll": { - "assemblyVersion": "3.24.24.34", - "fileVersion": "3.24.24.34" - } - } - }, - "CairoSharp/3.24.24.34": { - "runtime": { - "lib/netstandard2.0/CairoSharp.dll": { - "assemblyVersion": "3.24.24.34", - "fileVersion": "3.24.24.34" - } - } - }, - "GdkSharp/3.24.24.34": { - "dependencies": { - "CairoSharp": "3.24.24.34", - "GLibSharp": "3.24.24.34", - "GioSharp": "3.24.24.34", - "PangoSharp": "3.24.24.34" - }, - "runtime": { - "lib/netstandard2.0/GdkSharp.dll": { - "assemblyVersion": "3.24.24.34", - "fileVersion": "3.24.24.34" - } - } - }, - "GioSharp/3.24.24.34": { - "dependencies": { - "GLibSharp": "3.24.24.34" - }, - "runtime": { - "lib/netstandard2.0/GioSharp.dll": { - "assemblyVersion": "3.24.24.34", - "fileVersion": "3.24.24.34" - } - } - }, - "GitInfo/2.1.2": {}, - "GLibSharp/3.24.24.34": { - "runtime": { - "lib/netstandard2.0/GLibSharp.dll": { - "assemblyVersion": "3.24.24.34", - "fileVersion": "3.24.24.34" - } - } - }, - "GtkSharp/3.24.24.34": { - "dependencies": { - "AtkSharp": "3.24.24.34", - "CairoSharp": "3.24.24.34", - "GLibSharp": "3.24.24.34", - "GdkSharp": "3.24.24.34", - "GioSharp": "3.24.24.34", - "PangoSharp": "3.24.24.34" - }, - "runtime": { - "lib/netstandard2.0/GtkSharp.dll": { - "assemblyVersion": "3.24.24.34", - "fileVersion": "3.24.24.34" - } - } - }, - "Microsoft.NETCore.Platforms/1.1.0": {}, - "MSBuilder.GenerateAssemblyInfo/0.2.2": {}, - "NETStandard.Library/2.0.3": { - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0" - } - }, - "PangoSharp/3.24.24.34": { - "dependencies": { - "CairoSharp": "3.24.24.34", - "GLibSharp": "3.24.24.34" - }, - "runtime": { - "lib/netstandard2.0/PangoSharp.dll": { - "assemblyVersion": "3.24.24.34", - "fileVersion": "3.24.24.34" - } - } - }, - "System.Numerics.Vectors/4.5.0": { - "runtime": { - "lib/netstandard2.0/System.Numerics.Vectors.dll": { - "assemblyVersion": "4.1.4.0", - "fileVersion": "4.6.26515.6" - } - } - }, - "Microsoft.Maui.Graphics/0.0.1-alpha1": { - "dependencies": { - "System.Numerics.Vectors": "4.5.0" - }, - "runtime": { - "Microsoft.Maui.Graphics.dll": {} - } - } - } - }, - "libraries": { - "Microsoft.Maui.Graphics.Gtk/6.0.100": { - "type": "project", - "serviceable": false, - "sha512": "" - }, - "AtkSharp/3.24.24.34": { - "type": "package", - "serviceable": true, - "sha512": "sha512-CNfTGhGDxcnow5e/u0THtOJeNWaZNDeeFmzYTMdC1tdUkmAtTFDareTGesLx+Gfj75m3415AKJSC9wQ6VyacYQ==", - "path": "atksharp/3.24.24.34", - "hashPath": "atksharp.3.24.24.34.nupkg.sha512" - }, - "CairoSharp/3.24.24.34": { - "type": "package", - "serviceable": true, - "sha512": "sha512-hr75uYPGFlmB3RvpL3/6ZJtb+UiKsrpkyjb5VGI+8y1/lkY405FMBhPZKlxFqoEH0iIZ9gAMPBqKzT1lSVaDqA==", - "path": "cairosharp/3.24.24.34", - "hashPath": "cairosharp.3.24.24.34.nupkg.sha512" - }, - "GdkSharp/3.24.24.34": { - "type": "package", - "serviceable": true, - "sha512": "sha512-COORB6Qd4yu6HWRbzVZXrkzr1T96Gy0wO7ckJfpYxWLbDUDnZVd/g2PICp9T05a0ZvLvkE++vsSjAWobwQeS0g==", - "path": "gdksharp/3.24.24.34", - "hashPath": "gdksharp.3.24.24.34.nupkg.sha512" - }, - "GioSharp/3.24.24.34": { - "type": "package", - "serviceable": true, - "sha512": "sha512-Qyz8bhKjLMTWoxXu6cdNEtTLNUuw7Y1sPdXlyTfyWMP/JmsUE9smCsCC0kyQNSFW17flxdSoeDpG8l6zzJF0vQ==", - "path": "giosharp/3.24.24.34", - "hashPath": "giosharp.3.24.24.34.nupkg.sha512" - }, - "GitInfo/2.1.2": { - "type": "package", - "serviceable": true, - "sha512": "sha512-1sO441DFuueysHa9gDWpql+bra1wL9KBHAM823dHUHuBTJjKwnv4Dpr+/+nnZ6cdY3mECtbWoMrYgeTiKwJ8Rg==", - "path": "gitinfo/2.1.2", - "hashPath": "gitinfo.2.1.2.nupkg.sha512" - }, - "GLibSharp/3.24.24.34": { - "type": "package", - "serviceable": true, - "sha512": "sha512-PSA7YJbxpnpeltjekoUk93FI9HWUMc2NtkxNIaWzHz7BavkkZDFmx8EKTKtuBrqbZZmEhlv5472NwGdiycSfxw==", - "path": "glibsharp/3.24.24.34", - "hashPath": "glibsharp.3.24.24.34.nupkg.sha512" - }, - "GtkSharp/3.24.24.34": { - "type": "package", - "serviceable": true, - "sha512": "sha512-CVAz7ACMxW9xPhlrrg4Xe+v3jUnpN+emQl78aaXHtoiE7pf0tR8mP8mw0/eBHxMObrmg6DsLxbEFqE/7Yo4Uow==", - "path": "gtksharp/3.24.24.34", - "hashPath": "gtksharp.3.24.24.34.nupkg.sha512" - }, - "Microsoft.NETCore.Platforms/1.1.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-a/iSwnRZb+LHFk49hQOyThh/ZNC3vsbZsF65XwQIb863qF6msmhdQtxGXFL28Ob2NsCz/drEj28BJd/YPpLRBg==", - "path": "microsoft.netcore.platforms/1.1.0", - "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" - }, - "MSBuilder.GenerateAssemblyInfo/0.2.2": { - "type": "package", - "serviceable": true, - "sha512": "sha512-ghF6V1yp/fHCNWqxv/0jeHFrbREoD+uR+cuKkayypjnJ2OSe5R8DYSMA9L4WLy0/ce0VwGdrl01cdp7d9oo2+Q==", - "path": "msbuilder.generateassemblyinfo/0.2.2", - "hashPath": "msbuilder.generateassemblyinfo.0.2.2.nupkg.sha512" - }, - "NETStandard.Library/2.0.3": { - "type": "package", - "serviceable": true, - "sha512": "sha512-548M6mnBSJWxsIlkQHfbzoYxpiYFXZZSL00p4GHYv8PkiqFBnnT68mW5mGEsA/ch9fDO9GkPgkFQpWiXZN7mAQ==", - "path": "netstandard.library/2.0.3", - "hashPath": "netstandard.library.2.0.3.nupkg.sha512" - }, - "PangoSharp/3.24.24.34": { - "type": "package", - "serviceable": true, - "sha512": "sha512-QpBEIiE29sxkewdW7l7rVRJR1p3SGoPauHrjm0A3yxpYxj+St5x45weHI8jquMJAZBUdVQuXYHSZDW1lQeJ+PQ==", - "path": "pangosharp/3.24.24.34", - "hashPath": "pangosharp.3.24.24.34.nupkg.sha512" - }, - "System.Numerics.Vectors/4.5.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", - "path": "system.numerics.vectors/4.5.0", - "hashPath": "system.numerics.vectors.4.5.0.nupkg.sha512" - }, - "Microsoft.Maui.Graphics/0.0.1-alpha1": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.Gtk.dll deleted file mode 100644 index 83c1e4bf4359a25d6db8854dee308186917e8704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmb?^31C#!)&ITky?L``CYhOJlCWhXVX_cFP+1fcc9fl{fL1aj1B?uLF_S15LxZT* zx_oL~TU(*p#a3-yTD6LTTT839YW?aixK*vT`qfsgE&hM!+&fEHY`_2iKbrH-cF#Tc z-2L7+!@^aU3sVST;qQwtgt!+^`m`|oaxe&Su;Ld%akux$s(a;vC#%}lC)1VPJSEYtu_+3$Z|&;;ao@Z^-1fS5#N} z<#-_;2gjqh=e~t!CE=1l5#xsPn;7Ije_9|1pFXB&Kc7_T|J+lP#KLDR>@H?Zib+`` z%ut|GiUPvk6rwGU{cq9Atm~}m0X;7-QFCu%Q!nTX9|M4l%c}hb#h*$c+M9dQJsqHw zZz!7$;#Vxrf)-R)b5A1WK#_fg&m4oNvMP)~Z^lrL5OIntKIEGrTq3qci08NJD6`~$ z2da%&tq?xZutp80nvTy506VE}Gf4bw9M^B@}Kw;EufjxC7Dctcbpdn5~$j+MeF zZ7ygOMp?7b=qd9xdP;qbR@B!hNM<(()-U67Wc7_kYp534tbz{Oyt3KkfyvTlyU_zv zY!arm$!cS)S=uP0+V+o-4oxH^jJ^tZ<+F?Tn-MEyHI1;HF>pC$J285s>jBe9O=M~k zpxx-rn6MkZZuC>?4MsmD!-MqkAjJ*oBLN#wCzgPenl19L(YfmEjDF6?=;sX5M zk0vDThO?D@WnNiV##yuBn}s5FG-ZY7Wc{3?pHu0nTsXpTrh$r~hR{edZOWag|GYMZ zmO}07pf*Kq(38`r22(~2=5THBEa-coj~-Rgx!>~HO|FVge`CU^dPEyBa>3YX z%(bHaM&WJ<8Yva`nec-?>0?m-TEjV(!T_&qXF4ze&T+(v5T`|RTJfwMYte`glBTjJ;rwPQ=`wzLD;ZP-SD8{%mv$s z6(J|X!BFFi6$4Eg&V1rK#}g+EPWnE82GrOI;G};*M4geW=scyOa}_nW1z@L){)OtX zNIfuoqt7h?%&4FZk_sNAf(NN=NG~N7YBkG%B=KCXpKbbiB0bY50kYc3n!Q3lSL){~ zdMdSLM*k_G;M1w}NPh*eK{JsrF*l@7BjzgPx0*;i5wCnUqQ&m4p=Y`SkhMECJ28~K z7Gw%W*3pxP8rCK@*(Uae^m;&MCxK8=Pp4;kLx!Ew?2S40R3o*e3*;#=hqR^-AvZKk zHCVcerOB-La5VM%O#3rT%N6T}QFMr?X{FBqI)H)HGK_wDqss1m!@=qJKK zb=YFS1lr(>HjFa*8KrUFCD3GqpW9+Th87D0BD&cKjAKNZMrqKLP z(76o}&Vg`%lAwum8%O>$hoX(MrLiHMDu!08G?hSQSY`CPk+^njNgedaP8wsNUF#np zw!5Iws}wM8dDPg0>Jb5DpGs3Z)~su^oiqhUm0EFPy^2HO(VRZTp-fcf!-a7UQ!xWQ z&F>y-G`ig}3_cX+*d}^5%+QmmFw6lAVHQP^pU()>C^TZ5p@qlU>Ol=W73&Aw046na zO*!WPrx5Y@IULU*m*E_;Rm}POY|7tO`J)TOCQ=|Ul0+L_u>mr9XeQf~0`U@sY?Fr! z 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 X*Z(aJ{4?uG)aWgYrC(kD|2XhJIgrJt diff --git a/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.dll b/src/Microsoft.Maui.Graphics.Gtk/Microsoft.Maui.Graphics.dll deleted file mode 100644 index ce951f73d82bc063be03f941b1c1fcd48233da83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186368 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
        i-iA6H`0#^{~FxKT?yIUM6>; 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 D-MU|B diff --git a/src/Microsoft.Maui.Graphics.Gtk/ref/Microsoft.Maui.Graphics.Gtk.dll b/src/Microsoft.Maui.Graphics.Gtk/ref/Microsoft.Maui.Graphics.Gtk.dll deleted file mode 100644 index ab66bd62fc92b356bd79bb95a843922a22210032..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26112 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 z 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 From 4621942ca0711851621c92ddf8dbe8d40bf4c0db Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 11 Dec 2023 21:29:40 +0100 Subject: [PATCH 271/425] [Gtk] Core.csproj: ContentView, LayoutView: inherit from ICrossPlatformLayoutBacking --- .../src/Handlers/ContentView/ContentViewHandler.Gtk.cs | 10 ++++++++-- src/Core/src/Platform/Gtk/ContentView.cs | 10 ++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs index 90c621bcd9b6..70ad817979c4 100644 --- a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs @@ -5,8 +5,15 @@ namespace Microsoft.Maui.Handlers public partial class ContentViewHandler : ViewHandler { + protected override ContentView CreatePlatformView() + { + if (VirtualView == null) + { + throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a {nameof(ContentView)}"); + } - protected override ContentView CreatePlatformView() => new(); + return new ContentView { CrossPlatformLayout = VirtualView }; + } public void UpdateContent() { @@ -25,7 +32,6 @@ public static partial void MapContent(IContentViewHandler handler, IContentView contentViewHandler.UpdateContent(); } } - } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ContentView.cs b/src/Core/src/Platform/Gtk/ContentView.cs index 1af8361a3309..fd2570b12b1f 100644 --- a/src/Core/src/Platform/Gtk/ContentView.cs +++ b/src/Core/src/Platform/Gtk/ContentView.cs @@ -5,14 +5,11 @@ namespace Microsoft.Maui.Platform { - public class ContentView : Gtk.Box + public class ContentView : Gtk.Box, ICrossPlatformLayoutBacking { - public ContentView() : base(Orientation.Horizontal, 0) { } - internal Func? CrossPlatformMeasure { get; set; } - - internal Func? CrossPlatformArrange { get; set; } + public ICrossPlatformLayout? CrossPlatformLayout { get; set; } Widget? _content; @@ -24,7 +21,6 @@ public Widget? Content if (_content != null && value != null) { this.ReplaceChild(_content, value); - } else if (value != null) { @@ -32,10 +28,8 @@ public Widget? Content } _content = value; - } } - } } \ No newline at end of file From 27c33394e889219a01fdc86233135883c7fa4a64 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 11 Dec 2023 23:01:13 +0100 Subject: [PATCH 272/425] [Gtk] Core.csproj: ScrollView, ScrollViewHandler.Gtk: inherit from ICrossPlatformLayout --- .../ScrollView/ScrollViewHandler.Gtk.cs | 123 ++++++++++++------ src/Core/src/Platform/Gtk/ScrollView.cs | 8 ++ 2 files changed, 91 insertions(+), 40 deletions(-) diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 70f049ec0498..91ebd357908f 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -1,15 +1,17 @@ using System; using Gdk; using Gtk; -using Microsoft.Maui.Platform; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Layouts; using Point = Microsoft.Maui.Graphics.Point; +using Size = Microsoft.Maui.Graphics.Size; namespace Microsoft.Maui.Handlers { // https://docs.gtk.org/gtk3/class.ScrolledWindow.html - public partial class ScrollViewHandler : ViewHandler + public partial class ScrollViewHandler : ViewHandler, ICrossPlatformLayout { protected override ScrollView CreatePlatformView() @@ -19,6 +21,44 @@ protected override ScrollView CreatePlatformView() return s; } + Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double heightConstraint) + { + var scrollView = VirtualView; + + var padding = scrollView.Padding; + + if (scrollView.PresentedContent == null) + { + return new Size(padding.HorizontalThickness, padding.VerticalThickness); + } + + // Exclude the padding while measuring the internal content ... + var measurementWidth = widthConstraint - padding.HorizontalThickness; + var measurementHeight = heightConstraint - padding.VerticalThickness; + + var result = (scrollView as ICrossPlatformLayout).CrossPlatformMeasure(measurementWidth, measurementHeight); + + // ... and add the padding back in to the final result + var fullSize = new Size(result.Width + padding.HorizontalThickness, result.Height + padding.VerticalThickness); + + if (double.IsInfinity(widthConstraint)) + { + widthConstraint = result.Width; + } + + if (double.IsInfinity(heightConstraint)) + { + heightConstraint = result.Height; + } + + return fullSize.AdjustForFill(new Rect(0, 0, widthConstraint, heightConstraint), scrollView.PresentedContent); + } + + Size ICrossPlatformLayout.CrossPlatformArrange(Rect bounds) + { + return (VirtualView as ICrossPlatformLayout).CrossPlatformArrange(bounds); + } + public override void SetVirtualView(IView view) { base.SetVirtualView(view); @@ -58,15 +98,18 @@ public static void MapContent(IScrollViewHandler handler, IScrollView scrollView } } - protected override void ConnectHandler(ScrollView nativeView) + protected override void ConnectHandler(ScrollView platformView) { - base.ConnectHandler(nativeView); + base.ConnectHandler(platformView); + + platformView.CrossPlatformArrange = VirtualView.CrossPlatformArrange; + platformView.CrossPlatformMeasure = VirtualView.CrossPlatformMeasure; - nativeView.Vadjustment.ValueChanged += OnNativeViewValueChanged; - nativeView.Hadjustment.ValueChanged += OnNativeViewValueChanged; - ConnectButtonEvents(nativeView); - ConnectButtonEvents(nativeView.VScrollbar); - ConnectButtonEvents(nativeView.HScrollbar); + platformView.Vadjustment.ValueChanged += OnNativeViewValueChanged; + platformView.Hadjustment.ValueChanged += OnNativeViewValueChanged; + ConnectButtonEvents(platformView); + ConnectButtonEvents(platformView.VScrollbar); + ConnectButtonEvents(platformView.HScrollbar); } @@ -78,7 +121,7 @@ protected virtual void ConnectButtonEvents(Widget? widget) widget.ButtonPressEvent += OnNativeViewButtonPressEvent; widget.ButtonReleaseEvent += OnNativeViewButtonReleaseEvent; widget.ScrollEvent += OnNativeViewScrollEvent; - widget.MotionNotifyEvent += OnNativeViewotionNotifyEvent; + widget.MotionNotifyEvent += OnNativeViewMotionNotifyEvent; } protected virtual void DisconnectButtonEvents(Widget? widget) @@ -91,15 +134,15 @@ protected virtual void DisconnectButtonEvents(Widget? widget) } - protected override void DisconnectHandler(ScrollView nativeView) + protected override void DisconnectHandler(ScrollView platformView) { - base.OnDisconnectHandler(nativeView); + base.OnDisconnectHandler(platformView); - nativeView.Vadjustment.ValueChanged -= OnNativeViewValueChanged; - nativeView.Hadjustment.ValueChanged -= OnNativeViewValueChanged; - DisconnectButtonEvents(nativeView); - DisconnectButtonEvents(nativeView.VScrollbar); - DisconnectButtonEvents(nativeView.HScrollbar); + platformView.Vadjustment.ValueChanged -= OnNativeViewValueChanged; + platformView.Hadjustment.ValueChanged -= OnNativeViewValueChanged; + DisconnectButtonEvents(platformView); + DisconnectButtonEvents(platformView.VScrollbar); + DisconnectButtonEvents(platformView.HScrollbar); } bool _scrolling; @@ -117,7 +160,7 @@ void EndScrolling() _lastDelta = 0d; } - void OnNativeViewotionNotifyEvent(object o, MotionNotifyEventArgs args) + void OnNativeViewMotionNotifyEvent(object o, MotionNotifyEventArgs args) { _lastMotion = new Point(args.Event.X, args.Event.Y); @@ -231,49 +274,49 @@ public static void MapRequestScrollTo(IScrollViewHandler handler, IScrollView sc public static void MapOrientation(IScrollViewHandler handler, IScrollView view) { - if (handler?.PlatformView is not { } nativeView) + if (handler?.PlatformView is not { } platformView) return; switch (view.Orientation) { case ScrollOrientation.Both: - nativeView.PropagateNaturalWidth = true; - nativeView.PropagateNaturalHeight = true; - nativeView.SetPolicy(PolicyType.Automatic, PolicyType.Automatic); - nativeView.HScrollbar.Visible = true; - nativeView.VScrollbar.Visible = true; + platformView.PropagateNaturalWidth = true; + platformView.PropagateNaturalHeight = true; + platformView.SetPolicy(PolicyType.Automatic, PolicyType.Automatic); + platformView.HScrollbar.Visible = true; + platformView.VScrollbar.Visible = true; break; case ScrollOrientation.Horizontal: - nativeView.PropagateNaturalWidth = true; - nativeView.PropagateNaturalHeight = false; - nativeView.SetPolicy(PolicyType.Automatic, PolicyType.Never); - nativeView.HScrollbar.Visible = true; - nativeView.VScrollbar.Visible = false; + platformView.PropagateNaturalWidth = true; + platformView.PropagateNaturalHeight = false; + platformView.SetPolicy(PolicyType.Automatic, PolicyType.Never); + platformView.HScrollbar.Visible = true; + platformView.VScrollbar.Visible = false; break; case ScrollOrientation.Vertical: - nativeView.PropagateNaturalHeight = true; - nativeView.PropagateNaturalWidth = false; - nativeView.SetPolicy(PolicyType.Never, PolicyType.Automatic); - nativeView.HScrollbar.Visible = false; - nativeView.VScrollbar.Visible = true; + platformView.PropagateNaturalHeight = true; + platformView.PropagateNaturalWidth = false; + platformView.SetPolicy(PolicyType.Never, PolicyType.Automatic); + platformView.HScrollbar.Visible = false; + platformView.VScrollbar.Visible = true; break; case ScrollOrientation.Neither: - nativeView.PropagateNaturalWidth = false; - nativeView.PropagateNaturalHeight = false; - nativeView.SetPolicy(PolicyType.Never, PolicyType.Never); - nativeView.HScrollbar.Visible = false; - nativeView.VScrollbar.Visible = false; + platformView.PropagateNaturalWidth = false; + platformView.PropagateNaturalHeight = false; + platformView.SetPolicy(PolicyType.Never, PolicyType.Never); + platformView.HScrollbar.Visible = false; + platformView.VScrollbar.Visible = false; break; default: throw new ArgumentOutOfRangeException(); } - nativeView.ScrollOrientation = view.Orientation; + platformView.ScrollOrientation = view.Orientation; } public static void MapHorizontalScrollBarVisibility(IScrollViewHandler handler, IScrollView view) diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index 19a71d03cda2..9d7787ee8ee2 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -1,4 +1,6 @@ using System; +using Gtk; +using Microsoft.Maui.Graphics; namespace Microsoft.Maui.Platform { @@ -8,7 +10,13 @@ public class ScrollView : Gtk.ScrolledWindow public ScrollOrientation ScrollOrientation { get; set; } + internal Func? CrossPlatformArrange { get; set; } + internal Func? CrossPlatformMeasure { get; set; } + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + { + base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); + } } } \ No newline at end of file From 69128b0c15fbc77f1eee694b990fde63264e4772 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 12 Jan 2024 17:42:30 +0100 Subject: [PATCH 273/425] [Gtk] Core.csproj: try fix sizing --- .../src/Handlers/Layout/LayoutHandler.Gtk.cs | 1 + .../ScrollView/ScrollViewHandler.Gtk.cs | 3 + .../src/Handlers/View/ViewHandlerOfT.Gtk.cs | 2 +- .../src/Handlers/ViewHandlerExtensions.Gtk.cs | 6 +- src/Core/src/Platform/Gtk/LayoutView.cs | 122 +++++++----------- src/Core/src/Platform/Gtk/ScrollView.cs | 58 ++++++++- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 27 ++-- 7 files changed, 126 insertions(+), 93 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index c1874776a530..19b2a854ed62 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -111,6 +111,7 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra return Size.Zero; return nativeView.GetDesiredSize(widthConstraint, heightConstraint); + //return base.GetDesiredSize(widthConstraint, heightConstraint); } #endif diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 91ebd357908f..938430f41639 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -138,6 +138,9 @@ protected override void DisconnectHandler(ScrollView platformView) { base.OnDisconnectHandler(platformView); + platformView.CrossPlatformArrange = null; + platformView.CrossPlatformMeasure = null; + platformView.Vadjustment.ValueChanged -= OnNativeViewValueChanged; platformView.Hadjustment.ValueChanged -= OnNativeViewValueChanged; DisconnectButtonEvents(platformView); diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs index 422caad2d78d..f9d2794ea786 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Gtk.cs @@ -18,7 +18,7 @@ public override void PlatformArrange(Rect rect) } public override Size GetDesiredSize(double widthConstraint, double heightConstraint) - => PlatformView.GetDesiredSize(widthConstraint, heightConstraint); + => this.GetDesiredSizeFromHandler(widthConstraint, heightConstraint); protected override void SetupContainer() { } diff --git a/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs index 893eb7e1e91e..61745f1b1971 100644 --- a/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs +++ b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs @@ -54,7 +54,11 @@ internal static Size GetDesiredSizeFromHandler(this IViewHandler viewHandler, do return virtualView == null || double.IsNaN(virtualView.Width) || double.IsNaN(virtualView.Height) ? Size.Zero : new Size(virtualView.Width, virtualView.Height); } - throw new NotImplementedException(); + double? explicitWidth = (virtualView.Width >= 0) ? virtualView.Width : null; + double? explicitHeight = (virtualView.Height >= 0) ? virtualView.Height : null; + + Size measured = platformView.GetDesiredSize(widthConstraint, heightConstraint); + return new Size(explicitWidth ?? measured.Width, explicitHeight ?? measured.Height); } internal static void PlatformArrangeHandler(this IViewHandler viewHandler, Rect frame) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index bdb4650a8c2e..c317ad11c91e 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -11,6 +11,8 @@ using Size = Microsoft.Maui.Graphics.Size; using Point = Microsoft.Maui.Graphics.Point; +#pragma warning disable CS0162 // Unreachable code detected + namespace Microsoft.Maui.Platform { @@ -18,7 +20,6 @@ namespace Microsoft.Maui.Platform public class LayoutView : Container, IGtkContainer { - protected override bool OnDrawn(Cairo.Context cr) { var stc = this.StyleContext; @@ -78,9 +79,9 @@ Orientation GetOrientation() => var orientation = GetOrientation(); var focusChain = _children - .Select(c => c.widget) + .Select(c => c.widget) // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) - .ToArray(); + .ToArray(); FocusChain = focusChain; } @@ -129,7 +130,6 @@ public void Update(IView view, Widget widget, int index) _children[index] = (view, widget); Remove(replace.widget); Add(widget); - } protected override void OnAdded(Widget widget) @@ -147,7 +147,6 @@ protected override void OnRemoved(Widget widget) protected void AllocateChildren(Rectangle allocation) { - foreach (var cr in _children.ToArray()) { var w = cr.widget; @@ -170,7 +169,6 @@ protected void ArrangeAllocation(Rectangle allocation) return; VirtualView.CrossPlatformArrange(allocation); - } protected bool RestrictToMesuredAllocation { get; set; } = true; @@ -199,12 +197,10 @@ protected void ClearMeasured(bool clearCache = true) MeasuredSizeH = null; MeasuredSizeV = null; MeasuredMinimum = null; - } protected override void OnSizeAllocated(Gdk.Rectangle allocation) { - if (IsSizeAllocating) return; @@ -244,14 +240,12 @@ protected override void OnSizeAllocated(Gdk.Rectangle allocation) } base.OnSizeAllocated(allocation); - } finally { IsReallocating = false; IsSizeAllocating = false; } - } protected override void OnUnrealized() @@ -271,7 +265,6 @@ protected override void OnRealized() { LastAllocation = Allocation.ToRect(); Measure(Allocation.Width, Allocation.Height); - } catch { @@ -291,10 +284,9 @@ protected override void OnRealized() public Size Measure(double widthConstraint, double heightConstraint, SizeRequestMode mode = SizeRequestMode.ConstantSize) { - bool CanBeCached() => !double.IsPositiveInfinity(widthConstraint) && !double.IsPositiveInfinity(heightConstraint); - if (VirtualView is not { } virtualView) + if (VirtualView is not { } virtualView) return Size.Zero; var key = (widthConstraint, heightConstraint, mode); @@ -303,13 +295,12 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest bool cacheHit = CanBeCached() && MeasureCache.TryGetValue(key, out cached); - if (cacheHit) + if (cacheHit && false) { #if TRACE_ALLOCATION if (!_checkCacheHitFailed) #endif return cached; - } var measured = VirtualView.CrossPlatformMeasure(widthConstraint, heightConstraint); @@ -329,25 +320,31 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest return measured; } - protected Size MeasureMinimum() + protected Size MeasureMinimum(Orientation orientation, double constraint) { - if (MeasuredMinimum != null) + if (MeasuredMinimum != null && false) return MeasuredMinimum.Value; if (VirtualView is not { } virtualView) return Size.Zero; + var size = Size.Zero; // ensure all children have DesiredSize: + if (orientation == Orientation.Vertical) + size = Measure(double.PositiveInfinity, constraint); + else + size = Measure(constraint, double.PositiveInfinity); - Measure(0, double.PositiveInfinity); - - var desiredMinimum = virtualView.Aggregate(new Size(), + return size; + var desiredMinimum = virtualView.Aggregate(new Size(), (s, c) => new Size( - // this is only true if Layout is vertical? - Math.Max(s.Width, c.DesiredSize.Width), - s.Height + c.DesiredSize.Height)); + orientation == Orientation.Vertical ? Math.Max(s.Width, c.DesiredSize.Width) : s.Width + c.DesiredSize.Width, + orientation == Orientation.Vertical ? s.Height + c.DesiredSize.Height : Math.Max(s.Height, c.DesiredSize.Height)) + ); - MeasuredMinimum = Measure(desiredMinimum.Width, double.PositiveInfinity); + MeasuredMinimum = orientation == Orientation.Vertical + ? Measure(desiredMinimum.Width, double.PositiveInfinity) + : Measure(double.PositiveInfinity, desiredMinimum.Height); return MeasuredMinimum.Value; } @@ -364,70 +361,31 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min if (VirtualView is not { } virtualView) return; - var measuredMinimum = MeasureMinimum(); - double constraint = minimumSize; + if (orientation == Orientation.Horizontal) { - if (RequestMode is SizeRequestMode.WidthForHeight or SizeRequestMode.ConstantSize) - { - if (MeasuredSizeV is { Width : > 0 } size && (constraint == 0)) - constraint = size.Width; - - constraint = constraint == 0 ? double.PositiveInfinity : constraint; - } - else - { - ; - } - - MeasuredSizeH = constraint != 0 ? Measure(constraint, double.PositiveInfinity) : measuredMinimum; - - constraint = MeasuredSizeH.Value.Width; - + // constraint = constraint == 0 && MeasuredSizeV is { } size ? size.Height : constraint; + var measuredMinimum = MeasureMinimum(orientation, constraint); + MeasuredSizeH = measuredMinimum; minimumSize = (int)measuredMinimum.Width; - naturalSize = (int)constraint; + naturalSize = (int)minimumSize; } if (orientation == Orientation.Vertical) { - var widthContraint = double.PositiveInfinity; - - if (RequestMode is SizeRequestMode.HeightForWidth or SizeRequestMode.ConstantSize) - { - MeasuredSizeH ??= measuredMinimum; - - if (MeasuredSizeH is { } size && constraint == 0) - { - if (size.Height > 0) - constraint = size.Height; - - if (size.Width > 0) - widthContraint = size.Width; - } - - constraint = constraint == 0 ? double.PositiveInfinity : constraint; - - } - else - { - ; - } - - MeasuredSizeV = constraint != 0 ? Measure(widthContraint, constraint) : measuredMinimum; - - constraint = MeasuredSizeV.Value.Height; + constraint = constraint == 0 && MeasuredSizeH is { } size ? size.Width : constraint; + var measuredMinimum = MeasureMinimum(orientation, constraint); + MeasuredSizeV = measuredMinimum; minimumSize = (int)measuredMinimum.Height; - naturalSize = (int)constraint; - + naturalSize = (int)minimumSize; } } public void Arrange(Rectangle rect) { - if (rect.IsEmpty) return; @@ -435,7 +393,6 @@ public void Arrange(Rectangle rect) if (IsSizeAllocating) { - SizeAllocate(rect.ToNative()); return; @@ -447,8 +404,25 @@ public void Arrange(Rectangle rect) QueueAllocate(); } - protected int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; + public Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + if (VirtualView is not { } virtualView) + return new Size(widthConstraint, heightConstraint); + double? explicitWidth = (virtualView.Width >= 0) ? virtualView.Width : null; + double? explicitHeight = (virtualView.Height >= 0) ? virtualView.Height : null; + + var measuredSize = Measure(explicitWidth ?? widthConstraint, explicitHeight ?? heightConstraint); + + // apply width and height constraints if necessary + // var desiredWidth = Math.Min(measuredSize.Width, widthConstraint); + // var desiredHeight = Math.Min(measuredSize.Height, heightConstraint); + + // return new Size(desiredWidth, desiredHeight); + return measuredSize; + } + + protected int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index 9d7787ee8ee2..5826bbb6bab0 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -1,13 +1,18 @@ using System; +using Gdk; using Gtk; using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; +using Point = Microsoft.Maui.Graphics.Point; +using Size = Microsoft.Maui.Graphics.Size; + +#pragma warning disable CS0162 // Unreachable code detected namespace Microsoft.Maui.Platform { public class ScrollView : Gtk.ScrolledWindow { - public ScrollOrientation ScrollOrientation { get; set; } internal Func? CrossPlatformArrange { get; set; } @@ -16,6 +21,57 @@ public class ScrollView : Gtk.ScrolledWindow protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) { base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); + + double allocation = orientation == Orientation.Vertical ? AllocatedWidth : AllocatedHeight; + + double constraint = Math.Max(allocation, natural_size); + double hConstraint = AllocatedHeight; + double wConstraint = AllocatedWidth; + if (VscrollbarPolicy != PolicyType.Never) + { + hConstraint = double.PositiveInfinity; + } + + if (HscrollbarPolicy != PolicyType.Never) + { + wConstraint = double.PositiveInfinity; + } + + if (CrossPlatformMeasure is { }) + { + var size = Size.Zero; + size = orientation == Orientation.Vertical ? + new Size(constraint, hConstraint) : + new Size(wConstraint, constraint); + + var measure = CrossPlatformMeasure(size.Width, size.Height); + MaxContentHeight = (int)measure.Height; + MaxContentWidth = (int)measure.Width; + //minimum_size = natural_size = (int)(orientation == Orientation.Vertical ? measure.Width : measure.Height); + ; + } + } + + protected override void OnSizeAllocated(Gdk.Rectangle allocation) + { + if (CrossPlatformArrange is { } && CrossPlatformMeasure is { }) + { + var size = allocation.Size.ToSize(); + if (VscrollbarPolicy != PolicyType.Never) + { + size.Height = double.PositiveInfinity; + } + + if (HscrollbarPolicy != PolicyType.Never) + { + size.Width = double.PositiveInfinity; + } + + var measure = CrossPlatformMeasure(size.Width, size.Height); + CrossPlatformArrange(new Rect(Point.Zero, measure)); + } + + base.OnSizeAllocated(allocation); } } diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index da03d12d4e0f..ef2e19428a15 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -2,13 +2,13 @@ using Gtk; using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics.Platform.Gtk; +using Microsoft.Maui.Primitives; namespace Microsoft.Maui { public static class WidgetExtensions { - public static void UpdateIsEnabled(this Widget nativeView, bool isEnabled) => nativeView.Sensitive = isEnabled; @@ -81,9 +81,7 @@ public static SizeRequest GetDesiredSize( if (!heightConstrained) { nativeView.GetPreferredWidthForHeight(Math.Max(minimumHeight, naturalHeight), out minimumWidth, out naturalWidth); - } - } if (heightConstrained) @@ -94,7 +92,6 @@ public static SizeRequest GetDesiredSize( { nativeView.GetPreferredHeightForWidth(Math.Max(minimumWidth, naturalWidth), out minimumHeight, out naturalHeight); } - } return new SizeRequest(new Size(naturalWidth, naturalHeight), new Size(minimumWidth, minimumHeight)); @@ -131,7 +128,6 @@ public static void UpdateWidth(this Widget nativeView, IView view) nativeView.WidthRequest = widthRequest; nativeView.QueueResize(); } - } public static void UpdateHeight(this Widget nativeView, IView view) @@ -143,7 +139,6 @@ public static void UpdateHeight(this Widget nativeView, IView view) nativeView.HeightRequest = heightRequest; nativeView.QueueResize(); } - } public static void UpdateFont(this Widget nativeView, ITextStyle textStyle, IFontManager fontManager) @@ -154,7 +149,6 @@ public static void UpdateFont(this Widget nativeView, ITextStyle textStyle, IFon #pragma warning disable 612 nativeView.ModifyFont(fontFamily); #pragma warning restore 612 - } public static void ReplaceChild(this Gtk.Container cont, Gtk.Widget oldWidget, Gtk.Widget newWidget) @@ -219,21 +213,22 @@ public static void ReplaceChild(this Gtk.Container cont, Gtk.Widget oldWidget, G } [MissingMapper] - public static void UpdateMinimumHeight(this Widget nativeView, IView view) - { } + public static void UpdateMinimumHeight(this Widget platformView, IView view) + { + UpdateHeight(platformView, view); + } [MissingMapper] - public static void UpdateMinimumWidth(this Widget nativeView, IView view) - { } + public static void UpdateMinimumWidth(this Widget platformView, IView view) + { + UpdateWidth(platformView, view); + } [MissingMapper] - public static void UpdateMaximumHeight(this Widget nativeView, IView view) - { } + public static void UpdateMaximumHeight(this Widget nativeView, IView view) { } [MissingMapper] - public static void UpdateMaximumWidth(this Widget nativeView, IView view) - { } - + public static void UpdateMaximumWidth(this Widget nativeView, IView view) { } } } \ No newline at end of file From d5aa7a7c2d8944440498126feb5f8f6cd771ea36 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 12 Jan 2024 19:15:26 +0100 Subject: [PATCH 274/425] [Gtk] Core.csproj: try fix sizing II --- .../src/Handlers/Layout/LayoutHandler.Gtk.cs | 4 ++-- src/Core/src/Platform/Gtk/LayoutView.cs | 24 ++++++++++++------- src/Core/src/Platform/Gtk/ScrollView.cs | 4 ++-- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 19b2a854ed62..3096be26d929 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -107,10 +107,10 @@ public override void PlatformArrange(Rect rect) public override Size GetDesiredSize(double widthConstraint, double heightConstraint) { - if (PlatformView is not { } nativeView) + if (PlatformView is not { } platformView) return Size.Zero; - return nativeView.GetDesiredSize(widthConstraint, heightConstraint); + return platformView.GetDesiredSize(widthConstraint, heightConstraint); //return base.GetDesiredSize(widthConstraint, heightConstraint); } diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index c317ad11c91e..62ded5b5eb16 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -192,10 +192,11 @@ protected void ClearMeasured(bool clearCache = true) if (clearCache && !MeasureCache.IsEmpty) { MeasureCache.Clear(); + MeasuredSizeH = null; + MeasuredSizeV = null; } - MeasuredSizeH = null; - MeasuredSizeV = null; + MeasuredMinimum = null; } @@ -224,10 +225,11 @@ protected override void OnSizeAllocated(Gdk.Rectangle allocation) LastAllocation = mAllocation; - var mesuredAllocation = Measure(allocation.Width, allocation.Height); - if (RestrictToMesuredAllocation) + { + var mesuredAllocation = Measure(allocation.Width, allocation.Height); mAllocation.Size = mesuredAllocation; + } ArrangeAllocation(new Rectangle(Point.Zero, mAllocation.Size)); AllocateChildren(mAllocation); @@ -361,13 +363,17 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min if (VirtualView is not { } virtualView) return; - double constraint = minimumSize; + double allocation = orientation == Orientation.Vertical ? AllocatedWidth : AllocatedHeight; + double constraint = Math.Max(allocation, naturalSize); + double hConstraint = IsReallocating ? AllocatedHeight : double.PositiveInfinity; + double wConstraint = IsReallocating ? AllocatedWidth : 0; if (orientation == Orientation.Horizontal) { // constraint = constraint == 0 && MeasuredSizeV is { } size ? size.Height : constraint; - var measuredMinimum = MeasureMinimum(orientation, constraint); + var size = new Size(wConstraint, constraint); + var measuredMinimum = Measure(size.Width, size.Height); MeasuredSizeH = measuredMinimum; minimumSize = (int)measuredMinimum.Width; naturalSize = (int)minimumSize; @@ -375,9 +381,9 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min if (orientation == Orientation.Vertical) { - constraint = constraint == 0 && MeasuredSizeH is { } size ? size.Width : constraint; - - var measuredMinimum = MeasureMinimum(orientation, constraint); + constraint = constraint == 0 && MeasuredSizeH is { } hsize ? hsize.Width : constraint; + var size = new Size(constraint, hConstraint); + var measuredMinimum = Measure(size.Width, size.Height); MeasuredSizeV = measuredMinimum; minimumSize = (int)measuredMinimum.Height; naturalSize = (int)minimumSize; diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index 5826bbb6bab0..1222fc4f5f4a 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -18,7 +18,7 @@ public class ScrollView : Gtk.ScrolledWindow internal Func? CrossPlatformArrange { get; set; } internal Func? CrossPlatformMeasure { get; set; } - protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + protected void OnAdjustSizeRequest_(Orientation orientation, out int minimum_size, out int natural_size) { base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); @@ -52,7 +52,7 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min } } - protected override void OnSizeAllocated(Gdk.Rectangle allocation) + protected void OnSizeAllocated_(Gdk.Rectangle allocation) { if (CrossPlatformArrange is { } && CrossPlatformMeasure is { }) { From 3bdcfc134cb68c776f7bfa6d250e238812eaa0f2 Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 12 Jan 2024 19:17:53 +0100 Subject: [PATCH 275/425] [Gtk] Controls.Sample.Gtk: adjust to test Sizing --- .../Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs | 2 +- .../samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 6de27453131e..1d25bcb621f4 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -421,7 +421,7 @@ void SetupMauiLayout() verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); - Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Both }; + Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Vertical }; } public IView View { get => (IView)Content; set => Content = (View)value; } diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs index f1c575adc5dd..e11b06d93d49 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/Startup.cs @@ -64,13 +64,17 @@ public static MauiApp CreateMauiApp() // Log everything in this one events.AddGtk(gtk => gtk + .OnCreated((window, args) => + { + window.WidthRequest = 800; + window.HeightRequest = 800; + }) .OnActivated((a, b) => LogEvent(nameof(GtkLifecycle.OnApplicationActivated))) .OnClosed((a, b) => LogEvent(nameof(GtkLifecycle.OnHidden))) .OnLaunched((a, b) => LogEvent(nameof(GtkLifecycle.OnLaunched))) .OnShown((a, b) => { LogEvent(nameof(GtkLifecycle.OnShown)); - a.Maximize(); }) ); From ac871dfad6d32b6c948f1071c4ecd1a6eb5dd1a3 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 16 Jan 2024 18:46:35 +0100 Subject: [PATCH 276/425] [Gtk] Core.csproj: try fix sizing III --- .../SimpleSampleApp/ExamplePage.cs | 2 +- src/Core/src/Platform/Gtk/LayoutView.cs | 62 ++++++++++--------- src/Core/src/Platform/Gtk/ScrollView.cs | 4 +- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 1d25bcb621f4..903fdb6f1b6e 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -421,7 +421,7 @@ void SetupMauiLayout() verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); - Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Vertical }; + Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Horizontal }; } public IView View { get => (IView)Content; set => Content = (View)value; } diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 62ded5b5eb16..aefe0d098035 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -18,8 +18,11 @@ namespace Microsoft.Maui.Platform // refactored from: https://github.com/mono/xwt/blob/501f6b529fca632655295169094f637627c74c47/Xwt.Gtk/Xwt.GtkBackend/BoxBackend.cs + // see: https://github.com/linuxmint/gtk/blob/master/gtk/gtkcontainer.c + public class LayoutView : Container, IGtkContainer { + protected override bool OnDrawn(Cairo.Context cr) { var stc = this.StyleContext; @@ -79,9 +82,9 @@ Orientation GetOrientation() => var orientation = GetOrientation(); var focusChain = _children - .Select(c => c.widget) + .Select(c => c.widget) // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) - .ToArray(); + .ToArray(); FocusChain = focusChain; } @@ -173,7 +176,7 @@ protected void ArrangeAllocation(Rectangle allocation) protected bool RestrictToMesuredAllocation { get; set; } = true; - protected bool RestrictToMeasuredArrange { get; set; } = true; + protected bool RestrictToMeasuredArrange { get; set; } = false; protected bool IsReallocating; @@ -196,7 +199,6 @@ protected void ClearMeasured(bool clearCache = true) MeasuredSizeV = null; } - MeasuredMinimum = null; } @@ -322,35 +324,20 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest return measured; } - protected Size MeasureMinimum(Orientation orientation, double constraint) + protected override void OnGetPreferredHeightForWidth(int width, out int minimum_height, out int natural_height) { - if (MeasuredMinimum != null && false) - return MeasuredMinimum.Value; + base.OnGetPreferredHeightForWidth(width, out minimum_height, out natural_height); - if (VirtualView is not { } virtualView) - return Size.Zero; + } + + protected override void OnGetPreferredWidthForHeight(int height, out int minimum_width, out int natural_width) + { + base.OnGetPreferredWidthForHeight(height, out minimum_width, out natural_width); - var size = Size.Zero; - // ensure all children have DesiredSize: - if (orientation == Orientation.Vertical) - size = Measure(double.PositiveInfinity, constraint); - else - size = Measure(constraint, double.PositiveInfinity); - - return size; - var desiredMinimum = virtualView.Aggregate(new Size(), - (s, c) => new Size( - orientation == Orientation.Vertical ? Math.Max(s.Width, c.DesiredSize.Width) : s.Width + c.DesiredSize.Width, - orientation == Orientation.Vertical ? s.Height + c.DesiredSize.Height : Math.Max(s.Height, c.DesiredSize.Height)) - ); - - MeasuredMinimum = orientation == Orientation.Vertical - ? Measure(desiredMinimum.Width, double.PositiveInfinity) - : Measure(double.PositiveInfinity, desiredMinimum.Height); - - return MeasuredMinimum.Value; } + // see: https://github.com/linuxmint/gtk/blob/158a2b0e1e8d582bc041acc7fe323922747d7787/gtk/gtksizerequest.c#L362 + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) { base.OnAdjustSizeRequest(orientation, out minimumSize, out naturalSize); @@ -369,6 +356,13 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min double hConstraint = IsReallocating ? AllocatedHeight : double.PositiveInfinity; double wConstraint = IsReallocating ? AllocatedWidth : 0; + var requestMode = RequestMode; + + if (requestMode != SizeRequestMode.HeightForWidth) + { + ; + } + if (orientation == Orientation.Horizontal) { // constraint = constraint == 0 && MeasuredSizeV is { } size ? size.Height : constraint; @@ -404,8 +398,15 @@ public void Arrange(Rectangle rect) return; } - var measuredArrange = Measure(rect.Width, rect.Height); - var alloc = new Rectangle(rect.Location, RestrictToMeasuredArrange ? measuredArrange : rect.Size); + var size = rect.Size; + + if (RestrictToMeasuredArrange) + { + var measuredArrange = Measure(rect.Width, rect.Height); + size = measuredArrange; + } + + var alloc = new Rectangle(rect.Location, size); SizeAllocate(alloc.ToNative()); QueueAllocate(); } @@ -429,6 +430,7 @@ public Size GetDesiredSize(double widthConstraint, double heightConstraint) } protected int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index 1222fc4f5f4a..68e6379f167b 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -18,7 +18,7 @@ public class ScrollView : Gtk.ScrolledWindow internal Func? CrossPlatformArrange { get; set; } internal Func? CrossPlatformMeasure { get; set; } - protected void OnAdjustSizeRequest_(Orientation orientation, out int minimum_size, out int natural_size) + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) { base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); @@ -52,7 +52,7 @@ protected void OnAdjustSizeRequest_(Orientation orientation, out int minimum_si } } - protected void OnSizeAllocated_(Gdk.Rectangle allocation) + protected void OnSizeAllocated_ (Gdk.Rectangle allocation) { if (CrossPlatformArrange is { } && CrossPlatformMeasure is { }) { From 43e44af39e42b8391cea1a38bc9b45cd33af96c7 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 6 Feb 2024 21:46:01 +0100 Subject: [PATCH 277/425] try fix sizing --- .../SimpleSampleApp/ExamplePage.cs | 2 +- .../src/Handlers/Layout/LayoutHandler.Gtk.cs | 2 +- src/Core/src/Platform/Gtk/LayoutView.cs | 80 ++++++++++++++++--- src/Core/src/Platform/Gtk/ScrollView.cs | 2 +- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 79 ++++++++++-------- 5 files changed, 115 insertions(+), 50 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 903fdb6f1b6e..1d25bcb621f4 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -421,7 +421,7 @@ void SetupMauiLayout() verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); - Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Horizontal }; + Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Vertical }; } public IView View { get => (IView)Content; set => Content = (View)value; } diff --git a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs index 3096be26d929..bf94c3ac1f44 100644 --- a/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs +++ b/src/Core/src/Handlers/Layout/LayoutHandler.Gtk.cs @@ -99,7 +99,7 @@ public void Update(int index, IView child) PlatformView.QueueAllocate(); } -#if DEBUG +#if DEBUG_ public override void PlatformArrange(Rect rect) { PlatformView?.Arrange(rect); diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index aefe0d098035..3de7a01ab6ff 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -1,5 +1,5 @@ #define TRACE_ALLOCATION - +#define USE_ADJUSTSIZEREQUEST_ using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -22,7 +22,6 @@ namespace Microsoft.Maui.Platform public class LayoutView : Container, IGtkContainer { - protected override bool OnDrawn(Cairo.Context cr) { var stc = this.StyleContext; @@ -82,9 +81,9 @@ Orientation GetOrientation() => var orientation = GetOrientation(); var focusChain = _children - .Select(c => c.widget) + .Select(c => c.widget) // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) - .ToArray(); + .ToArray(); FocusChain = focusChain; } @@ -174,7 +173,7 @@ protected void ArrangeAllocation(Rectangle allocation) VirtualView.CrossPlatformArrange(allocation); } - protected bool RestrictToMesuredAllocation { get; set; } = true; + protected bool RestrictToMeasuredAllocation { get; set; } = true; protected bool RestrictToMeasuredArrange { get; set; } = false; @@ -227,7 +226,7 @@ protected override void OnSizeAllocated(Gdk.Rectangle allocation) LastAllocation = mAllocation; - if (RestrictToMesuredAllocation) + if (RestrictToMeasuredAllocation) { var mesuredAllocation = Measure(allocation.Width, allocation.Height); mAllocation.Size = mesuredAllocation; @@ -324,18 +323,70 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest return measured; } +#if !USE_ADJUSTSIZEREQUEST + + // protected override SizeRequestMode OnGetRequestMode() + // { + // // dirty fix: unwrapped labels report fixed sizes, forcing parents to fixed mode + // // -> report always width_for_height, since we don't support angles + // return Gtk.SizeRequestMode.WidthForHeight; + // } + + + protected override void OnGetPreferredHeight(out int minimum_height, out int natural_height) + { + base.OnGetPreferredHeight(out minimum_height, out natural_height); + // containers need initial width in height_for_width mode + // dirty fix: do not constrain width on first allocation + var force_width = double.PositiveInfinity; + if (IsReallocating) + force_width = Allocation.Width; + var size = Measure(force_width, minimum_height > 0 ? minimum_height : double.PositiveInfinity); + if (size.Height < HeightRequest) + minimum_height = natural_height = HeightRequest; + else + minimum_height = natural_height = (int)size.Height; + } + + protected override void OnGetPreferredWidth(out int minimum_width, out int natural_width) + { + base.OnGetPreferredWidth(out minimum_width, out natural_width); + // containers need initial height in width_for_height mode + // dirty fix: do not constrain height on first allocation + var force_height = double.PositiveInfinity; + if (IsReallocating) + force_height = Allocation.Height; + var size = Measure(minimum_width > 0 ? minimum_width : double.PositiveInfinity, force_height); + if (size.Width < WidthRequest) + minimum_width = natural_width = WidthRequest; + else + minimum_width = natural_width = (int)size.Width; + } + protected override void OnGetPreferredHeightForWidth(int width, out int minimum_height, out int natural_height) { base.OnGetPreferredHeightForWidth(width, out minimum_height, out natural_height); - + var size = Measure(width, minimum_height > 0 ? minimum_height : double.PositiveInfinity); + if (size.Height < HeightRequest) + minimum_height = natural_height = HeightRequest; + else + minimum_height = natural_height = (int)size.Height; } protected override void OnGetPreferredWidthForHeight(int height, out int minimum_width, out int natural_width) { base.OnGetPreferredWidthForHeight(height, out minimum_width, out natural_width); - + var size = Measure(minimum_width > 0 ? minimum_width : double.PositiveInfinity, height); + if (size.Width < WidthRequest) + minimum_width = natural_width = WidthRequest; + else + minimum_width = natural_width = (int)size.Width; } +#endif + +#if USE_ADJUSTSIZEREQUEST + // see: https://github.com/linuxmint/gtk/blob/158a2b0e1e8d582bc041acc7fe323922747d7787/gtk/gtksizerequest.c#L362 protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) @@ -352,7 +403,6 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min double allocation = orientation == Orientation.Vertical ? AllocatedWidth : AllocatedHeight; - double constraint = Math.Max(allocation, naturalSize); double hConstraint = IsReallocating ? AllocatedHeight : double.PositiveInfinity; double wConstraint = IsReallocating ? AllocatedWidth : 0; @@ -366,7 +416,9 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min if (orientation == Orientation.Horizontal) { // constraint = constraint == 0 && MeasuredSizeV is { } size ? size.Height : constraint; - var size = new Size(wConstraint, constraint); + if (minimumSize > 0) + wConstraint = minimumSize; + var size = new Size(wConstraint, hConstraint); var measuredMinimum = Measure(size.Width, size.Height); MeasuredSizeH = measuredMinimum; minimumSize = (int)measuredMinimum.Width; @@ -375,14 +427,17 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min if (orientation == Orientation.Vertical) { - constraint = constraint == 0 && MeasuredSizeH is { } hsize ? hsize.Width : constraint; - var size = new Size(constraint, hConstraint); + // constraint = constraint == 0 && MeasuredSizeH is { } hsize ? hsize.Width : constraint; + if (minimumSize > 0) + hConstraint = minimumSize; + var size = new Size(wConstraint, hConstraint); var measuredMinimum = Measure(size.Width, size.Height); MeasuredSizeV = measuredMinimum; minimumSize = (int)measuredMinimum.Height; naturalSize = (int)minimumSize; } } +#endif public void Arrange(Rectangle rect) { @@ -430,7 +485,6 @@ public Size GetDesiredSize(double widthConstraint, double heightConstraint) } protected int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; - } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index 68e6379f167b..db4eb40a2865 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -18,7 +18,7 @@ public class ScrollView : Gtk.ScrolledWindow internal Func? CrossPlatformArrange { get; set; } internal Func? CrossPlatformMeasure { get; set; } - protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + protected void OnAdjustSizeRequest_(Orientation orientation, out int minimum_size, out int natural_size) { base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index ef2e19428a15..7b9bef47b9ae 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -46,53 +46,64 @@ public static SizeRequest GetDesiredSize( var widthConstrained = !double.IsPositiveInfinity(widthConstraint); var heightConstrained = !double.IsPositiveInfinity(heightConstraint); - if (nativeView.RequestMode == SizeRequestMode.HeightForWidth) - { - ; - } - - if (nativeView.RequestMode == SizeRequestMode.WidthForHeight) - { - ; - } - - if (nativeView.RequestMode == SizeRequestMode.ConstantSize) - { - ; - } - - if (!widthConstrained && !heightConstrained) - { - // https://docs.gtk.org/gtk3/method.Widget.get_preferred_size.html - nativeView.GetPreferredSize(out var minimumSize, out var req); - - return new SizeRequest(req.ToSize(), minimumSize.ToSize()); - } - int minimumHeight = 0; int naturalHeight = 0; int minimumWidth = 0; int naturalWidth = 0; - if (widthConstrained) + if (nativeView.RequestMode == SizeRequestMode.WidthForHeight) { - nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); - - if (!heightConstrained) + if (widthConstrained) + { + nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); + } + else if (heightConstrained) + { + nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); + } + else if ((heightConstrained) && (widthConstrained)) + { + minimumWidth = naturalWidth = (int)widthConstraint; + minimumHeight = naturalHeight = (int)heightConstraint; + } + else { - nativeView.GetPreferredWidthForHeight(Math.Max(minimumHeight, naturalHeight), out minimumWidth, out naturalWidth); + nativeView.GetPreferredHeight(out minimumHeight, out naturalHeight); + nativeView.GetPreferredWidthForHeight(minimumHeight, out minimumWidth, out naturalWidth); } } - - if (heightConstrained) + else if (nativeView.RequestMode == Gtk.SizeRequestMode.HeightForWidth) { - nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); - - if (!widthConstrained) + if (heightConstrained) + { + nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); + } + else if (widthConstrained) { - nativeView.GetPreferredHeightForWidth(Math.Max(minimumWidth, naturalWidth), out minimumHeight, out naturalHeight); + nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); + } + else if ((heightConstrained) && (widthConstrained)) + { + minimumWidth = naturalWidth = (int)widthConstraint; + minimumHeight = naturalHeight = (int)heightConstraint; + } + else + { + nativeView.GetPreferredWidth(out minimumWidth, out naturalWidth); + nativeView.GetPreferredHeightForWidth(minimumWidth, out minimumHeight, out naturalHeight); } } + else + { + nativeView.GetPreferredWidth(out minimumWidth, out naturalWidth); + nativeView.GetPreferredHeightForWidth(minimumWidth, out minimumHeight, out naturalHeight); + } + + if (nativeView.WidthRequest > minimumWidth) + minimumWidth = nativeView.WidthRequest; + if (nativeView.HeightRequest > minimumHeight) + minimumHeight = nativeView.HeightRequest; + return new SizeRequest(new Size(naturalWidth, naturalHeight), new Size(minimumWidth, minimumHeight)); } From d4bb66f8f7e9669d820c44f5519747162850030c Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Tue, 13 Feb 2024 10:47:31 -0600 Subject: [PATCH 278/425] Update GitInfo.txt (#20554) --- GitInfo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitInfo.txt b/GitInfo.txt index cfd83910c219..404f7d9a1135 100644 --- a/GitInfo.txt +++ b/GitInfo.txt @@ -1 +1 @@ -8.0.7-preview +8.0.7 From 3c9fbb3c2ea142660c05e8349089a805dfcd6923 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 19 Feb 2024 22:24:42 +0100 Subject: [PATCH 279/425] [Gtk] Controls.Sample.Gtk: adjust to test Sizing of Label --- .../SimpleSampleApp/ExamplePage.cs | 418 +++++++++++++++--- 1 file changed, 354 insertions(+), 64 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 1d25bcb621f4..535ef0be5ba2 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -9,12 +9,17 @@ using Microsoft.Maui.Graphics.Platform.Gtk; using Debug = System.Diagnostics.Debug; using IImage = Microsoft.Maui.Graphics.IImage; +using ILayout = Microsoft.Maui.ILayout; using LineBreakMode = Microsoft.Maui.LineBreakMode; +#pragma warning disable CS0162 // Unreachable code detected + namespace Maui.SimpleSampleApp { + public class ExamplePage : BasePage { + readonly IServiceProvider _services; readonly MainPageViewModel _viewModel; @@ -27,6 +32,8 @@ public class ExamplePage : BasePage "Cras rutrum scelerisque elit, et porta est lobortis ac. " + "Pellentesque eu ornare tortor. Sed bibendum a nisl at laoreet."; + const bool ShowLorem = true; + public ExamplePage(IServiceProvider services, MainPageViewModel viewModel) { _services = services; @@ -35,10 +42,28 @@ public ExamplePage(IServiceProvider services, MainPageViewModel viewModel) // SetupMauiLayoutLayouts(); // SetupMauiLayoutSimple(); - SetupMauiLayout(); + //SetupMauiLayout(); + SetupMauiLorem(); // SetupMauiLayoutDrawables(); } + void SetupMauiLorem() + { + var verticalStack = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.AntiqueWhite + }; + + AddLorem(verticalStack); + + Content = new ScrollView + { + Content = verticalStack, + Orientation = ScrollOrientation.Vertical + }; + } + void SetupMauiLayoutLayouts() { void Fill(Layout l, string m, int count, Color bkCol) @@ -61,20 +86,36 @@ void Fill(Layout l, string m, int count, Color bkCol) } } - var verticalStack1 = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.WhiteSmoke, }; + var verticalStack1 = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.WhiteSmoke, + }; - var verticalStack2 = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.LightYellow, }; + var verticalStack2 = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.LightYellow, + }; Fill(verticalStack2, nameof(verticalStack2), 4, Colors.Coral); - var horizontalStack1 = new HorizontalStackLayout() { Spacing = 5, BackgroundColor = Colors.NavajoWhite, }; + var horizontalStack1 = new HorizontalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.NavajoWhite, + }; Fill(horizontalStack1, nameof(horizontalStack1), 4, Colors.Aquamarine); verticalStack1.Add(verticalStack2); verticalStack1.Add(horizontalStack1); - var verticalStack3 = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.Lime, }; + var verticalStack3 = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.Lime, + }; verticalStack3.Add(new Label { @@ -97,9 +138,18 @@ void SetupMauiLayoutDrawables() void SetupMauiLayoutButtonSpacing() { - var verticalStack = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.WhiteSmoke, }; + var verticalStack = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.WhiteSmoke, + }; - var label = new Label { Text = "a label", HorizontalTextAlignment = TextAlignment.Center, VerticalTextAlignment = TextAlignment.Center }; + var label = new Label + { + Text = "a label", + HorizontalTextAlignment = TextAlignment.Center, + VerticalTextAlignment = TextAlignment.Center + }; verticalStack.Add(label); @@ -150,7 +200,10 @@ void SetupMauiLayoutButtonSpacing() var button2 = new Button { - Padding = new Thickness(10), Text = "Change the button!", BackgroundColor = Colors.Green, TextColor = Colors.Yellow, + Padding = new Thickness(10), + Text = "Change the button!", + BackgroundColor = Colors.Green, + TextColor = Colors.Yellow, }; button2.Clicked += (sender, args) => @@ -165,7 +218,11 @@ void SetupMauiLayoutButtonSpacing() button.Clicked += (s, e) => activityIndicator.IsRunning = !activityIndicator.IsRunning; verticalStack.Add(activityIndicator); - var editor = new Editor { Placeholder = "write something longer", Margin = new Thickness(5), }; + var editor = new Editor + { + Placeholder = "write something longer", + Margin = new Thickness(5), + }; button.Clicked += (s, e) => { @@ -177,57 +234,138 @@ void SetupMauiLayoutButtonSpacing() Content = verticalStack; } + void AddLorem(ILayout verticalStack) + { + verticalStack.Add(new Label { Text = LoremIpsum }); + + verticalStack.Add(new Label + { + Text = LoremIpsum, + MaxLines = 2 + }); + + verticalStack.Add(new Label + { + Text = LoremIpsum, + LineBreakMode = LineBreakMode.TailTruncation + }); + + verticalStack.Add(new Label + { + Text = LoremIpsum, + MaxLines = 2, + LineBreakMode = LineBreakMode.TailTruncation, + WidthRequest = 200 + }); + + verticalStack.Add(new Label + { + Text = "This should have five times the line height! " + LoremIpsum, + LineHeight = 5, + MaxLines = 2 + }); + } + void SetupMauiLayout() { - var verticalStack = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.AntiqueWhite }; + var verticalStack = new VerticalStackLayout() + { + Spacing = 5, + BackgroundColor = Colors.AntiqueWhite + }; - var horizontalStack = new HorizontalStackLayout() { Spacing = 2, BackgroundColor = Colors.CornflowerBlue }; + var horizontalStack = new HorizontalStackLayout() + { + Spacing = 2, + BackgroundColor = Colors.CornflowerBlue + }; verticalStack.Add(CreateSampleGrid()); - verticalStack.Add(new Label { Text = " ", Padding = new Thickness(10) }); + verticalStack.Add(new Label + { + Text = " ", + Padding = new Thickness(10) + }); - var label = new Label { Text = "End-aligned text", BackgroundColor = Colors.Fuchsia, HorizontalTextAlignment = TextAlignment.End, Margin = new Thickness(15, 10, 20, 15) }; + var label = new Label + { + Text = "End-aligned text", + BackgroundColor = Colors.Fuchsia, + HorizontalTextAlignment = TextAlignment.End, + Margin = new Thickness(15, 10, 20, 15) + }; SemanticProperties.SetHint(label, "Hint Text"); SemanticProperties.SetDescription(label, "Description Text"); verticalStack.Add(label); - verticalStack.Add(new Label { Text = "This should be BIG text!", FontSize = 24, HorizontalOptions = LayoutOptions.End }); + verticalStack.Add(new Label + { + Text = "This should be BIG text!", + FontSize = 24, + HorizontalOptions = LayoutOptions.End + }); SemanticProperties.SetHeadingLevel((BindableObject)verticalStack.Children.Last(), SemanticHeadingLevel.Level1); - verticalStack.Add(new Label { Text = "This should be BOLD text!", FontAttributes = FontAttributes.Bold, HorizontalOptions = LayoutOptions.Center }); - - verticalStack.Add(new Label { Text = "This should be a CUSTOM font!", FontFamily = "Dokdo" }); - - verticalStack.Add(new Label { Text = "This should have padding", Padding = new Thickness(40), BackgroundColor = Colors.LightBlue }); - - verticalStack.Add(new Label { Text = LoremIpsum }); - - verticalStack.Add(new Label { Text = LoremIpsum, MaxLines = 2 }); + verticalStack.Add(new Label + { + Text = "This should be BOLD text!", + FontAttributes = FontAttributes.Bold, + HorizontalOptions = LayoutOptions.Center + }); - verticalStack.Add(new Label { Text = LoremIpsum, LineBreakMode = LineBreakMode.TailTruncation }); + verticalStack.Add(new Label + { + Text = "This should be a CUSTOM font!", + FontFamily = "Dokdo" + }); - verticalStack.Add(new Label { Text = LoremIpsum, MaxLines = 2, LineBreakMode = LineBreakMode.TailTruncation, WidthRequest = 200 }); + verticalStack.Add(new Label + { + Text = "This should have padding", + Padding = new Thickness(40), + BackgroundColor = Colors.LightBlue + }); - verticalStack.Add(new Label { Text = "This should have five times the line height! " + LoremIpsum, LineHeight = 5, MaxLines = 2 }); + if (ShowLorem) + { + AddLorem(verticalStack); + } SemanticProperties.SetHeadingLevel((BindableObject)verticalStack.Children.Last(), SemanticHeadingLevel.Level2); - var visibleClearButtonEntry = new Entry() { ClearButtonVisibility = ClearButtonVisibility.WhileEditing, Placeholder = "This Entry will show clear button if has input." }; + var visibleClearButtonEntry = new Entry() + { + ClearButtonVisibility = ClearButtonVisibility.WhileEditing, + Placeholder = "This Entry will show clear button if has input." + }; - var hiddenClearButtonEntry = new Entry() { ClearButtonVisibility = ClearButtonVisibility.Never, Placeholder = "This Entry will not..." }; + var hiddenClearButtonEntry = new Entry() + { + ClearButtonVisibility = ClearButtonVisibility.Never, + Placeholder = "This Entry will not..." + }; verticalStack.Add(visibleClearButtonEntry); verticalStack.Add(hiddenClearButtonEntry); - var paddingButton = new Button { Padding = new Thickness(40), Text = "This button has a padding!!", BackgroundColor = Colors.Purple, }; + var paddingButton = new Button + { + Padding = new Thickness(40), + Text = "This button has a padding!!", + BackgroundColor = Colors.Purple, + }; verticalStack.Add(paddingButton); - var underlineLabel = new Label { Text = (TextDecorations.Underline | TextDecorations.Strikethrough).ToString(), TextDecorations = TextDecorations.Underline | TextDecorations.Strikethrough }; + var underlineLabel = new Label + { + Text = (TextDecorations.Underline | TextDecorations.Strikethrough).ToString(), + TextDecorations = TextDecorations.Underline | TextDecorations.Strikethrough + }; verticalStack.Add(underlineLabel); IImage image = default; @@ -239,7 +377,11 @@ void SetupMauiLayout() var paint = image.AsPaint(); - var labelImage = new Label { Text = "this has backgroudImage", Background = paint }; + var labelImage = new Label + { + Text = "this has backgroudImage", + Background = paint + }; // Background is null cause there is no ImageBrush if (labelImage.Background != null) @@ -247,16 +389,31 @@ void SetupMauiLayout() var labelG = new Label { - Text = "this has gradient", Background = new RadialGradientBrush(new GradientStopCollection { new(Colors.Aqua, 0), new(Colors.Green, 10), }), Padding = new Thickness(30), Margin = new Thickness(10), + Text = "this has gradient", + Background = new RadialGradientBrush(new GradientStopCollection + { + new(Colors.Aqua, 0), + new(Colors.Green, 10), + }), + Padding = new Thickness(30), + Margin = new Thickness(10), }; verticalStack.Add(labelG); verticalStack.Add(new ActivityIndicator()); - verticalStack.Add(new ActivityIndicator { Color = Colors.Red, IsRunning = true }); + verticalStack.Add(new ActivityIndicator + { + Color = Colors.Red, + IsRunning = true + }); - var button = new Button() { Text = _viewModel.Text, WidthRequest = 200 }; + var button = new Button() + { + Text = _viewModel.Text, + WidthRequest = 200 + }; // button.Clicked += async (sender, e) => // { @@ -269,17 +426,29 @@ void SetupMauiLayout() var button2 = new Button() { - TextColor = Colors.Green, Text = "Hello I'm a button", BackgroundColor = Colors.Purple, Margin = new Thickness(12), + TextColor = Colors.Green, + Text = "Hello I'm a button", + BackgroundColor = Colors.Purple, + Margin = new Thickness(12), }; horizontalStack.Add(button); horizontalStack.Add(button2); - horizontalStack.Add(new Label { Text = "And these buttons are in a HorizontalStackLayout", VerticalOptions = LayoutOptions.Center, HorizontalTextAlignment = TextAlignment.End }); + horizontalStack.Add(new Label + { + Text = "And these buttons are in a HorizontalStackLayout", + VerticalOptions = LayoutOptions.Center, + HorizontalTextAlignment = TextAlignment.End + }); verticalStack.Add(horizontalStack); - verticalStack.Add(new Button { CharacterSpacing = 4, Text = "CharacterSpacing 4" }); + verticalStack.Add(new Button + { + CharacterSpacing = 4, + Text = "CharacterSpacing 4" + }); var checkbox = new CheckBox(); @@ -291,7 +460,11 @@ void SetupMauiLayout() verticalStack.Add(checkbox); verticalStack.Add(new CheckBox { BackgroundColor = Colors.LightPink }); - verticalStack.Add(new CheckBox { IsChecked = true, Color = Colors.Aquamarine }); + verticalStack.Add(new CheckBox + { + IsChecked = true, + Color = Colors.Aquamarine + }); if (true) #pragma warning disable 162 @@ -300,13 +473,30 @@ void SetupMauiLayout() verticalStack.Add(new Editor { Placeholder = "This is an editor placeholder." }); verticalStack.Add(new Editor { Text = "Editor" }); - verticalStack.Add(new Editor { Text = "Lorem ipsum dolor sit amet", MaxLength = 10 }); + verticalStack.Add(new Editor + { + Text = "Lorem ipsum dolor sit amet", + MaxLength = 10 + }); - verticalStack.Add(new Editor { Text = "Predictive Text Off", IsTextPredictionEnabled = false }); + verticalStack.Add(new Editor + { + Text = "Predictive Text Off", + IsTextPredictionEnabled = false + }); - verticalStack.Add(new Editor { Text = "Lorem ipsum dolor sit amet", FontSize = 10, FontFamily = "dokdo_regular" }); + verticalStack.Add(new Editor + { + Text = "Lorem ipsum dolor sit amet", + FontSize = 10, + FontFamily = "dokdo_regular" + }); - verticalStack.Add(new Editor { Text = "ReadOnly Editor", IsReadOnly = true }); + verticalStack.Add(new Editor + { + Text = "ReadOnly Editor", + IsReadOnly = true + }); } #pragma warning restore 162 @@ -319,18 +509,41 @@ void SetupMauiLayout() verticalStack.Add(entry); - verticalStack.Add(new Entry { Text = "Entry", TextColor = Colors.DarkRed, FontFamily = "Dokdo", MaxLength = -1 }); + verticalStack.Add(new Entry + { + Text = "Entry", + TextColor = Colors.DarkRed, + FontFamily = "Dokdo", + MaxLength = -1 + }); - verticalStack.Add(new Entry { IsPassword = true, TextColor = Colors.Black, Placeholder = "Pasword Entry" }); + verticalStack.Add(new Entry + { + IsPassword = true, + TextColor = Colors.Black, + Placeholder = "Pasword Entry" + }); verticalStack.Add(new Entry { IsTextPredictionEnabled = false }); verticalStack.Add(new Entry { Placeholder = "This should be placeholder text" }); - verticalStack.Add(new Entry { Text = "This should be read only property", IsReadOnly = true }); + verticalStack.Add(new Entry + { + Text = "This should be read only property", + IsReadOnly = true + }); - verticalStack.Add(new Entry { MaxLength = 5, Placeholder = "MaxLength text" }); + verticalStack.Add(new Entry + { + MaxLength = 5, + Placeholder = "MaxLength text" + }); - var spacingEntry = new Entry { Text = "This should be text with character spacing", CharacterSpacing = 10 }; + var spacingEntry = new Entry + { + Text = "This should be text with character spacing", + CharacterSpacing = 10 + }; verticalStack.Add(spacingEntry); @@ -352,21 +565,45 @@ void SetupMauiLayout() spacingEntry.CharacterSpacing = spacingEntry.CharacterSpacing == 10 ? 5 : 10; }; - verticalStack.Add(new Entry { Keyboard = Keyboard.Numeric, Placeholder = "Numeric Entry" }); + verticalStack.Add(new Entry + { + Keyboard = Keyboard.Numeric, + Placeholder = "Numeric Entry" + }); - verticalStack.Add(new Entry { Keyboard = Keyboard.Email, Placeholder = "Email Entry" }); + verticalStack.Add(new Entry + { + Keyboard = Keyboard.Email, + Placeholder = "Email Entry" + }); verticalStack.Add(new ProgressBar { Progress = 0.5 }); - verticalStack.Add(new ProgressBar { Progress = 0.5, BackgroundColor = Colors.LightCoral }); + verticalStack.Add(new ProgressBar + { + Progress = 0.5, + BackgroundColor = Colors.LightCoral + }); - verticalStack.Add(new ProgressBar { Progress = 0.5, ProgressColor = Colors.Purple }); + verticalStack.Add(new ProgressBar + { + Progress = 0.5, + ProgressColor = Colors.Purple + }); - var searchBar = new SearchBar { CharacterSpacing = 4, Text = "A search query" }; + var searchBar = new SearchBar + { + CharacterSpacing = 4, + Text = "A search query" + }; verticalStack.Add(searchBar); - var placeholderSearchBar = new SearchBar { Placeholder = "Placeholder", BackgroundColor = Colors.Plum }; + var placeholderSearchBar = new SearchBar + { + Placeholder = "Placeholder", + BackgroundColor = Colors.Plum + }; verticalStack.Add(placeholderSearchBar); @@ -394,20 +631,38 @@ void SetupMauiLayout() verticalStack.Add(picker); - verticalStack.Add(new Slider { ThumbColor = Colors.Aqua, ThumbImageSource = "rainbow_heart.png" }); + verticalStack.Add(new Slider + { + ThumbColor = Colors.Aqua, + ThumbImageSource = "rainbow_heart.png" + }); verticalStack.Add(new Stepper()); verticalStack.Add(new Stepper { BackgroundColor = Colors.IndianRed }); - verticalStack.Add(new Stepper { Minimum = 0, Maximum = 10, Value = 5 }); + verticalStack.Add(new Stepper + { + Minimum = 0, + Maximum = 10, + Value = 5 + }); verticalStack.Add(new Switch()); verticalStack.Add(new Switch() { OnColor = Colors.Green }); verticalStack.Add(new Switch() { ThumbColor = Colors.Yellow }); - verticalStack.Add(new Switch() { OnColor = Colors.Green, ThumbColor = Colors.Yellow }); + verticalStack.Add(new Switch() + { + OnColor = Colors.Green, + ThumbColor = Colors.Yellow + }); - verticalStack.Add(new GraphicsView { Drawable = new TextDrawable(), HeightRequest = 50, WidthRequest = 200 }); + verticalStack.Add(new GraphicsView + { + Drawable = new TextDrawable(), + HeightRequest = 50, + WidthRequest = 200 + }); verticalStack.Add(new DatePicker()); verticalStack.Add(new DatePicker { CharacterSpacing = 6 }); @@ -415,20 +670,32 @@ void SetupMauiLayout() verticalStack.Add(new TimePicker()); - verticalStack.Add(new TimePicker { Time = TimeSpan.FromHours(8), CharacterSpacing = 6 }); + verticalStack.Add(new TimePicker + { + Time = TimeSpan.FromHours(8), + CharacterSpacing = 6 + }); verticalStack.Add(CreateShapes()); verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); - Content = new ScrollView { Content = verticalStack, Orientation = ScrollOrientation.Vertical }; + Content = new ScrollView + { + Content = verticalStack, + Orientation = ScrollOrientation.Vertical + }; } public IView View { get => (IView)Content; set => Content = (View)value; } View CreateSampleGrid() { - var layout = new Grid() { ColumnSpacing = 5, RowSpacing = 8 }; + var layout = new Grid() + { + ColumnSpacing = 5, + RowSpacing = 8 + }; layout.AddRowDefinition(new RowDefinition() { Height = new GridLength(40) }); layout.AddRowDefinition(new RowDefinition() { Height = GridLength.Auto }); @@ -436,11 +703,20 @@ View CreateSampleGrid() layout.AddColumnDefinition(new ColumnDefinition() { Width = new GridLength(100) }); layout.AddColumnDefinition(new ColumnDefinition() { Width = new GridLength(100) }); - var topLeft = new Label { Text = "Top Left", BackgroundColor = Colors.LightBlue }; + var topLeft = new Label + { + Text = "Top Left", + BackgroundColor = Colors.LightBlue + }; layout.Add(topLeft); - var bottomLeft = new Label { Text = "Bottom Left", BackgroundColor = Colors.Lavender, VerticalTextAlignment = TextAlignment.End }; + var bottomLeft = new Label + { + Text = "Bottom Left", + BackgroundColor = Colors.Lavender, + VerticalTextAlignment = TextAlignment.End + }; layout.Add(bottomLeft); layout.SetRow(bottomLeft, 1); @@ -457,7 +733,13 @@ View CreateSampleGrid() layout.Add(topRight); layout.SetColumn(topRight, 1); - var bottomRight = new Label { Text = "Bottom Right", BackgroundColor = Colors.MediumPurple, VerticalTextAlignment = TextAlignment.End, HorizontalTextAlignment = TextAlignment.End }; + var bottomRight = new Label + { + Text = "Bottom Right", + BackgroundColor = Colors.MediumPurple, + VerticalTextAlignment = TextAlignment.End, + HorizontalTextAlignment = TextAlignment.End + }; layout.Add(bottomRight); layout.SetRow(bottomRight, 1); @@ -530,7 +812,11 @@ View CreateShapes() { RadiusX = 12, RadiusY = 6, - Fill = new LinearGradientBrush(new Microsoft.Maui.Controls.GradientStopCollection { new(Colors.Green, 0), new(Colors.Blue, 1) }, new Point(0, 0), new Point(1, 0)), + Fill = new LinearGradientBrush(new Microsoft.Maui.Controls.GradientStopCollection + { + new(Colors.Green, 0), + new(Colors.Blue, 1) + }, new Point(0, 0), new Point(1, 0)), Stroke = new SolidColorBrush(Colors.Purple), StrokeThickness = 8, StrokeDashArray = new float[] { 2, 2 }, @@ -550,10 +836,12 @@ View CreateShapes() return verticalStack; } + } class TextDrawable : IDrawable { + public void Draw(ICanvas canvas, RectF dirtyRect) { canvas.SaveState(); @@ -564,5 +852,7 @@ public void Draw(ICanvas canvas, RectF dirtyRect) canvas.DrawString("Drawable", 100, 10, HorizontalAlignment.Center); canvas.RestoreState(); } + } + } \ No newline at end of file From db0fcf496b5592021f49d645e1095eca434c2b5c Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 19 Feb 2024 22:26:32 +0100 Subject: [PATCH 280/425] [Gtk] Core.csproj: try fix sizing LabelView --- .../src/Handlers/Label/LabelHandler.Gtk.cs | 4 +- .../src/Handlers/ViewHandlerExtensions.Gtk.cs | 2 +- src/Core/src/Platform/Gtk/LabelExtensions.cs | 4 + src/Core/src/Platform/Gtk/LabelView.cs | 104 ++++++++++++++++++ src/Core/src/Platform/Gtk/LayoutView.cs | 41 +++++-- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 9 ++ .../src/Graphics.Gtk/Gtk/TextLayout.cs | 1 + 7 files changed, 152 insertions(+), 13 deletions(-) diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index 365b5c86086a..cac197fb52a4 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -58,7 +58,7 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra // SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); - var heightForWidth = !heightConstrained; + var heightForWidth = nativeView.RequestMode == SizeRequestMode.HeightForWidth; var constraint = Math.Max(heightForWidth ? widthConstraint - hMargin : heightConstraint - vMargin, 1); @@ -95,7 +95,7 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra layout.Width = Math.Max((widthConstraint - hMargin).ScaledToPango(), -1); } - (width, height) = layout.GetPixelSize(nativeView.Text, constraint, heightForWidth); + (width, height) = layout.GetPixelSize(nativeView.Text, constraint, nativeView.RequestMode == SizeRequestMode.HeightForWidth); if (lh > 0) { diff --git a/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs index 61745f1b1971..2aa59737297f 100644 --- a/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs +++ b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs @@ -57,7 +57,7 @@ internal static Size GetDesiredSizeFromHandler(this IViewHandler viewHandler, do double? explicitWidth = (virtualView.Width >= 0) ? virtualView.Width : null; double? explicitHeight = (virtualView.Height >= 0) ? virtualView.Height : null; - Size measured = platformView.GetDesiredSize(widthConstraint, heightConstraint); + Size measured = platformView.GetDesiredSize(widthConstraint, heightConstraint).Minimum; return new Size(explicitWidth ?? measured.Width, explicitHeight ?? measured.Height); } diff --git a/src/Core/src/Platform/Gtk/LabelExtensions.cs b/src/Core/src/Platform/Gtk/LabelExtensions.cs index c98ea18820b3..9255dff60d82 100644 --- a/src/Core/src/Platform/Gtk/LabelExtensions.cs +++ b/src/Core/src/Platform/Gtk/LabelExtensions.cs @@ -169,11 +169,15 @@ public static void UpdateHorizontalTextAlignment(this Label nativeLabel, ILabel nativeLabel.Justify = label.HorizontalTextAlignment.ToJustification(); nativeLabel.Xalign = label.HorizontalTextAlignment.ToXyAlign(); + if (nativeLabel is LabelView labelView) + labelView.HorizontalTextAlignment = label.HorizontalTextAlignment; } public static void UpdateVerticalTextAlignment(this Label nativeLabel, ILabel label) { nativeLabel.Yalign = label.VerticalTextAlignment.ToXyAlign(); + if (nativeLabel is LabelView labelView) + labelView.VerticalTextAlignment = label.VerticalTextAlignment; } } diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs index 984eafadb45c..06448a3243b3 100644 --- a/src/Core/src/Platform/Gtk/LabelView.cs +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -1,5 +1,10 @@ +using System; using Cairo; using Gtk; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; + +#pragma warning disable CS0162 // Unreachable code detected namespace Microsoft.Maui.Platform { @@ -9,6 +14,28 @@ public class LabelView : Label public float LineHeight { get; set; } + internal TextAlignment HorizontalTextAlignment { get; set; } + + internal TextAlignment VerticalTextAlignment { get; set; } + + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + { + if (LineHeight > 1) + Layout.LineSpacing = LineHeight; + + base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); + + var wContraint = orientation == Orientation.Horizontal ? natural_size : double.PositiveInfinity; + var hContraint = orientation == Orientation.Vertical ? natural_size : double.PositiveInfinity; + var size = GetDesiredSize(wContraint, hContraint, this.RequestMode == SizeRequestMode.HeightForWidth); + natural_size = (int)(orientation == Orientation.Horizontal ? size.Width : size.Height); + + wContraint = orientation == Orientation.Horizontal ? minimum_size : double.PositiveInfinity; + hContraint = orientation == Orientation.Vertical ? minimum_size : double.PositiveInfinity; + size = GetDesiredSize(wContraint, hContraint, this.RequestMode == SizeRequestMode.HeightForWidth); + minimum_size = (int)(orientation == Orientation.Horizontal ? size.Width : size.Height); + } + protected override bool OnDrawn(Context cr) { if (LineHeight > 1) @@ -17,6 +44,83 @@ protected override bool OnDrawn(Context cr) return base.OnDrawn(cr); } + private static Microsoft.Maui.Graphics.Platform.Gtk.TextLayout? _textLayout; + + public Microsoft.Maui.Graphics.Platform.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Platform.Gtk.TextLayout { HeightForWidth = true }; + + public Size GetDesiredSize(double widthConstraint, double heightConstraint, bool heightForWidth) + { + + var nativeView = this; + int width = -1; + int height = -1; + + var widthConstrained = !double.IsPositiveInfinity(widthConstraint); + var heightConstrained = !double.IsPositiveInfinity(heightConstraint); + + var hMargin = nativeView.MarginStart + nativeView.MarginEnd; + var vMargin = nativeView.MarginTop + nativeView.MarginBottom; + + SharedTextLayout.SetLayout(this.Layout); + SharedTextLayout.FontDescription = nativeView.GetPangoFontDescription(); + + SharedTextLayout.TextFlow = TextFlow.ClipBounds; + SharedTextLayout.HorizontalAlignment = HorizontalTextAlignment.GetHorizontalAlignment(); + SharedTextLayout.VerticalAlignment = VerticalTextAlignment.GetVerticalAlignment(); + + // SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); + + var constraint = Math.Max(heightForWidth ? widthConstraint - hMargin : heightConstraint - vMargin, + 1); + + var lh = 0d; + var layout = SharedTextLayout.GetLayout(); + layout.Height = -1; + layout.Width = -1; + layout.Ellipsize = nativeView.Ellipsize; + layout.Spacing = nativeView.Layout.Spacing; + + layout.Attributes = nativeView.Attributes; + + if (LineHeight > 1) + layout.LineSpacing = (float)LineHeight; + else + { + layout.LineSpacing = 0; + } + + layout.SetText(nativeView.Text); + + if (!heightConstrained) + { + if (nativeView.Lines > 0) + { + lh = layout.GetLineHeigth(nativeView.Lines, false); + layout.Height = (int)lh; + } + } + + if (!heightForWidth && heightConstrained && widthConstrained) + { + layout.Width = Math.Max((widthConstraint - hMargin).ScaledToPango(), -1); + } + + (width, height) = layout.GetPixelSize(nativeView.Text, constraint, heightForWidth); + + if (lh > 0) + { + height = Math.Min((int)lh.ScaledFromPango(), height); + } + + layout.Attributes = null; + + width += hMargin; + height += vMargin; + + return new Size(width, height); + + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 3de7a01ab6ff..592b7d3bac5b 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -22,6 +22,7 @@ namespace Microsoft.Maui.Platform public class LayoutView : Container, IGtkContainer { + protected override bool OnDrawn(Cairo.Context cr) { var stc = this.StyleContext; @@ -81,9 +82,9 @@ Orientation GetOrientation() => var orientation = GetOrientation(); var focusChain = _children - .Select(c => c.widget) + .Select(c => c.widget) // .OrderBy(kvp => orientation == Orientation.Horizontal ? kvp.Value.Rect.X : kvp.Value.Rect.Y) - .ToArray(); + .ToArray(); FocusChain = focusChain; } @@ -173,7 +174,7 @@ protected void ArrangeAllocation(Rectangle allocation) VirtualView.CrossPlatformArrange(allocation); } - protected bool RestrictToMeasuredAllocation { get; set; } = true; + protected bool RestrictToMeasuredAllocation { get; set; } = false; protected bool RestrictToMeasuredArrange { get; set; } = false; @@ -332,16 +333,22 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest // return Gtk.SizeRequestMode.WidthForHeight; // } + double? LastH { get; set; } + + double? LastW { get; set; } protected override void OnGetPreferredHeight(out int minimum_height, out int natural_height) { base.OnGetPreferredHeight(out minimum_height, out natural_height); // containers need initial width in height_for_width mode // dirty fix: do not constrain width on first allocation - var force_width = double.PositiveInfinity; + var force_width = LastW ?? double.PositiveInfinity; + if (IsReallocating) force_width = Allocation.Width; - var size = Measure(force_width, minimum_height > 0 ? minimum_height : double.PositiveInfinity); + + var size = Measure(force_width, minimum_height > 0 ? minimum_height : LastH ?? double.PositiveInfinity); + if (size.Height < HeightRequest) minimum_height = natural_height = HeightRequest; else @@ -353,10 +360,13 @@ protected override void OnGetPreferredWidth(out int minimum_width, out int natur base.OnGetPreferredWidth(out minimum_width, out natural_width); // containers need initial height in width_for_height mode // dirty fix: do not constrain height on first allocation - var force_height = double.PositiveInfinity; + var force_height = LastH ?? double.PositiveInfinity; + if (IsReallocating) force_height = Allocation.Height; - var size = Measure(minimum_width > 0 ? minimum_width : double.PositiveInfinity, force_height); + + var size = Measure(minimum_width > 0 ? minimum_width : LastW ?? double.PositiveInfinity, force_height); + if (size.Width < WidthRequest) minimum_width = natural_width = WidthRequest; else @@ -365,28 +375,38 @@ protected override void OnGetPreferredWidth(out int minimum_width, out int natur protected override void OnGetPreferredHeightForWidth(int width, out int minimum_height, out int natural_height) { + LastW = width; + base.OnGetPreferredHeightForWidth(width, out minimum_height, out natural_height); - var size = Measure(width, minimum_height > 0 ? minimum_height : double.PositiveInfinity); + + var size = Measure(width, minimum_height > 0 ? minimum_height : LastH ?? double.PositiveInfinity); + if (size.Height < HeightRequest) minimum_height = natural_height = HeightRequest; else minimum_height = natural_height = (int)size.Height; + + LastH = null; } protected override void OnGetPreferredWidthForHeight(int height, out int minimum_width, out int natural_width) { + LastH = height; + base.OnGetPreferredWidthForHeight(height, out minimum_width, out natural_width); - var size = Measure(minimum_width > 0 ? minimum_width : double.PositiveInfinity, height); + var size = Measure(minimum_width > 0 ? minimum_width : LastW ?? double.PositiveInfinity, height); + if (size.Width < WidthRequest) minimum_width = natural_width = WidthRequest; else minimum_width = natural_width = (int)size.Width; + + LastW = null; } #endif #if USE_ADJUSTSIZEREQUEST - // see: https://github.com/linuxmint/gtk/blob/158a2b0e1e8d582bc041acc7fe323922747d7787/gtk/gtksizerequest.c#L362 protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) @@ -485,6 +505,7 @@ public Size GetDesiredSize(double widthConstraint, double heightConstraint) } protected int ToSize(double it) => double.IsPositiveInfinity(it) ? 0 : (int)it; + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index 7b9bef47b9ae..9aec7fca945f 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -50,6 +50,14 @@ public static SizeRequest GetDesiredSize( int naturalHeight = 0; int minimumWidth = 0; int naturalWidth = 0; +#pragma warning disable CS0162 // Unreachable code detected + + if (false) + { + nativeView.GetSizeRequest(out var w, out var h); + + return new SizeRequest(new Size(w, h)); + } if (nativeView.RequestMode == SizeRequestMode.WidthForHeight) { @@ -106,6 +114,7 @@ public static SizeRequest GetDesiredSize( return new SizeRequest(new Size(naturalWidth, naturalHeight), new Size(minimumWidth, minimumHeight)); +#pragma warning restore CS0162 // Unreachable code detected } public static void Arrange(this Widget? nativeView, Rect rect) diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs index 76352eed623b..4344c46a0b96 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayout.cs @@ -18,6 +18,7 @@ public TextLayout(Context context) { _context = context; } + public TextLayout() { } public Context Context => _context; From dc74565f26553d4dd2ddfde7a191a584b762b420 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 20 Feb 2024 00:15:55 +0100 Subject: [PATCH 281/425] [Gtk] Core.csproj: try fix sizing --- .../src/Handlers/Label/LabelHandler.Gtk.cs | 2 +- .../src/Handlers/ViewHandlerExtensions.Gtk.cs | 5 ++-- src/Core/src/Platform/Gtk/LabelView.cs | 14 +++++++--- src/Core/src/Platform/Gtk/ScrollView.cs | 2 +- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 26 ++++++++++--------- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index cac197fb52a4..3fcc98414aa2 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -29,7 +29,7 @@ protected override LabelView CreatePlatformView() }; } - public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + public Size _GetDesiredSize(double widthConstraint, double heightConstraint) { if (PlatformView is not { } nativeView) return default; diff --git a/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs index 2aa59737297f..dd07b7d44dba 100644 --- a/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs +++ b/src/Core/src/Handlers/ViewHandlerExtensions.Gtk.cs @@ -57,8 +57,9 @@ internal static Size GetDesiredSizeFromHandler(this IViewHandler viewHandler, do double? explicitWidth = (virtualView.Width >= 0) ? virtualView.Width : null; double? explicitHeight = (virtualView.Height >= 0) ? virtualView.Height : null; - Size measured = platformView.GetDesiredSize(widthConstraint, heightConstraint).Minimum; - return new Size(explicitWidth ?? measured.Width, explicitHeight ?? measured.Height); + Size measured = platformView.GetDesiredSize(explicitWidth ?? widthConstraint, explicitHeight ?? heightConstraint).Minimum; + + return new Size(measured.Width, measured.Height); } internal static void PlatformArrangeHandler(this IViewHandler viewHandler, Rect frame) diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs index 06448a3243b3..bb234db16d98 100644 --- a/src/Core/src/Platform/Gtk/LabelView.cs +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -14,17 +14,18 @@ public class LabelView : Label public float LineHeight { get; set; } - internal TextAlignment HorizontalTextAlignment { get; set; } + public TextAlignment HorizontalTextAlignment { get; set; } - internal TextAlignment VerticalTextAlignment { get; set; } + public TextAlignment VerticalTextAlignment { get; set; } - protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + public LineBreakMode LineBreakMode { get; set; } = LineBreakMode.TailTruncation; + + protected void _OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) { if (LineHeight > 1) Layout.LineSpacing = LineHeight; base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); - var wContraint = orientation == Orientation.Horizontal ? natural_size : double.PositiveInfinity; var hContraint = orientation == Orientation.Vertical ? natural_size : double.PositiveInfinity; var size = GetDesiredSize(wContraint, hContraint, this.RequestMode == SizeRequestMode.HeightForWidth); @@ -41,6 +42,7 @@ protected override bool OnDrawn(Context cr) if (LineHeight > 1) Layout.LineSpacing = LineHeight; + // GetDesiredSize(Allocation.Width, Allocation.Height, RequestMode == SizeRequestMode.HeightForWidth); return base.OnDrawn(cr); } @@ -99,6 +101,10 @@ public Size GetDesiredSize(double widthConstraint, double heightConstraint, bool layout.Height = (int)lh; } } + else + { + layout.Height = Math.Max((heightConstraint - vMargin).ScaledToPango(), -1); + } if (!heightForWidth && heightConstrained && widthConstrained) { diff --git a/src/Core/src/Platform/Gtk/ScrollView.cs b/src/Core/src/Platform/Gtk/ScrollView.cs index db4eb40a2865..500aa9db5707 100644 --- a/src/Core/src/Platform/Gtk/ScrollView.cs +++ b/src/Core/src/Platform/Gtk/ScrollView.cs @@ -18,7 +18,7 @@ public class ScrollView : Gtk.ScrolledWindow internal Func? CrossPlatformArrange { get; set; } internal Func? CrossPlatformMeasure { get; set; } - protected void OnAdjustSizeRequest_(Orientation orientation, out int minimum_size, out int natural_size) + protected void _OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) { base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index 9aec7fca945f..202d8005f33e 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -61,7 +61,12 @@ public static SizeRequest GetDesiredSize( if (nativeView.RequestMode == SizeRequestMode.WidthForHeight) { - if (widthConstrained) + if ((heightConstrained) && (widthConstrained)) + { + minimumWidth = naturalWidth = (int)widthConstraint; + minimumHeight = naturalHeight = (int)heightConstraint; + } + else if (widthConstrained) { nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); } @@ -69,11 +74,7 @@ public static SizeRequest GetDesiredSize( { nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); } - else if ((heightConstrained) && (widthConstrained)) - { - minimumWidth = naturalWidth = (int)widthConstraint; - minimumHeight = naturalHeight = (int)heightConstraint; - } + else { nativeView.GetPreferredHeight(out minimumHeight, out naturalHeight); @@ -82,7 +83,12 @@ public static SizeRequest GetDesiredSize( } else if (nativeView.RequestMode == Gtk.SizeRequestMode.HeightForWidth) { - if (heightConstrained) + if ((heightConstrained) && (widthConstrained)) + { + minimumWidth = naturalWidth = (int)widthConstraint; + minimumHeight = naturalHeight = (int)heightConstraint; + } + else if (heightConstrained) { nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); } @@ -90,11 +96,7 @@ public static SizeRequest GetDesiredSize( { nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); } - else if ((heightConstrained) && (widthConstrained)) - { - minimumWidth = naturalWidth = (int)widthConstraint; - minimumHeight = naturalHeight = (int)heightConstraint; - } + else { nativeView.GetPreferredWidth(out minimumWidth, out naturalWidth); From 23a614b5c927dd2b536be07771568f6d858d7c82 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 20 Feb 2024 16:48:17 +0100 Subject: [PATCH 282/425] [Gtk] Core.csproj: LayoutView: fix naming --- src/Core/src/Platform/Gtk/LayoutView.cs | 26 +++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 592b7d3bac5b..54dcdc497aae 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -200,6 +200,8 @@ protected void ClearMeasured(bool clearCache = true) } MeasuredMinimum = null; + // RequestedWidth = null; + // RequestedHeight = null; } protected override void OnSizeAllocated(Gdk.Rectangle allocation) @@ -333,21 +335,21 @@ public Size Measure(double widthConstraint, double heightConstraint, SizeRequest // return Gtk.SizeRequestMode.WidthForHeight; // } - double? LastH { get; set; } + double? RequestedHeight { get; set; } - double? LastW { get; set; } + double? RequestedWidth { get; set; } protected override void OnGetPreferredHeight(out int minimum_height, out int natural_height) { base.OnGetPreferredHeight(out minimum_height, out natural_height); // containers need initial width in height_for_width mode // dirty fix: do not constrain width on first allocation - var force_width = LastW ?? double.PositiveInfinity; + var force_width = RequestedWidth ?? double.PositiveInfinity; if (IsReallocating) force_width = Allocation.Width; - var size = Measure(force_width, minimum_height > 0 ? minimum_height : LastH ?? double.PositiveInfinity); + var size = Measure(force_width, minimum_height > 0 ? minimum_height : RequestedHeight ?? double.PositiveInfinity); if (size.Height < HeightRequest) minimum_height = natural_height = HeightRequest; @@ -360,12 +362,12 @@ protected override void OnGetPreferredWidth(out int minimum_width, out int natur base.OnGetPreferredWidth(out minimum_width, out natural_width); // containers need initial height in width_for_height mode // dirty fix: do not constrain height on first allocation - var force_height = LastH ?? double.PositiveInfinity; + var force_height = RequestedHeight ?? double.PositiveInfinity; if (IsReallocating) force_height = Allocation.Height; - var size = Measure(minimum_width > 0 ? minimum_width : LastW ?? double.PositiveInfinity, force_height); + var size = Measure(minimum_width > 0 ? minimum_width : RequestedWidth ?? double.PositiveInfinity, force_height); if (size.Width < WidthRequest) minimum_width = natural_width = WidthRequest; @@ -375,33 +377,33 @@ protected override void OnGetPreferredWidth(out int minimum_width, out int natur protected override void OnGetPreferredHeightForWidth(int width, out int minimum_height, out int natural_height) { - LastW = width; + RequestedWidth = width; base.OnGetPreferredHeightForWidth(width, out minimum_height, out natural_height); - var size = Measure(width, minimum_height > 0 ? minimum_height : LastH ?? double.PositiveInfinity); + var size = Measure(width, minimum_height > 0 ? minimum_height : RequestedHeight ?? double.PositiveInfinity); if (size.Height < HeightRequest) minimum_height = natural_height = HeightRequest; else minimum_height = natural_height = (int)size.Height; - LastH = null; + RequestedHeight = null; } protected override void OnGetPreferredWidthForHeight(int height, out int minimum_width, out int natural_width) { - LastH = height; + RequestedHeight = height; base.OnGetPreferredWidthForHeight(height, out minimum_width, out natural_width); - var size = Measure(minimum_width > 0 ? minimum_width : LastW ?? double.PositiveInfinity, height); + var size = Measure(minimum_width > 0 ? minimum_width : RequestedWidth ?? double.PositiveInfinity, height); if (size.Width < WidthRequest) minimum_width = natural_width = WidthRequest; else minimum_width = natural_width = (int)size.Width; - LastW = null; + RequestedWidth = null; } #endif From d0684ef481268e8a382a949af5891ba327c8aa20 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 20 Feb 2024 17:09:56 +0100 Subject: [PATCH 283/425] [Gtk] Core.csproj: LabelView: refactor --- src/Core/src/Platform/Gtk/LabelView.cs | 74 +++--- .../Gtk/TextExtensions.cs | 221 +++++++++--------- .../Graphics.Gtk/Gtk/TextLayoutExtensions.cs | 2 +- 3 files changed, 142 insertions(+), 155 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs index bb234db16d98..c542d6c9e336 100644 --- a/src/Core/src/Platform/Gtk/LabelView.cs +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -11,7 +11,6 @@ namespace Microsoft.Maui.Platform public class LabelView : Label { - public float LineHeight { get; set; } public TextAlignment HorizontalTextAlignment { get; set; } @@ -20,12 +19,12 @@ public class LabelView : Label public LineBreakMode LineBreakMode { get; set; } = LineBreakMode.TailTruncation; - protected void _OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimum_size, out int natural_size) { - if (LineHeight > 1) - Layout.LineSpacing = LineHeight; + SetLayout(Layout, this); base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); + return; var wContraint = orientation == Orientation.Horizontal ? natural_size : double.PositiveInfinity; var hContraint = orientation == Orientation.Vertical ? natural_size : double.PositiveInfinity; var size = GetDesiredSize(wContraint, hContraint, this.RequestMode == SizeRequestMode.HeightForWidth); @@ -37,67 +36,60 @@ protected void _OnAdjustSizeRequest(Orientation orientation, out int minimum_si minimum_size = (int)(orientation == Orientation.Horizontal ? size.Width : size.Height); } + internal Size GetDesiredSize(double wContraint, double hContraint, bool heightForWidth) + => GetDesiredSize(Layout, wContraint, hContraint, heightForWidth, Text, Lines, + MarginStart, MarginTop, MarginEnd, MarginBottom); + protected override bool OnDrawn(Context cr) { - if (LineHeight > 1) - Layout.LineSpacing = LineHeight; - - // GetDesiredSize(Allocation.Width, Allocation.Height, RequestMode == SizeRequestMode.HeightForWidth); + SetLayout(Layout, this); return base.OnDrawn(cr); } - private static Microsoft.Maui.Graphics.Platform.Gtk.TextLayout? _textLayout; - - public Microsoft.Maui.Graphics.Platform.Gtk.TextLayout SharedTextLayout => _textLayout ??= new Microsoft.Maui.Graphics.Platform.Gtk.TextLayout { HeightForWidth = true }; + public static void SetLayout(Pango.Layout layout, LabelView platformView) + { + var horizontalTextAlignment = platformView.HorizontalTextAlignment.GetHorizontalAlignment(); + layout.Alignment = horizontalTextAlignment.ToPango(); + layout.Justify = horizontalTextAlignment.HasFlag(HorizontalAlignment.Justified); + layout.Wrap = platformView.LineBreakMode.GetLineBreakMode().ToPangoWrap(); + layout.Ellipsize = platformView.LineBreakMode.GetLineBreakMode().ToPangoEllipsize(); + layout.LineSpacing = platformView.LineHeight > 1 ? platformView.LineHeight : 0; + } - public Size GetDesiredSize(double widthConstraint, double heightConstraint, bool heightForWidth) + public static void SetLayoutFromLabel(Pango.Layout layout, Label platformView) { + layout.Ellipsize = platformView.Ellipsize; + layout.Spacing = platformView.Layout.Spacing; + layout.Attributes = platformView.Attributes; + } - var nativeView = this; + public static Size GetDesiredSize(Pango.Layout layout, double widthConstraint, double heightConstraint, bool heightForWidth, + string text, int lines, int marginStart,int marginTop, int marginEnd, int marginBottom) + { int width = -1; int height = -1; var widthConstrained = !double.IsPositiveInfinity(widthConstraint); var heightConstrained = !double.IsPositiveInfinity(heightConstraint); - var hMargin = nativeView.MarginStart + nativeView.MarginEnd; - var vMargin = nativeView.MarginTop + nativeView.MarginBottom; - - SharedTextLayout.SetLayout(this.Layout); - SharedTextLayout.FontDescription = nativeView.GetPangoFontDescription(); - - SharedTextLayout.TextFlow = TextFlow.ClipBounds; - SharedTextLayout.HorizontalAlignment = HorizontalTextAlignment.GetHorizontalAlignment(); - SharedTextLayout.VerticalAlignment = VerticalTextAlignment.GetVerticalAlignment(); - - // SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); + var hMargin = marginStart + marginEnd; + var vMargin = marginTop + marginBottom; var constraint = Math.Max(heightForWidth ? widthConstraint - hMargin : heightConstraint - vMargin, 1); var lh = 0d; - var layout = SharedTextLayout.GetLayout(); + layout.Height = -1; layout.Width = -1; - layout.Ellipsize = nativeView.Ellipsize; - layout.Spacing = nativeView.Layout.Spacing; - layout.Attributes = nativeView.Attributes; - - if (LineHeight > 1) - layout.LineSpacing = (float)LineHeight; - else - { - layout.LineSpacing = 0; - } - - layout.SetText(nativeView.Text); + layout.SetText(text); if (!heightConstrained) { - if (nativeView.Lines > 0) + if (lines > 0) { - lh = layout.GetLineHeigth(nativeView.Lines, false); + lh = layout.GetLineHeigth(lines, false); layout.Height = (int)lh; } } @@ -111,7 +103,7 @@ public Size GetDesiredSize(double widthConstraint, double heightConstraint, bool layout.Width = Math.Max((widthConstraint - hMargin).ScaledToPango(), -1); } - (width, height) = layout.GetPixelSize(nativeView.Text, constraint, heightForWidth); + (width, height) = layout.GetPixelSize(text, constraint, heightForWidth); if (lh > 0) { @@ -124,9 +116,7 @@ public Size GetDesiredSize(double widthConstraint, double heightConstraint, bool height += vMargin; return new Size(width, height); - } - } } \ No newline at end of file diff --git a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs index 971734c53ec5..f5f0ab25d03f 100644 --- a/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs +++ b/src/Core/src/[Microsoft.Maui.Graphics]/Gtk/TextExtensions.cs @@ -1,169 +1,166 @@ using System; using System.Collections.Generic; -namespace Microsoft.Maui.Graphics.Platform.Gtk +namespace Microsoft.Maui.Graphics.Platform.Gtk; + +public static class TextExtensions { - public static class TextExtensions + public static double GetLineHeigth(this Pango.Layout layout, int numLines, bool scaled = true) { - - public static double GetLineHeigth(this Pango.Layout layout, int numLines, bool scaled = true) + var inkRect = new Pango.Rectangle(); + var logicalRect = new Pango.Rectangle(); + var numLines1 = numLines > 0 ? Math.Min(numLines, layout.LineCount) : layout.LineCount; + var lineHeigh = 0d; + + var metrics = layout.Context.GetMetrics(layout.FontDescription, Pango.Language.Default); + var baseline = metrics.Ascent / (double)(metrics.Ascent + metrics.Descent); + layout.GetLineReadonly(0).GetExtents(ref inkRect, ref logicalRect); + lineHeigh += (scaled ? logicalRect.Height.ScaledFromPango() : logicalRect.Height); + var fact = 1f; + + if (layout.LineSpacing > 0) { - var inkRect = new Pango.Rectangle(); - var logicalRect = new Pango.Rectangle(); - var numLines1 = numLines > 0 ? Math.Min(numLines, layout.LineCount) : layout.LineCount; - var lineHeigh = 0d; - - var metrics = layout.Context.GetMetrics(layout.FontDescription, Pango.Language.Default); - var baseline = metrics.Ascent / (double)(metrics.Ascent + metrics.Descent); - layout.GetLineReadonly(0).GetExtents(ref inkRect, ref logicalRect); - lineHeigh += (scaled ? logicalRect.Height.ScaledFromPango() : logicalRect.Height); - var fact = 1f; - - if (layout.LineSpacing > 0) - { - fact = layout.LineSpacing; - } - - return lineHeigh * baseline + lineHeigh + (lineHeigh * fact * (numLines - 1)); + fact = layout.LineSpacing; } - public static (int width, int height) GetPixelSize(this Pango.Layout layout, string text, double desiredSize = -1d, bool heightForWidth = true) - { - desiredSize = double.IsInfinity(desiredSize) ? -1 : desiredSize; - - if (desiredSize > 0) - { - if (heightForWidth) - { - layout.Width = desiredSize.ScaledToPango(); - } - else - { - layout.Height = desiredSize.ScaledToPango(); - } - } - - layout.SetText(text); - layout.GetPixelSize(out var textWidth, out var textHeight); - - return (textWidth, textHeight); - } + return lineHeigh * baseline + lineHeigh + (lineHeigh * fact * (numLines - 1)); + } - public static double ScaledFromPango(this double it) - => Math.Ceiling(it / Pango.Scale.PangoScale); + public static (int width, int height) GetPixelSize(this Pango.Layout layout, string text, double desiredSize = -1d, bool heightForWidth = true) + { + desiredSize = double.IsInfinity(desiredSize) ? -1 : desiredSize; - public static Pango.AttrList? AddAttrFor(this Pango.AttrList? l, TextDecorations it) + if (desiredSize > 0) { - if (l == null) - return l; - - if (it.HasFlag(TextDecorations.Underline)) + if (heightForWidth) { - - l.Insert(new Pango.AttrUnderline(Pango.Underline.Single)); + layout.Width = desiredSize.ScaledToPango(); } - - if (it.HasFlag(TextDecorations.Strikethrough)) + else { - l.Insert(new Pango.AttrStrikethrough(true)); - + layout.Height = desiredSize.ScaledToPango(); } + } + + layout.SetText(text); + layout.GetPixelSize(out var textWidth, out var textHeight); + + return (textWidth, textHeight); + } + + public static double ScaledFromPango(this double it) + => Math.Ceiling(it / Pango.Scale.PangoScale); + public static Pango.AttrList? AddAttrFor(this Pango.AttrList? l, TextDecorations it) + { + if (l == null) return l; - } - public static Pango.AttrList? AddAttrFor(this Pango.AttrList? list, int spacing) + if (it.HasFlag(TextDecorations.Underline)) { - if (spacing <= 1.ScaledToPango()) - return list; - list?.Insert(new Pango.AttrLetterSpacing(spacing)); - - return list; + l.Insert(new Pango.AttrUnderline(Pango.Underline.Single)); } - public static Pango.AttrList? AttrListFor(this Pango.AttrList? list, TextDecorations decorations, double letterspacing) + if (it.HasFlag(TextDecorations.Strikethrough)) { - var spacing = letterspacing.ScaledToPango(); + l.Insert(new Pango.AttrStrikethrough(true)); - if (decorations == TextDecorations.None && letterspacing <= 1) - return null; + } - var l = new Pango.AttrList(); + return l; + } - if (decorations != TextDecorations.None) - l.AddAttrFor(decorations); + public static Pango.AttrList? AddAttrFor(this Pango.AttrList? list, int spacing) + { + if (spacing <= 1.ScaledToPango()) + return list; - if (letterspacing > 1) - l.AddAttrFor(spacing); + list?.Insert(new Pango.AttrLetterSpacing(spacing)); - return l; + return list; + } - } + public static Pango.AttrList? AttrListFor(this Pango.AttrList? list, TextDecorations decorations, double letterspacing) + { + var spacing = letterspacing.ScaledToPango(); - /// - /// Use this only if there are no other attributes to set - /// - /// - /// - /// - public static Pango.AttrList? AttrListFor(this Pango.AttrList? list, double letterspacing) - { - var spacing = letterspacing.ScaledToPango(); + if (decorations == TextDecorations.None && letterspacing <= 1) + return null; - if (letterspacing <= 1) - return null; + var l = new Pango.AttrList(); - var l = new Pango.AttrList(); + if (decorations != TextDecorations.None) + l.AddAttrFor(decorations); + if (letterspacing > 1) l.AddAttrFor(spacing); - return l; + return l; - } + } - static Dictionary? _attrLists; + /// + /// Use this only if there are no other attributes to set + /// + /// + /// + /// + public static Pango.AttrList? AttrListFor(this Pango.AttrList? list, double letterspacing) + { + var spacing = letterspacing.ScaledToPango(); - [Obsolete("not working with spacing")] - static Pango.AttrList? DefaultAttrListFor(this TextDecorations decorations) - { - _attrLists ??= new(); + if (letterspacing <= 1) + return null; - if (TextDecorations.None == decorations) - { - return null; - } + var l = new Pango.AttrList(); - if (_attrLists.TryGetValue(decorations, out var l)) - return l; + l.AddAttrFor(spacing); - l = new Pango.AttrList(); + return l; - l.AddAttrFor(decorations); + } - _attrLists[decorations] = l; + static Dictionary? _attrLists; - return l; - } + [Obsolete("not working with spacing")] + static Pango.AttrList? DefaultAttrListFor(this TextDecorations decorations) + { + _attrLists ??= new(); - [Obsolete("not working together with letterspacing")] - static Pango.AttrList? AttrListFor(this Pango.AttrList? list, TextDecorations decorations) + if (TextDecorations.None == decorations) { + return null; + } + + if (_attrLists.TryGetValue(decorations, out var l)) + return l; - // something wrong with Filter; iterater is null then - var l = list?.Filter(f => f.Type != Pango.AttrType.Underline || f.Type != Pango.AttrType.Strikethrough); + l = new Pango.AttrList(); - if (decorations == TextDecorations.None) - return list; + l.AddAttrFor(decorations); - list ??= new Pango.AttrList(); + _attrLists[decorations] = l; - list.AddAttrFor(decorations); + return l; + } + + [Obsolete("not working together with letterspacing")] + static Pango.AttrList? AttrListFor(this Pango.AttrList? list, TextDecorations decorations) + { + + // something wrong with Filter; iterater is null then + var l = list?.Filter(f => f.Type != Pango.AttrType.Underline || f.Type != Pango.AttrType.Strikethrough); + if (decorations == TextDecorations.None) return list; - } + list ??= new Pango.AttrList(); + + list.AddAttrFor(decorations); + + return list; } diff --git a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs index 134e3d28ad4f..e8bd15cc59a9 100644 --- a/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs +++ b/src/Graphics/src/Graphics.Gtk/Gtk/TextLayoutExtensions.cs @@ -1,6 +1,6 @@ namespace Microsoft.Maui.Graphics.Platform.Gtk; -internal static class TextLayoutExtensions { +public static class TextLayoutExtensions { public static void SetFontStyle(this TextLayout it, IFont font, double? fontSize = null, int? weight = null, FontStyleType? fontStyleType = null) { From 1db4f6629b113529a97370b158429cfc3fc5fd36 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 20 Feb 2024 19:34:48 +0100 Subject: [PATCH 284/425] [Gtk] Core.csproj: try fix sizing Label; works without Lorem --- .../SimpleSampleApp/ExamplePage.cs | 16 +-- .../src/Handlers/Label/LabelHandler.Gtk.cs | 99 +++---------------- src/Core/src/Platform/Gtk/LabelView.cs | 30 +++--- 3 files changed, 38 insertions(+), 107 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs index 535ef0be5ba2..599853ed1542 100644 --- a/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs +++ b/src/Controls/samples/Controls.Sample.Gtk/SimpleSampleApp/ExamplePage.cs @@ -32,18 +32,20 @@ public class ExamplePage : BasePage "Cras rutrum scelerisque elit, et porta est lobortis ac. " + "Pellentesque eu ornare tortor. Sed bibendum a nisl at laoreet."; - const bool ShowLorem = true; - + const bool ShowLorem = false; + ScrollOrientation ScrollOrientation = ScrollOrientation.Vertical; + public ExamplePage(IServiceProvider services, MainPageViewModel viewModel) { _services = services; BindingContext = _viewModel = viewModel; - + SetupMauiLayout(); + // SetupMauiLorem(); + // SetupMauiLayoutLayouts(); // SetupMauiLayoutSimple(); - //SetupMauiLayout(); - SetupMauiLorem(); + // SetupMauiLayoutDrawables(); } @@ -60,7 +62,7 @@ void SetupMauiLorem() Content = new ScrollView { Content = verticalStack, - Orientation = ScrollOrientation.Vertical + Orientation = this.ScrollOrientation }; } @@ -683,7 +685,7 @@ void SetupMauiLayout() Content = new ScrollView { Content = verticalStack, - Orientation = ScrollOrientation.Vertical + Orientation = ScrollOrientation }; } diff --git a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs index 3fcc98414aa2..d5f9017cd59e 100644 --- a/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs +++ b/src/Core/src/Handlers/Label/LabelHandler.Gtk.cs @@ -9,7 +9,6 @@ namespace Microsoft.Maui.Handlers public partial class LabelHandler : ViewHandler { - private static Microsoft.Maui.Graphics.Platform.Gtk.TextLayout? _textLayout; static PlatformStringSizeService? _stringSizeService; @@ -21,96 +20,25 @@ public partial class LabelHandler : ViewHandler // https://docs.gtk.org/gtk3/class.Label.html protected override LabelView CreatePlatformView() { - return new() - { - LineWrap = true, - Halign = Align.Fill, - Xalign = 0, - }; + return new() { LineWrap = true, Halign = Align.Fill, Xalign = 0, }; } - public Size _GetDesiredSize(double widthConstraint, double heightConstraint) + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) { - if (PlatformView is not { } nativeView) + if (PlatformView is not { } platformView) return default; if (VirtualView is not { } virtualView) return default; - - int width = -1; - int height = -1; - - var widthConstrained = !double.IsPositiveInfinity(widthConstraint); - var heightConstrained = !double.IsPositiveInfinity(heightConstraint); - - var hMargin = nativeView.MarginStart + nativeView.MarginEnd; - var vMargin = nativeView.MarginTop + nativeView.MarginBottom; - - // try use layout from Label: not working - - lock (SharedTextLayout) - { - SharedTextLayout.FontDescription = nativeView.GetPangoFontDescription(); - - SharedTextLayout.TextFlow = TextFlow.ClipBounds; - SharedTextLayout.HorizontalAlignment = virtualView.HorizontalTextAlignment.GetHorizontalAlignment(); - SharedTextLayout.VerticalAlignment = virtualView.VerticalTextAlignment.GetVerticalAlignment(); - - // SharedTextLayout.LineBreakMode = virtualView.LineBreakMode.GetLineBreakMode(); - - var heightForWidth = nativeView.RequestMode == SizeRequestMode.HeightForWidth; - - var constraint = Math.Max(heightForWidth ? widthConstraint - hMargin : heightConstraint - vMargin, - 1); - - var lh = 0d; - var layout = SharedTextLayout.GetLayout(); - layout.Height = -1; - layout.Width = -1; - layout.Ellipsize = nativeView.Ellipsize; - layout.Spacing = nativeView.Layout.Spacing; - - layout.Attributes = nativeView.Attributes; - - if (virtualView.LineHeight > 1) - layout.LineSpacing = (float)virtualView.LineHeight; - else - { - layout.LineSpacing = 0; - } - - layout.SetText(nativeView.Text); - - if (!heightConstrained) - { - if (nativeView.Lines > 0) - { - lh = layout.GetLineHeigth(nativeView.Lines, false); - layout.Height = (int)lh; - } - } - - if (!heightForWidth && heightConstrained && widthConstrained) - { - layout.Width = Math.Max((widthConstraint - hMargin).ScaledToPango(), -1); - } - - (width, height) = layout.GetPixelSize(nativeView.Text, constraint, nativeView.RequestMode == SizeRequestMode.HeightForWidth); - - if (lh > 0) - { - height = Math.Min((int)lh.ScaledFromPango(), height); - } - - layout.Attributes = null; - - } - - width += hMargin; - height += vMargin; - - return new Size(width, height); - + + double? explicitWidth = (virtualView.Width >= 0) ? virtualView.Width : null; + double? explicitHeight = (virtualView.Height >= 0) ? virtualView.Height : null; + + var size = platformView.GetDesiredSize( + explicitWidth ?? widthConstraint, + explicitHeight ?? heightConstraint); + + return size; } public static void MapText(ILabelHandler handler, ILabel label) @@ -153,7 +81,6 @@ public static void MapMaxLines(ILabelHandler handler, ILabel label) public static void MapPadding(ILabelHandler handler, ILabel label) { handler.PlatformView.WithPadding(label.Padding); - } public static void MapCharacterSpacing(ILabelHandler handler, ILabel label) @@ -197,9 +124,7 @@ public static void MapLineHeight(ILabelHandler handler, ILabel label) // so we use LabelView, this sets it before OnDrawn: nativeView.LineHeight = (float)label.LineHeight; } - } - } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs index c542d6c9e336..87e0fb0d535f 100644 --- a/src/Core/src/Platform/Gtk/LabelView.cs +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -24,20 +24,23 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min SetLayout(Layout, this); base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); - return; - var wContraint = orientation == Orientation.Horizontal ? natural_size : double.PositiveInfinity; - var hContraint = orientation == Orientation.Vertical ? natural_size : double.PositiveInfinity; - var size = GetDesiredSize(wContraint, hContraint, this.RequestMode == SizeRequestMode.HeightForWidth); - natural_size = (int)(orientation == Orientation.Horizontal ? size.Width : size.Height); - - wContraint = orientation == Orientation.Horizontal ? minimum_size : double.PositiveInfinity; - hContraint = orientation == Orientation.Vertical ? minimum_size : double.PositiveInfinity; - size = GetDesiredSize(wContraint, hContraint, this.RequestMode == SizeRequestMode.HeightForWidth); - minimum_size = (int)(orientation == Orientation.Horizontal ? size.Width : size.Height); + + int Constrainted(int avail) + { + var wConstraint = orientation == Orientation.Horizontal ? avail : double.PositiveInfinity; + var hConstraint = orientation == Orientation.Vertical ? avail : double.PositiveInfinity; + var size = GetDesiredSize(wConstraint, hConstraint); + + return (int)(orientation == Orientation.Horizontal ? size.Width : size.Height); + } + + natural_size = Constrainted(natural_size); + minimum_size = Constrainted(minimum_size); } - internal Size GetDesiredSize(double wContraint, double hContraint, bool heightForWidth) - => GetDesiredSize(Layout, wContraint, hContraint, heightForWidth, Text, Lines, + internal Size GetDesiredSize(double wConstraint, double hConstraint) + => GetDesiredSize(Layout, wConstraint, hConstraint, + RequestMode == SizeRequestMode.HeightForWidth, Text, Lines, MarginStart, MarginTop, MarginEnd, MarginBottom); protected override bool OnDrawn(Context cr) @@ -54,6 +57,7 @@ public static void SetLayout(Pango.Layout layout, LabelView platformView) layout.Wrap = platformView.LineBreakMode.GetLineBreakMode().ToPangoWrap(); layout.Ellipsize = platformView.LineBreakMode.GetLineBreakMode().ToPangoEllipsize(); layout.LineSpacing = platformView.LineHeight > 1 ? platformView.LineHeight : 0; + layout.FontDescription = platformView.GetPangoFontDescription(); } public static void SetLayoutFromLabel(Pango.Layout layout, Label platformView) @@ -64,7 +68,7 @@ public static void SetLayoutFromLabel(Pango.Layout layout, Label platformView) } public static Size GetDesiredSize(Pango.Layout layout, double widthConstraint, double heightConstraint, bool heightForWidth, - string text, int lines, int marginStart,int marginTop, int marginEnd, int marginBottom) + string text, int lines, int marginStart, int marginTop, int marginEnd, int marginBottom) { int width = -1; int height = -1; From 39160897f94bee8e2c1382911f15769790214df8 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 16:40:52 +0100 Subject: [PATCH 285/425] [Gtk] Core.csproj: LayoutView: introduce CurrentAllocation; WidgetExtensions: fix --- src/Core/src/Platform/Gtk/LayoutView.cs | 22 ++++++++++++------- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 10 +++++++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index 54dcdc497aae..a7f7a694b708 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -190,6 +190,8 @@ protected void ArrangeAllocation(Rectangle allocation) protected Rectangle LastAllocation { get; set; } + protected Rectangle? CurrentAllocation { get; set; } + protected void ClearMeasured(bool clearCache = true) { if (clearCache && !MeasureCache.IsEmpty) @@ -223,16 +225,16 @@ protected override void OnSizeAllocated(Gdk.Rectangle allocation) IsReallocating = true; var mAllocation = allocation.ToRect(); + CurrentAllocation = mAllocation; clearCache = LastAllocation.IsEmpty || mAllocation.IsEmpty || LastAllocation != mAllocation; ClearMeasured(clearCache); - LastAllocation = mAllocation; - if (RestrictToMeasuredAllocation) { var mesuredAllocation = Measure(allocation.Width, allocation.Height); mAllocation.Size = mesuredAllocation; + CurrentAllocation = mAllocation; } ArrangeAllocation(new Rectangle(Point.Zero, mAllocation.Size)); @@ -246,11 +248,13 @@ protected override void OnSizeAllocated(Gdk.Rectangle allocation) } base.OnSizeAllocated(allocation); + LastAllocation = mAllocation; } finally { IsReallocating = false; IsSizeAllocating = false; + CurrentAllocation = null; } } @@ -270,10 +274,12 @@ protected override void OnRealized() try { LastAllocation = Allocation.ToRect(); + CurrentAllocation = LastAllocation; Measure(Allocation.Width, Allocation.Height); } catch { + CurrentAllocation = null; IsReallocating = false; } } @@ -346,8 +352,8 @@ protected override void OnGetPreferredHeight(out int minimum_height, out int nat // dirty fix: do not constrain width on first allocation var force_width = RequestedWidth ?? double.PositiveInfinity; - if (IsReallocating) - force_width = Allocation.Width; + if (IsReallocating && CurrentAllocation.HasValue) + force_width = CurrentAllocation.Value.Width; var size = Measure(force_width, minimum_height > 0 ? minimum_height : RequestedHeight ?? double.PositiveInfinity); @@ -364,8 +370,8 @@ protected override void OnGetPreferredWidth(out int minimum_width, out int natur // dirty fix: do not constrain height on first allocation var force_height = RequestedHeight ?? double.PositiveInfinity; - if (IsReallocating) - force_height = Allocation.Height; + if (IsReallocating && CurrentAllocation.HasValue) + force_height = CurrentAllocation.Value.Height; var size = Measure(minimum_width > 0 ? minimum_width : RequestedWidth ?? double.PositiveInfinity, force_height); @@ -388,7 +394,7 @@ protected override void OnGetPreferredHeightForWidth(int width, out int minimum_ else minimum_height = natural_height = (int)size.Height; - RequestedHeight = null; + RequestedWidth = null; } protected override void OnGetPreferredWidthForHeight(int height, out int minimum_width, out int natural_width) @@ -403,7 +409,7 @@ protected override void OnGetPreferredWidthForHeight(int height, out int minimum else minimum_width = natural_width = (int)size.Width; - RequestedWidth = null; + RequestedHeight = null; } #endif diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index 202d8005f33e..9220db8959e1 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -9,6 +9,7 @@ namespace Microsoft.Maui public static class WidgetExtensions { + public static void UpdateIsEnabled(this Widget nativeView, bool isEnabled) => nativeView.Sensitive = isEnabled; @@ -68,13 +69,15 @@ public static SizeRequest GetDesiredSize( } else if (widthConstrained) { + minimumWidth = naturalWidth = (int)widthConstraint; nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); } else if (heightConstrained) { + minimumHeight = naturalHeight = (int)heightConstraint; nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); } - + else { nativeView.GetPreferredHeight(out minimumHeight, out naturalHeight); @@ -90,10 +93,12 @@ public static SizeRequest GetDesiredSize( } else if (heightConstrained) { + minimumHeight = naturalHeight = (int)heightConstraint; nativeView.GetPreferredWidthForHeight((int)heightConstraint, out minimumWidth, out naturalWidth); } else if (widthConstrained) { + minimumWidth = naturalWidth = (int)widthConstraint; nativeView.GetPreferredHeightForWidth((int)widthConstraint, out minimumHeight, out naturalHeight); } @@ -111,10 +116,10 @@ public static SizeRequest GetDesiredSize( if (nativeView.WidthRequest > minimumWidth) minimumWidth = nativeView.WidthRequest; + if (nativeView.HeightRequest > minimumHeight) minimumHeight = nativeView.HeightRequest; - return new SizeRequest(new Size(naturalWidth, naturalHeight), new Size(minimumWidth, minimumHeight)); #pragma warning restore CS0162 // Unreachable code detected } @@ -251,6 +256,7 @@ public static void UpdateMaximumHeight(this Widget nativeView, IView view) { } [MissingMapper] public static void UpdateMaximumWidth(this Widget nativeView, IView view) { } + } } \ No newline at end of file From be7c848fd7fa24cd0641281f6e629ad6f16a8c32 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 18:15:10 +0100 Subject: [PATCH 286/425] [Gtk] Core.csproj: WindowHandler.Gtk: inplement MapX,MapY,MapWidth,MapHeight --- .../src/Handlers/Window/WindowHandler.Gtk.cs | 28 ++++++++++----- src/Core/src/Platform/Gtk/WindowExtensions.cs | 34 +++++++++++++++++++ 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs index 7ff0fae0b51c..673621ed22f8 100644 --- a/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs +++ b/src/Core/src/Handlers/Window/WindowHandler.Gtk.cs @@ -6,6 +6,15 @@ namespace Microsoft.Maui.Handlers public partial class WindowHandler : ElementHandler { + protected override void ConnectHandler(Gtk.Window platformView) + { + base.ConnectHandler(platformView); + + // update the platform window with the user size/position + platformView.UpdatePosition(VirtualView); + platformView.UpdateSize(VirtualView); + } + public static void MapTitle(IWindowHandler handler, IWindow window) => handler.PlatformView.UpdateTitle(window); @@ -20,18 +29,19 @@ public static void MapContent(IWindowHandler handler, IWindow window) [MissingMapper] public static void MapRequestDisplayDensity(IWindowHandler handler, IWindow window, object? args) { } - - [MissingMapper] - public static void MapX(IWindowHandler handler, IWindow view) { } - [MissingMapper] - public static void MapY(IWindowHandler handler, IWindow view) { } + public static void MapX(IWindowHandler handler, IWindow view) => + handler.PlatformView?.UpdateX(view); - [MissingMapper] - public static void MapWidth(IWindowHandler handler, IWindow view) { } + public static void MapY(IWindowHandler handler, IWindow view) => + handler.PlatformView?.UpdateY(view); + + public static void MapWidth(IWindowHandler handler, IWindow view) => + handler.PlatformView?.UpdateWidth(view); + + public static void MapHeight(IWindowHandler handler, IWindow view) => + handler.PlatformView?.UpdateHeight(view); - [MissingMapper] - public static void MapHeight(IWindowHandler handler, IWindow view) { } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Gtk/WindowExtensions.cs b/src/Core/src/Platform/Gtk/WindowExtensions.cs index 663d2cd25f83..89003bc73d37 100644 --- a/src/Core/src/Platform/Gtk/WindowExtensions.cs +++ b/src/Core/src/Platform/Gtk/WindowExtensions.cs @@ -46,6 +46,40 @@ public static void SetWindow(this Gtk.Window platformWindow, IWindow window, IMa internal static DisplayOrientation GetOrientation(this IWindow? window) => DeviceDisplay.Current.MainDisplayInfo.Orientation; + public static void UpdateX(this Gtk.Window platformWindow, IWindow window) => + platformWindow.UpdatePosition(window); + + public static void UpdateY(this Gtk.Window platformWindow, IWindow window) => + platformWindow.UpdatePosition(window); + + public static void UpdatePosition(this Gtk.Window platformWindow, IWindow window) + { + + var x = (int)window.X; + var y = (int)window.Y; + + platformWindow.Move(x, y); + } + + public static void UpdateWidth(this Gtk.Window platformWindow, IWindow window) => + platformWindow.UpdateSize(window); + + public static void UpdateHeight(this Gtk.Window platformWindow, IWindow window) => + platformWindow.UpdateSize(window); + + public static void UpdateSize(this Gtk.Window platformWindow, IWindow window) + { + + var width = (int)window.Width; + var height = (int)window.Height; + + if (width <= 0 || height <= 0) + return; + + platformWindow.Resize(width, height); + platformWindow.QueueResize(); + } + } } \ No newline at end of file From c93ed4cd2425f24043a6dc566ca32998e55054b9 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 18:59:38 +0100 Subject: [PATCH 287/425] [Gtk] Core.csproj: ScrollViewHandler.Gtk: disconnect MotionNotifyEvent --- src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs index 938430f41639..d01c3cb932dd 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Gtk.cs @@ -131,6 +131,7 @@ protected virtual void DisconnectButtonEvents(Widget? widget) widget.ButtonPressEvent -= OnNativeViewButtonPressEvent; widget.ButtonReleaseEvent -= OnNativeViewButtonReleaseEvent; widget.ScrollEvent -= OnNativeViewScrollEvent; + widget.MotionNotifyEvent -= OnNativeViewMotionNotifyEvent; } From 6cb940eb5aeb89f894cc4f10ccbfd2c1fef7bbc5 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 20:05:43 +0100 Subject: [PATCH 288/425] [Gtk] Core.csproj: LabelView: fix sizerequest --- src/Core/src/Platform/Gtk/LabelView.cs | 30 +++++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LabelView.cs b/src/Core/src/Platform/Gtk/LabelView.cs index 87e0fb0d535f..49c71689b31e 100644 --- a/src/Core/src/Platform/Gtk/LabelView.cs +++ b/src/Core/src/Platform/Gtk/LabelView.cs @@ -11,6 +11,7 @@ namespace Microsoft.Maui.Platform public class LabelView : Label { + public float LineHeight { get; set; } public TextAlignment HorizontalTextAlignment { get; set; } @@ -25,6 +26,8 @@ protected override void OnAdjustSizeRequest(Orientation orientation, out int min base.OnAdjustSizeRequest(orientation, out minimum_size, out natural_size); + return; + int Constrainted(int avail) { var wConstraint = orientation == Orientation.Horizontal ? avail : double.PositiveInfinity; @@ -46,6 +49,7 @@ internal Size GetDesiredSize(double wConstraint, double hConstraint) protected override bool OnDrawn(Context cr) { SetLayout(Layout, this); + return base.OnDrawn(cr); } @@ -97,30 +101,40 @@ public static Size GetDesiredSize(Pango.Layout layout, double widthConstraint, d layout.Height = (int)lh; } } - else - { - layout.Height = Math.Max((heightConstraint - vMargin).ScaledToPango(), -1); - } - + if (!heightForWidth && heightConstrained && widthConstrained) { layout.Width = Math.Max((widthConstraint - hMargin).ScaledToPango(), -1); } - (width, height) = layout.GetPixelSize(text, constraint, heightForWidth); + var desiredSize = double.IsInfinity(constraint) ? -1 : constraint; + if (desiredSize > 0) + { + if (heightForWidth) + layout.Width = desiredSize.ScaledToPango(); + else + layout.Height = desiredSize.ScaledToPango(); + + } + + layout.SetText(text); + layout.GetPixelSize(out var textWidth, out var textHeight); + + width = textWidth; + height = textHeight; + if (lh > 0) { height = Math.Min((int)lh.ScaledFromPango(), height); } - layout.Attributes = null; - width += hMargin; height += vMargin; return new Size(width, height); } + } } \ No newline at end of file From 52e82dd90f3a356bf421017c0b8ed969b2955c4d Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 17 Nov 2023 22:06:21 +0100 Subject: [PATCH 289/425] [Gtk] Core.csproj: fix BorderHandler.Gtk.cs --- .../src/Handlers/Border/BorderHandler.Gtk.cs | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs index 710bee3d69b7..17204a4c18b3 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -1,11 +1,35 @@ using System; +using Microsoft.Maui.Graphics; namespace Microsoft.Maui.Handlers { + public partial class BorderHandler : ViewHandler { + [MissingMapper] - protected override BorderView CreatePlatformView() => new(); + protected override BorderView CreatePlatformView() + { + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a Border"); + + var view = new BorderView() + { + CrossPlatformMeasure = VirtualView.CrossPlatformMeasure, + CrossPlatformArrange = VirtualView.CrossPlatformArrange + }; + return view; + } + + public override void SetVirtualView(IView view) + { + base.SetVirtualView(view); + + _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); + _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); + + PlatformView.CrossPlatformMeasure = VirtualView.CrossPlatformMeasure; + PlatformView.CrossPlatformArrange = VirtualView.CrossPlatformArrange; + } static partial void UpdateContent(IBorderHandler handler) { @@ -16,5 +40,28 @@ static partial void UpdateContent(IBorderHandler handler) if (virtualView is { Content: IView view }) platformView.Content = view.ToPlatform(mauiContext); } + + public override void PlatformArrange(Rect rect) + { + PlatformView?.CrossPlatformArrange?.Invoke(rect); + + PlatformView?.Arrange(rect); + } + + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + if (PlatformView?.CrossPlatformMeasure is { }) + { + var cf= PlatformView.CrossPlatformMeasure(widthConstraint, heightConstraint); + + return cf; + } + + var size = base.GetDesiredSize(widthConstraint, heightConstraint); + + return size; + } + } -} + +} \ No newline at end of file From a2775fca496fffef2c548a26a77511c3b19d0456 Mon Sep 17 00:00:00 2001 From: lytico Date: Mon, 20 Nov 2023 23:09:36 +0100 Subject: [PATCH 290/425] [Gtk] Core.csproj: fix contenthanders --- src/Core/src/Handlers/Border/BorderHandler.Gtk.cs | 2 +- src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs index 17204a4c18b3..a315b41001a2 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -37,7 +37,7 @@ static partial void UpdateContent(IBorderHandler handler) var mauiContext = handler.MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); var virtualView = handler.VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); - if (virtualView is { Content: IView view }) + if (virtualView is { PresentedContent: IView view }) platformView.Content = view.ToPlatform(mauiContext); } diff --git a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs index 70ad817979c4..d6115d1d2bdc 100644 --- a/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs +++ b/src/Core/src/Handlers/ContentView/ContentViewHandler.Gtk.cs @@ -21,7 +21,7 @@ public void UpdateContent() _ = MauiContext ?? throw new InvalidOperationException($"{nameof(MauiContext)} should have been set by base class."); _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); - if (VirtualView is { Content: IView view }) + if (VirtualView is { PresentedContent: IView view }) PlatformView.Content = view.ToPlatform(MauiContext); } From d59397454d1697e8f711a14ed38fd457418b0769 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 20:31:26 +0100 Subject: [PATCH 291/425] [Gtk] Core.csproj: fix BorderHandler.Gtk.cs --- .../src/Handlers/Border/BorderHandler.Gtk.cs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs index a315b41001a2..3f7d0eeb34f0 100644 --- a/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs +++ b/src/Core/src/Handlers/Border/BorderHandler.Gtk.cs @@ -12,11 +12,8 @@ protected override BorderView CreatePlatformView() { _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} must be set to create a Border"); - var view = new BorderView() - { - CrossPlatformMeasure = VirtualView.CrossPlatformMeasure, - CrossPlatformArrange = VirtualView.CrossPlatformArrange - }; + var view = new BorderView() { CrossPlatformLayout = VirtualView }; + return view; } @@ -27,8 +24,7 @@ public override void SetVirtualView(IView view) _ = VirtualView ?? throw new InvalidOperationException($"{nameof(VirtualView)} should have been set by base class."); _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} should have been set by base class."); - PlatformView.CrossPlatformMeasure = VirtualView.CrossPlatformMeasure; - PlatformView.CrossPlatformArrange = VirtualView.CrossPlatformArrange; + PlatformView.CrossPlatformLayout = VirtualView; } static partial void UpdateContent(IBorderHandler handler) @@ -40,19 +36,19 @@ static partial void UpdateContent(IBorderHandler handler) if (virtualView is { PresentedContent: IView view }) platformView.Content = view.ToPlatform(mauiContext); } - + public override void PlatformArrange(Rect rect) { - PlatformView?.CrossPlatformArrange?.Invoke(rect); + PlatformView?.CrossPlatformLayout?.CrossPlatformArrange(rect); PlatformView?.Arrange(rect); } public override Size GetDesiredSize(double widthConstraint, double heightConstraint) { - if (PlatformView?.CrossPlatformMeasure is { }) + if (PlatformView?.CrossPlatformLayout is { }) { - var cf= PlatformView.CrossPlatformMeasure(widthConstraint, heightConstraint); + var cf = PlatformView.CrossPlatformLayout.CrossPlatformMeasure(widthConstraint, heightConstraint); return cf; } From 07d90a22dcdba101c62d735b80b639457958ff43 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 20:43:14 +0100 Subject: [PATCH 292/425] [Gtk] Core.csproj: draft NavigationView, StackNavigationManager --- src/Core/src/Platform/Gtk/NavigationView.cs | 8 +++++++- src/Core/src/Platform/Gtk/StackNavigationManager.cs | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Gtk/NavigationView.cs b/src/Core/src/Platform/Gtk/NavigationView.cs index 1bc23eb93b60..3c88a914c365 100644 --- a/src/Core/src/Platform/Gtk/NavigationView.cs +++ b/src/Core/src/Platform/Gtk/NavigationView.cs @@ -18,7 +18,13 @@ public Widget? Content get => _content; set { - _content?.Unparent(); + if (_content == value) + return; + + if (_content is { }) + Remove(_content); + + // _content?.Unparent(); _content = value; diff --git a/src/Core/src/Platform/Gtk/StackNavigationManager.cs b/src/Core/src/Platform/Gtk/StackNavigationManager.cs index 491811f5e9e7..6eb616bf7918 100644 --- a/src/Core/src/Platform/Gtk/StackNavigationManager.cs +++ b/src/Core/src/Platform/Gtk/StackNavigationManager.cs @@ -34,6 +34,8 @@ public void Disconnect(IStackNavigation virtualView, NavigationView platformView public void NavigateTo(NavigationRequest request) { _ = PlatformView ?? throw new InvalidOperationException($"{nameof(PlatformView)} must not be null"); + _ = NavigationView ?? throw new InvalidOperationException($"{nameof(NavigationView)} must not be null"); + if (request.NavigationStack.FirstOrDefault() is { } firstOrDefault && firstOrDefault.ToPlatform(Context) is { } s) { From 996d9447656066e04944920cefad5ed85fc0782b Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 20:44:34 +0100 Subject: [PATCH 293/425] [Gtk] Controls.Core.csproj: draft Handlers/Items --- .../Handlers/Items/CarouselViewHandler.Gtk.cs | 41 +- .../Items/GroupableItemsViewHandler.Gtk.cs | 12 +- .../Items/Gtk/CollectionViewExtensions.cs | 42 + .../Handlers/Items/Gtk/EmptyItemAdaptor.cs | 167 ++++ .../Handlers/Items/Gtk/GroupItemSource.cs | 340 +++++++ .../Items/Gtk/GroupItemTemplateAdaptor.cs | 73 ++ .../Handlers/Items/Gtk/ItemTemplateAdaptor.cs | 479 ++++++++++ .../Handlers/Items/Gtk/MauiCarouselView.cs | 260 ++++++ .../Handlers/Items/Gtk/MauiCollectionView.cs | 401 +++++++++ .../CollectionView.GtkImpl.cs | 410 +++++++++ .../Gtk/UIExtensions.NUI/CollectionView.cs | 428 +++++++++ .../CollectionViewController.cs | 651 ++++++++++++++ .../CollectionViewScrolledEventArgs.cs | 45 + .../CollectionViewSelectionMode.cs | 28 + .../Gtk/UIExtensions.NUI/GridLayoutManager.cs | 831 ++++++++++++++++++ .../ICollectionViewController.cs | 79 ++ .../ICollectionViewLayoutManager.cs | 130 +++ .../Items/Gtk/UIExtensions.NUI/IMeasurable.cs | 19 + .../Items/Gtk/UIExtensions.NUI/ItemAdaptor.cs | 250 ++++++ .../UIExtensions.NUI/ItemSizingStrategy.cs | 17 + .../Gtk/UIExtensions.NUI/LayoutEventArgs.cs | 24 + .../UIExtensions.NUI/LinearLayoutManager.cs | 667 ++++++++++++++ .../Items/Gtk/UIExtensions.NUI/ReadMe.md | 9 + .../Gtk/UIExtensions.NUI/RecyclerPool.cs | 52 ++ .../Gtk/UIExtensions.NUI/ScrollableBase.cs | 117 +++ .../UIExtensions.NUI/SnapPointsAlignment.cs | 21 + .../Gtk/UIExtensions.NUI/SnapPointsType.cs | 21 + .../UIExtensions.NUI/SnappableScrollView.cs | 328 +++++++ .../Items/Gtk/UIExtensions.NUI/ViewHolder.cs | 201 +++++ .../Gtk/UIExtensions.NUI/WidgetExtensions.cs | 178 ++++ .../Handlers/Items/ItemsViewHandler.Gtk.cs | 51 +- .../Items/ItemsViewHandler.Windows.cs | 42 +- .../Items/SelectableItemsViewHandler.Gtk.cs | 25 +- .../Items/StructuredItemsViewHandler.Gtk.cs | 27 +- .../StructuredItemsViewHandler.Windows.cs | 98 +-- 35 files changed, 6421 insertions(+), 143 deletions(-) create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/CollectionViewExtensions.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/EmptyItemAdaptor.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/GroupItemSource.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/GroupItemTemplateAdaptor.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/ItemTemplateAdaptor.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/MauiCarouselView.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/MauiCollectionView.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.GtkImpl.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewController.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewScrolledEventArgs.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewSelectionMode.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/GridLayoutManager.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewController.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewLayoutManager.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/IMeasurable.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemAdaptor.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemSizingStrategy.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LayoutEventArgs.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LinearLayoutManager.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ReadMe.md create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/RecyclerPool.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ScrollableBase.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsAlignment.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsType.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnappableScrollView.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ViewHolder.cs create mode 100644 src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/WidgetExtensions.cs diff --git a/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs index 2612c93785e8..551b0b5b0d8c 100644 --- a/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/CarouselViewHandler.Gtk.cs @@ -1,25 +1,42 @@ -using System; +#nullable disable +using TCollectionView = Gtk.UIExtensions.NUI.CollectionView; namespace Microsoft.Maui.Controls.Handlers.Items { public partial class CarouselViewHandler : ItemsViewHandler { - [MissingMapper] - public static void MapCurrentItem(CarouselViewHandler handler, CarouselView carouselView) { } - - [MissingMapper] - public static void MapPosition(CarouselViewHandler handler, CarouselView carouselView) { } - + protected override TCollectionView CreatePlatformView() + { + return new MauiCarouselView(); + } + + public static void MapCurrentItem(CarouselViewHandler handler, CarouselView carouselView) + { + (handler.PlatformView as MauiCarouselView)?.UpdateCurrentItem(); + } + + public static void MapPosition(CarouselViewHandler handler, CarouselView carouselView) + { + (handler.PlatformView as MauiCarouselView)?.UpdatePosition(); + } + [MissingMapper] public static void MapIsBounceEnabled(CarouselViewHandler handler, CarouselView carouselView) { } - - [MissingMapper] - public static void MapIsSwipeEnabled(CarouselViewHandler handler, CarouselView carouselView) { } - + + public static void MapIsSwipeEnabled(CarouselViewHandler handler, CarouselView carouselView) + { + (handler.PlatformView as MauiCarouselView)?.UpdateIsSwipeEnabled(); + } + [MissingMapper] public static void MapPeekAreaInsets(CarouselViewHandler handler, CarouselView carouselView) { } - + [MissingMapper] public static void MapLoop(CarouselViewHandler handler, CarouselView carouselView) { } + + public static void MapItemsLayout(CarouselViewHandler handler, CarouselView itemsView) + { + (handler.PlatformView as MauiCarouselView)?.UpdateLayoutManager(); + } } } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs index ec132deb9f91..30b11f17a4c9 100644 --- a/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.Gtk.cs @@ -1,10 +1,18 @@ -namespace Microsoft.Maui.Controls.Handlers.Items +#nullable disable +using TCollectionView = Gtk.UIExtensions.NUI.CollectionView; + +namespace Microsoft.Maui.Controls.Handlers.Items { public partial class GroupableItemsViewHandler : SelectableItemsViewHandler where TItemsView : GroupableItemsView { - [MissingMapper] + protected override TCollectionView CreatePlatformView() + { + return new MauiGroupableItemsView(); + } + public static void MapIsGrouped(GroupableItemsViewHandler handler, GroupableItemsView itemsView) { + (handler.PlatformView as MauiGroupableItemsView).UpdateAdaptor(); } } } diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/CollectionViewExtensions.cs b/src/Controls/src/Core/Handlers/Items/Gtk/CollectionViewExtensions.cs new file mode 100644 index 000000000000..2f29a86f6605 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/CollectionViewExtensions.cs @@ -0,0 +1,42 @@ +#nullable disable +using Gtk.UIExtensions.NUI; +using TCollectionViewSelectionMode = Gtk.UIExtensions.NUI.CollectionViewSelectionMode; +using TItemSizingStrategy = Microsoft.Maui.Controls.ItemSizingStrategy; +using Microsoft.Maui.Controls; + +namespace Gtk.UIExtensions.NUI +{ + public static class CollectionViewExtensions + { + public static TCollectionViewSelectionMode ToNative(this SelectionMode selectionMode) + { + switch (selectionMode) + { + case SelectionMode.Multiple: + return TCollectionViewSelectionMode.Multiple; + case SelectionMode.Single: + return TCollectionViewSelectionMode.SingleAlways; + default: + return TCollectionViewSelectionMode.None; + } + } + + public static ICollectionViewLayoutManager ToLayoutManager(this IItemsLayout layout, ItemSizingStrategy sizing = ItemSizingStrategy.MeasureFirstItem) + { + switch (layout) + { + case LinearItemsLayout listItemsLayout: + return new LinearLayoutManager(listItemsLayout.Orientation == ItemsLayoutOrientation.Horizontal, (TItemSizingStrategy)sizing, listItemsLayout.ItemSpacing.ToScaledPixel()); + case GridItemsLayout gridItemsLayout: + return new GridLayoutManager(gridItemsLayout.Orientation == ItemsLayoutOrientation.Horizontal, + gridItemsLayout.Span, + (TItemSizingStrategy)sizing, + gridItemsLayout.VerticalItemSpacing.ToScaledPixel(), + gridItemsLayout.HorizontalItemSpacing.ToScaledPixel()); + default: + break; + } + return new LinearLayoutManager(false); + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/EmptyItemAdaptor.cs b/src/Controls/src/Core/Handlers/Items/Gtk/EmptyItemAdaptor.cs new file mode 100644 index 000000000000..9cd5673c00b1 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/EmptyItemAdaptor.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Gtk.UIExtensions.NUI; +using NView = Gtk.Widget; +using TSize = Microsoft.Maui.Graphics.Size; +using XLabel = Microsoft.Maui.Controls.Label; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public class EmptyItemAdaptor : ItemTemplateAdaptor + { + static DataTemplate s_defaultEmptyTemplate = new DataTemplate(typeof(EmptyView)); + + View? _createdEmptyView; + + public EmptyItemAdaptor(ItemsView itemsView, IEnumerable items, DataTemplate template) : base(itemsView, items, template) + { + } + + public static EmptyItemAdaptor Create(ItemsView itemsView) + { + DataTemplate template; + if (itemsView.EmptyView is View emptyView) + { + template = new DataTemplate(() => + { + return emptyView; + }); + } + else + { + template = itemsView.EmptyViewTemplate ?? s_defaultEmptyTemplate; + } + + return new EmptyItemAdaptor(itemsView, new List(), template); + } + + public override NView? GetFooterView() + { + return null; + } + + public override NView? GetHeaderView() + { + View emptyView = (View)ItemTemplate.CreateContent(); + + if (emptyView.Handler is IDisposable platformHandler) + platformHandler.Dispose(); + + emptyView.Handler = null; + if (emptyView != (Element as ItemsView)?.EmptyView) + emptyView.BindingContext = (Element as ItemsView)?.EmptyView; + + var header = CreateHeaderView(); + if (header != null) + { + if (header.Handler is IDisposable nativeHandler) + nativeHandler.Dispose(); + header.Handler = null; + } + + var footer = CreateFooterView(); + if (footer != null) + { + if (footer.Handler is IDisposable nativeHandler) + nativeHandler.Dispose(); + footer.Handler = null; + } + + bool isHorizontal = false; + + if (CollectionView is Gtk.UIExtensions.NUI.CollectionView cv) + { + if (cv.LayoutManager != null) + { + isHorizontal = cv.LayoutManager.IsHorizontal; + } + } + + var layout = new Grid(); + + if (isHorizontal) + { + layout.ColumnDefinitions.Add(new ColumnDefinition + { + Width = GridLength.Auto, + }); + layout.ColumnDefinitions.Add(new ColumnDefinition + { + Width = GridLength.Star, + }); + layout.ColumnDefinitions.Add(new ColumnDefinition + { + Width = GridLength.Auto, + }); + } + else + { + layout.RowDefinitions.Add(new RowDefinition + { + Height = GridLength.Auto, + }); + layout.RowDefinitions.Add(new RowDefinition + { + Height = GridLength.Star, + }); + layout.RowDefinitions.Add(new RowDefinition + { + Height = GridLength.Auto, + }); + } + + if (header != null) + { + layout.Add(header, 0, 0); + } + + if (isHorizontal) + layout.Add(emptyView, 1, 0); + else + layout.Add(emptyView, 0, 1); + + if (footer != null) + { + if (isHorizontal) + layout.Add(footer, 2, 0); + else + layout.Add(footer, 0, 2); + } + + layout.Parent = Element; + _createdEmptyView = layout; + + return layout.ToPlatform(MauiContext); + } + + public override TSize MeasureHeader(double widthConstraint, double heightConstraint) + { + return (CollectionView as NView)!.Size(); + } + + public override TSize MeasureItem(double widthConstraint, double heightConstraint) + { + return new TSize(widthConstraint, heightConstraint); + } + + class EmptyView : StackLayout + { + public EmptyView() + { + HorizontalOptions = LayoutOptions.Fill; + VerticalOptions = LayoutOptions.Fill; + Children.Add( + new XLabel + { + Text = "No items found", + VerticalOptions = LayoutOptions.Center, + HorizontalOptions = LayoutOptions.Center, + HorizontalTextAlignment = TextAlignment.Center, + VerticalTextAlignment = TextAlignment.Center, + } + ); + } + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/GroupItemSource.cs b/src/Controls/src/Core/Handlers/Items/Gtk/GroupItemSource.cs new file mode 100644 index 000000000000..34d5f944d71a --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/GroupItemSource.cs @@ -0,0 +1,340 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public class GroupItemSource : IList, INotifyCollectionChanged, IDisposable + { + IList _groupSource = new List(); + IList _originalGroupSource = new List(); + INotifyCollectionChanged? _groupColletionChanged; + int _groupHeaderFooterCount; + bool _disposedValue; + + public GroupItemSource(GroupableItemsView itemsView) + { + ItemsView = itemsView; + HasGroupHeader = ItemsView.GroupHeaderTemplate != null; + HasGroupFooter = ItemsView.GroupFooterTemplate != null; + _groupHeaderFooterCount = (HasGroupHeader ? 1 : 0) + (HasGroupFooter ? 1 : 0); + BuildGroupSource(ItemsView.ItemsSource); + } + + public event NotifyCollectionChangedEventHandler? CollectionChanged; + + public object? this[int index] + { + get => GetItem(index); + set => throw new NotImplementedException(); + } + + public int Count => GetCount(); + + bool HasGroupHeader { get; set; } + + bool HasGroupFooter { get; set; } + + GroupableItemsView ItemsView { get; } + + #region NotImplemented IList interface + public bool IsFixedSize => false; + public bool IsReadOnly => false; + public bool IsSynchronized => false; + public object SyncRoot => this; + public int Add(object? value) => throw new NotImplementedException(); + public void Clear() => throw new NotImplementedException(); + public void Insert(int index, object? value) => throw new NotImplementedException(); + public void Remove(object? value) => throw new NotImplementedException(); + public void RemoveAt(int index) => throw new NotImplementedException(); + public void CopyTo(Array array, int index) => throw new NotImplementedException(); + public IEnumerator GetEnumerator() => throw new NotImplementedException(); + #endregion + + public bool Contains(object? value) => IndexOf(value) != -1; + + public int IndexOf(object? value) + { + for (int groupIndex = 0; groupIndex < _groupSource.Count; groupIndex++) + { + if (_groupSource[groupIndex] == value) + { + return GetAbsoluteIndex(groupIndex, -1); + } + + var idx = _groupSource[groupIndex].IndexOf(value); + if (idx > -1) + { + return GetAbsoluteIndex(groupIndex, idx); + } + } + return -1; + } + + /// + /// Get group and index + /// + /// a global index + /// index of group , index in group + public (int, int) GetGroupAndIndex(int index) + { + int groupIndex = 0; + int count = 0; + foreach (var src in _groupSource) + { + count += src.Count + _groupHeaderFooterCount; + if (count > index) + { + var groupStartIndex = count -= src.Count + _groupHeaderFooterCount; + int inGroupIndex = index - groupStartIndex; + return (groupIndex, AdjustIndex(inGroupIndex, src.Count)); + } + groupIndex++; + } + return (-1, -1); + } + + /// + /// Get absolute index in groups + /// + /// Index of group + /// Index of item in group + /// Index that converted to absolute position + public int GetAbsoluteIndex(int group, int ingroup) + { + int absIdx = 0; + for (int i = 0; i < group; i++) + { + absIdx += _groupSource[i].Count + _groupHeaderFooterCount; + } + absIdx += ingroup + (HasGroupHeader ? 1 : 0); + return absIdx; + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + if (_groupColletionChanged != null) + _groupColletionChanged.CollectionChanged -= OnGroupCollectionChanged; + } + _disposedValue = true; + } + } + + IList BuildGroupSource(IEnumerable itemSource) + { + foreach (var src in itemSource) + { + AddGroupItem(src); + } + + if (itemSource is INotifyCollectionChanged groupCollectionChanged) + { + groupCollectionChanged.CollectionChanged += OnGroupCollectionChanged; + _groupColletionChanged = groupCollectionChanged; + } + + return _groupSource; + } + + object? GetItem(int index) + { + var (group, inGroup) = GetGroupAndIndex(index); + + if (group == -1) + return null; + + if (inGroup < 0) + return _groupSource[group]; + else + return _groupSource[group][inGroup]; + } + + int GetCount() + { + int count = 0; + foreach (var inGroup in _groupSource) + { + count += inGroup.Count + _groupHeaderFooterCount; + } + return count; + } + + int AdjustIndex(int index, int count) + { + if (HasGroupHeader) + index--; + if (index == count && HasGroupFooter) + index = -2; + + return index; + } + + void OnGroupCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems != null) + { + int idx = e.NewStartingIndex != -1 ? e.NewStartingIndex : _groupSource.Count; + foreach (var groupItem in e.NewItems) + { + HandleGroupCollectionAdded(idx++, groupItem); + } + } + else if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null) + { + foreach (var groupItem in e.OldItems) + { + HandleGroupCollectionRemoved(groupItem); + } + } + else if (e.Action == NotifyCollectionChangedAction.Replace && e.NewItems != null && e.OldItems != null) + { + for (int i = 0; i < e.OldItems.Count; i++) + { + int replaceIdx = _originalGroupSource.IndexOf(e.OldItems[i]!); + HandleGroupCollectionRemoved(e.OldItems[i]!); + HandleGroupCollectionAdded(replaceIdx, e.NewItems[i]!); + } + } + else if (e.Action == NotifyCollectionChangedAction.Reset) + { + foreach (var item in _originalGroupSource) + { + RemoveGroupItem(item); + } + CollectionChanged?.Invoke(this, e); + } + } + + void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + var groupIdx = _groupSource.IndexOf(sender); + if (groupIdx == -1) + return; + + if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems != null) + { + var startIndexInGroup = e.NewStartingIndex != -1 ? e.NewStartingIndex : _groupSource[groupIdx].Count; + var startIndexInGlobal = GetAbsoluteIndex(groupIdx, startIndexInGroup); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, e.NewItems, startIndexInGlobal)); + } + else if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null) + { + var startIndexInGroup = e.OldStartingIndex != -1 ? e.OldStartingIndex : _groupSource[groupIdx].Count + e.OldItems.Count - 1; + var startIndexInGlobal = GetAbsoluteIndex(groupIdx, startIndexInGroup); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, e.OldItems, startIndexInGlobal)); + } + else if (e.Action == NotifyCollectionChangedAction.Replace && e.NewItems != null && e.OldItems != null) + { + var startIndexInGlobal = e.NewStartingIndex == -1 ? -1 : GetAbsoluteIndex(groupIdx, e.NewStartingIndex); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, e.NewItems, e.OldItems, startIndexInGlobal)); + } + else if (e.Action == NotifyCollectionChangedAction.Move && e.NewItems != null) + { + var oldIndex = GetAbsoluteIndex(groupIdx, e.OldStartingIndex); + var newIndex = GetAbsoluteIndex(groupIdx, e.NewStartingIndex); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, e.NewItems, newIndex, oldIndex)); + } + else if (e.Action == NotifyCollectionChangedAction.Reset) + { + CollectionChanged?.Invoke(this, e); + } + } + + void HandleGroupCollectionAdded(int startIndex, object groupItem) + { + InsertGroupItem(startIndex, groupItem); + + var startIdx = GetAbsoluteIndex(startIndex, 0) + (HasGroupHeader ? -1 : 0); + var newitems = _groupSource[startIndex].Cast().ToList(); + + if (HasGroupHeader) + newitems.Insert(0, _groupSource[startIndex]); + if (HasGroupFooter) + newitems.Add(_groupSource[startIndex]); + + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newitems, startIdx)); + } + + void HandleGroupCollectionRemoved(object groupItem) + { + var groupIdx = _originalGroupSource.IndexOf(groupItem); + + if (groupIdx == -1) + return; + + var olditems = _groupSource[groupIdx].Cast().ToList(); + if (HasGroupHeader) + olditems.Insert(0, _groupSource[groupIdx]); + if (HasGroupFooter) + olditems.Add(_groupSource[groupIdx]); + + var startIdx = GetAbsoluteIndex(groupIdx, 0) + (HasGroupHeader ? -1 : 0); + + RemoveGroupItem(groupItem); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, olditems, startIdx)); + } + + void AddGroupItem(object groupItem) + { + if (groupItem is IEnumerable enumerable) + { + _groupSource.Add(CreateSource(enumerable)); + _originalGroupSource.Add(groupItem); + if (groupItem is INotifyCollectionChanged collectionChanged) + { + collectionChanged.CollectionChanged += OnCollectionChanged; + } + } + } + + void InsertGroupItem(int index, object groupItem) + { + if (groupItem is IEnumerable enumerable) + { + _groupSource.Insert(index, CreateSource(enumerable)); + _originalGroupSource.Insert(index, groupItem); + if (groupItem is INotifyCollectionChanged collectionChanged) + { + collectionChanged.CollectionChanged += OnCollectionChanged; + } + } + } + + void RemoveGroupItem(object groupItem) + { + var idx = _originalGroupSource.IndexOf(groupItem); + _groupSource.RemoveAt(idx); + _originalGroupSource.RemoveAt(idx); + if (groupItem is INotifyCollectionChanged collectionChanged) + { + collectionChanged.CollectionChanged -= OnCollectionChanged; + } + } + + static IList CreateSource(IEnumerable source) + { + if (source is IList list) + return list; + + var listSource = new List(); + + foreach (object item in source) + { + listSource.Add(item); + } + return listSource; + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/GroupItemTemplateAdaptor.cs b/src/Controls/src/Core/Handlers/Items/Gtk/GroupItemTemplateAdaptor.cs new file mode 100644 index 000000000000..aec26c2460e5 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/GroupItemTemplateAdaptor.cs @@ -0,0 +1,73 @@ +using NView = Gtk.Widget; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + + public class GroupItemTemplateAdaptor : ItemTemplateAdaptor + { + GroupItemSource _groupItemSource; + DataTemplate _groupHeaderTemplate; + DataTemplate _groupFooterTemplate; + DataTemplate _itemTemplate; + + public GroupItemTemplateAdaptor(GroupableItemsView itemsView, GroupItemSource source) : base(itemsView, source, itemsView.ItemTemplate ?? new DefaultItemTemplate()) + { + _groupHeaderTemplate = itemsView.GroupHeaderTemplate ?? new DefaultItemTemplate(); + _groupFooterTemplate = itemsView.GroupFooterTemplate ?? new DefaultItemTemplate(); + _itemTemplate = ItemTemplate; + _groupItemSource = source; + } + + /// + /// Get absolute index in groups + /// + /// Index of group + /// Index of item in group + /// Index that converted to absolute position + public int GetAbsoluteIndex(int group, int inGroup) + { + return _groupItemSource.GetAbsoluteIndex(group, inGroup); + } + + public override NView CreateNativeView(int index) + { + var (_, inGroup) = _groupItemSource.GetGroupAndIndex(index); + if (inGroup == -1) + { + ItemTemplate = _groupHeaderTemplate; + } + else if (inGroup == -2) + { + ItemTemplate = _groupFooterTemplate; + } + var nativeView = base.CreateNativeView(index); + + ItemTemplate = _itemTemplate; + return nativeView; + } + + public override object GetViewCategory(int index) + { + var (_, inGroup) = _groupItemSource.GetGroupAndIndex(index); + if (inGroup == -1) + { + return _groupHeaderTemplate; + } + else if (inGroup == -2) + { + return _groupFooterTemplate; + } + + return base.GetViewCategory(index); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _groupItemSource?.Dispose(); + } + base.Dispose(disposing); + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/ItemTemplateAdaptor.cs b/src/Controls/src/Core/Handlers/Items/Gtk/ItemTemplateAdaptor.cs new file mode 100644 index 000000000000..d6b061effd41 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/ItemTemplateAdaptor.cs @@ -0,0 +1,479 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.Maui.Graphics; +using Gtk.UIExtensions.NUI; +using NView = Gtk.Widget; +using TSize = Microsoft.Maui.Graphics.Size; +using XLabel = Microsoft.Maui.Controls.Label; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + public class CollectionViewSelectionChangedEventArgs : EventArgs + { + public IList? SelectedItems { get; set; } + } + + public class ItemTemplateAdaptor : ItemAdaptor + { + Dictionary _nativeMauiTable = new Dictionary(); + Dictionary _dataBindedViewTable = new Dictionary(); + protected View? _headerCache; + protected View? _footerCache; + + public ItemTemplateAdaptor(ItemsView itemsView) : this(itemsView, itemsView.ItemsSource, itemsView.ItemTemplate ?? new DefaultItemTemplate()) { } + + protected ItemTemplateAdaptor(Element itemsView, IEnumerable items, DataTemplate template) : base(items) + { + ItemTemplate = template; + Element = itemsView; + IsSelectable = itemsView is SelectableItemsView; + } + + public event EventHandler? SelectionChanged; + + protected DataTemplate ItemTemplate { get; set; } + + protected Element Element { get; set; } + + protected virtual bool IsSelectable { get; } + + protected IMauiContext MauiContext => Element.Handler!.MauiContext!; + + public object GetData(int index) + { + if (this[index] == null) + throw new InvalidOperationException("No data"); + + return this[index]!; + } + + public override void SendItemSelected(IEnumerable selected) + { + var items = new List(); + + foreach (var idx in selected) + { + if (idx < 0 || Count <= idx) + continue; + + var selectedObject = this[idx]; + + if (selectedObject != null) + items.Add(selectedObject); + } + + SelectionChanged?.Invoke(this, new CollectionViewSelectionChangedEventArgs { SelectedItems = items }); + } + + public override void UpdateViewState(NView view, ViewHolderState state) + { + base.UpdateViewState(view, state); + + if (_nativeMauiTable.TryGetValue(view, out View? formsView)) + { + switch (state) + { + case ViewHolderState.Focused: + VisualStateManager.GoToState(formsView, VisualStateManager.CommonStates.Focused); + formsView.SetValue(VisualElement.IsFocusedPropertyKey, true); + + break; + case ViewHolderState.Normal: + VisualStateManager.GoToState(formsView, VisualStateManager.CommonStates.Normal); + formsView.SetValue(VisualElement.IsFocusedPropertyKey, false); + + break; + case ViewHolderState.Selected: + if (IsSelectable) + VisualStateManager.GoToState(formsView, VisualStateManager.CommonStates.Selected); + + break; + } + } + } + + public override IView? GetTemplatedView(NView view) + { + return _nativeMauiTable.TryGetValue (view, out View? value) ? value : null; + } + + public override IView? GetTemplatedView(int index) + { + var item = this[index]; + + if (item != null && Count > index && _dataBindedViewTable.TryGetValue(item, out View? view)) + { + return view; + } + + return null; + } + + public override object GetViewCategory(int index) + { + if (ItemTemplate is DataTemplateSelector selector) + { + return selector.SelectTemplate(this[index], Element); + } + + return base.GetViewCategory(index); + } + + public override NView CreateNativeView(int index) + { + View view; + + if (ItemTemplate is DataTemplateSelector selector) + { + view = (View)selector.SelectTemplate(GetData(index), Element).CreateContent(); + } + else + { + view = (View)ItemTemplate.CreateContent(); + } + + var native = view.ToPlatform(MauiContext); + _nativeMauiTable[native] = view; + + return native; + } + + public override NView CreateNativeView() + { + return CreateNativeView(0); + } + +#pragma warning disable CS8764 + public override NView? GetHeaderView() +#pragma warning restore CS8764 + { + if (_headerCache != null) + { + _headerCache.MeasureInvalidated -= OnHeaderFooterMeasureInvalidated; + } + + _headerCache = CreateHeaderView(); + + if (_headerCache != null) + { + _headerCache.Parent = Element; + + if (_headerCache.Handler is IDisposable nativeHandler) + nativeHandler.Dispose(); + + _headerCache.Handler = null; + _headerCache.MeasureInvalidated += OnHeaderFooterMeasureInvalidated; + + return _headerCache.ToPlatform(MauiContext); + } + + return null; + } + +#pragma warning disable CS8764 + public override NView? GetFooterView() +#pragma warning restore CS8764 + { + if (_footerCache != null) + { + _footerCache.MeasureInvalidated -= OnHeaderFooterMeasureInvalidated; + } + + _footerCache = CreateFooterView(); + + if (_footerCache != null) + { + _footerCache.Parent = Element; + + if (_footerCache.Handler is IDisposable nativeHandler) + nativeHandler.Dispose(); + + _footerCache.Handler = null; + _footerCache.MeasureInvalidated += OnHeaderFooterMeasureInvalidated; + + return _footerCache.ToPlatform(MauiContext); + } + + return null; + } + + public override void RemoveNativeView(NView native) + { + UnBinding(native); + + if (_nativeMauiTable.TryGetValue(native, out View? view)) + { + if (view.Handler is IPlatformViewHandler handler) + { + _nativeMauiTable.Remove(handler.PlatformView!); + + if (handler is IDisposable d) + d.Dispose(); + + view.Handler = null; + } + } + } + + public override void SetBinding(NView native, int index) + { + if (_nativeMauiTable.TryGetValue(native, out View? view)) + { + ResetBindedView(view); + view.BindingContext = this[index]; + _dataBindedViewTable[this[index]!] = view; + view.MeasureInvalidated += OnItemMeasureInvalidated; + + AddLogicalChild(view); + } + } + + public override void UnBinding(NView native) + { + if (_nativeMauiTable.TryGetValue(native, out View? view)) + { + view.MeasureInvalidated -= OnItemMeasureInvalidated; + ResetBindedView(view); + } + } + + public override TSize MeasureItem(double widthConstraint, double heightConstraint) + { + return MeasureItem(0, widthConstraint, heightConstraint); + } + + public override TSize MeasureItem(int index, double widthConstraint, double heightConstraint) + { + if (index < 0 || index >= Count || this[index] == null) + return new TSize(0, 0); + + widthConstraint = widthConstraint.ToScaledDP(); + heightConstraint = heightConstraint.ToScaledDP(); + + if (_dataBindedViewTable.TryGetValue(GetData(index), out View? createdView) && createdView != null) + { + return (createdView as IView).Measure(widthConstraint, heightConstraint).ToPixel(); + } + + View view; + + if (ItemTemplate is DataTemplateSelector selector) + { + view = (View)selector.SelectTemplate(GetData(index), Element).CreateContent(); + } + else + { + view = (View)ItemTemplate.CreateContent(); + } + + + if (Count > index) + view.BindingContext = this[index]; + + view.Parent = Element; + + var platformView = view.ToPlatform(MauiContext); + var handler = view.Handler!; + + try + { + return (view as IView).Measure(widthConstraint, heightConstraint).ToPixel(); + } + finally + { + if (handler is IDisposable d) + d.Dispose(); + } + } + + public override TSize MeasureHeader(double widthConstraint, double heightConstraint) + { + // TODO. It is workaround code, if update Tizen.UIExtensions.NUI, this code will be removed + if (CollectionView is Gtk.UIExtensions.NUI.CollectionView cv) + { + if (cv.LayoutManager != null) + { + if (cv.LayoutManager.IsHorizontal) + widthConstraint = double.PositiveInfinity; + else + heightConstraint = double.PositiveInfinity; + } + } + + return (_headerCache as IView)?.Measure(widthConstraint.ToScaledDP(), heightConstraint.ToScaledDP()).ToPixel() ?? new TSize(0, 0); + } + + public override TSize MeasureFooter(double widthConstraint, double heightConstraint) + { + return (_footerCache as IView)?.Measure(widthConstraint.ToScaledDP(), heightConstraint.ToScaledDP()).ToPixel() ?? new TSize(0, 0); + } + + protected virtual View? CreateHeaderView() + { + if (Element is StructuredItemsView structuredItemsView) + { + if (structuredItemsView.Header != null) + { + View? header = null; + + if (structuredItemsView.Header is View view) + { + header = view; + } + else if (structuredItemsView.HeaderTemplate != null) + { + header = (View)structuredItemsView.HeaderTemplate.CreateContent(); + header.BindingContext = structuredItemsView.Header; + } + else if (structuredItemsView.Header is string str) + { + header = new XLabel { Text = str, }; + } + + return header; + } + } + + return null; + } + + protected virtual View? CreateFooterView() + { + if (Element is StructuredItemsView structuredItemsView) + { + if (structuredItemsView.Footer != null) + { + View? footer = null; + + if (structuredItemsView.Footer is View view) + { + footer = view; + } + else if (structuredItemsView.FooterTemplate != null) + { + footer = (View)structuredItemsView.FooterTemplate.CreateContent(); + footer.BindingContext = structuredItemsView.Footer; + } + else if (structuredItemsView.Footer is string str) + { + footer = new XLabel { Text = str, }; + } + + return footer; + } + } + + return null; + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (_headerCache != null) + { + _headerCache.MeasureInvalidated -= OnHeaderFooterMeasureInvalidated; + } + + if (_footerCache != null) + { + _footerCache.MeasureInvalidated -= OnHeaderFooterMeasureInvalidated; + } + } + + base.Dispose(disposing); + } + + void ResetBindedView(View view) + { + if (view.BindingContext != null && _dataBindedViewTable.ContainsKey(view.BindingContext)) + { + _dataBindedViewTable[view.BindingContext] = null; + RemoveLogicalChild(view); + view.BindingContext = null; + } + } + + void OnItemMeasureInvalidated(object? sender, EventArgs e) + { + var data = (sender as View)?.BindingContext ?? null; + int index = data != null ? GetItemIndex(data) : -1; + + if (index != -1) + { + CollectionView?.ItemMeasureInvalidated(index); + } + } + + void OnHeaderFooterMeasureInvalidated(object? sender, EventArgs e) + { + CollectionView?.ItemMeasureInvalidated(-1); + } + + void AddLogicalChild(Element element) + { + if (Element is ItemsView iv) + { + iv.AddLogicalChild(element); + } + else + { + element.Parent = Element; + } + } + + void RemoveLogicalChild(Element element) + { + if (Element is ItemsView iv) + { + iv.RemoveLogicalChild(element); + } + else + { + element.Parent = null; + } + } + } + + public class CarouselViewItemTemplateAdaptor : ItemTemplateAdaptor + { + public CarouselViewItemTemplateAdaptor(ItemsView itemsView) : base(itemsView) { } + + public override TSize MeasureItem(double widthConstraint, double heightConstraint) + { + return MeasureItem(0, widthConstraint, heightConstraint); + } + + public override TSize MeasureItem(int index, double widthConstraint, double heightConstraint) + { + return (CollectionView as NView)!.Size(); + } + } + + class DefaultItemTemplate : DataTemplate + { + public DefaultItemTemplate() : base(CreateView) { } + + class ToTextConverter : IValueConverter + { + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value?.ToString() ?? string.Empty; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + => throw new NotImplementedException(); + } + + static View CreateView() + { + var label = new XLabel { TextColor = Colors.Black, }; + + label.SetBinding(XLabel.TextProperty, new Binding(".", converter: new ToTextConverter())); + + return new Controls.StackLayout { BackgroundColor = Colors.White, Padding = 30, Children = { label } }; + } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/MauiCarouselView.cs b/src/Controls/src/Core/Handlers/Items/Gtk/MauiCarouselView.cs new file mode 100644 index 000000000000..40e6e0029c06 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/MauiCarouselView.cs @@ -0,0 +1,260 @@ +using System; +using System.Collections.Generic; +using Gtk.UIExtensions.NUI; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + + public class MauiCarouselView : MauiCollectionView + { + + List _oldViews = new List(); + bool _updatePositionFromUI; + bool _updateCurrentItemFromUI; + bool _itemLayouted; + + public override void SetupNewElement(CarouselView newElement) + { + base.SetupNewElement(newElement); + + Scrolled += OnScrolled; + ScrollView.ScrollDragStarted += OnDragStart; + ScrollView.ScrollDragEnded += OnDragStop; + ScrollView.ScrollAnimationStarted += OnScrollStart; + Relayout += OnRelayout; + _itemLayouted = false; + } + + public override void TearDownOldElement(CarouselView oldElement) + { + base.TearDownOldElement(oldElement); + + Scrolled -= OnScrolled; + ScrollView.ScrollDragStarted -= OnDragStart; + ScrollView.ScrollDragEnded -= OnDragStop; + ScrollView.ScrollAnimationStarted -= OnScrollStart; + Relayout -= OnRelayout; + + } + + void OnRelayout(object? sender, EventArgs e) + { + var size = this.Size(); + + if (size.Width > 0 && size.Height > 0) + { + Application.Current?.Dispatcher.Dispatch(() => + { + _itemLayouted = true; + UpdatePosition(); + UpdateCurrentItem(); + }); + } + + } + + public override IItemsLayout GetItemsLayout() + { + return ItemsView!.ItemsLayout; + } + + public override void UpdateAdaptor() + { + base.UpdateAdaptor(); + + UpdatePosition(); + UpdateCurrentItem(); + } + + public override void UpdateLayoutManager() + { + base.UpdateLayoutManager(); + UpdatePosition(); + UpdateCurrentItem(); + } + + public void UpdatePositionFromUI(int position) + { + if (ItemsView == null) + return; + + _updatePositionFromUI = true; + ItemsView.Position = position; + _updatePositionFromUI = false; + } + + public void UpdateCurrentItemFromUI(object item) + { + if (ItemsView == null) + return; + + _updateCurrentItemFromUI = true; + ItemsView.CurrentItem = item; + _updateCurrentItemFromUI = false; + } + + public void UpdateCurrentItem() + { + if (_updateCurrentItemFromUI) + return; + + var size = this.Size(); + + if (ItemsView == null || Adaptor == null || LayoutManager == null || size.Width == 0 || size.Height == 0) + return; + + if (!_itemLayouted) + return; + + if (ItemsView.CurrentItem != null) + ScrollTo(Adaptor.GetItemIndex(ItemsView.CurrentItem)); + } + + public void UpdatePosition() + { + if (_updatePositionFromUI) + return; + + if (!_itemLayouted) + return; + + var size = this.Size(); + + if (ItemsView == null || Adaptor == null || LayoutManager == null || size.Width == 0 || size.Height == 0) + return; + + ScrollTo(ItemsView.Position); + } + + public void UpdateIsSwipeEnabled() + { + if (ItemsView == null) + return; + + ScrollView.ScrollEnabled = ItemsView.IsSwipeEnabled; + } + + protected override ItemTemplateAdaptor CreateItemAdaptor(ItemsView view) + { + return new CarouselViewItemTemplateAdaptor(view); + } + + void ScrollTo(int position) + { + if (ItemsView == null || Adaptor == null || LayoutManager == null) + return; + + if (ItemsView.IsScrolling) + return; + + if (position > -1 && position < Adaptor.Count) + { + ScrollTo(position, animate: true); + } + } + + void OnScrolled(object? sender, CollectionViewScrolledEventArgs e) + { + + if (ItemsView == null || Adaptor == null || LayoutManager == null) + return; + + var scrolledIndex = e.CenterItemIndex; + + if (0 <= scrolledIndex && scrolledIndex < Adaptor.Count) + { + UpdatePositionFromUI(scrolledIndex); + UpdateCurrentItemFromUI(Adaptor[scrolledIndex]!); + CollectionViewController.RequestItemSelect(scrolledIndex); + } + + ItemsView.IsScrolling = false; + + if (Adaptor is ItemTemplateAdaptor adaptor) + { + var newViews = new List(); + var carouselPosition = ItemsView.Position; + var previousPosition = carouselPosition - 1; + var nextPosition = carouselPosition + 1; + + for (int i = e.FirstVisibleItemIndex; i <= e.LastVisibleItemIndex; i++) + { + if (i < 0 || i >= Adaptor.Count) + continue; + + if (adaptor.GetTemplatedView(i) is not View itemView) + { + continue; + } + + if (i == carouselPosition) + { + VisualStateManager.GoToState(itemView, CarouselView.CurrentItemVisualState); + } + else if (i == previousPosition) + { + VisualStateManager.GoToState(itemView, CarouselView.PreviousItemVisualState); + } + else if (i == nextPosition) + { + VisualStateManager.GoToState(itemView, CarouselView.NextItemVisualState); + } + else + { + VisualStateManager.GoToState(itemView, CarouselView.DefaultItemVisualState); + } + + newViews.Add(itemView); + + if (!ItemsView.VisibleViews.Contains(itemView)) + { + ItemsView.VisibleViews.Add(itemView); + } + } + + foreach (var itemView in _oldViews) + { + if (!newViews.Contains(itemView)) + { + VisualStateManager.GoToState(itemView, CarouselView.DefaultItemVisualState); + + if (ItemsView.VisibleViews.Contains(itemView)) + { + ItemsView.VisibleViews.Remove(itemView); + } + } + } + + _oldViews = newViews; + } + } + + void OnDragStart(object? sender, EventArgs e) + { + if (ItemsView == null) + return; + + ItemsView.SetIsDragging(true); + ItemsView.IsScrolling = true; + } + + void OnDragStop(object? sender, EventArgs e) + { + if (ItemsView == null) + return; + + ItemsView.SetIsDragging(false); + ItemsView.IsScrolling = false; + } + + void OnScrollStart(object? sender, EventArgs e) + { + if (ItemsView == null) + return; + + ItemsView.IsScrolling = true; + } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/MauiCollectionView.cs b/src/Controls/src/Core/Handlers/Items/Gtk/MauiCollectionView.cs new file mode 100644 index 000000000000..9e7275a02ac9 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/MauiCollectionView.cs @@ -0,0 +1,401 @@ +using System; +using System.Collections.Specialized; +using System.Linq; +using Microsoft.Maui.Controls.Platform; +using Gtk.UIExtensions.NUI; +using IMeasurable = Gtk.UIExtensions.Common.IMeasurable; +using TCollectionView = Gtk.UIExtensions.NUI.CollectionView; +using TScrollToPosition = Microsoft.Maui.Controls.ScrollToPosition; +using TSize = Microsoft.Maui.Graphics.Size; +using TSnapPointsAlignment = Gtk.UIExtensions.NUI.SnapPointsAlignment; +using TSnapPointsType = Gtk.UIExtensions.NUI.SnapPointsType; + +namespace Microsoft.Maui.Controls.Handlers.Items +{ + + public abstract class MauiCollectionView : TCollectionView, IMeasurable where TItemsView : ItemsView + { + + INotifyCollectionChanged? _observableSource; + TItemsView? _itemsView; + + protected TItemsView? ItemsView + { + get => _itemsView; + set + { + _itemsView = value; + base.VirtualView = value; + } + } + + protected IItemsLayout? ItemsLayout { get; private set; } + + public event EventHandler? Relayout; + + protected virtual void OnRelayout() + { + Relayout?.Invoke(this, EventArgs.Empty); + } + + public virtual void SetupNewElement(TItemsView newElement) + { + if (newElement == null) + { + ItemsView = null; + + return; + } + + Scrolled += OnScrolled; + + ItemsView = newElement; + ItemsView.ScrollToRequested += OnScrollToRequested; + } + + public virtual void TearDownOldElement(TItemsView oldElement) + { + if (ItemsLayout != null) + { + ItemsLayout.PropertyChanged -= OnLayoutPropertyChanged; + } + + oldElement.ScrollToRequested -= OnScrollToRequested; + + using var oldAdaptor = Adaptor; + Adaptor = null; + LayoutManager = null; + } + + public virtual void UpdateItemsSource() + { + if (ItemsView == null) + return; + + if (ItemsView.ItemsSource is INotifyCollectionChanged collectionChanged) + { + if (_observableSource != null) + { + _observableSource.CollectionChanged -= OnCollectionChanged; + } + + _observableSource = collectionChanged; + _observableSource.CollectionChanged += OnCollectionChanged; + } + + UpdateAdaptor(); + } + + public virtual void UpdateAdaptor() + { + if (ItemsView == null) + return; + + using var oldAdaptor = Adaptor; + + if (Adaptor is ItemTemplateAdaptor old) + { + old.SelectionChanged -= OnItemSelectedFromUI; + } + + if (ItemsView.ItemsSource == null || !ItemsView.ItemsSource.Cast().Any()) + { + Adaptor = EmptyItemAdaptor.Create(ItemsView); + } + else + { + Adaptor = CreateItemAdaptor(ItemsView); + } + + if (Adaptor is ItemTemplateAdaptor adaptor) + { + adaptor.SelectionChanged += OnItemSelectedFromUI; + } + } + + public virtual void UpdateLayoutManager() + { + if (ItemsLayout != null) + { + ItemsLayout.PropertyChanged -= OnLayoutPropertyChanged; + } + + ItemsLayout = GetItemsLayout(); + + if (ItemsLayout != null) + { + LayoutManager = ItemsLayout.ToLayoutManager((ItemsView as StructuredItemsView)?.ItemSizingStrategy ?? ItemSizingStrategy.MeasureFirstItem); + ItemsLayout.PropertyChanged += OnLayoutPropertyChanged; + + if (ItemsLayout is ItemsLayout itemsLayout) + { + SnapPointsType = (TSnapPointsType)itemsLayout.SnapPointsType; + SnapPointsAlignment = (TSnapPointsAlignment)itemsLayout.SnapPointsAlignment; + } + } + } + + public void UpdateHorizontalScrollBarVisibility() + { + if (ItemsView == null || LayoutManager == null) + return; + + if (LayoutManager.IsHorizontal) + { + ScrollView.HideScrollbar = ItemsView.HorizontalScrollBarVisibility == ScrollBarVisibility.Never; + } + } + + public void UpdateVerticalScrollBarVisibility() + { + if (ItemsView == null || LayoutManager == null) + return; + + if (!LayoutManager.IsHorizontal) + { + ScrollView.HideScrollbar = ItemsView.VerticalScrollBarVisibility == ScrollBarVisibility.Never; + } + } + + public abstract IItemsLayout GetItemsLayout(); + + TSize IMeasurable.Measure(double availableWidth, double availableHeight) + { + if (Adaptor == null || LayoutManager == null || AllocatedSize == TSize.Zero) + { + var scaled = Devices.DeviceDisplay.MainDisplayInfo.GetScaledScreenSize(); + var size = new TSize(availableWidth, availableHeight); + + if (size.Width == double.PositiveInfinity) + size.Width = scaled.Width.ToScaledPixel(); + + if (size.Height == double.PositiveInfinity) + size.Height = scaled.Height.ToScaledPixel(); + + return size; + } + + var canvasSize = LayoutManager.GetScrollCanvasSize(); + canvasSize.Width = System.Math.Min(canvasSize.Width, availableWidth); + canvasSize.Height = System.Math.Min(canvasSize.Height, availableHeight); + + return canvasSize; + } + + void OnLayoutPropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (sender == null) + return; + + if (e.PropertyName == nameof(LinearItemsLayout.ItemSpacing) + || e.PropertyName == nameof(GridItemsLayout.VerticalItemSpacing) + || e.PropertyName == nameof(GridItemsLayout.HorizontalItemSpacing) + || e.PropertyName == nameof(Controls.ItemsLayout.SnapPointsType) + || e.PropertyName == nameof(Controls.ItemsLayout.SnapPointsAlignment)) + { + UpdateLayoutManager(); + } + else if (e.PropertyName == nameof(GridItemsLayout.Span)) + { + (LayoutManager as GridLayoutManager)?.UpdateSpan(((GridItemsLayout)sender).Span); + } + } + + void OnScrolled(object? sender, CollectionViewScrolledEventArgs e) + { + if (ItemsView == null || Adaptor == null) + return; + + ItemsView.SendScrolled(new ItemsViewScrolledEventArgs + { + HorizontalDelta = e.HorizontalDelta.ToScaledDP(), + HorizontalOffset = e.HorizontalOffset.ToScaledDP(), + VerticalDelta = e.VerticalDelta.ToScaledDP(), + VerticalOffset = e.VerticalOffset.ToScaledDP(), + FirstVisibleItemIndex = e.FirstVisibleItemIndex, + CenterItemIndex = e.CenterItemIndex, + LastVisibleItemIndex = e.LastVisibleItemIndex, + }); + + if (ItemsView.RemainingItemsThreshold >= 0) + { + if (Adaptor.Count - 1 - e.LastVisibleItemIndex <= ItemsView.RemainingItemsThreshold) + ItemsView.SendRemainingItemsThresholdReached(); + } + } + + protected virtual ItemTemplateAdaptor CreateItemAdaptor(ItemsView view) + { + return new ItemTemplateAdaptor(view); + } + + protected virtual void OnItemSelectedFromUI(object? sender, CollectionViewSelectionChangedEventArgs e) { } + + protected virtual int GetIndex(ScrollToRequestEventArgs request) + { + return request.Index; + } + + void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + if (ItemsView == null) + return; + + if (ItemsView.ItemsSource == null || !ItemsView.ItemsSource.Cast().Any()) + { + Adaptor = EmptyItemAdaptor.Create(ItemsView); + } + else if (Adaptor is EmptyItemAdaptor) + { + UpdateAdaptor(); + } + } + + void OnScrollToRequested(object? sender, ScrollToRequestEventArgs e) + { + if (e.Mode == ScrollToMode.Position) + { + ScrollTo(GetIndex(e), (TScrollToPosition)e.ScrollToPosition, e.IsAnimated); + } + else + { + ScrollTo(e.Item, (TScrollToPosition)e.ScrollToPosition, e.IsAnimated); + } + } + + } + + public class MauiStructuredItemsView : MauiCollectionView where TItemsView : StructuredItemsView + { + + public override IItemsLayout GetItemsLayout() + { + return ItemsView!.ItemsLayout; + } + + } + + public class MauiSelectableItemsView : MauiStructuredItemsView where TItemsView : SelectableItemsView + { + + bool _updateSelection; + bool _updateFromUI; + + public override void UpdateAdaptor() + { + base.UpdateAdaptor(); + UpdateSelection(); + } + + public void UpdateSelection() + { + if (ItemsView == null || _updateFromUI) + return; + + _updateSelection = true; + + if (SelectionMode != ItemsView.SelectionMode) + { + SelectionMode = ItemsView.SelectionMode; + } + + if (Adaptor == null) + { + _updateSelection = false; + + return; + } + + // Sync SelectedItem from Maui to Native + if (ItemsView.SelectionMode == Controls.SelectionMode.Single) + { + var selected = Adaptor.GetItemIndex(ItemsView.SelectedItem); + + foreach (var index in CollectionViewController.SelectedItems.ToList()) + { + if (selected != index) + CollectionViewController.RequestItemUnselect(index); + } + + if (selected != -1) + CollectionViewController.RequestItemSelect(selected); + + } + else if (ItemsView.SelectionMode == Controls.SelectionMode.Multiple) + { + var selectedItemIndexes = ItemsView.SelectedItems.Select(d => Adaptor.GetItemIndex(d)).ToHashSet(); + + foreach (var index in CollectionViewController.SelectedItems.ToList()) + { + if (index < 0 || Adaptor.Count <= index) + continue; + + if (!selectedItemIndexes.Contains(index)) + { + CollectionViewController.RequestItemUnselect(index); + } + } + + var alreadySelected = CollectionViewController.SelectedItems.ToHashSet(); + + foreach (var selected in selectedItemIndexes) + { + if (!alreadySelected.Contains(selected)) + { + CollectionViewController.RequestItemSelect(selected); + } + } + } + + _updateSelection = false; + } + + protected override void OnItemSelectedFromUI(object? sender, CollectionViewSelectionChangedEventArgs e) + { + if (ItemsView == null || Adaptor == null || _updateSelection) + { + return; + } + + _updateFromUI = true; + + if (ItemsView.SelectionMode == Controls.SelectionMode.Single) + { + ItemsView.SelectedItem = e.SelectedItems?.FirstOrDefault() ?? null; + } + else if (ItemsView.SelectionMode == Controls.SelectionMode.Multiple) + { + ItemsView.SelectedItems = e.SelectedItems; + } + + _updateFromUI = false; + } + + } + + public class MauiGroupableItemsView : MauiSelectableItemsView where TItemsView : GroupableItemsView + { + + protected override ItemTemplateAdaptor CreateItemAdaptor(ItemsView view) + { + if (view is GroupableItemsView groupableItemsView && groupableItemsView.IsGrouped) + { + return new GroupItemTemplateAdaptor(groupableItemsView, new GroupItemSource(groupableItemsView)); + } + + return base.CreateItemAdaptor(view); + } + + protected override int GetIndex(ScrollToRequestEventArgs request) + { + if (Adaptor is GroupItemTemplateAdaptor groupAdaptor) + { + return groupAdaptor.GetAbsoluteIndex(request.GroupIndex, request.Index); + } + + return base.GetIndex(request); + } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.GtkImpl.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.GtkImpl.cs new file mode 100644 index 000000000000..dffd14d9a231 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.GtkImpl.cs @@ -0,0 +1,410 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlTypes; +using System.Linq; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; +using Point = Microsoft.Maui.Graphics.Point; +using Size = Microsoft.Maui.Graphics.Size; +using Rectangle = Microsoft.Maui.Graphics.Rect; + +namespace Gtk.UIExtensions.NUI; + +public partial class CollectionView +{ + protected override bool OnDrawn(Cairo.Context cr) + { + var r = base.OnDrawn(cr); + + return r; + } + + bool IsReallocating { get; set; } + + bool IsSizeAllocating { get; set; } + + protected IView? VirtualView { get; set; } + + Rect LastAllocation { get; set; } + + const bool RestrictToMesuredAllocation = false; + + protected Size? MeasuredSizeH { get; set; } + + protected Size? MeasuredSizeV { get; set; } + + protected Size? MeasuredMinimum { get; set; } + + protected void ClearMeasured(bool clearCache = true) + { + MeasuredSizeH = null; + MeasuredSizeV = null; + MeasuredMinimum = null; + } + + List _children = new(); + List _items = new(); + + protected override void ForAll(bool include_internals, Callback callback) + { + base.ForAll(include_internals, callback); + + foreach (var w in _children) + { + callback(w); + } + + foreach (var w in _items) + { + callback(w); + } + } + + public void AddItem(Widget widget) + { + _items.Add(widget); + widget.Parent = this; + } + + public void RemoveItem(Widget widget) + { + widget.Unparent(); + _items.Remove(widget); + } + + public new void Add(Widget widget) + { + _children.Add(widget); + base.Add(widget); + } + + protected override void OnAdded(Widget widget) + { + widget.Parent = this; + ClearMeasured(); + } + + protected override void OnRemoved(Widget widget) + { + widget.Unparent(); + _children.Remove(widget); + ClearMeasured(); + QueueResize(); + } + + protected override void OnSizeAllocated(Gdk.Rectangle allocation) + { + if (IsSizeAllocating) + return; + + if (VirtualView is not { } virtualView) + { + base.OnSizeAllocated(allocation); + + return; + } + + var clearCache = true; + + try + { + IsReallocating = true; + + var mAllocation = allocation.ToRect(); + + clearCache = LastAllocation.IsEmpty || mAllocation.IsEmpty || LastAllocation != mAllocation; + ClearMeasured(clearCache); + + LastAllocation = mAllocation; + + if (RestrictToMesuredAllocation) +#pragma warning disable CS0162 // Unreachable code detected + { + var mesuredAllocation = Measure(allocation.Width, allocation.Height); + mAllocation.Size = mesuredAllocation; + } +#pragma warning restore CS0162 // Unreachable code detected + + ArrangeAllocation(new Rectangle(Point.Zero, mAllocation.Size)); + AllocateChildren(mAllocation); + + if (virtualView.Frame != mAllocation) + { + IsSizeAllocating = true; + + Arrange(mAllocation); + } + + base.OnSizeAllocated(allocation); + } + finally + { + IsReallocating = false; + IsSizeAllocating = false; + } + } + + IEnumerable<(Widget w, IView view)> GetItemViews() + { + if (Adaptor is not { }) + yield break; + + foreach (var cr in _items.ToArray()) + { + var w = cr; + + if (w is ViewHolder vw && Adaptor.GetTemplatedView(vw.Child) is { } v) + { + yield return (w, v); + } + } + } + + void AllocateChildren(Rect allocation) + { + if (Adaptor is not { }) + return; + + foreach (var cr in GetItemViews()) + { + var (w, v) = cr; + var r = v.Frame; + + if (r.IsEmpty) + continue; + + var cAlloc = new Gdk.Rectangle((int)(allocation.X + r.X), (int)(allocation.Y + r.Y), (int)r.Width, (int)r.Height); + + if (w is ViewHolder holder) + { + cAlloc = new Rect(new Point(holder.Bounds.X + allocation.X, holder.Bounds.Y + allocation.Y), holder.Bounds.Size).ToNative(); + } + + // if (cAlloc != w.Allocation) // it's always needed to implicit arrange children: + w.SizeAllocate(cAlloc); + } + } + + void ArrangeAllocation(Rectangle allocation) + { + if (VirtualView is not { } virtualView || LayoutManager is not { }) + return; + + LayoutManager.SizeAllocated(allocation.Size); + LayoutManager.LayoutItems(new Rect(Point.Zero, allocation.Size), false); + + foreach (var cr in GetItemViews()) + { + var (w, v) = cr; + } + } + + bool IsMeasuring { get; set; } + + Size Measure(double widthConstraint, double heightConstraint) + { + IsMeasuring = true; + + try + { + if (VirtualView is not { } virtualView || LayoutManager is not { }) + return new Size(widthConstraint, heightConstraint); + + var size = new Size(widthConstraint, heightConstraint); + // LayoutManager.Reset(); + LayoutManager.SizeAllocated(size); + LayoutManager.LayoutItems(new Rect(Point.Zero, size), false); + + var measured = LayoutManager.GetScrollCanvasSize(); + var blockSize = LayoutManager.GetScrollBlockSize(); + + var width = LayoutManager.GetScrollColumnSize(); + + if (double.IsPositiveInfinity(measured.Width)) + measured.Width = width; + + if (double.IsPositiveInfinity(measured.Height)) + measured.Height = blockSize; + + return measured; + } + finally + { + IsMeasuring = false; + } + } + + public Size Clamp(Size mesured, Size constraint) + { + var w = mesured.Width; + var h = mesured.Height; + + if (double.IsPositiveInfinity(mesured.Width)) + w = constraint.Width; + + if (double.IsPositiveInfinity(mesured.Height)) + h = constraint.Height; + + return new(w, h); + } + + protected override void OnUnrealized() + { + // force reallocation on next realization, since allocation may be lost + IsReallocating = false; + ClearMeasured(); + base.OnUnrealized(); + } + + protected override void OnRealized() + { + // force reallocation, if unrealized previously + if (!IsReallocating) + { + try + { + LastAllocation = Allocation.ToRect(); + Measure(Allocation.Width, Allocation.Height); + } + catch + { + IsReallocating = false; + } + } + + base.OnRealized(); + } + + protected Size MeasureMinimum() + { + if (MeasuredMinimum != null) + return MeasuredMinimum.Value; + + if (VirtualView is not { } virtualView || LayoutManager is not { } || Adaptor is not { }) + return Size.Zero; + + IsMeasuring = true; + var itemSize = CollectionViewController.GetItemSize(double.PositiveInfinity, double.PositiveInfinity); + var firstAlloc = new Size(double.PositiveInfinity, itemSize.Height); + LayoutManager.SizeAllocated(firstAlloc); + var blockSize = LayoutManager.GetScrollBlockSize(); + + var width = LayoutManager.GetScrollColumnSize(); + firstAlloc.Width = width; + LayoutManager.SizeAllocated(firstAlloc); + LayoutManager.LayoutItems(new Rect(Point.Zero, firstAlloc), false); + + blockSize = LayoutManager.GetScrollBlockSize(); + + width = LayoutManager.GetScrollColumnSize(); + + // var desiredSize = GetChildrensView().Select(c => c.view) + // .Aggregate(new Size(), + // (s, c) => new Size(Math.Max(s.Width, c.DesiredSize.Width), s.Height + c.DesiredSize.Height)); + + IsMeasuring = false; + MeasuredMinimum = new Size(width, blockSize); + + return MeasuredMinimum.Value; + } + + // protected override Gtk.SizeRequestMode OnGetRequestMode() + // { + // // dirty fix: unwrapped labels report fixed sizes, forcing parents to fixed mode + // // -> report always width_for_height, since we don't support angles + // return Gtk.SizeRequestMode.WidthForHeight; + // } + + protected override void OnAdjustSizeRequest(Orientation orientation, out int minimumSize, out int naturalSize) + { + base.OnAdjustSizeRequest(orientation, out minimumSize, out naturalSize); + + if (IsSizeAllocating) + { + return; + } + + if (VirtualView is not { } virtualView) + return; + + var measuredMinimum = MeasureMinimum(); + + double constraint = minimumSize; + + if (orientation == Orientation.Horizontal) + { + if (RequestMode is SizeRequestMode.WidthForHeight or SizeRequestMode.ConstantSize) + { + if (MeasuredSizeV is { Width : > 0 } size && (constraint == 0)) + constraint = size.Width; + + constraint = constraint == 0 ? double.PositiveInfinity : constraint; + } + else + { + ; + } + + MeasuredSizeH = constraint != 0 ? Measure(constraint, double.PositiveInfinity) : measuredMinimum; + + constraint = MeasuredSizeH.Value.Width; + + minimumSize = (int)measuredMinimum.Width; + naturalSize = (int)constraint; + } + + if (orientation == Orientation.Vertical) + { + var widthContraint = double.PositiveInfinity; + + if (RequestMode is SizeRequestMode.HeightForWidth or SizeRequestMode.ConstantSize) + { + MeasuredSizeH ??= measuredMinimum; + + if (MeasuredSizeH is { } size && constraint == 0) + { + if (size.Height > 0) + constraint = size.Height; + + if (size.Width > 0) + widthContraint = size.Width; + } + + constraint = constraint == 0 ? double.PositiveInfinity : constraint; + } + else + { + ; + } + + MeasuredSizeV = constraint != 0 ? Measure(widthContraint, constraint) : measuredMinimum; + + constraint = MeasuredSizeV.Value.Height; + + minimumSize = (int)measuredMinimum.Height; + naturalSize = (int)constraint; + } + } + + const bool RestrictToMeasuredArrange = false; + + public void Arrange(Rectangle rect) + { + if (rect.IsEmpty) + return; + + if (rect == Allocation.ToRect()) return; + + if (IsSizeAllocating) + { + SizeAllocate(rect.ToNative()); + + return; + } + + var arrangeSize = RestrictToMeasuredArrange ? Measure(rect.Width, rect.Height) : rect.Size; + var alloc = new Rectangle(rect.Location, arrangeSize); + SizeAllocate(alloc.ToNative()); + QueueAllocate(); + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.cs new file mode 100644 index 000000000000..615c5e74402e --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionView.cs @@ -0,0 +1,428 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Threading; +using Gtk; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Graphics.Platform.Gtk; +using Rect = Microsoft.Maui.Graphics.Rect; +using Size = Microsoft.Maui.Graphics.Size; +using CollectionViewSelectionMode = Microsoft.Maui.Controls.SelectionMode; + +namespace Gtk.UIExtensions.NUI +{ + + /// + /// A View that contain a templated list of items. + /// + public partial class CollectionView : Gtk.Container, ICollectionViewController + { + + double _previousHorizontalOffset; + double _previousVerticalOffset; + + Widget? _headerView; + Widget? _footerView; + + Microsoft.Maui.Controls.SelectionMode _selectionMode; + + /// + /// Initializes a new instance of the class. + /// +#pragma warning disable CS8618 + // dotnet compiler does not track a method that called on constructor to check non-nullable object + // https://github.com/dotnet/roslyn/issues/32358 + public CollectionView() +#pragma warning restore CS8618 + { + HasWindow = false; + InitializationComponent(); + } + + /// + /// Event that is raised after a scroll completes. + /// + public event EventHandler? Scrolled; + + /// + /// Gets a ScrollView instance that used in CollectionView + /// + public ScrollableBase ScrollView { get; private set; } + + protected CollectionViewController CollectionViewController { get; set; } + + public ItemAdaptor? Adaptor + { + get => CollectionViewController.Adaptor; + set => CollectionViewController.Adaptor = value; + + } + + public ICollectionViewLayoutManager? LayoutManager + { + get => CollectionViewController.LayoutManager; + set => CollectionViewController.LayoutManager = value; + + } + + /// + /// Gets or sets a value that controls whether and how many items can be selected. + /// + public Microsoft.Maui.Controls.SelectionMode SelectionMode + { + get => _selectionMode; + set + { + _selectionMode = value; + CollectionViewController.SelectionMode = value; + } + } + + /// + /// Specifies the behavior of snap points when scrolling. + /// + public SnapPointsType SnapPointsType { get; set; } + + /// + /// Specifies how snap points are aligned with items. + /// + public SnapPointsAlignment SnapPointsAlignment { get; set; } + + /// + /// The size of the area that layout in advance before it is visible + /// + public float RedundancyLayoutBoundRatio + { + get => CollectionViewController.RedundancyLayoutBoundRatio; + set => CollectionViewController.RedundancyLayoutBoundRatio = value; + } + + /// + /// A size of allocated by Layout, it become viewport size on scrolling + /// + protected Size AllocatedSize + { + get => CollectionViewController.AllocatedSize; + } + + internal Rect ViewPort => ScrollView.GetScrollBound(); + + /// + /// Scrolls the CollectionView to the index + /// + /// Index of item + /// How the item should be positioned on screen. + /// Whether or not the scroll should be animated. + public void ScrollTo(int index, ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true) + { + if (LayoutManager == null) + throw new InvalidOperationException("No Layout manager"); + + var itemBound = LayoutManager.GetItemBound(index); + double itemStart; + double itemEnd; + double scrollStart; + double scrollEnd; + double itemPadding = 0; + double itemSize; + double viewportSize; + var isHorizontal = LayoutManager.IsHorizontal; + + if (isHorizontal) + { + itemStart = itemBound.Left; + itemEnd = itemBound.Right; + itemSize = itemBound.Width; + scrollStart = ViewPort.Left; + scrollEnd = ViewPort.Right; + viewportSize = ViewPort.Width; + } + else + { + itemStart = itemBound.Top; + itemEnd = itemBound.Bottom; + itemSize = itemBound.Height; + scrollStart = ViewPort.Top; + scrollEnd = ViewPort.Bottom; + viewportSize = ViewPort.Height; + } + + if (position == ScrollToPosition.MakeVisible) + { + if (itemStart < scrollStart) + { + position = ScrollToPosition.Start; + } + else if (itemEnd > scrollEnd) + { + position = ScrollToPosition.End; + } + else + { + // already visible + return; + } + } + + if (itemSize < viewportSize) + { + switch (position) + { + case ScrollToPosition.Center: + itemPadding = (viewportSize - itemSize) / 2; + + break; + case ScrollToPosition.End: + itemPadding = (viewportSize - itemSize); + + break; + } + } + + if (isHorizontal) + { + itemBound.X -= itemPadding; + } + else + { + itemBound.Y -= itemPadding; + } + + ScrollView.ScrollTo(isHorizontal ? (float)itemBound.X : (float)itemBound.Y, animate); + } + + /// + /// Scrolls the CollectionView to the item + /// + /// Item to scroll + /// How the item should be positioned on screen. + /// Whether or not the scroll should be animated. + public void ScrollTo(object item, ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true) + { + if (Adaptor == null) + throw new InvalidOperationException("No Adaptor"); + + ScrollTo(Adaptor.GetItemIndex(item), position, animate); + } + + /// + /// Create a ScrollView to use in CollectionView + /// + /// A ScrollView instance + protected virtual ScrollableBase CreateScrollView() + { + return new SnappableScrollView(this) + { + UseCostomScrolling = true, + MaximumVelocity = 8.5f, + Friction = 0.015f + }; + } + + /// + /// Initialize internal components, such as ScrollView + /// + protected virtual void InitializationComponent() + { + + CollectionViewController = new CollectionViewController() + { + SelectionMode = this.SelectionMode, + GetViewPort = () => ViewPort, + + AddToContainer = holder => AddItem(holder), + RemoveFromContainer = holder => RemoveItem(holder), + + ScrollTo = args => ScrollTo(args.index, args.position, args.animate), + + }; + + CollectionViewController.HasContentSizeUpdated += (sender, size) => + { + if (IsSizeAllocating || IsMeasuring || IsReallocating) return; + + ScrollView.ContentContainer.UpdateSize(size); + }; + + CollectionViewController.UpdateHeaderFooter += (sender, args) => UpdateHeaderFooter(); + + CollectionViewController.AdaptorChanging += (sender, args) => + { + // reset header view + if (_headerView != null) + { + _headerView.Unparent(); + Adaptor?.RemoveHeaderView(_headerView); + _headerView = null; + } + + // reset footer view + if (_footerView != null) + { + _footerView.Unparent(); + Adaptor?.RemoveFooterView(_footerView); + _footerView.Dispose(); + _footerView = null; + } + }; + + CollectionViewController.AdaptorChanged += (sender, args) => + { + if (Adaptor is not { }) + return; + + _headerView = Adaptor.GetHeaderView(); + + if (_headerView != null) + { + ScrollView.ContentContainer.Add(_headerView); + } + + _footerView = Adaptor.GetFooterView(); + + if (_footerView != null) + { + ScrollView.ContentContainer.Add(_footerView); + } + + UpdateHeaderFooter(); + }; + + this.WidthSpecification(LayoutParamPolicies.MatchParent); + this.HeightSpecification(LayoutParamPolicies.MatchParent); + + ScrollView = CreateScrollView(); + ScrollView.WidthSpecification(LayoutParamPolicies.MatchParent); + ScrollView.HeightSpecification(LayoutParamPolicies.MatchParent); + ScrollView.WidthResizePolicy(ResizePolicyType.FillToParent); + ScrollView.HeightResizePolicy(ResizePolicyType.FillToParent); + + ScrollView.ScrollingEventThreshold = 10; + ScrollView.Scrolling += OnScrolling; + ScrollView.ScrollAnimationEnded += OnScrollAnimationEnded; + + if (ScrollView is SnappableScrollView snappable) + { + snappable.SnapRequestFinished += OnSnapRequestFinished; + } + + ScrollView.Relayout += CollectionViewController.OnLayout; + // Add(ScrollView); + } + + void OnScrollAnimationEnded(object? sender, ScrollEventArgs e) + { + SendScrolledEvent(); + } + + void OnSnapRequestFinished(object? sender, EventArgs e) + { + SendScrolledEvent(); + } + + void OnScrolling(object? sender, ScrollEventArgs e) + { + if (LayoutManager == null) + return; + + if (sender is IScrollable sa) + { + ; + } + + var viewport = ViewPort; + var viewportFromEvent = new Rect(-e.Event.X, -e.Event.Y, viewport.Width, viewport.Height); + + CollectionViewController.LayoutManager?.LayoutItems(ExtendViewPort(viewportFromEvent)); + } + + void SendScrolledEvent() + { + if (LayoutManager == null) + return; + + var args = new CollectionViewScrolledEventArgs(); + args.FirstVisibleItemIndex = LayoutManager.GetVisibleItemIndex(ViewPort.X, ViewPort.Y); + args.CenterItemIndex = LayoutManager.GetVisibleItemIndex(ViewPort.X + (ViewPort.Width / 2), ViewPort.Y + (ViewPort.Height / 2)); + args.LastVisibleItemIndex = LayoutManager.GetVisibleItemIndex(ViewPort.X + ViewPort.Width, ViewPort.Y + ViewPort.Height); + args.HorizontalOffset = ViewPort.X; + args.HorizontalDelta = ViewPort.X - _previousHorizontalOffset; + args.VerticalOffset = ViewPort.Y; + args.VerticalDelta = ViewPort.Y - _previousVerticalOffset; + Scrolled?.Invoke(this, args); + + _previousHorizontalOffset = ViewPort.X; + _previousVerticalOffset = ViewPort.Y; + } + + void UpdateHeaderFooter() + { + if (LayoutManager != null) + { + double widthConstraint = LayoutManager.IsHorizontal ? double.PositiveInfinity : AllocatedSize.Width; + double heightConstraint = LayoutManager.IsHorizontal ? AllocatedSize.Height : double.PositiveInfinity; + + LayoutManager.SetHeader(_headerView, + _headerView != null ? Adaptor!.MeasureHeader(widthConstraint, heightConstraint) : new Size(0, 0)); + + LayoutManager.SetFooter(_footerView, + _footerView != null ? Adaptor!.MeasureFooter(widthConstraint, heightConstraint) : new Size(0, 0)); + } + } + + Rect ExtendViewPort(Rect viewport) + { + if (LayoutManager == null) + return viewport; + + if (LayoutManager.IsHorizontal) + { + viewport.X = Math.Max(0, viewport.X - viewport.Width * RedundancyLayoutBoundRatio / 2f); + viewport.Width += viewport.Width * RedundancyLayoutBoundRatio; + } + else + { + viewport.Y = Math.Max(0, viewport.Y - viewport.Height * RedundancyLayoutBoundRatio / 2f); + viewport.Height += viewport.Height * RedundancyLayoutBoundRatio; + } + + return viewport; + } + + protected override void Dispose(bool disposing) + { + if (disposing && ScrollView is IDisposable d) + { + d.Dispose(); + } + + base.Dispose(disposing); + } + + ViewHolder ICollectionViewController.RealizeView(int index) => CollectionViewController.RealizeView(index); + + void ICollectionViewController.UnrealizeView(ViewHolder view) => CollectionViewController.UnrealizeView(view); + + void ICollectionViewController.RequestLayoutItems() => CollectionViewController.RequestLayoutItems(); + + public int Count + { + get => CollectionViewController.Count; + } + + Size ICollectionViewController.GetItemSize() => CollectionViewController.GetItemSize(); + + Size ICollectionViewController.GetItemSize(double widthConstraint, double heightConstraint) => CollectionViewController.GetItemSize(widthConstraint, heightConstraint); + + Size ICollectionViewController.GetItemSize(int index, double widthConstraint, double heightConstraint) => CollectionViewController.GetItemSize(index, widthConstraint, heightConstraint); + + void ICollectionViewController.ContentSizeUpdated() => CollectionViewController.ContentSizeUpdated(); + + void ICollectionViewController.ItemMeasureInvalidated(int index) => CollectionViewController.ItemMeasureInvalidated(index); + + void ICollectionViewController.RequestItemSelect(int index) => CollectionViewController.RequestItemSelect(index); + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewController.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewController.cs new file mode 100644 index 000000000000..794743486da5 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewController.cs @@ -0,0 +1,651 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Threading; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; +using Microsoft.Maui.Layouts; + +namespace Gtk.UIExtensions.NUI; + +public class CollectionViewController : ICollectionViewController +{ + + bool _requestLayoutItems = false; + + public Size AllocatedSize { get; protected set; } + + Size _itemSize = new Size(-1, -1); + + SynchronizationContext _mainloopContext; + ItemAdaptor? _adaptor; + + /// + /// Gets or sets ItemAdaptor to adapt items source + /// + public ItemAdaptor? Adaptor + { + get => _adaptor; + set + { + OnAdaptorChanging(); + _adaptor = value; + OnAdaptorChanged(); + } + } + + ICollectionViewLayoutManager? _layoutManager; + + /// + /// Gets or sets LayoutManager to organize position of item + /// + public ICollectionViewLayoutManager? LayoutManager + { + get => _layoutManager; + set + { + OnLayoutManagerChanging(); + _layoutManager = value; + OnLayoutManagerChanged(); + } + } + + RecyclerPool _pool = new RecyclerPool(); + Dictionary _viewHolderIndexTable = new Dictionary(); + HashSet _selectedItems = new HashSet(); + + /// + /// The size of the area that layout in advance before it is visible + /// + public float RedundancyLayoutBoundRatio { get; set; } = 2f; + + /// + /// The number of items on CollectionView + /// + public int Count => Adaptor?.Count ?? 0; + + internal Rect ViewPort => GetViewPort?.Invoke() ?? Rect.Zero; + + /// + /// Selected items + /// + public IEnumerable SelectedItems { get => _selectedItems; } + + public CollectionViewController() + { + _mainloopContext = SynchronizationContext.Current ?? throw new InvalidOperationException("Must create on main thread"); + + } + + /// + /// Create a ViewHolder, override it to customzie a decoration of view + /// + /// A ViewHolder instance + protected virtual ViewHolder CreateViewHolder() + { + return new ViewHolder(); + } + + public ViewHolder RealizeView(int index) + { + if (Adaptor == null) + throw new InvalidOperationException("No Adaptor"); + + if (LayoutManager == null) + throw new InvalidOperationException("No LayoutManager"); + + var holder = _pool.GetRecyclerView(Adaptor.GetViewCategory(index)); + + if (holder != null) + { + holder.Visible = true; + } + else + { + var content = Adaptor.CreateNativeView(index); + holder = CreateViewHolder(); + holder.RequestSelected += OnRequestItemSelected; + holder.StateUpdated += OnItemStateUpdated; + holder.Content = content; + holder.ViewCategory = Adaptor.GetViewCategory(index); + AddToContainer?.Invoke(holder); + } + + Adaptor.SetBinding(holder.Content!, index); + _viewHolderIndexTable[holder] = index; + + if (_selectedItems.Contains(index)) + { + holder.UpdateSelected(); + } + + var bounds = LayoutManager.GetItemBound(index); + + if (Adaptor.GetTemplatedView(holder.Content!) is { } view) + { + var size = view.Arrange(new Rect(Point.Zero, bounds.Size)); + + if (size != bounds.Size) + { + ; + } + } + + holder.Bounds = bounds; + + return holder; + } + + void OnRequestItemSelected(object? sender, EventArgs e) + { + if (sender == null) + return; + + // Selection request from UI + var viewHolder = (ViewHolder)sender; + + if (_viewHolderIndexTable.TryGetValue(viewHolder, out var index)) + { + + if (_selectedItems.Contains(index) && SelectionMode != Microsoft.Maui.Controls.SelectionMode.Single) + { + RequestItemUnselect(index, viewHolder); + } + else + { + RequestItemSelect(index, viewHolder); + } + } + } + + void OnItemStateUpdated(object? sender, EventArgs e) + { + if (sender == null) + return; + + ViewHolder holder = (ViewHolder)sender; + + // Hack, in NUI, equal was override and even though not null, if it has no Body , it treat as null + if (holder.Content is { }) + { + Adaptor?.UpdateViewState(holder.Content, holder.State); + + if (_viewHolderIndexTable.ContainsKey(holder) && holder.State == ViewHolderState.Focused) + { + var index = _viewHolderIndexTable[holder]; + OnScrollTo(index, ScrollToPosition.MakeVisible, true); + } + } + } + + public void UnrealizeView(ViewHolder view) + { + if (Adaptor == null) + throw new InvalidOperationException("No Adaptor"); + + _viewHolderIndexTable.Remove(view); + Adaptor.UnBinding(view.Content!); + view.ResetState(); + view.Hide(); + + if (_pool.Count < Math.Max(Count / 3, _viewHolderIndexTable.Count * 3)) + { + _pool.AddRecyclerView(view); + } + else + { + var content = view.Content; + + if (content != null) + Adaptor.RemoveNativeView(content); + + view.Content = null; + RemoveFromContainer?.Invoke(view); + view.Dispose(); + } + } + + public void RequestLayoutItems() + { + if (AllocatedSize.Width <= 0 || AllocatedSize.Height <= 0) + return; + + if (!_requestLayoutItems) + { + _requestLayoutItems = true; + + _mainloopContext.Post((s) => + { + _requestLayoutItems = false; + + if (Adaptor != null && LayoutManager != null) + { + ContentSizeUpdated(); + LayoutManager.LayoutItems(ExtendViewPort(ViewPort), true); + } + }, null); + } + } + + public Rect ExtendViewPort(Rect viewport) + { + if (LayoutManager == null) + return viewport; + + if (LayoutManager.IsHorizontal) + { + viewport.X = Math.Max(0, viewport.X - viewport.Width * RedundancyLayoutBoundRatio / 2f); + viewport.Width += viewport.Width * RedundancyLayoutBoundRatio; + } + else + { + viewport.Y = Math.Max(0, viewport.Y - viewport.Height * RedundancyLayoutBoundRatio / 2f); + viewport.Height += viewport.Height * RedundancyLayoutBoundRatio; + } + + return viewport; + } + + public Size GetItemSize() + { + var widthConstraint = LayoutManager!.IsHorizontal ? double.PositiveInfinity : AllocatedSize.Width; + var heightConstraint = LayoutManager!.IsHorizontal ? AllocatedSize.Height : double.PositiveInfinity; + + return GetItemSize(widthConstraint, heightConstraint); + } + + public Size GetItemSize(double widthConstraint, double heightConstraint) + { + if (Adaptor == null || Adaptor.Count == 0) + { + return new Size(0, 0); + } + + if (_itemSize.Width > 0 && _itemSize.Height > 0) + { + return _itemSize; + } + + _itemSize = Adaptor.MeasureItem(widthConstraint, heightConstraint); + _itemSize.Width = Math.Max(_itemSize.Width, 10); + _itemSize.Height = Math.Max(_itemSize.Height, 10); + + return _itemSize; + } + + public Size GetItemSize(int index, double widthConstraint, double heightConstraint) + { + if (Adaptor == null) + { + return new Size(0, 0); + } + + return Adaptor.MeasureItem(index, widthConstraint, heightConstraint); + + } + + public void ContentSizeUpdated() + { + var size = LayoutManager?.GetScrollCanvasSize() ?? AllocatedSize; + + OnContentSizeUpdated(size); + } + + public void OnLayout(object? sender, SizeAllocatedArgs e) + { + //called when resized + AllocatedSize = e.Allocation.ToRect().Size; + _itemSize = new Size(-1, -1); + + if (Adaptor != null && LayoutManager != null) + { + LayoutManager.SizeAllocated(AllocatedSize); + OnUpdateHeaderFooter(); + ContentSizeUpdated(); + LayoutManager.LayoutItems(ExtendViewPort(ViewPort)); + } + } + + public void ItemMeasureInvalidated(int index) + { + if (index == -1) + { + OnUpdateHeaderFooter(); + RequestLayoutItems(); + + return; + } + + // If a first item size was updated, need to reset _itemSize + if (index == 0) + { + _itemSize = new Size(-1, -1); + } + + LayoutManager?.ItemMeasureInvalidated(index); + } + + Microsoft.Maui.Controls.SelectionMode _selectionMode; + + /// + /// Gets or sets a value that controls whether and how many items can be selected. + /// + public Microsoft.Maui.Controls.SelectionMode SelectionMode + { + get => _selectionMode; + set + { + _selectionMode = value; + UpdateSelectionMode(); + } + } + + public void RequestItemSelect(int index) + { + RequestItemSelect(index, default); + } + + void RequestItemSelect(int index, ViewHolder? viewHolder = null) + { + if (SelectionMode == Microsoft.Maui.Controls.SelectionMode.None) + return; + + if (SelectionMode != Microsoft.Maui.Controls.SelectionMode.Multiple && _selectedItems.Any()) + { + var selected = _selectedItems.First(); + + if (selected == index) + { + // already selected + if (SelectionMode == Microsoft.Maui.Controls.SelectionMode.Single) + return; + } + else + { + // clear previous selection item + var prevSelected = FindViewHolder(_selectedItems.First()); + prevSelected?.ResetState(); + _selectedItems.Clear(); + } + } + + _selectedItems.Add(index); + + if (viewHolder != null) + { + viewHolder.UpdateSelected(); + } + else + { + FindViewHolder(index)?.UpdateSelected(); + } + + Adaptor?.SendItemSelected(_selectedItems); + } + + ViewHolder? FindViewHolder(int index) + { + return _viewHolderIndexTable.Where(d => d.Value == index).Select(d => d.Key).FirstOrDefault(); + } + + public void RequestItemUnselect(int index, ViewHolder? viewHolder = null) + { + if (SelectionMode == Microsoft.Maui.Controls.SelectionMode.None) + return; + + if (_selectedItems.Contains(index)) + { + if (viewHolder == null) + { + viewHolder = FindViewHolder(index); + } + + _selectedItems.Remove(index); + viewHolder?.ResetState(); + } + + Adaptor?.SendItemSelected(_selectedItems); + } + + void UpdateSelectionMode() + { + if (_selectionMode == Microsoft.Maui.Controls.SelectionMode.None) + { + if (_selectedItems.Count > 0) + { + foreach (var item in _viewHolderIndexTable) + { + if (_selectedItems.Contains(item.Value)) + { + item.Key.ResetState(); + } + } + } + + _selectedItems.Clear(); + } + else if (_selectionMode == Microsoft.Maui.Controls.SelectionMode.Single) + { + if (_selectedItems.Count > 1) + { + var first = _selectedItems.First(); + + foreach (var item in _viewHolderIndexTable) + { + if (_selectedItems.Contains(item.Value) && first != item.Value) + { + item.Key.ResetState(); + } + } + + _selectedItems.Clear(); + _selectedItems.Add(first); + } + } + + Adaptor?.SendItemSelected(_selectedItems); + } + + #region Extra + + public event EventHandler? UpdateHeaderFooter; + + void OnUpdateHeaderFooter() + { + UpdateHeaderFooter?.Invoke(this, new()); + + } + + public event EventHandler? LayoutManagerChanged; + + void OnLayoutManagerChanged() + { + if (_layoutManager == null) + return; + + _itemSize = new Size(-1, -1); + _layoutManager.CollectionView = this; + + LayoutManagerChanged?.Invoke(this, new()); + _layoutManager.SizeAllocated(AllocatedSize); + OnUpdateHeaderFooter(); + RequestLayoutItems(); + + } + + public event EventHandler? LayoutManagerChanging; + + void OnLayoutManagerChanging() + { + LayoutManagerChanging?.Invoke(this, new()); + _layoutManager?.Reset(); + } + + public event EventHandler? AdaptorChanged; + + void OnAdaptorChanged() + { + if (Adaptor == null) + return; + + _itemSize = new Size(-1, -1); + Adaptor.CollectionView = this; + (Adaptor as INotifyCollectionChanged).CollectionChanged += OnCollectionChanged; + + LayoutManager?.ItemSourceUpdated(); + RequestLayoutItems(); + + AdaptorChanged?.Invoke(this, new()); + } + + public event EventHandler? AdaptorChanging; + + void OnAdaptorChanging() + { + AdaptorChanging?.Invoke(this, new()); + + LayoutManager?.Reset(); + + if (Adaptor != null) + { + _pool.Clear(Adaptor); + (Adaptor as INotifyCollectionChanged).CollectionChanged -= OnCollectionChanged; + Adaptor.CollectionView = null; + } + + _selectedItems.Clear(); + } + + void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + if (sender != Adaptor) + { + return; + } + + if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems != null) + { + int idx = e.NewStartingIndex; + + if (idx == -1) + { + idx = Adaptor!.Count - e.NewItems.Count; + } + + foreach (var item in e.NewItems) + { + foreach (var viewHolder in _viewHolderIndexTable.Keys.ToList()) + { + if (_viewHolderIndexTable[viewHolder] >= idx) + { + _viewHolderIndexTable[viewHolder]++; + } + } + + var updated = new HashSet(); + + foreach (var selected in _selectedItems) + { + if (selected >= idx) + { + updated.Add(selected + 1); + } + } + + _selectedItems = updated; + LayoutManager?.ItemInserted(idx++); + } + } + else if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null) + { + int idx = e.OldStartingIndex; + + // Can't tracking remove if there is no data of old index + if (idx == -1) + { + LayoutManager?.ItemSourceUpdated(); + } + else + { + foreach (var item in e.OldItems) + { + LayoutManager?.ItemRemoved(idx); + + foreach (var viewHolder in _viewHolderIndexTable.Keys.ToList()) + { + if (_viewHolderIndexTable[viewHolder] > idx) + { + _viewHolderIndexTable[viewHolder]--; + } + } + + if (_selectedItems.Contains(idx)) + { + _selectedItems.Remove(idx); + } + + var updated = new HashSet(); + + foreach (var selected in _selectedItems) + { + if (selected > idx) + { + updated.Add(selected - 1); + } + } + + _selectedItems = updated; + } + } + } + else if (e.Action == NotifyCollectionChangedAction.Move) + { + LayoutManager?.ItemRemoved(e.OldStartingIndex); + LayoutManager?.ItemInserted(e.NewStartingIndex); + } + else if (e.Action == NotifyCollectionChangedAction.Replace && e.OldItems != null) + { + // Can't tracking if there is no information old data + if (e.OldItems.Count > 1 || e.NewStartingIndex == -1) + { + LayoutManager?.ItemSourceUpdated(); + } + else + { + LayoutManager?.ItemUpdated(e.NewStartingIndex); + } + } + else if (e.Action == NotifyCollectionChangedAction.Reset) + { + LayoutManager?.Reset(); + LayoutManager?.ItemSourceUpdated(); + } + + RequestLayoutItems(); + } + + public event EventHandler? HasContentSizeUpdated; + + void OnContentSizeUpdated(Size size) + { + HasContentSizeUpdated?.Invoke(this, size); + } + + public Func? GetViewPort { get; set; } + + public Action? AddToContainer { get; set; } + + public Action? RemoveFromContainer { get; set; } + + public Action<(int index, ScrollToPosition position, bool animate)>? ScrollTo { get; set; } + + void OnScrollTo(int index, ScrollToPosition position, bool animate) + { + ScrollTo?.Invoke((index, position, animate)); + } + + #endregion + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewScrolledEventArgs.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewScrolledEventArgs.cs new file mode 100644 index 000000000000..9bc86c00606c --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewScrolledEventArgs.cs @@ -0,0 +1,45 @@ +using System; + +namespace Gtk.UIExtensions.NUI +{ + /// + /// EventArgs for CollectionView Scrolled event + /// + public class CollectionViewScrolledEventArgs : EventArgs + { + /// + /// Delta of horizontal just before event + /// + public double HorizontalDelta { get; set; } + + /// + /// Delta of vertical just before event + /// + public double VerticalDelta { get; set; } + + /// + /// Scrolled offset horizontally + /// + public double HorizontalOffset { get; set; } + + /// + /// Scrolled offset vertically + /// + public double VerticalOffset { get; set; } + + /// + /// First visible item on scrolled area + /// + public int FirstVisibleItemIndex { get; set; } + + /// + /// Center item on scrolled area + /// + public int CenterItemIndex { get; set; } + + /// + /// Last visible item on scrolled area + /// + public int LastVisibleItemIndex { get; set; } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewSelectionMode.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewSelectionMode.cs new file mode 100644 index 000000000000..9c500a2a51b8 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/CollectionViewSelectionMode.cs @@ -0,0 +1,28 @@ +namespace Gtk.UIExtensions.NUI +{ + /// + /// Enumerates values that control whether items in a collection view can or cannot be selected. + /// + public enum CollectionViewSelectionMode + { + /// + /// Indicates that items cannot be selected. + /// + None, + + /// + /// Indicates that a single item can be selected. + /// + Single, + + /// + /// Indicates that multiple items can be selected. + /// + Multiple, + + /// + /// Indicates that a single item can be always selected. + /// + SingleAlways, + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/GridLayoutManager.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/GridLayoutManager.cs new file mode 100644 index 000000000000..2b08c8ea1afd --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/GridLayoutManager.cs @@ -0,0 +1,831 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Maui.Controls; +using Point = Microsoft.Maui.Graphics.Point; +using Rect = Microsoft.Maui.Graphics.Rect; +using Size = Microsoft.Maui.Graphics.Size; +using NView = Gtk.Widget; + +namespace Gtk.UIExtensions.NUI +{ + + /// + /// A implementation which provides grid layout + /// + public class GridLayoutManager : ICollectionViewLayoutManager + { + + Size _allocatedSize; + Size _scrollCanvasSize; + bool _isLayouting; + Rect _lastLayoutedBound; + Dictionary _realizedItem = new(); + List _itemSizes = new(); + List _cached = new(); + List _accumulatedItemSizes = new(); + bool _hasUnevenRows; + Size _baseItemBound; + + Size _headerSize; + NView? _header; + Size _footerSize; + NView? _footer; + + /// + /// Initializes a new instance of the class + /// + /// Layout orientation + /// Column count + public GridLayoutManager(bool isHorizontal, int span = 1) : this(isHorizontal, span, ItemSizingStrategy.MeasureFirstItem) { } + + /// + /// Initializes a new instance of the class + /// + /// Layout orientation + /// Column count + /// Item size measuring strategy + public GridLayoutManager(bool isHorizontal, int span, ItemSizingStrategy sizingStrategy) : this(isHorizontal, span, sizingStrategy, 0, 0) { } + + /// + /// Initializes a new instance of the class + /// + /// Layout orientation + /// Column count + /// Item size measuring strategy + /// A space size between items + /// A space size between items + public GridLayoutManager(bool isHorizontal, int span, ItemSizingStrategy sizingStrategy, int verticalSpacing, int horizontalSpacing) + { + IsHorizontal = isHorizontal; + Span = span; + _hasUnevenRows = sizingStrategy == ItemSizingStrategy.MeasureAllItems; + VerticalItemSpacing = verticalSpacing; + HorizontalItemSpacing = horizontalSpacing; + } + + /// + /// Column count + /// + public int Span { get; private set; } + + /// + /// Whether the item is a layout horizontally + /// + public bool IsHorizontal { get; } + + /// + /// A space size between items + /// + public double VerticalItemSpacing { get; } + + /// + /// A space size between items + /// + public double HorizontalItemSpacing { get; } + + /// + /// CollectionView that interact with layout manager + /// + public ICollectionViewController? CollectionView { get; set; } + + double BaseItemSize + { + get => IsHorizontal ? BaseItemBound.Width : BaseItemBound.Height; + } + + Size BaseItemBound + { + get + { + if (_baseItemBound == Size.Zero) + { + if (_allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + return Size.Zero; + + var itembound = CollectionView!.GetItemSize(ItemWidthConstraint, ItemHeightConstraint); + _baseItemBound = itembound; + } + + return _baseItemBound; + } + } + + double ItemSpacing => IsHorizontal ? HorizontalItemSpacing : VerticalItemSpacing; + + double ItemWidthConstraint => IsHorizontal ? double.PositiveInfinity : ColumnSize; + + double ItemHeightConstraint => IsHorizontal ? ColumnSize : double.PositiveInfinity; + + double ColumnSize => (IsHorizontal ? _allocatedSize.Height / Span : _allocatedSize.Width / Span) - ((Span - 1) * ColumnSpacing / Span); + + double ColumnSpacing => IsHorizontal ? VerticalItemSpacing : HorizontalItemSpacing; + + double FooterSize => IsHorizontal ? _footerSize.Width : _footerSize.Height; + + double HeaderSize => IsHorizontal ? _headerSize.Width : _headerSize.Height; + + double ItemStartPoint + { + get + { + var startPoint = HeaderSize; + + if (startPoint > 0) + { + startPoint += ItemSpacing; + } + + return startPoint; + } + } + + double FooterSizeWithSpacing + { + get + { + var size = FooterSize; + + if (size > 0) + { + size += ItemSpacing; + } + + return size; + } + } + + public void SizeAllocated(Size size) + { + _allocatedSize = size; + InitializeMeasureCache(); + } + + public Size GetScrollCanvasSize() + { + if (CollectionView!.Count == 0 || _allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + return _allocatedSize; + + if (_scrollCanvasSize.Width > 0 && _scrollCanvasSize.Height > 0) + return _scrollCanvasSize; + + double totalItemSize = 0; + + if (_hasUnevenRows) + { + // If item source was shared between adaptors, in some case CollectionView.Count could be wrong + if (_accumulatedItemSizes.Count == 0) + { + return _allocatedSize; + } + + totalItemSize = _accumulatedItemSizes[_accumulatedItemSizes.Count - 1] + FooterSizeWithSpacing; + } + else + { + totalItemSize = (int)Math.Ceiling(CollectionView!.Count / (double)Span) * (BaseItemSize + ItemSpacing) - ItemSpacing + ItemStartPoint + FooterSizeWithSpacing; + } + + if (IsHorizontal) + { + _scrollCanvasSize = new Size(totalItemSize, _allocatedSize.Height); + } + else + { + _scrollCanvasSize = new Size(_allocatedSize.Width, totalItemSize); + } + + return _scrollCanvasSize; + } + + public double GetScrollBlockSize() + { + return BaseItemSize + ItemSpacing; + } + + public double GetScrollColumnSize() + { + return (IsHorizontal ? BaseItemBound.Height : BaseItemBound.Width) * Span + ColumnSpacing * (Span - 1); + } + + public void LayoutItems(Rect bound, bool force) + { + if (_allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + return; + + // TODO : need to optimization. it was frequently called with similar bound value. + if (!ShouldRearrange(bound) && !force) + { + return; + } + + _isLayouting = true; + _lastLayoutedBound = bound; + + int padding = Span; + int startIndex = Math.Max(GetStartIndex(bound) - padding * 2, 0); + int endIndex = Math.Min(GetEndIndex(bound) + padding * 2, CollectionView!.Count - 1); + + foreach (var index in _realizedItem.Keys.ToList()) + { + if (index < startIndex || index > endIndex) + { + CollectionView!.UnrealizeView(_realizedItem[index].Holder); + _realizedItem.Remove(index); + } + } + + for (int i = startIndex; i <= endIndex; i++) + { + NView? itemView = null; + + if (!_realizedItem.ContainsKey(i)) + { + var holder = CollectionView!.RealizeView(i); + + _realizedItem[i] = new RealizedItem(holder, i); + itemView = holder; + } + else + { + itemView = _realizedItem[i].Holder; + itemView.Visible = true; + } + + var itemBound = GetItemBound(i); + itemView.UpdateBounds(itemBound); + } + + _isLayouting = false; + } + + public void UpdateSpan(int span) + { + Span = span; + InitializeMeasureCache(); + CollectionView!.RequestLayoutItems(); + } + + public void ItemInserted(int inserted) + { + var items = _realizedItem.Keys.OrderByDescending(key => key); + + foreach (var index in items) + { + if (index >= inserted) + { + _realizedItem[index + 1] = _realizedItem[index]; + } + } + + if (_realizedItem.ContainsKey(inserted)) + { + _realizedItem.Remove(inserted); + } + else + { + var last = items.LastOrDefault(); + + if (last >= inserted) + { + _realizedItem.Remove(last); + } + } + + UpdateInsertedSize(inserted); + + _scrollCanvasSize = new Size(0, 0); + CollectionView!.ContentSizeUpdated(); + } + + public void ItemRemoved(int removed) + { + if (_realizedItem.ContainsKey(removed)) + { + CollectionView!.UnrealizeView(_realizedItem[removed].Holder); + _realizedItem.Remove(removed); + } + + var items = _realizedItem.Keys.OrderBy(key => key); + + foreach (var index in items) + { + if (index > removed) + { + _realizedItem[index - 1] = _realizedItem[index]; + } + } + + var last = items.LastOrDefault(); + + if (last > removed) + { + _realizedItem.Remove(last); + } + + UpdateRemovedSize(removed); + + _scrollCanvasSize = new Size(0, 0); + CollectionView!.ContentSizeUpdated(); + } + + public void ItemUpdated(int index) + { + if (_realizedItem.ContainsKey(index)) + { + var bound = _realizedItem[index].Holder.Bounds; + CollectionView!.UnrealizeView(_realizedItem[index].Holder); + var view = CollectionView!.RealizeView(index); + _realizedItem[index].Holder = view; + view.UpdateBounds(bound); + } + } + + public Rect GetItemBound(int index) + { + int rowIndex = index / Span; + int columnIndex = index % Span; + double columnSize = ColumnSize; + + if (double.IsInfinity(columnSize)) + columnSize = BaseItemSize; + + double rowStartPoint = 0; + double columnStartPoint = 0; + double itemSize = 0; + + if (!_hasUnevenRows) + { + itemSize = BaseItemSize; + rowStartPoint = ItemStartPoint + rowIndex * (BaseItemSize + ItemSpacing); + columnStartPoint = columnIndex * (columnSize + ColumnSpacing); + } + else if (_cached[index]) + { + var updatedMaxItemSize = GetMaxItemSize(index); + itemSize = _itemSizes[index]; + rowStartPoint = _accumulatedItemSizes[rowIndex] - updatedMaxItemSize + (updatedMaxItemSize - itemSize) / 2; + columnStartPoint = columnIndex * (columnSize + ColumnSpacing); + } + else + { + var oldMaxItemSize = GetMaxItemSize(index); + + var measured = CollectionView!.GetItemSize(index, ItemWidthConstraint, ItemHeightConstraint); + itemSize = IsHorizontal ? measured.Width : measured.Height; + + if (itemSize != _itemSizes[index]) + { + _itemSizes[index] = itemSize; + } + + var updatedMaxItemSize = GetMaxItemSize(index); + + if (oldMaxItemSize != updatedMaxItemSize) + { + UpdateAccumulatedItemSize(rowIndex, updatedMaxItemSize - oldMaxItemSize); + int columnStart = (index / Span) * Span; + + for (int toUpdate = columnStart; toUpdate < index; toUpdate++) + { + if (_realizedItem.ContainsKey(toUpdate)) + { + var updated = _realizedItem[toUpdate].Holder.Bounds; + + if (IsHorizontal) + { + updated.X += (updatedMaxItemSize - oldMaxItemSize) / 2; + } + else + { + updated.Y += (updatedMaxItemSize - oldMaxItemSize) / 2; + } + + _realizedItem[toUpdate].Holder.UpdateBounds(updated); + } + } + + CollectionView!.ContentSizeUpdated(); + } + + rowStartPoint = _accumulatedItemSizes[rowIndex] - updatedMaxItemSize + (updatedMaxItemSize - itemSize) / 2; + + columnStartPoint = columnIndex * (columnSize + ColumnSpacing); + + _cached[index] = true; + } + + return IsHorizontal ? + new Rect(rowStartPoint, columnStartPoint, itemSize, columnSize) : + new Rect(columnStartPoint, rowStartPoint, columnSize, itemSize); + } + + public void Reset() + { + foreach (var realizedItem in _realizedItem.Values.ToList()) + { + CollectionView!.UnrealizeView(realizedItem.Holder); + } + + _realizedItem.Clear(); + _scrollCanvasSize = new Size(0, 0); + CollectionView!.ContentSizeUpdated(); + } + + public void ItemSourceUpdated() + { + InitializeMeasureCache(); + } + + public void ItemMeasureInvalidated(int index) + { + if (_hasUnevenRows) + { + if (index >= 0 && _cached.Count > index) + _cached[index] = false; + + if (_realizedItem.ContainsKey(index)) + { + CollectionView!.RequestLayoutItems(); + } + } + else if (index == 0) // MeasureFirstItem + { + // Reset item size to measure updated size + InitializeMeasureCache(); + CollectionView!.RequestLayoutItems(); + } + } + + public int GetVisibleItemIndex(double x, double y) + { + int index = 0; + + if (x < 0 || y < 0) + return index; + + if (_scrollCanvasSize.Width < x || _scrollCanvasSize.Height < y) + return CollectionView!.Count - 1; + + int first = 0; + + if (!_hasUnevenRows) + { + first = Math.Min(Math.Max(0, (int)(((IsHorizontal ? x : y) - ItemStartPoint) / (BaseItemSize + ItemSpacing))), ((CollectionView!.Count - 1) / Span)); + } + else + { + first = _accumulatedItemSizes.FindIndex(current => (IsHorizontal ? x : y) <= current); + + if (first == -1) + first = (CollectionView!.Count - 1) / Span; + } + + int second = (int)((IsHorizontal ? y : x) / (ColumnSize + ColumnSpacing)); + + if (second == Span) + second -= 1; + + index = (first * Span) + second; + + if (index < CollectionView!.Count) + return index; + + return CollectionView!.Count - 1; + } + + public void SetHeader(NView? header, Size size) + { + bool contentSizeChanged = false; + + if (IsHorizontal) + { + if (_headerSize.Width != size.Width) + contentSizeChanged = true; + } + else + { + if (_headerSize.Height != size.Height) + contentSizeChanged = true; + } + + _header = header; + _headerSize = size; + + if (contentSizeChanged) + { + InitializeMeasureCache(); + CollectionView!.ContentSizeUpdated(); + } + + if (_header != null) + { + var bound = new Rect(0, 0, _headerSize.Width, _headerSize.Height); + + if (IsHorizontal) + { + bound.Height = _allocatedSize.Height; + } + else + { + bound.Width = _allocatedSize.Width; + } + + _header.UpdateBounds(bound); + } + } + + public void SetFooter(NView? footer, Size size) + { + bool contentSizeChanged = false; + + if (IsHorizontal) + { + if (_footerSize.Width != size.Width) + contentSizeChanged = true; + } + else + { + if (_footerSize.Height != size.Height) + contentSizeChanged = true; + } + + _footer = footer; + _footerSize = size; + + if (contentSizeChanged) + { + InitializeMeasureCache(); + CollectionView!.ContentSizeUpdated(); + } + + UpdateFooterPosition(); + } + + public int NextRowItemIndex(int index) + { + return Math.Min(index + Span, CollectionView!.Count - 1); + } + + public int PreviousRowItemIndex(int index) + { + return Math.Max(index - Span, 0); + } + + void UpdateFooterPosition() + { + if (_footer == null) + return; + + var position = new Point(); + + if (IsHorizontal) + { + position.X += (GetScrollCanvasSize().Width - _footerSize.Width); + } + else + { + position.Y += (GetScrollCanvasSize().Height - _footerSize.Height); + } + + var bound = new Rect(position.X, position.Y, _footerSize.Width, _footerSize.Height); + + if (IsHorizontal) + { + bound.Height = _allocatedSize.Height; + } + else + { + bound.Width = _allocatedSize.Width; + } + + _footer.UpdateBounds(bound); + } + + void InitializeMeasureCache() + { + _baseItemBound = Size.Zero; + _scrollCanvasSize = new Size(0, 0); + _lastLayoutedBound = new Rect(0, 0, 0, 0); + + if (_allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + return; + + if (!_hasUnevenRows) + { + CollectionView!.ContentSizeUpdated(); + + return; + } + + int n = CollectionView!.Count; + _itemSizes = new List(); + _cached = new List(); + _accumulatedItemSizes = new List(); + + for (int i = 0; i < n; i++) + { + _cached.Add(false); + _itemSizes.Add(BaseItemSize); + + if (i % Span == 0) + { + int accIndex = i / Span; + _accumulatedItemSizes.Add((accIndex > 0 ? (_accumulatedItemSizes[accIndex - 1] + ItemSpacing) : ItemStartPoint) + _itemSizes[i]); + } + } + + CollectionView!.ContentSizeUpdated(); + } + + void BuildAccumulatedSize() + { + _accumulatedItemSizes = new List(); + int n = _itemSizes.Count; + + for (int i = 0; i < n; i++) + { + int accIndex = i / Span; + double prevSize = accIndex > 0 ? (_accumulatedItemSizes[accIndex - 1] + ItemSpacing) : ItemStartPoint; + + if (i % Span == 0) + { + _accumulatedItemSizes.Add(prevSize); + } + + double columnMax = _accumulatedItemSizes[accIndex] - prevSize; + + if (columnMax < _itemSizes[i]) + { + _accumulatedItemSizes[accIndex] += (_itemSizes[i] - columnMax); + } + } + } + + void UpdateInsertedSize(int inserted) + { + if (!_hasUnevenRows) + return; + + _cached.Insert(inserted, false); + _itemSizes.Insert(inserted, BaseItemSize); + + BuildAccumulatedSize(); + } + + void UpdateRemovedSize(int removed) + { + if (!_hasUnevenRows) + return; + + _itemSizes.RemoveAt(removed); + + _cached.RemoveAt(removed); + BuildAccumulatedSize(); + } + + void UpdateAccumulatedItemSize(int index, double diff) + { + for (int i = index; i < _accumulatedItemSizes.Count; i++) + { + _accumulatedItemSizes[i] += diff; + } + + if (_scrollCanvasSize.Width > 0 && _scrollCanvasSize.Height > 0) + { + if (IsHorizontal) + { + _scrollCanvasSize.Width += diff; + } + else + { + _scrollCanvasSize.Height += diff; + } + } + + UpdateFooterPosition(); + } + + double GetMaxItemSize(int index) + { + int columnStart = (index / Span) * Span; + int columnEnd = columnStart + Span - 1; + double max = 0; + + for (int i = columnStart; i <= columnEnd && i < _itemSizes.Count; i++) + { + max = Math.Max(max, _itemSizes[i]); + } + + return max; + } + + int GetStartIndex(Rect bound, double itemSize) + { + return (int)((ViewPortStartPoint(bound) - ItemStartPoint) / itemSize * Span); + } + + int GetStartIndex(Rect bound) + { + if (!_hasUnevenRows) + { + return GetStartIndex(bound, BaseItemSize + ItemSpacing); + } + + return FindFirstGreaterOrEqualTo(_accumulatedItemSizes, ViewPortStartPoint(bound)) * Span; + } + + int GetEndIndex(Rect bound, double itemSize) + { + return (int)Math.Ceiling(ViewPortEndPoint(bound) / (double)itemSize) * Span - 1; + } + + int GetEndIndex(Rect bound) + { + if (!_hasUnevenRows) + { + return GetEndIndex(bound, BaseItemSize + ItemSpacing); + } + + return (FindFirstGreaterOrEqualTo(_accumulatedItemSizes, ViewPortEndPoint(bound)) + 1) * Span - 1; + } + + double ViewPortStartPoint(Rect viewPort) + { + return IsHorizontal ? viewPort.X : viewPort.Y; + } + + double ViewPortEndPoint(Rect viewPort) + { + return ViewPortStartPoint(viewPort) + ViewPortSize(viewPort); + } + + double ViewPortSize(Rect viewPort) + { + return IsHorizontal ? viewPort.Width : viewPort.Height; + } + + bool ShouldRearrange(Rect viewport) + { + if (_isLayouting) + return false; + + if (_lastLayoutedBound.Size != viewport.Size) + return true; + + var diff = IsHorizontal ? Math.Abs(_lastLayoutedBound.X - viewport.X) : Math.Abs(_lastLayoutedBound.Y - viewport.Y); + + if (diff > BaseItemSize) + return true; + + return false; + } + + static int FindFirstGreaterOrEqualTo(IList data, double value) + { + if (data.Count == 0) + return 0; + + int start = 0; + int end = data.Count - 1; + + while (start < end) + { + int mid = (start + end) / 2; + + if (data[mid] < value) + { + start = mid + 1; + } + else + { + end = mid - 1; + } + } + + if (data[start] < value) + { + start++; + } + + return start; + } + + class RealizedItem + { + + public RealizedItem(ViewHolder holder, int index) + { + Holder = holder; + Index = index; + } + + public ViewHolder Holder { get; set; } + + public int Index { get; set; } + + } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewController.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewController.cs new file mode 100644 index 000000000000..aae8959eb556 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewController.cs @@ -0,0 +1,79 @@ +using Gtk.UIExtensions.Common; +using Rect = Microsoft.Maui.Graphics.Rect; +using Size = Microsoft.Maui.Graphics.Size; + +namespace Gtk.UIExtensions.NUI +{ + + /// + /// Interface to control CollectionView on internal modules + /// these apis not open as CollectionView API + /// + public interface ICollectionViewController + { + /// + /// Request realize a view, it create a view to represent a item + /// + /// index of item + /// Realized view + ViewHolder RealizeView(int index); + + /// + /// Request unrealize a view, it remove a view from CollectionView + /// + /// A view to unrealize + void UnrealizeView(ViewHolder view); + + /// + /// Request layouting items newly + /// + void RequestLayoutItems(); + + /// + /// The number of items + /// + int Count { get; } + + /// + /// Gets a item size + /// + /// Size of item + Size GetItemSize(); + + /// + /// Gets a item size with contstraint + /// + /// A width size that could be reached as maximum + /// A height size that could be reached as maximum + /// Size of item + Size GetItemSize(double widthConstraint, double heightConstraint); + + /// + /// Gets a item size with contstraint + /// + /// Index of item to get a size + /// A width size that could be reached as maximum + /// A height size that could be reached as maximum + /// Size of item + Size GetItemSize(int index, double widthConstraint, double heightConstraint); + + /// + /// Notify scroll canvas size was changed + /// + void ContentSizeUpdated(); + + /// + /// Notify that item measure result is changed + /// + /// + public void ItemMeasureInvalidated(int index); + + /// + /// Request item select + /// + /// Item index + public void RequestItemSelect(int index); + + } + +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewLayoutManager.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewLayoutManager.cs new file mode 100644 index 000000000000..f922c74077f1 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ICollectionViewLayoutManager.cs @@ -0,0 +1,130 @@ +using Rect = Microsoft.Maui.Graphics.Rect; +using Size = Microsoft.Maui.Graphics.Size; +using View = Gtk.Widget; + +namespace Gtk.UIExtensions.NUI +{ + /// + /// Interface for positioning item views within a CollectionView + /// + public interface ICollectionViewLayoutManager + { + /// + /// CollectoinView interact with layout manager + /// + ICollectionViewController? CollectionView { get; set; } + + /// + /// Whether the item is a layout horizontally + /// + bool IsHorizontal { get; } + + /// + /// Inform a view Size of CollectionView + /// + /// + void SizeAllocated(Size size); + + /// + /// Calculate scrolling canvas size + /// + /// scrolling area size + Size GetScrollCanvasSize(); + + /// + /// Layout items + /// + /// A view port area on scrolling canvas + /// Forced layout + void LayoutItems(Rect bound, bool force = false); + + /// + /// Gets item bound indicated by index + /// + /// Item index + /// Bound of view + Rect GetItemBound(int index); + + /// + /// Inform a new item was inserted + /// + /// Index of new item + void ItemInserted(int index); + + /// + /// Inform item was removed + /// + /// Index of reomved item + void ItemRemoved(int index); + + /// + /// Inform item was updated + /// + /// Index of updated item + void ItemUpdated(int index); + + /// + /// Inform item source was updated + /// + void ItemSourceUpdated(); + + /// + /// Reset layouting cache + /// + void Reset(); + + /// + /// Update item measuring result + /// + /// Index of updated item + void ItemMeasureInvalidated(int index); + + /// + /// Get item index by position + /// + /// X + /// Y + /// Index of postion + int GetVisibleItemIndex(double x, double y); + + /// + /// Get Item size to scroll at once + /// + /// + double GetScrollBlockSize(); + + /// + /// Get Item size to scroll at once + /// + /// + double GetScrollColumnSize(); + + /// + /// Sets header on layout + /// + /// Header view + /// Size of header + void SetHeader(View? header, Size size); + + /// + /// Sets footer on layout + /// + /// Fotter view + /// Size of footer + void SetFooter(View? footer, Size size); + + /// + /// Gets index of next row item + /// + /// Current item index + /// + int NextRowItemIndex(int index); + + /// + /// Gets index of previous row item + /// + /// Current item index + /// + int PreviousRowItemIndex(int index); + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/IMeasurable.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/IMeasurable.cs new file mode 100644 index 000000000000..2b4a50aae9f7 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/IMeasurable.cs @@ -0,0 +1,19 @@ +using Microsoft.Maui.Graphics; +namespace Gtk.UIExtensions.Common +{ + /// + /// Interface of the controls which can measure their size taking into + /// account the available area. + /// + public interface IMeasurable + { + /// + /// Measures the size of the control in order to fit it into the + /// available area. + /// + /// Available width. + /// Available height. + /// Size of the control that fits the available area. + Size Measure(double availableWidth, double availableHeight); + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemAdaptor.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemAdaptor.cs new file mode 100644 index 000000000000..5923029439e4 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemAdaptor.cs @@ -0,0 +1,250 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using Rect = Microsoft.Maui.Graphics.Rect; +using Size = Microsoft.Maui.Graphics.Size; +using NView = Gtk.Widget; + +namespace Gtk.UIExtensions.NUI +{ + /// + /// Base class for an Adapter + /// Adapters provide a binding from an app-specific data set to views that are displayed within a CollectionView. + /// + public abstract class ItemAdaptor : INotifyCollectionChanged, IDisposable + { + bool disposedValue; + IList _itemsSource; + + /// + /// Initializes a new instance of the class. + /// + /// Items soruce +#pragma warning disable CS8618 + // dotnet compiler does not track a method that called on constructor to check non-nullable object + // https://github.com/dotnet/roslyn/issues/32358 + protected ItemAdaptor(IEnumerable items) +#pragma warning restore CS8618 + { + SetItemsSource(items); + } + + /// + /// A CollectionView associated with current Adaptor + /// + public ICollectionViewController? CollectionView { get; set; } + + /// + /// Sets ItemsSource + /// + /// Items source + protected void SetItemsSource(IEnumerable items) + { + switch (items) + { + case IList list: + _itemsSource = list; + if (list is INotifyCollectionChanged observable) + { + _observableCollection = observable; + _observableCollection.CollectionChanged += OnCollectionChanged; + } + break; + case IEnumerable generic: + _itemsSource = new List(generic); + break; + case IEnumerable _: + _itemsSource = new List(); + foreach (var item in items) + { + _itemsSource.Add(item); + } + break; + } + } + + public object? this[int index] + { + get + { + return _itemsSource[index]; + } + } + + /// + /// the number of items + /// + public virtual int Count => _itemsSource.Count; + + INotifyCollectionChanged? _observableCollection; + + /// + /// Occurs when the collection changes. + /// + public event NotifyCollectionChangedEventHandler? CollectionChanged; + + /// + /// Handle Selected item + /// + /// + public virtual void SendItemSelected(IEnumerable selected) + { + } + + /// + /// Update View state + /// + /// A view to update + /// State of view + public virtual void UpdateViewState(NView view, ViewHolderState state) + { + } + + /// + /// Find item index by item + /// + /// item to find + /// index of item + public int GetItemIndex(object item) + { + return _itemsSource.IndexOf(item); + } + + /// + /// A view category that represent a item, it use to distinguish kinds of view + /// + /// item index + /// An identifier of category + public virtual object GetViewCategory(int index) + { + return this; + } + + /// + /// Create a new view + /// + /// Created view + public abstract NView CreateNativeView(); + + /// + /// Create a new view + /// + /// To used item when create a view + /// Created view + public abstract NView CreateNativeView(int index); + + /// + /// Create a header view, if header is not existed, null will be returned + /// + /// A created view + public abstract NView? GetHeaderView(); + + public abstract IView? GetTemplatedView(int index); + + public abstract IView? GetTemplatedView(NView view); + + /// + /// Remove header view, a created view by Adaptor, should be removed by Adaptor + /// + /// A view to remove + public virtual void RemoveHeaderView(NView header) + { + header.Dispose(); + } + + /// + /// Create a footer view, if footer is not existed, null will be returned + /// + /// A created view + public abstract NView? GetFooterView(); + + /// + /// Remove footer view, a created view by Adaptor, should be removed by Adaptor + /// + /// A view to remove + public virtual void RemoveFooterView(NView footer) + { + footer.Dispose(); + } + + /// + /// Remove view, a created view by Adaptor, should be removed by Adaptor + /// + /// A view to remove + public abstract void RemoveNativeView(NView native); + + /// + /// Set data binding between view and item + /// + /// A target view + /// A target item + public abstract void SetBinding(NView view, int index); + + /// + /// Unset data binding on view + /// + /// A view to unbinding + public abstract void UnBinding(NView view); + + /// + /// Measure item size + /// + /// A width size that could be reached as maximum + /// A height size that could be reached as maximum + /// Item size + public abstract Size MeasureItem(double widthConstraint, double heightConstraint); + + /// + /// Measure item size + /// + /// A item index to measure + /// A width size that could be reached as maximum + /// A height size that could be reached as maximum + /// Item size + public abstract Size MeasureItem(int index, double widthConstraint, double heightConstraint); + + /// + /// Measure header size + /// + /// A width size that could be reached as maximum + /// A height size that could be reached as maximum + /// Header size + public abstract Size MeasureHeader(double widthConstraint, double heightConstraint); + + /// + /// Measure Footer size + /// + /// A width size that could be reached as maximum + /// A height size that could be reached as maximum + /// Footer size + public abstract Size MeasureFooter(double widthConstraint, double heightConstraint); + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + if (_observableCollection != null) + { + _observableCollection.CollectionChanged -= OnCollectionChanged; + } + } + + disposedValue = true; + } + } + + void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + CollectionChanged?.Invoke(this, e); + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemSizingStrategy.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemSizingStrategy.cs new file mode 100644 index 000000000000..e5c3bf5ed1a7 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ItemSizingStrategy.cs @@ -0,0 +1,17 @@ +namespace Gtk.UIExtensions.NUI +{ + /// + /// Enum for ItemSizingStrategy + /// + public enum ItemSizingStrategy_ + { + /// + /// Measuring all items + /// + MeasureAllItems, + /// + /// Measure only first item + /// + MeasureFirstItem + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LayoutEventArgs.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LayoutEventArgs.cs new file mode 100644 index 000000000000..5e1bd8ff69de --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LayoutEventArgs.cs @@ -0,0 +1,24 @@ +using System; +using Rect = Microsoft.Maui.Graphics.Rect; + +namespace Gtk.UIExtensions.Common +{ + + /// + /// Holds information about size of the area which can be used for layout. + /// + public class LayoutEventArgs : EventArgs + { + + /// + /// Geometry of the layout area, absolute coordinate + /// + public Rect Geometry + { + get; + set; + } + + } + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LinearLayoutManager.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LinearLayoutManager.cs new file mode 100644 index 000000000000..5560c51de3dd --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/LinearLayoutManager.cs @@ -0,0 +1,667 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Graphics; +using View = Gtk.Widget; +namespace Gtk.UIExtensions.NUI +{ + /// + /// A implementation which provides linear layout + /// + public class LinearLayoutManager : ICollectionViewLayoutManager + { + Size _allocatedSize; + bool _isLayouting; + Rect _lastLayoutedBound; + Dictionary _realizedItem = new Dictionary(); + List _itemSizes = new List(); + List _cached = new List(); + List _accumulatedItemSizes = new List(); + + bool _hasUnevenRows; + Size _baseItemBound; + + Size _headerSize; + View? _header; + Size _footerSize; + View? _footer; + + /// + /// Initializes a new instance of the class. + /// + /// Layout orientation + public LinearLayoutManager(bool isHorizontal) : this(isHorizontal, ItemSizingStrategy.MeasureFirstItem) { } + + /// + /// Initializes a new instance of the class. + /// + /// Layout orientation + /// Item size measuring strategy + public LinearLayoutManager(bool isHorizontal, ItemSizingStrategy sizingStrategy) : this(isHorizontal, sizingStrategy, 0) { } + + /// + /// Initializes a new instance of the class. + /// + /// Layout orientation + /// Item size measuring strategy + /// A space size between items + public LinearLayoutManager(bool isHorizontal, ItemSizingStrategy sizingStrategy, int itemSpacing) + { + IsHorizontal = isHorizontal; + _hasUnevenRows = sizingStrategy == ItemSizingStrategy.MeasureAllItems; + ItemSpacing = itemSpacing; + } + + /// + /// Whether the item is a layout horizontally + /// + public bool IsHorizontal { get; } + + /// + /// A space size between items + /// + public double ItemSpacing { get; } + + /// + /// CollectionView that interact with layout manager + /// + public ICollectionViewController? CollectionView { get; set; } + + double BaseItemSize + { + get => IsHorizontal ? BaseItemBound.Width : BaseItemBound.Height; + } + + Size BaseItemBound + { + get + { + if (_baseItemBound == Size.Zero) + { + if (_allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + return Size.Zero; + + var itembound = CollectionView!.GetItemSize(ItemWidthConstraint, ItemHeightConstraint); + _baseItemBound = itembound; + } + + return _baseItemBound; + } + } + + double ItemWidthConstraint => IsHorizontal ? double.PositiveInfinity : _allocatedSize.Width; + double ItemHeightConstraint => IsHorizontal ? _allocatedSize.Height : double.PositiveInfinity; + + double FooterSize => IsHorizontal ? _footerSize.Width : _footerSize.Height; + double HeaderSize => IsHorizontal ? _headerSize.Width : _headerSize.Height; + + double ItemStartPoint + { + get + { + var startPoint = HeaderSize; + if (startPoint > 0) + { + startPoint += ItemSpacing; + } + return startPoint; + } + } + + double FooterSizeWithSpacing + { + get + { + var size = FooterSize; + if (size > 0) + { + size += ItemSpacing; + } + return size; + } + } + + public void SizeAllocated(Size size) + { + _allocatedSize = size; + InitializeMeasureCache(); + } + + Size _scrollCanvasSize; + + public Size GetScrollCanvasSize() + { + if (CollectionView!.Count == 0 || _allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + { + return _allocatedSize; + } + + if (_scrollCanvasSize.Width > 0 && _scrollCanvasSize.Height > 0) + return _scrollCanvasSize; + + double totalItemSize = 0; + + if (_hasUnevenRows) + { + // If item source was shared between adaptors, in some case CollectionView.Count could be wrong + if (_accumulatedItemSizes.Count == 0) + { + return _allocatedSize; + } + totalItemSize = _accumulatedItemSizes[_accumulatedItemSizes.Count - 1] + FooterSizeWithSpacing; + } + else + { + totalItemSize = (BaseItemSize + ItemSpacing) * CollectionView!.Count - ItemSpacing + ItemStartPoint + FooterSizeWithSpacing; + } + + if (IsHorizontal) + { + _scrollCanvasSize = new Size(totalItemSize, _allocatedSize.Height); + } + else + { + _scrollCanvasSize = new Size(_allocatedSize.Width, totalItemSize); + } + + return _scrollCanvasSize; + } + + public void LayoutItems(Rect bound, bool force) + { + if (_allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + return; + + // TODO : need to optimization. it was frequently called with similar bound value. + if (!ShouldRearrange(bound) && !force) + { + return; + } + + _isLayouting = true; + _lastLayoutedBound = bound; + + int startIndex = Math.Max(GetStartIndex(bound) - 5, 0); + int endIndex = Math.Min(GetEndIndex(bound) + 5, CollectionView!.Count - 1); + + foreach (var index in _realizedItem.Keys.ToList()) + { + if (index < startIndex || index > endIndex) + { + CollectionView!.UnrealizeView(_realizedItem[index].View); + _realizedItem.Remove(index); + } + } + + for (int i = startIndex; i <= endIndex; i++) + { + View itemView; + if (!_realizedItem.ContainsKey(i)) + { + var view = CollectionView!.RealizeView(i); + _realizedItem[i] = new RealizedItem(view, i); + itemView = view; + } + else + { + itemView = _realizedItem[i].View; + } + var itemBound = GetItemBound(i); + itemView.UpdateBounds(itemBound); + } + _isLayouting = false; + } + + public void ItemInserted(int inserted) + { + var items = _realizedItem.Keys.OrderByDescending(key => key); + foreach (var index in items) + { + if (index >= inserted) + { + _realizedItem[index + 1] = _realizedItem[index]; + } + } + if (_realizedItem.ContainsKey(inserted)) + { + _realizedItem.Remove(inserted); + } + else + { + var last = items.LastOrDefault(); + if (last >= inserted) + { + _realizedItem.Remove(last); + } + } + + UpdateInsertedSize(inserted); + + _scrollCanvasSize = new Size(0, 0); + CollectionView!.ContentSizeUpdated(); + } + + public void ItemRemoved(int removed) + { + if (_realizedItem.ContainsKey(removed)) + { + CollectionView!.UnrealizeView(_realizedItem[removed].View); + _realizedItem.Remove(removed); + } + + var items = _realizedItem.Keys.OrderBy(key => key); + foreach (var index in items) + { + if (index > removed) + { + _realizedItem[index - 1] = _realizedItem[index]; + } + } + + var last = items.LastOrDefault(); + if (last > removed) + { + _realizedItem.Remove(last); + } + + UpdateRemovedSize(removed); + + _scrollCanvasSize = new Size(0, 0); + CollectionView!.ContentSizeUpdated(); + } + + public void ItemUpdated(int index) + { + if (_realizedItem.ContainsKey(index)) + { + var bound = _realizedItem[index].View.GetBounds(); + CollectionView!.UnrealizeView(_realizedItem[index].View); + var view = CollectionView!.RealizeView(index); + _realizedItem[index].View = view; + view.UpdateBounds(bound); + } + } + + public Rect GetItemBound(int index) + { + double itemSize = 0; + double startPoint = 0; + + if (!_hasUnevenRows) + { + itemSize = BaseItemSize; + startPoint = ItemStartPoint + (itemSize + ItemSpacing) * index; + } + else if (index >= _itemSizes.Count) + { + return new Rect(0, 0, 0, 0); + } + else if (_cached[index]) + { + itemSize = _itemSizes[index]; + startPoint = _accumulatedItemSizes[index] - itemSize; + } + else + { + var measured = CollectionView!.GetItemSize(index, ItemWidthConstraint, ItemHeightConstraint); + itemSize = IsHorizontal ? measured.Width : measured.Height; + + if (itemSize != _itemSizes[index]) + { + UpdateAccumulatedItemSize(index, itemSize - _itemSizes[index]); + _itemSizes[index] = itemSize; + + CollectionView!.ContentSizeUpdated(); + } + startPoint = _accumulatedItemSizes[index] - itemSize; + _cached[index] = true; + } + + return IsHorizontal ? + new Rect(startPoint, 0, itemSize, _allocatedSize.Height) : + new Rect(0, startPoint, _allocatedSize.Width, itemSize); + } + + public void Reset() + { + foreach (var realizedItem in _realizedItem.Values.ToList()) + { + CollectionView!.UnrealizeView(realizedItem.View); + } + _realizedItem.Clear(); + _scrollCanvasSize = new Size(0, 0); + CollectionView!.ContentSizeUpdated(); + } + + public void ItemSourceUpdated() + { + InitializeMeasureCache(); + CollectionView!.ContentSizeUpdated(); + } + + public void ItemMeasureInvalidated(int index) + { + if (_hasUnevenRows) + { + if (index >= 0 && _cached.Count > index) + _cached[index] = false; + + if (_realizedItem.ContainsKey(index)) + { + CollectionView!.RequestLayoutItems(); + } + } + else if (index == 0) + { + // Reset item size to measure updated size + InitializeMeasureCache(); + CollectionView!.RequestLayoutItems(); + } + } + + public int GetVisibleItemIndex(double x, double y) + { + double coordinate = IsHorizontal ? x : y; + double canvasSize = IsHorizontal ? _scrollCanvasSize.Width : _scrollCanvasSize.Height; + + if (coordinate < 0) + return 0; + if (canvasSize < coordinate) + return CollectionView!.Count - 1; + + if (!_hasUnevenRows) + { + return Math.Min(Math.Max(0, (int)((coordinate - ItemStartPoint) / (BaseItemSize + ItemSpacing))), CollectionView!.Count - 1); + } + else + { + var index = _accumulatedItemSizes.FindIndex(current => coordinate <= current); + if (index == -1) + index = CollectionView!.Count - 1; + return index; + } + } + + public double GetScrollBlockSize() + { + return BaseItemSize + ItemSpacing; + } + + public double GetScrollColumnSize() + { + return (IsHorizontal ? BaseItemBound.Height : BaseItemBound.Width); + } + + public void SetHeader(View? header, Size size) + { + bool contentSizeChanged = false; + if (IsHorizontal) + { + if (_headerSize.Width != size.Width) + contentSizeChanged = true; + } + else + { + if (_headerSize.Height != size.Height) + contentSizeChanged = true; + } + + _header = header; + _headerSize = size; + + if (contentSizeChanged) + { + InitializeMeasureCache(); + CollectionView!.ContentSizeUpdated(); + } + + if (_header != null) + { + var bound = new Rect(0, 0, _headerSize.Width, _headerSize.Height); + if (IsHorizontal) + { + bound.Height = _allocatedSize.Height; + } + else + { + bound.Width = _allocatedSize.Width; + } + _header.UpdateBounds(bound); + } + } + + public void SetFooter(View? footer, Size size) + { + bool contentSizeChanged = false; + if (IsHorizontal) + { + if (_footerSize.Width != size.Width) + contentSizeChanged = true; + } + else + { + if (_footerSize.Height != size.Height) + contentSizeChanged = true; + } + + _footer = footer; + _footerSize = size; + + if (contentSizeChanged) + { + InitializeMeasureCache(); + CollectionView!.ContentSizeUpdated(); + } + + UpdateFooterPosition(); + } + + public int NextRowItemIndex(int index) + { + return Math.Min(index + 1, CollectionView!.Count - 1); + } + + public int PreviousRowItemIndex(int index) + { + return Math.Max(index - 1, 0); + } + + void UpdateFooterPosition() + { + if (_footer == null) + return; + + var point = new Point(); + if (IsHorizontal) + { + point.X += (GetScrollCanvasSize().Width - _footerSize.Width); + } + else + { + point.Y += (GetScrollCanvasSize().Height - _footerSize.Height); + } + + var bound = new Rect(point, _footerSize); + if (IsHorizontal) + { + bound.Height = _allocatedSize.Height; + } + else + { + bound.Width = _allocatedSize.Width; + } + _footer.UpdateBounds(bound); + } + + void InitializeMeasureCache() + { + _baseItemBound = Size.Zero; + _scrollCanvasSize = new Size(0, 0); + + if (_allocatedSize.Width <= 0 || _allocatedSize.Height <= 0) + return; + + if (!_hasUnevenRows) + { + CollectionView!.ContentSizeUpdated(); + return; + } + + int n = CollectionView!.Count; + _itemSizes = new List(); + _cached = new List(); + _accumulatedItemSizes = new List(); + + for (int i = 0; i < n; i++) + { + _cached.Add(false); + _itemSizes.Add(BaseItemSize); + _accumulatedItemSizes.Add((i > 0 ? (_accumulatedItemSizes[i - 1] + ItemSpacing) : ItemStartPoint) + _itemSizes[i]); + } + CollectionView!.ContentSizeUpdated(); + } + + int GetStartIndex(Rect bound, double itemSize) + { + return (int)((ViewPortStartPoint(bound) - ItemStartPoint) / itemSize); + } + + int GetStartIndex(Rect bound) + { + if (!_hasUnevenRows) + { + return GetStartIndex(bound, BaseItemSize + ItemSpacing); + } + + return FindFirstGreaterOrEqualTo(_accumulatedItemSizes, ViewPortStartPoint(bound)); + } + + int GetEndIndex(Rect bound, double itemSize) + { + return (int)Math.Ceiling(ViewPortEndPoint(bound) / (double)itemSize) - 1; + } + + int GetEndIndex(Rect bound) + { + if (!_hasUnevenRows) + { + return GetEndIndex(bound, BaseItemSize + ItemSpacing); + } + + return FindFirstGreaterOrEqualTo(_accumulatedItemSizes, ViewPortEndPoint(bound)); + } + + double ViewPortStartPoint(Rect viewPort) + { + return IsHorizontal ? viewPort.X : viewPort.Y; + } + + double ViewPortEndPoint(Rect viewPort) + { + return ViewPortStartPoint(viewPort) + ViewPortSize(viewPort); + } + + double ViewPortSize(Rect viewPort) + { + return IsHorizontal ? viewPort.Width : viewPort.Height; + } + + void UpdateAccumulatedItemSize(int index, double diff) + { + for (int i = index; i < _accumulatedItemSizes.Count; i++) + { + _accumulatedItemSizes[i] += diff; + } + + if (_scrollCanvasSize.Width > 0 && _scrollCanvasSize.Height > 0) + { + + if (IsHorizontal) + { + _scrollCanvasSize.Width += diff; + } + else + { + _scrollCanvasSize.Height += diff; + } + } + UpdateFooterPosition(); + } + + void UpdateRemovedSize(int removed) + { + if (!_hasUnevenRows) + return; + var removedSize = _itemSizes[removed]; + _itemSizes.RemoveAt(removed); + UpdateAccumulatedItemSize(removed, -removedSize); + _accumulatedItemSizes.RemoveAt(removed); + _cached.RemoveAt(removed); + } + + void UpdateInsertedSize(int inserted) + { + if (!_hasUnevenRows) + return; + + _cached.Insert(inserted, false); + _itemSizes.Insert(inserted, BaseItemSize); + _accumulatedItemSizes.Insert(inserted, 0); + _accumulatedItemSizes[inserted] = inserted > 0 ? _accumulatedItemSizes[inserted - 1] : ItemStartPoint; + UpdateAccumulatedItemSize(inserted, BaseItemSize); + } + + bool ShouldRearrange(Rect viewport) + { + if (_isLayouting) + return false; + if (_lastLayoutedBound.Size != viewport.Size) + return true; + + var diff = IsHorizontal ? Math.Abs(_lastLayoutedBound.X - viewport.X) : Math.Abs(_lastLayoutedBound.Y - viewport.Y); + if (diff > BaseItemSize) + return true; + + return false; + } + + static int FindFirstGreaterOrEqualTo(IList data, double value) + { + if (data.Count == 0) + return 0; + + int start = 0; + int end = data.Count - 1; + while (start < end) + { + int mid = (start + end) / 2; + if (data[mid] < value) + { + start = mid + 1; + } + else + { + end = mid - 1; + } + } + if (data[start] < value) + { + start++; + } + return start; + } + + class RealizedItem + { + public RealizedItem(ViewHolder view, int index) + { + View = view; + Index = index; + } + + public ViewHolder View { get; set; } + public int Index { get; set; } + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ReadMe.md b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ReadMe.md new file mode 100644 index 000000000000..59b7accf8c33 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ReadMe.md @@ -0,0 +1,9 @@ +this is copied from + +https://github.com/Samsung/Tizen.UIExtensions/tree/main/src/Tizen.UIExtensions.NUI + +https://github.com/Samsung/Tizen.UIExtensions/tree/main/src/Tizen.UIExtensions.Common + +State: + +need to handle \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/RecyclerPool.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/RecyclerPool.cs new file mode 100644 index 000000000000..67dda9994f11 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/RecyclerPool.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Gtk.UIExtensions.NUI +{ + class RecyclerPool + { + LinkedList _pool = new LinkedList(); + + public int Count { get; private set; } + + public void Clear(ItemAdaptor adaptor) + { + foreach (var item in _pool) + { + adaptor.RemoveNativeView(item.Content!); + item.Unparent(); + item.Dispose(); + } + _pool.Clear(); + } + + public void AddRecyclerView(ViewHolder view) + { + Count++; + _pool.AddLast(view); + } + + public ViewHolder? GetRecyclerView(object category) + { + var holder = _pool.Where(d => d.ViewCategory == category).FirstOrDefault(); + if (holder != null) + { + _pool.Remove(holder); + Count--; + } + return holder; + } + + public ViewHolder? GetRecyclerView() + { + if (_pool.First != null) + { + var fisrt = _pool.First; + _pool.RemoveFirst(); + Count--; + return fisrt.Value; + } + return null; + } + } +} diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ScrollableBase.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ScrollableBase.cs new file mode 100644 index 000000000000..c9e1ec8435ef --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ScrollableBase.cs @@ -0,0 +1,117 @@ +using System; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; + +#pragma warning disable CS0067 // Event is never used + +namespace Gtk.UIExtensions.NUI; + +public class ScrollableBase +{ + + public ScrollableBase(Gtk.Widget contentContainer) + { + ContentContainer = contentContainer; + } + + public Direction ScrollingDirection { get; set; } + + public Gtk.Widget ContentContainer { get; set; } + + [MissingMapper] + protected virtual void Decelerating(float velocity, Animation animation) + { + + } + + public float DecelerationRate { get; set; } + + public int ScrollingEventThreshold { get; set; } + + public bool HideScrollbar { get; set; } + + public bool ScrollEnabled { get; set; } + + public event EventHandler? ScrollAnimationEnded; + + public event EventHandler? ScrollDragStarted; + + [MissingMapper] + public Rect GetScrollBound() + { + return new Rect(0,0,ContentContainer.Allocation.Width,ContentContainer.Allocation.Height); + } + + [MissingMapper] + public void ScrollTo(float itemBoundX, bool animate) + { + } + + public event EventHandler? Scrolling; + + public event EventHandler? Relayout; + + protected void OnLayout(object? sender, SizeAllocatedArgs e) + { + if (sender is not Widget w) + return; + + Relayout?.Invoke(sender,e); + } + + /// + /// The direction axis to scroll. + /// + /// 8 + public enum Direction + { + /// + /// Horizontal axis. + /// + /// 8 + Horizontal, + + /// + /// Vertical axis. + /// + /// 8 + Vertical + } + + public event EventHandler? ScrollDragEnded; + + public event EventHandler? ScrollAnimationStarted; + + [MissingMapper] + public virtual float SizeWidth() + { + return default; + } + + [MissingMapper] + public virtual float SizeHeight() + { + return default; + } + + [MissingMapper] + public void WidthSpecification(LayoutParamPolicies matchParent) + { + } + + [MissingMapper] + public void HeightSpecification(LayoutParamPolicies matchParent) + { + } + + [MissingMapper] + public void WidthResizePolicy(ResizePolicyType fillToParent) + { + } + + [MissingMapper] + public void HeightResizePolicy(ResizePolicyType fillToParent) + { + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsAlignment.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsAlignment.cs new file mode 100644 index 000000000000..a57362e9b081 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsAlignment.cs @@ -0,0 +1,21 @@ +namespace Gtk.UIExtensions.NUI +{ + /// + /// Enumerates values that specifies how snap points are aligned with items. + /// + public enum SnapPointsAlignment + { + /// + /// indicates that scrolling item was aligned with start + /// + Start, + /// + /// indicates that scrolling item was aligned with center + /// + Center, + /// + /// indicates that scrolling item was aligned with end + /// + End + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsType.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsType.cs new file mode 100644 index 000000000000..57e763b53fdb --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnapPointsType.cs @@ -0,0 +1,21 @@ +namespace Gtk.UIExtensions.NUI +{ + /// + /// Enumerates values that specifies the behavior of snap points when scrolling.. + /// + public enum SnapPointsType + { + /// + /// indicates that scrolling does not snap to items. + /// + None, + /// + /// indicates that content always snaps to the closest snap point to where scrolling would naturally stop, along the direction of inertia. + /// + Mandatory, + /// + /// indicates the same behavior as Mandatory, but only scrolls one item at a time. + /// + MandatorySingle, + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnappableScrollView.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnappableScrollView.cs new file mode 100644 index 000000000000..c20a9f7e6cb4 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/SnappableScrollView.cs @@ -0,0 +1,328 @@ +using System; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Graphics; +using Gtk; + +#pragma warning disable CS0067 // Event is never used + +namespace Gtk.UIExtensions.NUI; + +/// +/// A ScrollView that implemented snap points +/// +internal class SnappableScrollView : ScrollableBase +{ + delegate float UserAlphaFunctionDelegate(float progress); + + UserAlphaFunctionDelegate? _customScrollingAlphaFunctionDelegate; + + Func? _scrollingAlpha; + // AlphaFunction? _customScrollingAlphaFunction; + // Animation? _snapAnimation; + + int _currentItemIndex = -1; + + public SnappableScrollView(CollectionView cv) : base(cv) + { + CollectionView = cv; + + _customScrollingAlphaFunctionDelegate = new UserAlphaFunctionDelegate(ScrollingAlpha); + // _customScrollingAlphaFunction = new AlphaFunction(_customScrollingAlphaFunctionDelegate); + + ScrollDragStarted += OnDragStart; + + ScrollAnimationEnded += OnAnimationEnd; + CollectionView.SizeAllocated += OnLayout; + + } + + + public event EventHandler? SnapRequestFinished; + + public bool UseCostomScrolling { get; set; } + + public float MaximumVelocity { get; set; } = 8.5f; + + public float Friction { get; set; } = 0.015f; + + CollectionView CollectionView { get; } + + ICollectionViewLayoutManager LayoutManager => CollectionView.LayoutManager!; + + Rect ViewPort => CollectionView.ViewPort; + + double ViewPortStart => IsHorizontal ? ViewPort.X : ViewPort.Y; + + double ViewPortEnd => IsHorizontal ? ViewPort.Right : ViewPort.Bottom; + + double ViewPortSize => IsHorizontal ? ViewPort.Width : ViewPort.Height; + + bool IsHorizontal => ScrollingDirection == Direction.Horizontal; + + protected override void Decelerating(float velocity, Animation animation) + { + if (CollectionView.SnapPointsType == SnapPointsType.MandatorySingle) + { + // Only one item should be passed when scrolling by snap + HandleMandatorySingle(velocity); + } + else + { + HandleNonMandatorySingle(velocity, animation); + } + } + + void CustomScrolling(float velocity, Animation animation) + { + float absVelocity = Math.Abs(velocity); + float friction = Friction; + + float totalTime = Math.Abs(velocity / friction); + float totalDistance = absVelocity * totalTime - (friction * (float)Math.Pow(totalTime, 2) / 2f); + + float currentPosition = (ScrollingDirection == Direction.Horizontal ? ContentContainer.PositionX() : ContentContainer.PositionY()); + float targetPosition = currentPosition + (velocity > 0 ? totalDistance : -totalDistance); + float maximumScrollableSize = IsHorizontal ? ContentContainer.SizeWidth() - SizeWidth() : ContentContainer.SizeHeight() - SizeHeight(); + + if (targetPosition > 0) + { + totalDistance -= targetPosition; + targetPosition = 0; + } + else if (targetPosition < -maximumScrollableSize) + { + var overlapped = -maximumScrollableSize - targetPosition; + totalDistance -= overlapped; + targetPosition = -maximumScrollableSize; + } + + if (totalDistance < 1) + { + base.Decelerating(0, animation); + + return; + } + + _scrollingAlpha = (progress) => + { + if (totalDistance == 0) + return 1; + + var time = totalTime * progress; + var distance = absVelocity * time - (friction * (float)Math.Pow(time, 2) / 2f); + + return Math.Min(distance / totalDistance, 1); + }; + + // animation.Duration = (int)totalTime; + // animation.AnimateTo(ContentContainer, (ScrollingDirection == Direction.Horizontal) ? "PositionX" : "PositionY", targetPosition, _customScrollingAlphaFunction); + // animation.Play(); + } + + + float ScrollingAlpha(float progress) + { + return _scrollingAlpha?.Invoke(progress) ?? 1.0f; + } + + void HandleNonMandatorySingle(float velocity, Animation animation) + { + if (Math.Abs(velocity) > MaximumVelocity) + { + velocity = MaximumVelocity * (velocity > 0 ? 1 : -1); + } + + if (UseCostomScrolling) + { + CustomScrolling(velocity, animation); + } + else + { + if (CollectionView.SnapPointsType == SnapPointsType.None) + { + DecelerationRate = 0.998f; + } + else + { + // Adjust DecelerationRate to stop more quickly because it will be moved again by OnSnapRequest + DecelerationRate = 0.992f; + } + + base.Decelerating(velocity, animation); + } + } + + + void HandleMandatorySingle(float velocity) + { + if (_currentItemIndex == -1) + return; + + int currentItem = _currentItemIndex; + + if (Math.Abs(velocity) > 0.5) + { + if (velocity < 0) + { + currentItem = LayoutManager.NextRowItemIndex(currentItem); + } + else + { + currentItem = LayoutManager.PreviousRowItemIndex(currentItem); + } + } + + var itemBound = LayoutManager.GetItemBound(currentItem); + var target = IsHorizontal ? itemBound.X : itemBound.Y; + var itemSize = IsHorizontal ? itemBound.Width : itemBound.Height; + var scrollingSize = IsHorizontal ? ContentContainer.SizeWidth() : ContentContainer.SizeHeight(); + + // adjust align + if (CollectionView.SnapPointsAlignment == SnapPointsAlignment.Center) + { + target -= (ViewPortSize - itemSize) / 2; + } + else if (CollectionView.SnapPointsAlignment == SnapPointsAlignment.End) + { + target -= (ViewPortSize - itemSize); + } + + // adjust end of scroll area + if (scrollingSize - target < ViewPortSize) + { + target = scrollingSize - ViewPortSize; + } + + if (target < 0) + { + target = 0; + } + + ScrollTo(target); + } + + void OnDragStart(object? sender, ScrollEventArgs e) + { + if (CollectionView.SnapPointsType == SnapPointsType.MandatorySingle) + { + MarkCurrentItem(); + } + } + + void MarkCurrentItem() + { + if (CollectionView.SnapPointsAlignment == SnapPointsAlignment.Start) + { + _currentItemIndex = CollectionView.LayoutManager!.GetVisibleItemIndex(CollectionView.ViewPort.X, CollectionView.ViewPort.Y); + var bound = CollectionView.LayoutManager!.GetItemBound(_currentItemIndex); + var padding = IsHorizontal ? bound.Width / 2 : bound.Height / 2; + + _currentItemIndex = CollectionView.LayoutManager!.GetVisibleItemIndex( + (IsHorizontal ? padding : 0) + CollectionView.ViewPort.X, + (IsHorizontal ? 0 : padding) + CollectionView.ViewPort.Y); + } + else if (CollectionView.SnapPointsAlignment == SnapPointsAlignment.Center) + { + _currentItemIndex = CollectionView.LayoutManager!.GetVisibleItemIndex(CollectionView.ViewPort.X + (CollectionView.ViewPort.Width / 2), CollectionView.ViewPort.Y + (CollectionView.ViewPort.Height / 2)); + } + else + { + _currentItemIndex = CollectionView.LayoutManager!.GetVisibleItemIndex(CollectionView.ViewPort.X + CollectionView.ViewPort.Width, CollectionView.ViewPort.Y + CollectionView.ViewPort.Height); + var bound = CollectionView.LayoutManager!.GetItemBound(_currentItemIndex); + var padding = IsHorizontal ? bound.Width / 2 : bound.Height / 2; + + _currentItemIndex = CollectionView.LayoutManager!.GetVisibleItemIndex( + (IsHorizontal ? -padding : 0) + CollectionView.ViewPort.X + CollectionView.ViewPort.Width, + (IsHorizontal ? 0 : -padding) + CollectionView.ViewPort.Y + CollectionView.ViewPort.Height); + } + } + + void OnAnimationEnd(object? sender, ScrollEventArgs e) + { + OnSnapRequest(); + } + + void OnSnapRequest() + { + if (CollectionView.SnapPointsType == SnapPointsType.None) + return; + + double target; + + if (CollectionView.SnapPointsAlignment == SnapPointsAlignment.Start) + { + var index = LayoutManager.GetVisibleItemIndex(ViewPort.X, ViewPort.Y); + var bound = LayoutManager.GetItemBound(index); + var itemSize = IsHorizontal ? bound.Width : bound.Height; + var itemStart = IsHorizontal ? bound.X : bound.Y; + + if (ViewPortStart - itemStart > itemSize / 2) + { + index = LayoutManager.NextRowItemIndex(index); + } + + bound = LayoutManager.GetItemBound(index); + target = IsHorizontal ? bound.X : bound.Y; + } + else if (CollectionView.SnapPointsAlignment == SnapPointsAlignment.Center) + { + var index = LayoutManager.GetVisibleItemIndex(ViewPort.X + (ViewPort.Width / 2), ViewPort.Y + (ViewPort.Height / 2)); + var bound = LayoutManager.GetItemBound(index); + var itemSize = IsHorizontal ? bound.Width : bound.Height; + var itemStart = IsHorizontal ? bound.X : bound.Y; + + if (ViewPortStart + (ViewPortSize / 2) - (itemStart + itemSize / 2) > (itemSize / 2)) + { + index = LayoutManager.NextRowItemIndex(index); + } + + bound = LayoutManager.GetItemBound(index); + itemSize = IsHorizontal ? bound.Width : bound.Height; + target = IsHorizontal ? bound.X : bound.Y; + target -= (ViewPortSize - itemSize) / 2; + } + else + { + var index = LayoutManager.GetVisibleItemIndex(ViewPort.Right, ViewPort.Bottom); + var bound = LayoutManager.GetItemBound(index); + var itemSize = IsHorizontal ? bound.Width : bound.Height; + var itemEnd = IsHorizontal ? bound.Right : bound.Bottom; + + if (itemEnd - ViewPortEnd > itemSize / 2) + { + index = LayoutManager.PreviousRowItemIndex(index); + } + + bound = LayoutManager.GetItemBound(index); + itemSize = IsHorizontal ? bound.Width : bound.Height; + + target = IsHorizontal ? bound.X : bound.Y; + target -= (ViewPortSize - itemSize); + } + + ScrollTo(target); + } + + void ScrollTo(double target) + { + // it is a ScrollTo api that do not raise ScrollAnimationStarted/Ended event + var scrollingSize = IsHorizontal ? ContentContainer.SizeWidth() : ContentContainer.SizeHeight(); + + if (scrollingSize - target < ViewPortSize) + { + target = scrollingSize - ViewPortSize; + } + + if (target < 0) + { + target = 0; + } + + // var animation = new Animation(); + // animation.Duration = 200; + // animation.AnimateTo(ContentContainer, IsHorizontal ? "PositionX" : "PositionY", -(float)target); + // animation.Finished += (s, e) => SnapRequestFinished?.Invoke(this, EventArgs.Empty); + // animation.Play(); + // _snapAnimation = animation; + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ViewHolder.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ViewHolder.cs new file mode 100644 index 000000000000..e860f5f0186a --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/ViewHolder.cs @@ -0,0 +1,201 @@ +using System; +using Gtk; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; + +namespace Gtk.UIExtensions.NUI +{ + public enum ViewHolderState + { + Normal, + Selected, + Focused, + } + + public class ViewHolder : Gtk.EventBox + { + ViewHolderState _state; + bool _isSelected; + bool _isFocused; + + Widget? _content; + + public ViewHolder() + { + Initialize(); + } + + public object? ViewCategory { get; set; } + + public Rect Bounds { get; set; } + + public void UpdateBounds(Rect bounds) + { + Bounds = bounds; + } + + public Widget? Content + { + get + { + return _content; + } + set + { + if (_content != null) + { + _content.CanFocus = false; + _content.FocusOnClick = false; + _content.FocusInEvent -= OnContentFocused; + _content.FocusOutEvent -= OnContentUnfocused; + + Remove(_content); + } + + _content = value; + + if (_content != null) + { + _content.AddEvents ((int)Gdk.EventMask.ButtonPressMask); + _content.CanFocus = true; + _content.FocusOnClick = true; + _content.WidthSpecification(LayoutParamPolicies.MatchParent); + _content.HeightSpecification(LayoutParamPolicies.MatchParent); + _content.WidthResizePolicy(ResizePolicyType.FillToParent); + _content.HeightResizePolicy(ResizePolicyType.FillToParent); + + // _content.FocusInEvent += OnContentFocused; + _content.FocusOutEvent += OnContentUnfocused; + _content.ButtonPressEvent+=OnContentOnButtonPressEvent; + // _content.FocusGrabbed += OnContentFocused; + Child = _content; + } + } + } + + void OnContentOnButtonPressEvent(object o, ButtonPressEventArgs args) + { + State = ViewHolderState.Focused; + } + + public new ViewHolderState State + { + get { return _state; } + set + { + if (value == ViewHolderState.Normal) + _isSelected = false; + else if (value == ViewHolderState.Selected) + _isSelected = true; + + _state = _isFocused ? ViewHolderState.Focused : (_isSelected ? ViewHolderState.Selected : ViewHolderState.Normal); + + UpdateState(); + } + } + + public event EventHandler? RequestSelected; + + public event EventHandler? StateUpdated; + + public void UpdateSelected() + { + State = ViewHolderState.Selected; + } + + public void ResetState() + { + State = ViewHolderState.Normal; + } + + protected void Initialize() + { + CanFocus = true; + + this.AddEvents ((int)Gdk.EventMask.ButtonPressMask); + this.AddEvents ((int)Gdk.EventMask.FocusChangeMask); + TouchEvent += OnTouchEvent; + KeyPressEvent += OnKeyEvent; + FocusGrabbed += OnFocused; + FocusOutEvent += OnUnfocused; + ButtonPressEvent+=OnButtonPressEvent; + // no need for that: + //SizeAllocated += OnLayout; + } + + void OnButtonPressEvent(object o, ButtonPressEventArgs args) + { + RequestSelected?.Invoke(this, EventArgs.Empty); + } + + void OnLayout(object? sender, SizeAllocatedArgs e) + { + var bounds = e.Allocation.ToRect(); + bounds.X = 0; + bounds.Y = 0; + foreach (var child in Children) + { + child.UpdateBounds(bounds); + } + } + + void OnUnfocused(object? sender, EventArgs e) + { + _isFocused = false; + State = _isSelected ? ViewHolderState.Selected : ViewHolderState.Normal; + } + + void OnFocused(object? sender, EventArgs e) + { + _isFocused = true; + State = ViewHolderState.Focused; + } + + void OnContentUnfocused(object? sender, EventArgs e) + { + OnUnfocused(this, e); + } + + void OnContentFocused(object? sender, EventArgs e) + { + OnFocused(this, e); + } + + void OnKeyEvent(object source, KeyPressEventArgs e) + { + if (e.Event.SendEvent) + { + RequestSelected?.Invoke(this, EventArgs.Empty); + //return true; + } + + // return false; + } + + void OnTouchEvent(object source, TouchEventArgs e) + { + // if (e.Touch.GetState(0) == PointStateType.Down) + // { + // return true; + // } + // else if (e.Touch.GetState(0) == PointStateType.Up && this.IsInside(e.Touch.GetLocalPosition(0))) + // { + // RequestSelected?.Invoke(this, EventArgs.Empty); + // return true; + // } + // return false; + } + + protected virtual void UpdateState() + { + if (State == ViewHolderState.Selected) + _isSelected = true; + else if (State == ViewHolderState.Normal) + _isSelected = false; + else if (State == ViewHolderState.Focused) + this.RaiseToTop(); + + StateUpdated?.Invoke(this, EventArgs.Empty); + } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/WidgetExtensions.cs b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/WidgetExtensions.cs new file mode 100644 index 000000000000..9df16e587d95 --- /dev/null +++ b/src/Controls/src/Core/Handlers/Items/Gtk/UIExtensions.NUI/WidgetExtensions.cs @@ -0,0 +1,178 @@ +using System; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Graphics.Platform.Gtk; +using Microsoft.Maui.Platform; + +namespace Gtk.UIExtensions.NUI; + +public static class WidgetExtensions +{ + + public static float PositionX(this Widget it) => it.Allocation.X; + + public static float PositionY(this Widget it) => it.Allocation.Y; + + public static float SizeWidth(this Widget it) => it.AllocatedWidth; + + public static float SizeHeight(this Widget it) => it.AllocatedHeight; + + public static Size Size(this Widget it) => new Size(it.Allocation.Width, it.Allocation.Height); + + public static void UpdateBounds(this Widget it, Rect bounds) + { + if (it is ViewHolder holder) + { + holder.Bounds = bounds; + + return; + } + + it.Arrange(bounds); + } + + public static Rect GetBounds(this Widget it) + { + if (it is ViewHolder holder) + { + return holder.Bounds; + } + + return it.Allocation.ToRect(); + } + + public static void UpdateSize(this Widget nativeView, Size size) + { + var widthRequest = Microsoft.Maui.WidgetExtensions.Request(size.Width); + var doResize = false; + + if (widthRequest != -1 && widthRequest != nativeView.AllocatedWidth) + { + nativeView.WidthRequest = widthRequest; + doResize = true; + } + + var heightRequest = Microsoft.Maui.WidgetExtensions.Request(size.Height); + + if (heightRequest != -1 && heightRequest != nativeView.AllocatedHeight) + { + nativeView.HeightRequest = heightRequest; + doResize = true; + } + + if (doResize) + nativeView.QueueResize(); + } + + [MissingMapper] + public static void RaiseToTop(this Widget it) { } + + public static void Add(this Widget it, Widget child) + { + if (it is CollectionView cw) + { + cw.Add(child); + + return; + } + + if (it is Container c) + { + c.Add(child); + } + } + + public static class DeviceInfo + { + + public static double ScalingFactor = 1; + + } + + public static int ToScaledPixel(this double it) => (int)Math.Round(it * DeviceInfo.ScalingFactor); + + public static double ToScaledDP(this int pixel) + { + if (pixel == int.MaxValue) + return double.PositiveInfinity; + + return pixel / DeviceInfo.ScalingFactor; + } + + public static double ToScaledDP(this double pixel) + { + return pixel / DeviceInfo.ScalingFactor; + } + + public static Size ToPixel(this Size it) => it; + + public static void WidthSpecification(this Widget it, LayoutParamPolicies p) + { + if (p == LayoutParamPolicies.MatchParent) + { + it.Vexpand = true; + } + } + + public static void HeightSpecification(this Widget it, LayoutParamPolicies p) + { + if (p == LayoutParamPolicies.MatchParent) + { + it.Hexpand = true; + } + } + + public static void WidthResizePolicy(this Widget it, ResizePolicyType p) + { + if (p == ResizePolicyType.FillToParent) + { + it.Hexpand = true; + } + } + + public static void HeightResizePolicy(this Widget it, ResizePolicyType p) + { + if (p == ResizePolicyType.FillToParent) + { + it.Vexpand = true; + } + } + +} + +/// +/// Layout policies to decide the size of View when the View is laid out in its parent View. +/// +/// +/// +/// // matchParentView matches its size to its parent size. +/// matchParentView.WidthSpecification (LayoutParamPolicies.MatchParent); +/// matchParentView.HeightSpecification (LayoutParamPolicies.MatchParent); +/// +/// // wrapContentView wraps its children with their desired size. +/// wrapContentView.WidthSpecification (LayoutParamPolicies.WrapContent); +/// wrapContentView.HeightSpecification (LayoutParamPolicies.WrapContent); +/// +/// +/// 9 +public enum LayoutParamPolicies +{ + + /// + /// Constant which indicates child size should match parent size. + /// + /// 9 + MatchParent, + + /// + /// Constant which indicates parent should take the smallest size possible to wrap its children with their desired size. + /// + WrapContent + +} + +public enum ResizePolicyType +{ + + FillToParent + +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs index df0ab77028c2..239a8423e299 100644 --- a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Gtk.cs @@ -1,45 +1,51 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Microsoft.Maui.Handlers; +#nullable disable +using Microsoft.Maui.Graphics; +using TCollectionView = Gtk.UIExtensions.NUI.CollectionView; namespace Microsoft.Maui.Controls.Handlers.Items { - public abstract partial class ItemsViewHandler : ViewHandler where TItemsView : ItemsView + public abstract partial class ItemsViewHandler : ViewHandler where TItemsView : ItemsView { - protected override NotImplementedView CreatePlatformView() + protected override void ConnectHandler(TCollectionView nativeView) { - return new(nameof(TItemsView)); + base.ConnectHandler(nativeView); + (nativeView as MauiCollectionView)?.SetupNewElement(VirtualView); + } + + protected override void DisconnectHandler(TCollectionView nativeView) + { + (nativeView as MauiCollectionView)?.TearDownOldElement(VirtualView); + base.DisconnectHandler(nativeView); } - [MissingMapper] public static void MapItemsSource(ItemsViewHandler handler, ItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateItemsSource(); } - [MissingMapper] public static void MapHorizontalScrollBarVisibility(ItemsViewHandler handler, ItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateHorizontalScrollBarVisibility(); } - [MissingMapper] public static void MapVerticalScrollBarVisibility(ItemsViewHandler handler, ItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateVerticalScrollBarVisibility(); } - [MissingMapper] public static void MapItemTemplate(ItemsViewHandler handler, ItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateAdaptor(); } - [MissingMapper] public static void MapEmptyView(ItemsViewHandler handler, ItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateAdaptor(); } - [MissingMapper] public static void MapEmptyViewTemplate(ItemsViewHandler handler, ItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateAdaptor(); } [MissingMapper] @@ -47,14 +53,31 @@ public static void MapFlowDirection(ItemsViewHandler handler, ItemsV { } - [MissingMapper] public static void MapIsVisible(ItemsViewHandler handler, ItemsView itemsView) { + handler.PlatformView.UpdateVisibility(itemsView); } [MissingMapper] public static void MapItemsUpdatingScrollMode(ItemsViewHandler handler, ItemsView itemsView) { } + + public override void PlatformArrange(Rect rect) + { + PlatformView?.Arrange(rect); + } + +#if DEBUG + + public override Size GetDesiredSize(double widthConstraint, double heightConstraint) + { + if (PlatformView is not { } nativeView) + return Size.Zero; + + return nativeView.GetDesiredSize(widthConstraint, heightConstraint); + } + +#endif } } diff --git a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Windows.cs b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Windows.cs index ab28a2d08714..456392f96e12 100644 --- a/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Windows.cs +++ b/src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Windows.cs @@ -32,6 +32,10 @@ public abstract partial class ItemsViewHandler : ViewHandler PlatformView; protected TItemsView ItemsView => VirtualView; protected TItemsView Element => VirtualView; @@ -335,18 +339,38 @@ protected virtual void UpdateEmptyView() protected virtual void UpdateItemsLayout() { - ListViewBase.IsSynchronizedWithCurrentItem = false; + if (ListViewBase is FormsGridView gridView) + { + if (Layout is LinearItemsLayout linearItemsLayout) + { + gridView.Orientation = linearItemsLayout.ToPlatform(); - FindScrollViewer(ListViewBase); + gridView.Span = 1; - _defaultHorizontalScrollVisibility = null; - _defaultVerticalScrollVisibility = null; + if (linearItemsLayout.ItemSpacing != _previousItemSpacing) + { + _previousItemSpacing = linearItemsLayout.ItemSpacing; + gridView.ItemContainerStyle = linearItemsLayout.GetItemContainerStyle(); + } + } - UpdateItemTemplate(); - UpdateItemsSource(); - UpdateVerticalScrollBarVisibility(); - UpdateHorizontalScrollBarVisibility(); - UpdateEmptyView(); + if (Layout is GridItemsLayout gridItemsLayout) + { + gridView.Orientation = gridItemsLayout.ToPlatform(); + + gridView.Span = gridItemsLayout.Span; + + if (gridItemsLayout.HorizontalItemSpacing != _previousHorizontalItemSpacing || + gridItemsLayout.VerticalItemSpacing != _previousVerticalItemSpacing) + { + _previousHorizontalItemSpacing = gridItemsLayout.HorizontalItemSpacing; + _previousVerticalItemSpacing = gridItemsLayout.VerticalItemSpacing; + gridView.ItemContainerStyle = gridItemsLayout.GetItemContainerStyle(); + } + } + } + + FindScrollViewer(ListViewBase); } void FindScrollViewer(ListViewBase listView) diff --git a/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs index f674427e3dcb..421a6f9c3816 100644 --- a/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.Gtk.cs @@ -1,23 +1,28 @@ -using Microsoft.Maui.Controls.Platform; +#nullable disable +using TCollectionView = Gtk.UIExtensions.NUI.CollectionView; namespace Microsoft.Maui.Controls.Handlers.Items { - public partial class SelectableItemsViewHandler : StructuredItemsViewHandler where TItemsView : SelectableItemsView { + protected override TCollectionView CreatePlatformView() + { + return new MauiSelectableItemsView(); + } - [MissingMapper] public static void MapSelectedItem(SelectableItemsViewHandler handler, SelectableItemsView itemsView) - { } + { + (handler.PlatformView as MauiSelectableItemsView)?.UpdateSelection(); + } - [MissingMapper] public static void MapSelectedItems(SelectableItemsViewHandler handler, SelectableItemsView itemsView) - { } + { + (handler.PlatformView as MauiSelectableItemsView)?.UpdateSelection(); + } - [MissingMapper] public static void MapSelectionMode(SelectableItemsViewHandler handler, SelectableItemsView itemsView) - { } - + { + (handler.PlatformView as MauiSelectableItemsView)?.UpdateSelection(); + } } - } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs index 16f90df67976..ac77b13c2620 100644 --- a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs +++ b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Gtk.cs @@ -1,27 +1,42 @@ -using Microsoft.Maui.Controls.Platform; +#nullable disable +using TCollectionView = Gtk.UIExtensions.NUI.CollectionView; namespace Microsoft.Maui.Controls.Handlers.Items { public partial class StructuredItemsViewHandler : ItemsViewHandler where TItemsView : StructuredItemsView { - [MissingMapper] + protected override TCollectionView CreatePlatformView() + { + return new MauiStructuredItemsView(); + } + public static void MapHeaderTemplate(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateAdaptor(); } - [MissingMapper] public static void MapFooterTemplate(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateAdaptor(); } - [MissingMapper] public static void MapItemsLayout(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateLayoutManager(); } - [MissingMapper] public static void MapItemSizingStrategy(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { + (handler.PlatformView as MauiCollectionView)?.UpdateLayoutManager(); + } + + public static void MapFooter(StructuredItemsViewHandler handler, StructuredItemsView itemsView) + { + (handler.PlatformView as MauiCollectionView)?.UpdateAdaptor(); + } + public static void MapHeader(StructuredItemsViewHandler handler, StructuredItemsView itemsView) + { + (handler.PlatformView as MauiCollectionView)?.UpdateAdaptor(); } } -} +} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Windows.cs b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Windows.cs index 2e8cc1c4683d..3fdc9d8c0baf 100644 --- a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Windows.cs +++ b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Windows.cs @@ -2,13 +2,7 @@ using System; using System.ComponentModel; using Microsoft.Maui.Controls.Platform; -using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; -using WASDKApp = Microsoft.UI.Xaml.Application; -using WListView = Microsoft.UI.Xaml.Controls.ListView; -using WScrollMode = Microsoft.UI.Xaml.Controls.ScrollMode; -using WSetter = Microsoft.UI.Xaml.Setter; -using WStyle = Microsoft.UI.Xaml.Style; namespace Microsoft.Maui.Controls.Handlers.Items { @@ -87,9 +81,9 @@ protected override ListViewBase SelectListViewBase() case GridItemsLayout gridItemsLayout: return CreateGridView(gridItemsLayout); case LinearItemsLayout listItemsLayout when listItemsLayout.Orientation == ItemsLayoutOrientation.Vertical: - return CreateVerticalListView(listItemsLayout); + return CreateGridView(new GridItemsLayout(ItemsLayoutOrientation.Vertical) { Span = 1 }); case LinearItemsLayout listItemsLayout when listItemsLayout.Orientation == ItemsLayoutOrientation.Horizontal: - return CreateHorizontalListView(listItemsLayout); + return CreateGridView(new GridItemsLayout(ItemsLayoutOrientation.Horizontal) { Span = 1 }); } throw new NotImplementedException("The layout is not implemented"); @@ -202,77 +196,10 @@ static ListViewBase CreateGridView(GridItemsLayout gridItemsLayout) : Orientation.Vertical, Span = gridItemsLayout.Span, - ItemContainerStyle = GetItemContainerStyle(gridItemsLayout) + ItemContainerStyle = gridItemsLayout.GetItemContainerStyle() }; } - static ListViewBase CreateVerticalListView(LinearItemsLayout listItemsLayout) - { - return new FormsListView() - { - ItemContainerStyle = GetVerticalItemContainerStyle(listItemsLayout) - }; - } - - static ListViewBase CreateHorizontalListView(LinearItemsLayout listItemsLayout) - { - var horizontalListView = new FormsListView() - { - ItemsPanel = (ItemsPanelTemplate)WASDKApp.Current.Resources["HorizontalListItemsPanel"], - ItemContainerStyle = GetHorizontalItemContainerStyle(listItemsLayout) - }; - ScrollViewer.SetVerticalScrollBarVisibility(horizontalListView, Microsoft.UI.Xaml.Controls.ScrollBarVisibility.Hidden); - ScrollViewer.SetVerticalScrollMode(horizontalListView, WScrollMode.Disabled); - ScrollViewer.SetHorizontalScrollMode(horizontalListView, WScrollMode.Auto); - ScrollViewer.SetHorizontalScrollBarVisibility(horizontalListView, Microsoft.UI.Xaml.Controls.ScrollBarVisibility.Auto); - - return horizontalListView; - } - - static WStyle GetItemContainerStyle(GridItemsLayout layout) - { - var h = layout?.HorizontalItemSpacing ?? 0; - var v = layout?.VerticalItemSpacing ?? 0; - var margin = WinUIHelpers.CreateThickness(h, v, h, v); - - var style = new WStyle(typeof(GridViewItem)); - - style.Setters.Add(new WSetter(FrameworkElement.MarginProperty, margin)); - style.Setters.Add(new WSetter(Control.PaddingProperty, WinUIHelpers.CreateThickness(0))); - style.Setters.Add(new WSetter(Control.HorizontalContentAlignmentProperty, HorizontalAlignment.Stretch)); - - return style; - } - - static WStyle GetVerticalItemContainerStyle(LinearItemsLayout layout) - { - var v = layout?.ItemSpacing ?? 0; - var margin = WinUIHelpers.CreateThickness(0, v, 0, v); - - var style = new WStyle(typeof(ListViewItem)); - - style.Setters.Add(new WSetter(FrameworkElement.MinHeightProperty, 0)); - style.Setters.Add(new WSetter(FrameworkElement.MarginProperty, margin)); - style.Setters.Add(new WSetter(Control.PaddingProperty, WinUIHelpers.CreateThickness(0))); - style.Setters.Add(new WSetter(Control.HorizontalContentAlignmentProperty, HorizontalAlignment.Stretch)); - - return style; - } - - static WStyle GetHorizontalItemContainerStyle(LinearItemsLayout layout) - { - var h = layout?.ItemSpacing ?? 0; - var padding = WinUIHelpers.CreateThickness(h, 0, h, 0); - - var style = new WStyle(typeof(ListViewItem)); - - style.Setters.Add(new WSetter(FrameworkElement.MinWidthProperty, 0)); - style.Setters.Add(new WSetter(Control.PaddingProperty, padding)); - style.Setters.Add(new WSetter(Control.VerticalContentAlignmentProperty, VerticalAlignment.Stretch)); - - return style; - } - void UpdateItemsLayoutSpan() { if (ListViewBase is FormsGridView formsGridView) @@ -283,22 +210,13 @@ void UpdateItemsLayoutSpan() void UpdateItemsLayoutItemSpacing() { - if (ListViewBase is FormsGridView formsGridView && Layout is GridItemsLayout gridLayout) + if (ListViewBase is FormsGridView formsGridView) { - formsGridView.ItemContainerStyle = GetItemContainerStyle(gridLayout); - } + if (Layout is GridItemsLayout gridItemsLayout) + formsGridView.ItemContainerStyle = gridItemsLayout.GetItemContainerStyle(); - if (Layout is LinearItemsLayout linearItemsLayout) - { - switch (ListViewBase) - { - case FormsListView formsListView: - formsListView.ItemContainerStyle = GetVerticalItemContainerStyle(linearItemsLayout); - break; - case WListView listView: - listView.ItemContainerStyle = GetHorizontalItemContainerStyle(linearItemsLayout); - break; - } + if (Layout is LinearItemsLayout linearItemsLayout) + formsGridView.ItemContainerStyle = linearItemsLayout.GetItemContainerStyle(); } } } From 07b55b85d4aa259e4a0802c521a512db40a32558 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 21:15:24 +0100 Subject: [PATCH 294/425] [Gtk] Core.csproj: LayoutView, WidgetExtensions: get it compile --- src/Core/src/Platform/Gtk/LayoutView.cs | 7 +++++-- src/Core/src/Platform/Gtk/WidgetExtensions.cs | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Core/src/Platform/Gtk/LayoutView.cs b/src/Core/src/Platform/Gtk/LayoutView.cs index a7f7a694b708..0405ed3c1141 100644 --- a/src/Core/src/Platform/Gtk/LayoutView.cs +++ b/src/Core/src/Platform/Gtk/LayoutView.cs @@ -202,8 +202,11 @@ protected void ClearMeasured(bool clearCache = true) } MeasuredMinimum = null; - // RequestedWidth = null; - // RequestedHeight = null; +#if !USE_ADJUSTSIZEREQUEST + RequestedWidth = null; + RequestedHeight = null; + +#endif } protected override void OnSizeAllocated(Gdk.Rectangle allocation) diff --git a/src/Core/src/Platform/Gtk/WidgetExtensions.cs b/src/Core/src/Platform/Gtk/WidgetExtensions.cs index 9220db8959e1..412e36d01d2e 100644 --- a/src/Core/src/Platform/Gtk/WidgetExtensions.cs +++ b/src/Core/src/Platform/Gtk/WidgetExtensions.cs @@ -144,7 +144,7 @@ public static void InvalidateMeasure(this Widget nativeView, IView view) nativeView.QueueAllocate(); } - static int Request(double viewSize) => viewSize >= 0 ? (int)viewSize : -1; + public static int Request(double viewSize) => viewSize >= 0 ? (int)viewSize : -1; public static void UpdateWidth(this Widget nativeView, IView view) { From 77b837c5cd9624d2b5c42251fb414c9b560a36fb Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 22:09:33 +0100 Subject: [PATCH 295/425] [Gtk] BlazorWebView: draft implementation of BlazorWebView --- .../src/Gtk.SharedSource/GtkWebViewManager.cs | 278 ++++++++++++++++ src/BlazorWebView/src/Gtk/BlazorWebView.cs | 307 ++++++++++++++++++ .../src/Gtk/GtkBlazorMarkerService.cs | 10 + .../src/Gtk/GtkBlazorWebViewBuilder.cs | 17 + src/BlazorWebView/src/Gtk/GtkDispatcher.cs | 22 ++ .../src/Gtk/GtkWebViewManager.cs | 114 +++++++ .../src/Gtk/IGtkBlazorWebViewBuilder.cs | 18 + ...t.AspNetCore.Components.WebView.Gtk.csproj | 35 ++ .../src/Gtk/PublicAPI.Shipped.txt | 1 + .../src/Gtk/PublicAPI.Unshipped.txt | 1 + src/BlazorWebView/src/Gtk/RootComponent.cs | 57 ++++ .../Gtk/RootComponentCollectionExtensions.cs | 49 +++ .../src/Gtk/RootComponentsCollection.cs | 18 + src/BlazorWebView/src/Gtk/WidgetCollection.cs | 32 ++ ...ft.AspNetCore.Components.WebView.Gtk.props | 2 + ....AspNetCore.Components.WebView.Gtk.targets | 30 ++ .../src/Maui/Gtk/BlazorWebView.Gtk.cs | 32 ++ .../src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs | 104 +++++- .../src/Maui/Gtk/GtkWebViewManager.cs | 114 +++++++ ....AspNetCore.Components.WebView.Maui.csproj | 5 + .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 1 - .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 3 + .../BlazorWebViewDeveloperTools.cs | 2 + .../BlazorWebViewInitializedEventArgs.cs | 7 + ...lazorWebViewServiceCollectionExtensions.cs | 7 + .../SharedSource/WebView2WebViewManager.cs | 2 +- 26 files changed, 1258 insertions(+), 10 deletions(-) create mode 100644 src/BlazorWebView/src/Gtk.SharedSource/GtkWebViewManager.cs create mode 100644 src/BlazorWebView/src/Gtk/BlazorWebView.cs create mode 100644 src/BlazorWebView/src/Gtk/GtkBlazorMarkerService.cs create mode 100644 src/BlazorWebView/src/Gtk/GtkBlazorWebViewBuilder.cs create mode 100644 src/BlazorWebView/src/Gtk/GtkDispatcher.cs create mode 100644 src/BlazorWebView/src/Gtk/GtkWebViewManager.cs create mode 100644 src/BlazorWebView/src/Gtk/IGtkBlazorWebViewBuilder.cs create mode 100644 src/BlazorWebView/src/Gtk/Microsoft.AspNetCore.Components.WebView.Gtk.csproj create mode 100644 src/BlazorWebView/src/Gtk/PublicAPI.Shipped.txt create mode 100644 src/BlazorWebView/src/Gtk/PublicAPI.Unshipped.txt create mode 100644 src/BlazorWebView/src/Gtk/RootComponent.cs create mode 100644 src/BlazorWebView/src/Gtk/RootComponentCollectionExtensions.cs create mode 100644 src/BlazorWebView/src/Gtk/RootComponentsCollection.cs create mode 100644 src/BlazorWebView/src/Gtk/WidgetCollection.cs create mode 100644 src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.props create mode 100644 src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.targets create mode 100644 src/BlazorWebView/src/Maui/Gtk/BlazorWebView.Gtk.cs create mode 100644 src/BlazorWebView/src/Maui/Gtk/GtkWebViewManager.cs diff --git a/src/BlazorWebView/src/Gtk.SharedSource/GtkWebViewManager.cs b/src/BlazorWebView/src/Gtk.SharedSource/GtkWebViewManager.cs new file mode 100644 index 000000000000..43ecf854b4e0 --- /dev/null +++ b/src/BlazorWebView/src/Gtk.SharedSource/GtkWebViewManager.cs @@ -0,0 +1,278 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using System.Web; +using GLib; +using Gtk; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Logging; +using WebKit; +using Process = System.Diagnostics.Process; + +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + +#pragma warning disable CS8601 // Possible null reference assignment. +#pragma warning disable CS8604 // Possible null reference argument. + +namespace GtkSharp.BlazorWebKit; + +[SuppressMessage("ApiDesign", "RS0016:Öffentliche Typen und Member der deklarierten API hinzufügen")] +public partial class GtkWebViewManager : Microsoft.AspNetCore.Components.WebView.WebViewManager +{ + + protected const string AppHostAddress = "localhost"; + + protected static readonly string AppHostScheme = "app"; + + /// + /// Gets the application's base URI. Defaults to app://localhost/ + /// + protected static string AppOrigin(string appHostScheme, string appHostAddress = AppHostAddress) => $"{appHostScheme}://{appHostAddress}/"; + + protected static readonly Uri AppOriginUri = new(AppOrigin(AppHostScheme, AppHostAddress)); + + protected Task? WebviewReadyTask; + + protected string MessageQueueId = "webview"; + + string _hostPageRelativePath; + Uri _appBaseUri; + + UserScript? _script; + + public delegate void WebMessageHandler(IntPtr contentManager, IntPtr jsResult, IntPtr arg); + + public WebView? WebView { get; protected set; } + + protected ILogger? Logger; + + protected GtkWebViewManager(IServiceProvider provider, Dispatcher dispatcher, Uri appBaseUri, IFileProvider fileProvider, JSComponentConfigurationStore jsComponents, string hostPageRelativePath) : + base(provider, dispatcher, appBaseUri, fileProvider, jsComponents, hostPageRelativePath) + { + _appBaseUri = appBaseUri; + _hostPageRelativePath = hostPageRelativePath; + } + + delegate bool TryGetResponseContentHandler(string uri, bool allowFallbackOnHostPage, out int statusCode, out string statusMessage, out Stream content, out IDictionary headers); + + static readonly Dictionary UriSchemeRequestHandlers = new(); + + static bool HandleUriSchemeRequestIsRegistered = false; + + /// + /// RegisterUriScheme can only called once per scheme + /// so it's needed to have a list of all WebViews registered + /// + /// + /// + static void HandleUriSchemeRequest(URISchemeRequest request) + { + if (!UriSchemeRequestHandlers.TryGetValue(request.WebView.Handle, out var uriSchemeHandler)) + { + throw new Exception($"Invalid scheme \"{request.Scheme}\""); + } + + var uri = request.Uri; + + if (request.Path == "/") + { + uri += uriSchemeHandler._hostPageRelativePath; + } + + if (uriSchemeHandler.tryGetResponseContent(uri, false, out int statusCode, out string statusMessage, out Stream content, out IDictionary headers)) + { + + var (inputStream, length) = InputStreamNewFromStream(content); + + request.Finish(inputStream, length, headers["Content-Type"]); + + inputStream?.Dispose(); + } + else + { + throw new Exception($"Failed to serve \"{uri}\". {statusCode} - {statusMessage}"); + } + } + + void RegisterUriSchemeRequestHandler() + { + if (WebView is not { }) + return; + + if (!UriSchemeRequestHandlers.TryGetValue(WebView.Handle, out var uriSchemeHandler)) + { + UriSchemeRequestHandlers.Add(WebView.Handle, (_hostPageRelativePath, TryGetResponseContent)); + } + } + + protected override void NavigateCore(Uri absoluteUri) + { + if (WebView is not { }) + return; + + Logger?.LogInformation($"Navigating to \"{absoluteUri}\""); + var loadUri = absoluteUri.ToString(); + + WebView.LoadUri(loadUri); + } + + public string JsScript(string messageQueueId) => + """ + window.__receiveMessageCallbacks = []; + + window.__dispatchMessageCallback = function(message) { + window.__receiveMessageCallbacks.forEach(function(callback) { callback(message); }); + }; + + window.external = { + sendMessage: function(message) { + """ + + + $""" + window.webkit.messageHandlers.{MessageQueueId}.postMessage(message); + """ + + + """ + }, + receiveMessage: function(callback) { + window.__receiveMessageCallbacks.push(callback); + } + }; + """; + + protected virtual void Attach() + { + if (WebView is not { }) + throw new ArgumentException(); + + if (!HandleUriSchemeRequestIsRegistered) + { + WebView.Context.RegisterUriScheme(AppHostScheme, HandleUriSchemeRequest); + HandleUriSchemeRequestIsRegistered = true; + } + + RegisterUriSchemeRequestHandler(); + + var jsScript = JsScript(MessageQueueId); + + _script = new UserScript( + jsScript, + UserContentInjectedFrames.AllFrames, + UserScriptInjectionTime.Start, +#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. + null, null); +#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. + + WebView.Destroyed += (o, args) => Detach(); + + WebView.UserContentManager.AddScript(_script); + + WebView.UserContentManager.ScriptMessageReceived += (o, args) => + { + var jsValue = args.JsResult.JsValue; + + if (!jsValue.IsString) return; + + var s = jsValue.ToString(); + + if (s is not null) + { + Logger?.LogDebug($"Received message `{s}`"); + + try + { + MessageReceived(_appBaseUri, s); + } + finally + { } + } + }; + + WebView.UserContentManager.RegisterScriptMessageHandler(MessageQueueId); + } + + bool _detached = false; + + protected virtual void Detach() + { + if (WebView is not { }) + return; + + if (_detached) + return; + + WebView.UserContentManager.UnregisterScriptMessageHandler(MessageQueueId); + WebView.UserContentManager.RemoveScript(_script); + UriSchemeRequestHandlers.Remove(WebView.Handle); + + _detached = true; + } + + protected override void SendMessage(string message) + { + if (WebView is not { }) + return; + + Logger?.LogDebug($"Dispatching `{message}`"); + + var script = $"__dispatchMessageCallback(\"{HttpUtility.JavaScriptStringEncode(message)}\")"; + + WebView.RunJavascript(script); + } + + protected override async ValueTask DisposeAsyncCore() + { + Detach(); + await base.DisposeAsyncCore(); + } + + protected static string GetHeaderString(IDictionary headers) => + string.Join(Environment.NewLine, headers.Select(kvp => $"{kvp.Key}: {kvp.Value}")); + + protected static string? GetWebView2UserDataFolder() + { + if (Assembly.GetEntryAssembly() is { } mainAssembly) + { + // In case the application is running from a non-writable location (e.g., program files if you're not running + // elevated), use our own convention of %LocalAppData%\YourApplicationName.WebView. + var applicationName = mainAssembly.GetName().Name; + + var result = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + $"{applicationName}.{nameof(WebView)}"); + + return result; + } + + return null; + } + + protected static void LaunchUriInExternalBrowser(Uri uri) + { + using var launchBrowser = new Process(); + + launchBrowser.StartInfo.UseShellExecute = true; + launchBrowser.StartInfo.FileName = uri.ToString(); + launchBrowser.Start(); + } + + + public static (InputStream inputStream, int length) InputStreamNewFromStream(Stream content) + { + using var memoryStream = new MemoryStream(); + var length = (int)content.Length; + content.CopyTo(memoryStream, length); + var buffer = memoryStream.GetBuffer(); + Array.Resize(ref buffer, length); + var bytes = new Bytes(buffer); + var inputStream = new MemoryInputStream(bytes); + + return (inputStream, length); + } +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Gtk/BlazorWebView.cs b/src/BlazorWebView/src/Gtk/BlazorWebView.cs new file mode 100644 index 000000000000..af2563e0812e --- /dev/null +++ b/src/BlazorWebView/src/Gtk/BlazorWebView.cs @@ -0,0 +1,307 @@ +using System; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Reflection; +using Gtk; +using Microsoft.Extensions.FileProviders; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk +{ + /// + /// A Gtk Widget for hosting Razor components locally in Windows desktop applications. + /// + public class BlazorWebView : Bin + { + private readonly WebKit.WebView _webview; + private GtkWebViewManager? _webviewManager; + private string? _hostPage; + private IServiceProvider? _services; + + /// + /// Creates a new instance of . + /// + public BlazorWebView() + { + Widgets = CreateWidgetsInstance(); + ComponentsDispatcher = Dispatcher.CreateDefault(); + + RootComponents.CollectionChanged += HandleRootComponentsCollectionChanged; + + _webview = new WebKit.WebView(); + + this.Child = _webview; + ((BlazorWebViewWidgetCollection)Widgets).AddInternal(_webview); + } + + /// + /// Returns the inner used by this control. + /// + /// + /// Directly using some functionality of the inner web view can cause unexpected results because its behavior + /// is controlled by the that is hosting it. + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public WebKit.WebView WebView => _webview; + + private Dispatcher ComponentsDispatcher { get; } + + WidgetCollection Widgets { get; set; } + + bool Created { get; set; } + + /// + protected override void OnShown() + { + base.OnShown(); + Created = true; + + StartWebViewCoreIfPossible(); + } + + /// + /// Path to the host page within the application's static files. For example, wwwroot\index.html. + /// This property must be set to a valid value for the Razor components to start. + /// + [Category("Behavior")] + [Description(@"Path to the host page within the application's static files. Example: wwwroot\index.html.")] + public string? HostPage + { + get => _hostPage; + set + { + _hostPage = value; + OnHostPagePropertyChanged(); + } + } + + // Learn more about these methods here: https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods?view=netframeworkdesktop-4.8 + private void ResetHostPage() => HostPage = null; + + private bool ShouldSerializeHostPage() => !string.IsNullOrEmpty(HostPage); + + /// + /// A collection of instances that specify the Blazor types + /// to be used directly in the specified . + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public RootComponentsCollection RootComponents { get; } = new(); + + /// + /// Gets or sets an containing services to be used by this control and also by application code. + /// This property must be set to a valid value for the Razor components to start. + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + [DisallowNull] + public IServiceProvider Services + { + get => _services!; + set + { + _services = value; + OnServicesPropertyChanged(); + } + } + + /// + /// Allows customizing how links are opened. + /// By default, opens internal links in the webview and external links in an external app. + /// + [Category("Action")] [Description("Allows customizing how links are opened. By default, opens internal links in the webview and external links in an external app.")] + public EventHandler? UrlLoading; + + /// + /// Allows customizing the web view before it is created. + /// + [Category("Action")] [Description("Allows customizing the web view before it is created.")] + public EventHandler? BlazorWebViewInitializing; + + /// + /// Allows customizing the web view after it is created. + /// + [Category("Action")] [Description("Allows customizing the web view after it is created.")] + public EventHandler? BlazorWebViewInitialized; + + private void OnHostPagePropertyChanged() => StartWebViewCoreIfPossible(); + + private void OnServicesPropertyChanged() => StartWebViewCoreIfPossible(); + + private bool RequiredStartupPropertiesSet => + Created && + _webview != null && + HostPage != null && + Services != null; + + private void StartWebViewCoreIfPossible() + { + // We never start the Blazor code in design time because it doesn't make sense to run + // a Razor component in the designer. + // if (IsAncestorSiteInDesignMode) + // { + // return; + // } + + // If we don't have all the required properties, or if there's already a WebViewManager, do nothing + if (!RequiredStartupPropertiesSet || _webviewManager != null) + { + return; + } + + // We assume the host page is always in the root of the content directory, because it's + // unclear there's any other use case. We can add more options later if so. + string appRootDir; + var entryAssemblyLocation = Assembly.GetEntryAssembly()?.Location; + +#if !DEBUG + if (!string.IsNullOrEmpty(entryAssemblyLocation)) + { + appRootDir = System.IO.Path.GetDirectoryName(entryAssemblyLocation)!; + } + else +#endif + + { + appRootDir = Environment.CurrentDirectory; + } + + var hostPageFullPath = System.IO.Path.GetFullPath(System.IO.Path.Combine(appRootDir, HostPage!)); // HostPage is nonnull because RequiredStartupPropertiesSet is checked above + var contentRootDirFullPath = System.IO.Path.GetDirectoryName(hostPageFullPath)!; + var contentRootRelativePath = System.IO.Path.GetRelativePath(appRootDir, contentRootDirFullPath); + var hostPageRelativePath = System.IO.Path.GetRelativePath(contentRootDirFullPath, hostPageFullPath); + + var fileProvider = CreateFileProvider(contentRootDirFullPath); + + if (_webviewManager != null) + { + _webviewManager.DisposeAsync() + .AsTask() + .GetAwaiter() + .GetResult(); + ; + } + + _webviewManager = new GtkWebViewManager( + _webview, + Services, + ComponentsDispatcher, + fileProvider, + RootComponents.JSComponents, + contentRootRelativePath, + hostPageRelativePath, + (args) => UrlLoading?.Invoke(this, args), + (args) => BlazorWebViewInitializing?.Invoke(this, args), + (args) => BlazorWebViewInitialized?.Invoke(this, args)); + + StaticContentHotReloadManager.AttachToWebViewManagerIfEnabled(_webviewManager); + + foreach (var rootComponent in RootComponents) + { + // Since the page isn't loaded yet, this will always complete synchronously + _ = rootComponent.AddToWebViewManagerAsync(_webviewManager); + } + + _webviewManager.Navigate("/"); + } + + private void HandleRootComponentsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs eventArgs) + { + // If we haven't initialized yet, this is a no-op + if (_webviewManager != null) + { + // Dispatch because this is going to be async, and we want to catch any errors + _ = ComponentsDispatcher.InvokeAsync(async () => + { + var newItems = (eventArgs.NewItems ?? Array.Empty()).Cast(); + var oldItems = (eventArgs.OldItems ?? Array.Empty()).Cast(); + + foreach (var item in newItems.Except(oldItems)) + { + await item.AddToWebViewManagerAsync(_webviewManager); + } + + foreach (var item in oldItems.Except(newItems)) + { + await item.RemoveFromWebViewManagerAsync(_webviewManager); + } + }); + } + } + + /// + /// Creates a file provider for static assets used in the . The default implementation + /// serves files from disk. Override this method to return a custom to serve assets such + /// as wwwroot/index.html. Call the base method and combine its return value with a + /// to use both custom assets and default assets. + /// + /// The base directory to use for all requested assets, such as wwwroot. + /// Returns a for static assets. + public virtual IFileProvider CreateFileProvider(string contentRootDir) + { + if (Directory.Exists(contentRootDir)) + { + // Typical case after publishing, or if you're copying content to the bin dir in development for some nonstandard reason + return new PhysicalFileProvider(contentRootDir); + } + + // Typical case in development, as the files come from Microsoft.AspNetCore.Components.WebView.StaticContentProvider + // instead and aren't copied to the bin dir + return new NullFileProvider(); + } + + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + // Dispose this component's contents and block on completion so that user-written disposal logic and + // Razor component disposal logic will complete first. Then call base.Dispose(), which will dispose + // the WebView2 control. This order is critical because once the WebView2 is disposed it will prevent + // Razor component code from working because it requires the WebView to exist. + _webviewManager? + .DisposeAsync() + .AsTask() + .GetAwaiter() + .GetResult(); + } + + base.Dispose(disposing); + } + + /// + protected WidgetCollection CreateWidgetsInstance() + { + return new BlazorWebViewWidgetCollection(this); + } + + /// + /// Custom control collection that ensures that only the owning can add + /// controls to it. + /// + private sealed class BlazorWebViewWidgetCollection : WidgetCollection + { + public BlazorWebViewWidgetCollection(BlazorWebView owner) : base(owner) { } + + /// + /// This is the only API we use; everything else is blocked. + /// + /// + internal void AddInternal(Widget value) => base.Add(value); + + // Everything below is overridden to protect the control collection as read-only. + public override bool IsReadOnly => true; + + public override void Add(Widget? value) => throw new NotSupportedException(); + + public override void Clear() => throw new NotSupportedException(); + + public override void Remove(Widget? value) => throw new NotSupportedException(); + + public override void SetChildIndex(Widget child, int newIndex) => throw new NotSupportedException(); + } + } +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Gtk/GtkBlazorMarkerService.cs b/src/BlazorWebView/src/Gtk/GtkBlazorMarkerService.cs new file mode 100644 index 000000000000..ef41f051217f --- /dev/null +++ b/src/BlazorWebView/src/Gtk/GtkBlazorMarkerService.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Components.WebView.Gtk +{ + internal class GtkBlazorMarkerService + { + } + +} diff --git a/src/BlazorWebView/src/Gtk/GtkBlazorWebViewBuilder.cs b/src/BlazorWebView/src/Gtk/GtkBlazorWebViewBuilder.cs new file mode 100644 index 000000000000..73ebee7b7697 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/GtkBlazorWebViewBuilder.cs @@ -0,0 +1,17 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk +{ + internal class GtkBlazorWebViewBuilder : IGtkBlazorWebViewBuilder + { + public IServiceCollection Services { get; } + + public GtkBlazorWebViewBuilder(IServiceCollection services) + { + Services = services; + } + } +} diff --git a/src/BlazorWebView/src/Gtk/GtkDispatcher.cs b/src/BlazorWebView/src/Gtk/GtkDispatcher.cs new file mode 100644 index 000000000000..ed7ca9a58cf5 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/GtkDispatcher.cs @@ -0,0 +1,22 @@ +using Gtk; +using Action = System.Action; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk; + + +/// +/// DUMMY +/// +public class GtkDispatcher +{ + + public GtkDispatcher(Widget owner) + { + } + + public object InvokeAsync(Action action) + { + throw new System.NotImplementedException(); + } + +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Gtk/GtkWebViewManager.cs b/src/BlazorWebView/src/Gtk/GtkWebViewManager.cs new file mode 100644 index 000000000000..acf1ae402e64 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/GtkWebViewManager.cs @@ -0,0 +1,114 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; +using WebKit; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk; +#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value + +public partial class GtkWebViewManager : GtkSharp.BlazorWebKit.GtkWebViewManager +{ + + #region CopiedFromWebView2WebViewManager + + protected readonly Action? _urlLoading; + protected readonly Action? _blazorWebViewInitializing; + protected readonly Action? _blazorWebViewInitialized; + + internal readonly BlazorWebViewDeveloperTools? _developerTools; + + internal void ApplyDefaultWebViewSettings(BlazorWebViewDeveloperTools? devTools) + { + if (devTools is not { }) + return; + + if (WebView is not { }) + return; + + WebView.Settings.EnableDeveloperExtras = devTools.Enabled; + WebView.Settings.EnablePageCache = false; + WebView.Settings.EnableOfflineWebApplicationCache = false; + } + + private void NavigationStarting(object? sender, LoadChangedArgs args) + { + if (WebView is not { }) + return; + + if (args.LoadEvent != LoadEvent.Started) + { + return; + } + + var argsUri = WebView.Uri; + + if (Uri.TryCreate(argsUri, UriKind.RelativeOrAbsolute, out var uri)) + { + var callbackArgs = UrlLoadingEventArgs.CreateWithDefaultLoadingStrategy(uri, AppOriginUri); + + _urlLoading?.Invoke(callbackArgs); +#if WEBVIEW2_MAUI + _blazorWebViewHandler.UrlLoading(callbackArgs); +#endif + + if (callbackArgs.UrlLoadingStrategy == UrlLoadingStrategy.OpenExternally) + { + LaunchUriInExternalBrowser(uri); + } + + if (callbackArgs.UrlLoadingStrategy != UrlLoadingStrategy.OpenInWebView) + WebView.StopLoading(); + } + } + + #endregion + + /// + /// Constructs an instance of . + /// + /// A to access platform-specific WebView2 APIs. + /// A service provider containing services to be used by this class and also by application code. + /// A instance that can marshal calls to the required thread or sync context. + /// Provides static content to the webview. + /// Describes configuration for adding, removing, and updating root components from JavaScript code. + /// Path to the app's content root relative to the application root directory. + /// Path to the host page within the . + /// Callback invoked when a url is about to load. + /// Callback invoked before the webview is initialized. + /// Callback invoked after the webview is initialized. + internal GtkWebViewManager( + WebKit.WebView webview, + IServiceProvider services, + Dispatcher dispatcher, + IFileProvider fileProvider, + JSComponentConfigurationStore jsComponents, + string contentRootRelativeToAppRoot, + string hostPagePathWithinFileProvider, + Action urlLoading, + Action blazorWebViewInitializing, + Action blazorWebViewInitialized) + : base(services, dispatcher, AppOriginUri, fileProvider, jsComponents, hostPagePathWithinFileProvider) + + { + ArgumentNullException.ThrowIfNull(webview); + + WebView = webview; + _urlLoading = urlLoading; + _blazorWebViewInitializing = blazorWebViewInitializing; + _blazorWebViewInitialized = blazorWebViewInitialized; + _developerTools = services.GetRequiredService(); + + Attach(); + } + + protected override void Attach() + { + _blazorWebViewInitializing?.Invoke(new BlazorWebViewInitializingEventArgs { }); + base.Attach(); + _blazorWebViewInitialized?.Invoke(new BlazorWebViewInitializedEventArgs { WebView = WebView }); + this.ApplyDefaultWebViewSettings(_developerTools); + } + +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Gtk/IGtkBlazorWebViewBuilder.cs b/src/BlazorWebView/src/Gtk/IGtkBlazorWebViewBuilder.cs new file mode 100644 index 000000000000..0004717ba015 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/IGtkBlazorWebViewBuilder.cs @@ -0,0 +1,18 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk +{ + /// + /// A builder for Gtk Blazor WebViews. + /// + public interface IGtkBlazorWebViewBuilder + { + /// + /// Gets the builder service collection. + /// + IServiceCollection Services { get; } + } +} diff --git a/src/BlazorWebView/src/Gtk/Microsoft.AspNetCore.Components.WebView.Gtk.csproj b/src/BlazorWebView/src/Gtk/Microsoft.AspNetCore.Components.WebView.Gtk.csproj new file mode 100644 index 000000000000..4eb5a4f3417e --- /dev/null +++ b/src/BlazorWebView/src/Gtk/Microsoft.AspNetCore.Components.WebView.Gtk.csproj @@ -0,0 +1,35 @@ + + + + $(_MauiDotNetTfm)-gtk + 3.24 + Build Gtk applications with Blazor and WebKit + $(DefineConstants);WEBKIT_GTK + enable + true + $(NoWarn);CS1591;RS0041;RS0026;RS0027;RS0016 + + + + + + + + + + + + + + + + + + + + + + true + + + diff --git a/src/BlazorWebView/src/Gtk/PublicAPI.Shipped.txt b/src/BlazorWebView/src/Gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..815c92006af7 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/PublicAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable \ No newline at end of file diff --git a/src/BlazorWebView/src/Gtk/PublicAPI.Unshipped.txt b/src/BlazorWebView/src/Gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..ab058de62d44 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/BlazorWebView/src/Gtk/RootComponent.cs b/src/BlazorWebView/src/Gtk/RootComponent.cs new file mode 100644 index 000000000000..587c704e44c4 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/RootComponent.cs @@ -0,0 +1,57 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using GtkSharp.BlazorWebKit; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk +{ + /// + /// Describes a root component that can be added to a . + /// + public class RootComponent + { + /// + /// Gets or sets the CSS selector string that specifies where in the document the component should be placed. + /// This must be unique among the root components within the . + /// + public string Selector { get; set; } = default!; + + /// + /// Gets or sets the type of the root component. This type must implement . + /// + public Type ComponentType { get; set; } = default!; + + /// + /// Gets or sets an optional dictionary of parameters to pass to the root component. + /// + public IDictionary? Parameters { get; set; } + + internal Task AddToWebViewManagerAsync(WebViewManager webViewManager) + { + // As a characteristic of XAML,we can't rely on non-default constructors. So we have to + // validate that the required properties were set. We could skip validating this and allow + // the lower-level renderer code to throw, but that would be harder for developers to understand. + + if (string.IsNullOrWhiteSpace(Selector)) + { + throw new InvalidOperationException($"{nameof(RootComponent)} requires a value for its {nameof(Selector)} property, but no value was set."); + } + + if (ComponentType is null) + { + throw new InvalidOperationException($"{nameof(RootComponent)} requires a value for its {nameof(ComponentType)} property, but no value was set."); + } + + var parameterView = Parameters == null ? ParameterView.Empty : ParameterView.FromDictionary(Parameters); + return webViewManager.AddRootComponentAsync(ComponentType, Selector, parameterView); + } + + internal Task RemoveFromWebViewManagerAsync(WebViewManager webviewManager) + { + return webviewManager.RemoveRootComponentAsync(Selector); + } + } +} diff --git a/src/BlazorWebView/src/Gtk/RootComponentCollectionExtensions.cs b/src/BlazorWebView/src/Gtk/RootComponentCollectionExtensions.cs new file mode 100644 index 000000000000..6be351038520 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/RootComponentCollectionExtensions.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk +{ + /// + /// Provides a set of extension methods for modifying collections of objects. + /// + public static class RootComponentCollectionExtensions + { + /// + /// Adds the component specified by to the collection specified by + /// to be associated with the selector specified by + /// and to be instantiated with the parameters specified by . + /// + /// The to add to the collection. + /// The collection to which the component should be added. + /// The selector to which the component will be associated. + /// The optional creation parameters for the component. + public static void Add(this RootComponentsCollection components, string selector, IDictionary? parameters = null) + where TComponent : IComponent + { + components.Add(new RootComponent { Selector = selector, ComponentType = typeof(TComponent), Parameters = parameters }); + } + + /// + /// Removes the component associated with the specified from the collection + /// specified by . + /// + /// The collection from which the component associated with the selector should be removed. + /// The selector associated with the component to be removed. + public static void Remove(this RootComponentsCollection components, string selector) + { + for (var i = 0; i < components.Count; i++) + { + if (components[i].Selector.Equals(selector, StringComparison.Ordinal)) + { + components.RemoveAt(i); + return; + } + } + + throw new ArgumentException($"There is no root component with selector '{selector}'.", nameof(selector)); + } + } +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Gtk/RootComponentsCollection.cs b/src/BlazorWebView/src/Gtk/RootComponentsCollection.cs new file mode 100644 index 000000000000..28bf5c8da31f --- /dev/null +++ b/src/BlazorWebView/src/Gtk/RootComponentsCollection.cs @@ -0,0 +1,18 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.ObjectModel; +using Microsoft.AspNetCore.Components.Web; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk +{ + /// + /// A collection of items. + /// + public class RootComponentsCollection : ObservableCollection, IJSComponentConfiguration + { + /// + public JSComponentConfigurationStore JSComponents { get; } = new(); + } + +} diff --git a/src/BlazorWebView/src/Gtk/WidgetCollection.cs b/src/BlazorWebView/src/Gtk/WidgetCollection.cs new file mode 100644 index 000000000000..df4f8f19b205 --- /dev/null +++ b/src/BlazorWebView/src/Gtk/WidgetCollection.cs @@ -0,0 +1,32 @@ +using System.Collections.ObjectModel; +using Gtk; + +namespace Microsoft.AspNetCore.Components.WebView.Gtk; + +/// +/// A collection of items. +/// +public class WidgetCollection : ObservableCollection +{ + + public WidgetCollection(Widget owner) + { } + + public virtual bool IsReadOnly => true; + + public new virtual void Add(Widget? value) + { + if (value != null) base.Add(value); + } + + public new virtual void Clear() => base.Clear(); + + public new virtual void Remove(Widget? value) + { + if (value != null) base.Remove(value); + } + + public virtual void SetChildIndex(Widget child, int newIndex) + { } + +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.props b/src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.props new file mode 100644 index 000000000000..7bc91e44385a --- /dev/null +++ b/src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.props @@ -0,0 +1,2 @@ + + diff --git a/src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.targets b/src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.targets new file mode 100644 index 000000000000..35c87cf4c6ef --- /dev/null +++ b/src/BlazorWebView/src/Gtk/build/Microsoft.AspNetCore.Components.WebView.Gtk.targets @@ -0,0 +1,30 @@ + + + + / + Root + $(CoreCompileDependsOn);StaticWebAssetsPrepareForRun + + + $(_TargetAssemblyProjectName) + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/BlazorWebView/src/Maui/Gtk/BlazorWebView.Gtk.cs b/src/BlazorWebView/src/Maui/Gtk/BlazorWebView.Gtk.cs new file mode 100644 index 000000000000..c840228a7a20 --- /dev/null +++ b/src/BlazorWebView/src/Maui/Gtk/BlazorWebView.Gtk.cs @@ -0,0 +1,32 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using WebKit; + +namespace Microsoft.AspNetCore.Components.WebView.Maui; + +public partial class BlazorWebView +{ + /// + protected override void OnPropertyChanging(string? propertyName = null) + { + base.OnPropertyChanging(propertyName); + + if (propertyName == nameof(Window) && Window is not null) + Window.Destroying -= Window_Destroying; + } + + /// + protected override void OnPropertyChanged(string? propertyName = null) + { + base.OnPropertyChanged(propertyName); + + if (propertyName == nameof(Window) && Window is not null) + Window.Destroying += Window_Destroying; + } + + private void Window_Destroying(object? sender, EventArgs e) + { + var platformView = ((BlazorWebViewHandler?)Handler)?.PlatformView; + // TODO: cleanup on clsoing + } +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs b/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs index e74da008c2b6..b2b71c0f774f 100644 --- a/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs +++ b/src/BlazorWebView/src/Maui/Gtk/BlazorWebViewHandler.Gtk.cs @@ -1,31 +1,119 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Components.WebView.Gtk; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; +using Microsoft.Maui.Dispatching; using Microsoft.Maui.Handlers; +using WebViewWidget = WebKit.WebView; + +#pragma warning disable RS0016 namespace Microsoft.AspNetCore.Components.WebView.Maui { + /// /// A for . /// - public partial class BlazorWebViewHandler : ViewHandler + public partial class BlazorWebViewHandler : ViewHandler { + + private WebViewManager? _webviewManager; + /// - protected override Gtk.Widget CreatePlatformView() => throw new NotSupportedException(); + protected override WebViewWidget CreatePlatformView() + { + var native = new WebViewWidget(); + + return native; + } /// public virtual IFileProvider CreateFileProvider(string contentRootDir) => throw new NotSupportedException(); - private void StartWebViewCoreIfPossible() { } + /// + protected override void DisconnectHandler(WebViewWidget platformView) + { + if (_webviewManager != null) + { + // Dispose this component's contents and block on completion so that user-written disposal logic and + // Blazor disposal logic will complete. + _webviewManager? + .DisposeAsync() + .AsTask() + .GetAwaiter() + .GetResult(); -#pragma warning disable CS0649 - private WebViewManager? _webviewManager; -#pragma warning restore CS0649 + _webviewManager = null; + } + } - /// + private void StartWebViewCoreIfPossible() + { + if (!RequiredStartupPropertiesSet || _webviewManager != null) + { + return; + } + + if (PlatformView == null) + { + throw new InvalidOperationException($"Can't start {nameof(BlazorWebView)} without platform web view instance."); + } + + // We assume the host page is always in the root of the content directory, because it's + // unclear there's any other use case. We can add more options later if so. + var contentRootDir = System.IO.Path.GetDirectoryName(HostPage!) ?? string.Empty; + var hostPageRelativePath = System.IO.Path.GetRelativePath(contentRootDir, HostPage!); + + var fileProvider = VirtualView.CreateFileProvider(contentRootDir); + + _webviewManager = new GtkWebViewManager( + this.PlatformView, + Services!, + new MauiDispatcher(Services!.GetRequiredService()), + fileProvider, + VirtualView.JSComponents, + contentRootDir, + hostPageRelativePath, + UrlLoading, + (args) => VirtualView.BlazorWebViewInitializing(args), + (args) => VirtualView.BlazorWebViewInitialized(args) + ); + + StaticContentHotReloadManager.AttachToWebViewManagerIfEnabled(_webviewManager); + + if (RootComponents != null) + { + foreach (var rootComponent in RootComponents) + { + // Since the page isn't loaded yet, this will always complete synchronously + _ = rootComponent.AddToWebViewManagerAsync(_webviewManager); + } + } + + _webviewManager.Navigate("/"); + + } + + bool RequiredStartupPropertiesSet => false; + + /// + /// Calls the specified asynchronously and passes in the scoped services available to Razor components. + /// + /// The action to call. + /// Returns a representing true if the was called, or false if it was not called because Blazor is not currently running. + /// Thrown if is null. public virtual async Task TryDispatchAsync(Action workItem) { - return await Task.FromResult(false); + ArgumentNullException.ThrowIfNull(workItem); + if (_webviewManager is null) + { + return false; + } + + return await _webviewManager.TryDispatchAsync(workItem); } + } + } \ No newline at end of file diff --git a/src/BlazorWebView/src/Maui/Gtk/GtkWebViewManager.cs b/src/BlazorWebView/src/Maui/Gtk/GtkWebViewManager.cs new file mode 100644 index 000000000000..e03a9002507d --- /dev/null +++ b/src/BlazorWebView/src/Maui/Gtk/GtkWebViewManager.cs @@ -0,0 +1,114 @@ +using System; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebView.Maui; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; +using WebKit; + +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value +#pragma warning disable RS0016 + +namespace Microsoft.AspNetCore.Components.WebView.Gtk; + +public class GtkWebViewManager : GtkSharp.BlazorWebKit.GtkWebViewManager +{ + + #region CopiedFromWebView2WebViewManager + + protected readonly Action? _urlLoading; + protected readonly Action? _blazorWebViewInitializing; + protected readonly Action? _blazorWebViewInitialized; + + internal readonly BlazorWebViewDeveloperTools? _developerTools; + + internal void ApplyDefaultWebViewSettings(BlazorWebViewDeveloperTools? devTools) + { + if (devTools is not { }) + return; + + if (WebView is not { }) + return; + + WebView.Settings.EnableDeveloperExtras = devTools.Enabled; + WebView.Settings.EnablePageCache = false; + WebView.Settings.EnableOfflineWebApplicationCache = false; + } + + private void NavigationStarting(object? sender, LoadChangedArgs args) + { + if (args.LoadEvent != LoadEvent.Started) + { + return; + } + + if (WebView is not { }) + return; + + var argsUri = WebView.Uri; + + if (Uri.TryCreate(argsUri, UriKind.RelativeOrAbsolute, out var uri)) + { + var callbackArgs = UrlLoadingEventArgs.CreateWithDefaultLoadingStrategy(uri, AppOriginUri); + + _urlLoading?.Invoke(callbackArgs); + + if (callbackArgs.UrlLoadingStrategy == UrlLoadingStrategy.OpenExternally) + { + LaunchUriInExternalBrowser(uri); + } + + if (callbackArgs.UrlLoadingStrategy != UrlLoadingStrategy.OpenInWebView) + WebView.StopLoading(); + } + } + + #endregion + + /// + /// Constructs an instance of . + /// + /// A to access platform-specific WebView2 APIs. + /// A service provider containing services to be used by this class and also by application code. + /// A instance that can marshal calls to the required thread or sync context. + /// Provides static content to the webview. + /// Describes configuration for adding, removing, and updating root components from JavaScript code. + /// Path to the app's content root relative to the application root directory. + /// Path to the host page within the . + /// Callback invoked when a url is about to load. + /// Callback invoked before the webview is initialized. + /// Callback invoked after the webview is initialized. + internal GtkWebViewManager( + WebKit.WebView webview, + IServiceProvider services, + Dispatcher dispatcher, + IFileProvider fileProvider, + JSComponentConfigurationStore jsComponents, + string contentRootRelativeToAppRoot, + string hostPagePathWithinFileProvider, + Action urlLoading, + Action blazorWebViewInitializing, + Action blazorWebViewInitialized) + : base(services, dispatcher, AppOriginUri, fileProvider, jsComponents, hostPagePathWithinFileProvider) + + { + ArgumentNullException.ThrowIfNull(webview); + + WebView = webview; + _urlLoading = urlLoading; + _blazorWebViewInitializing = blazorWebViewInitializing; + _blazorWebViewInitialized = blazorWebViewInitialized; + _developerTools = services.GetRequiredService(); + + Attach(); + } + + protected override void Attach() + { + _blazorWebViewInitializing?.Invoke(new BlazorWebViewInitializingEventArgs { }); + base.Attach(); + _blazorWebViewInitialized?.Invoke(new BlazorWebViewInitializedEventArgs { WebView = WebView }); + this.ApplyDefaultWebViewSettings(_developerTools); + } + +} \ No newline at end of file diff --git a/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj b/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj index 71e06b830a2e..018faf01004f 100644 --- a/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj +++ b/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj @@ -39,6 +39,11 @@ + + + + + diff --git a/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt index dc96fb6481fe..c2e0a3c1bf36 100644 --- a/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt +++ b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -44,7 +44,6 @@ Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy.CancelLoad = 2 -> Mic Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy.OpenExternally = 0 -> Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy.OpenInWebView = 1 -> Microsoft.AspNetCore.Components.WebView.UrlLoadingStrategy Microsoft.Extensions.DependencyInjection.BlazorWebViewServiceCollectionExtensions -override Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.CreatePlatformView() -> Gtk.Widget! static Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.MapHostPage(Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler! handler, Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView! webView) -> void static Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler.MapRootComponents(Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebViewHandler! handler, Microsoft.AspNetCore.Components.WebView.Maui.IBlazorWebView! webView) -> void static Microsoft.Extensions.DependencyInjection.BlazorWebViewServiceCollectionExtensions.AddBlazorWebViewDeveloperTools(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! diff --git a/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt index ab058de62d44..6571a34e0a4b 100644 --- a/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt +++ b/src/BlazorWebView/src/Maui/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -1 +1,4 @@ #nullable enable +override Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.OnPropertyChanged(string? propertyName = null) -> void +override Microsoft.AspNetCore.Components.WebView.Maui.BlazorWebView.OnPropertyChanging(string? propertyName = null) -> void +~Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializedEventArgs.WebView.get -> WebKit.WebView diff --git a/src/BlazorWebView/src/SharedSource/BlazorWebViewDeveloperTools.cs b/src/BlazorWebView/src/SharedSource/BlazorWebViewDeveloperTools.cs index 0f088fb3d261..2cf48cc30f6c 100644 --- a/src/BlazorWebView/src/SharedSource/BlazorWebViewDeveloperTools.cs +++ b/src/BlazorWebView/src/SharedSource/BlazorWebViewDeveloperTools.cs @@ -4,6 +4,8 @@ namespace Microsoft.AspNetCore.Components.WebView.WindowsForms #elif WEBVIEW2_WPF namespace Microsoft.AspNetCore.Components.WebView.Wpf +#elif WEBKIT_GTK +namespace Microsoft.AspNetCore.Components.WebView.Gtk #elif WEBVIEW2_MAUI namespace Microsoft.AspNetCore.Components.WebView.Maui #else diff --git a/src/BlazorWebView/src/SharedSource/BlazorWebViewInitializedEventArgs.cs b/src/BlazorWebView/src/SharedSource/BlazorWebViewInitializedEventArgs.cs index 4d7c1b27ab1c..6ef7d9aec2c1 100644 --- a/src/BlazorWebView/src/SharedSource/BlazorWebViewInitializedEventArgs.cs +++ b/src/BlazorWebView/src/SharedSource/BlazorWebViewInitializedEventArgs.cs @@ -15,6 +15,8 @@ using WebKit; #elif TIZEN using TWebView = Tizen.NUI.BaseComponents.WebView; +#elif GTK +using TWebView = WebKit.WebView; #endif namespace Microsoft.AspNetCore.Components.WebView @@ -46,6 +48,11 @@ public class BlazorWebViewInitializedEventArgs : EventArgs /// Gets the instance that was initialized. /// public TWebView WebView { get; internal set; } +#elif GTK + /// + /// Gets the instance that was initialized. + /// + public TWebView WebView { get; internal set; } #endif } } diff --git a/src/BlazorWebView/src/SharedSource/BlazorWebViewServiceCollectionExtensions.cs b/src/BlazorWebView/src/SharedSource/BlazorWebViewServiceCollectionExtensions.cs index b7b0c748177d..1e321cf2bdcd 100644 --- a/src/BlazorWebView/src/SharedSource/BlazorWebViewServiceCollectionExtensions.cs +++ b/src/BlazorWebView/src/SharedSource/BlazorWebViewServiceCollectionExtensions.cs @@ -3,6 +3,8 @@ using Microsoft.AspNetCore.Components.WebView.WindowsForms; #elif WEBVIEW2_WPF using Microsoft.AspNetCore.Components.WebView.Wpf; +#elif WEBKIT_GTK +using Microsoft.AspNetCore.Components.WebView.Gtk; #elif WEBVIEW2_MAUI using Microsoft.AspNetCore.Components.WebView.Maui; using Microsoft.Maui.Hosting; @@ -35,6 +37,8 @@ public static IWpfBlazorWebViewBuilder AddWpfBlazorWebView(this IServiceCollecti [System.Runtime.Versioning.SupportedOSPlatform("ios11.0")] #endif public static IMauiBlazorWebViewBuilder AddMauiBlazorWebView(this IServiceCollection services) +#elif WEBKIT_GTK + public static IGtkBlazorWebViewBuilder AddGtkBlazorWebView(this IServiceCollection services) #else #error Must define WEBVIEW2_WINFORMS, WEBVIEW2_WPF, WEBVIEW2_MAUI #endif @@ -51,6 +55,9 @@ public static IMauiBlazorWebViewBuilder AddMauiBlazorWebView(this IServiceCollec #elif WEBVIEW2_WPF services.TryAddSingleton(_ => new WpfBlazorMarkerService()); return new WpfBlazorWebViewBuilder(services); +#elif WEBKIT_GTK + services.TryAddSingleton(); + return new GtkBlazorWebViewBuilder(services); #endif } diff --git a/src/BlazorWebView/src/SharedSource/WebView2WebViewManager.cs b/src/BlazorWebView/src/SharedSource/WebView2WebViewManager.cs index 6f7c1dd01674..58139852e726 100644 --- a/src/BlazorWebView/src/SharedSource/WebView2WebViewManager.cs +++ b/src/BlazorWebView/src/SharedSource/WebView2WebViewManager.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#if !WEBVIEW2_WINFORMS && !WEBVIEW2_WPF && !WEBVIEW2_MAUI +#if !WEBVIEW2_WINFORMS && !WEBVIEW2_WPF && !WEBVIEW2_MAUI &&!WEBKIT_GTK #error Must specify which WebView2 is targeted #endif From 420d273b3e94ffa7156bf3fd21bab91536995cc0 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 22:39:43 +0100 Subject: [PATCH 296/425] GraphicTester.Portable.csproj: use ImageLoadingService to get Image --- src/Graphics/samples/GraphicsTester.Gtk/Program.cs | 3 ++- .../GraphicsTester.Portable/Scenarios/AbstractScenario.cs | 3 +++ .../samples/GraphicsTester.Portable/Scenarios/DrawImages.cs | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Graphics/samples/GraphicsTester.Gtk/Program.cs b/src/Graphics/samples/GraphicsTester.Gtk/Program.cs index 1d40f3a57115..8a161a4f75dd 100644 --- a/src/Graphics/samples/GraphicsTester.Gtk/Program.cs +++ b/src/Graphics/samples/GraphicsTester.Gtk/Program.cs @@ -2,6 +2,7 @@ // Happy coding!!! - GtkSharp Team using System; +using GraphicsTester.Scenarios; using Gtk; using Microsoft.Maui.Graphics.Platform.Gtk; @@ -20,7 +21,7 @@ public static void Main(string[] args) App = new Application("Microsoft.Maui.Graphics.Samples", GLib.ApplicationFlags.None); App.Startup += (s, e) => StartupTests(); - + App.Startup += (s, e) => AbstractScenario.ImageLoadingService = new PlatformImageLoadingService(); App.Startup += (s, e) => { Win = new MainWindow(); diff --git a/src/Graphics/samples/GraphicsTester.Portable/Scenarios/AbstractScenario.cs b/src/Graphics/samples/GraphicsTester.Portable/Scenarios/AbstractScenario.cs index 5172350cd1f9..3fdb2d6891a5 100644 --- a/src/Graphics/samples/GraphicsTester.Portable/Scenarios/AbstractScenario.cs +++ b/src/Graphics/samples/GraphicsTester.Portable/Scenarios/AbstractScenario.cs @@ -84,5 +84,8 @@ public IImage ToImage(int width, int height, float scale = 1) { throw new System.NotImplementedException(); } + + public static IImageLoadingService ImageLoadingService { get; set; } + } } diff --git a/src/Graphics/samples/GraphicsTester.Portable/Scenarios/DrawImages.cs b/src/Graphics/samples/GraphicsTester.Portable/Scenarios/DrawImages.cs index b2ab856089bf..6c0bc4fae013 100644 --- a/src/Graphics/samples/GraphicsTester.Portable/Scenarios/DrawImages.cs +++ b/src/Graphics/samples/GraphicsTester.Portable/Scenarios/DrawImages.cs @@ -19,7 +19,7 @@ public override void Draw(ICanvas canvas) var assembly = GetType().GetTypeInfo().Assembly; using (var stream = assembly.GetManifestResourceStream("GraphicsTester.Resources.royals.png")) { - image = PlatformImage.FromStream(stream); + image = ImageLoadingService?.FromStream(stream); } if (image != null) From b5fc91a3f4824eca4f4aa2109ce8e4340f87ba76 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 22:42:21 +0100 Subject: [PATCH 297/425] GraphicTester.Portable.csproj: use ImageLoadingService to get Image in ImageFills.cs --- .../samples/GraphicsTester.Portable/Scenarios/ImageFills.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Graphics/samples/GraphicsTester.Portable/Scenarios/ImageFills.cs b/src/Graphics/samples/GraphicsTester.Portable/Scenarios/ImageFills.cs index f507aa293ad1..c7a0f773e058 100644 --- a/src/Graphics/samples/GraphicsTester.Portable/Scenarios/ImageFills.cs +++ b/src/Graphics/samples/GraphicsTester.Portable/Scenarios/ImageFills.cs @@ -17,7 +17,7 @@ public override void Draw(ICanvas canvas) var assembly = GetType().GetTypeInfo().Assembly; using (var stream = assembly.GetManifestResourceStream("GraphicsTester.Resources.swirl_pattern.png")) { - image = PlatformImage.FromStream(stream); + image = ImageLoadingService.FromStream(stream); } if (image != null) From f5c40bc91e56e621bdfe788fbba54e0a38034266 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 23:00:07 +0100 Subject: [PATCH 298/425] GraphicsTester.Skia.Gtk.csproj: fix proj & add ImageLoadingService --- .../GraphicsTester.Skia.Gtk/GraphicsTester.Skia.Gtk.csproj | 1 - src/Graphics/samples/GraphicsTester.Skia.Gtk/Program.cs | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Graphics/samples/GraphicsTester.Skia.Gtk/GraphicsTester.Skia.Gtk.csproj b/src/Graphics/samples/GraphicsTester.Skia.Gtk/GraphicsTester.Skia.Gtk.csproj index 37f74da9e69a..b3d06eb1b147 100644 --- a/src/Graphics/samples/GraphicsTester.Skia.Gtk/GraphicsTester.Skia.Gtk.csproj +++ b/src/Graphics/samples/GraphicsTester.Skia.Gtk/GraphicsTester.Skia.Gtk.csproj @@ -18,7 +18,6 @@ - \ No newline at end of file diff --git a/src/Graphics/samples/GraphicsTester.Skia.Gtk/Program.cs b/src/Graphics/samples/GraphicsTester.Skia.Gtk/Program.cs index 8e38018b1e45..b37d5a2a0370 100644 --- a/src/Graphics/samples/GraphicsTester.Skia.Gtk/Program.cs +++ b/src/Graphics/samples/GraphicsTester.Skia.Gtk/Program.cs @@ -2,6 +2,7 @@ // Happy coding!!! - GtkSharp Team using System; +using GraphicsTester.Scenarios; using Gtk; using Microsoft.Maui.Graphics.Skia; @@ -20,6 +21,7 @@ public static void Main(string[] args) Application.Init(); App = new Application("Microsoft.Maui.Graphics.Samples.Gtk.Skia", GLib.ApplicationFlags.None); + App.Startup += (s, e) => AbstractScenario.ImageLoadingService = new SkiaImageLoadingService(); App.Startup += (s, e) => { From d3e5839590bc299a42c88ca1afbc976c945c9732 Mon Sep 17 00:00:00 2001 From: lytico Date: Wed, 21 Feb 2024 23:13:13 +0100 Subject: [PATCH 299/425] Graphics.Skia.csproj: add PublicApi for Gtk --- .../PublicAPI/net-gtk/PublicAPI.Shipped.txt | 1 + .../PublicAPI/net-gtk/PublicAPI.Unshipped.txt | 166 ++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Shipped.txt create mode 100644 src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Unshipped.txt diff --git a/src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Shipped.txt b/src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Shipped.txt new file mode 100644 index 000000000000..7dc5c58110bf --- /dev/null +++ b/src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Unshipped.txt b/src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Unshipped.txt new file mode 100644 index 000000000000..333621e4ed92 --- /dev/null +++ b/src/Graphics/src/Graphics.Skia/PublicAPI/net-gtk/PublicAPI.Unshipped.txt @@ -0,0 +1,166 @@ +#nullable enable +Microsoft.Maui.Graphics.Skia.FontExtensions +Microsoft.Maui.Graphics.Skia.PlatformBitmapExportService +Microsoft.Maui.Graphics.Skia.PlatformBitmapExportService.PlatformBitmapExportService() -> void +Microsoft.Maui.Graphics.Skia.SKColorExtensions +Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions +Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext +Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext.SkiaBitmapExportContext(int width, int height, float displayScale, int dpi = 72, bool disposeBitmap = true, bool transparent = true) -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvas +Microsoft.Maui.Graphics.Skia.SkiaCanvas.SetBlur(float radius) -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvas.SetDisplayScale(float value) -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvas.SkiaCanvas() -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.Alpha -> float +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.AntiAlias.set -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.BlurRadius.get -> float +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FontSize.set -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.IsBlurred.get -> bool +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.MiterLimit.set -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.PlatformStrokeSize.set -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.ScaledFontSize.get -> float +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.ScaledStrokeSize.get -> float +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.ScaleX.get -> float +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.ScaleY.get -> float +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SetBlur(float radius) -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SetFillPaintFilterBitmap(bool value) -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SetScale(float sx, float sy) -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SetShadow(float blur, float sx, float sy, SkiaSharp.SKColor color) -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SkiaCanvasState() -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.StrokeLineCap.set -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasState.StrokeLineJoin.set -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasStateService +Microsoft.Maui.Graphics.Skia.SkiaCanvasStateService.Dispose() -> void +Microsoft.Maui.Graphics.Skia.SkiaCanvasStateService.SkiaCanvasStateService() -> void +Microsoft.Maui.Graphics.Skia.SkiaImage +Microsoft.Maui.Graphics.Skia.SkiaImage.Dispose() -> void +Microsoft.Maui.Graphics.Skia.SkiaImage.Height.get -> float +Microsoft.Maui.Graphics.Skia.SkiaImage.Width.get -> float +Microsoft.Maui.Graphics.Skia.SkiaImageLoadingService +Microsoft.Maui.Graphics.Skia.SkiaImageLoadingService.SkiaImageLoadingService() -> void +Microsoft.Maui.Graphics.Skia.SkiaStringSizeService +Microsoft.Maui.Graphics.Skia.SkiaStringSizeService.SkiaStringSizeService() -> void +Microsoft.Maui.Graphics.Skia.SkiaTextLayout +Microsoft.Maui.Graphics.Skia.SkiaTextLayout.Dispose() -> void +Microsoft.Maui.Graphics.Skia.SkiaTextLayout.LayoutText() -> void +Microsoft.Maui.Graphics.Skia.SkiaTextLayout.WordWrap.get -> bool +Microsoft.Maui.Graphics.Skia.SkiaTextLayout.WordWrap.set -> void +Microsoft.Maui.Graphics.Skia.SKPaintExtensions +Microsoft.Maui.Graphics.Skia.TextLine +Microsoft.Maui.Graphics.Skia.TextLine.Width.get -> float +override Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext.Dispose() -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.Alpha.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.Antialias.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.BlendMode.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.ClipRectangle(float x, float y, float width, float height) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.DisplayScale.get -> float +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.Dispose() -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FillArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FillEllipse(float x, float y, float width, float height) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FillRectangle(float x, float y, float width, float height) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FillRoundedRectangle(float x, float y, float width, float height, float aCornerRadius) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FontSize.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.MiterLimit.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformConcatenateTransform(System.Numerics.Matrix3x2 transform) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformDrawArc(float x, float y, float width, float height, float startAngle, float endAngle, bool clockwise, bool closed) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformDrawEllipse(float x, float y, float width, float height) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformDrawLine(float x1, float y1, float x2, float y2) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformDrawRectangle(float x, float y, float width, float height) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformDrawRoundedRectangle(float x, float y, float width, float height, float aCornerRadius) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformRotate(float degrees, float radians) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformRotate(float degrees, float radians, float x, float y) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformScale(float xFactor, float yFactor) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformStrokeSize.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformTranslate(float tx, float ty) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.ResetState() -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.RestoreState() -> bool +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.SaveState() -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.StrokeLineCap.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.StrokeLineJoin.set -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvas.SubtractFromClip(float x, float y, float width, float height) -> void +override Microsoft.Maui.Graphics.Skia.SkiaCanvasState.Dispose() -> void +static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsMatrix(this in System.Numerics.Matrix3x2 transform) -> SkiaSharp.SKMatrix +static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsPointF(this SkiaSharp.SKPoint target) -> Microsoft.Maui.Graphics.PointF +static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsRectangleF(this SkiaSharp.SKRect target) -> Microsoft.Maui.Graphics.RectF +static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSize(this SkiaSharp.SKSize target) -> Microsoft.Maui.Graphics.SizeF +static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSizeF(this Microsoft.Maui.Graphics.SizeF target) -> SkiaSharp.SKSize +static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSKRect(this Microsoft.Maui.Graphics.RectF target) -> SkiaSharp.SKRect +static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.ToSKPoint(this Microsoft.Maui.Graphics.PointF target) -> SkiaSharp.SKPoint +~Microsoft.Maui.Graphics.Skia.PlatformBitmapExportService.CreateContext(int width, int height, float displayScale = 1) -> Microsoft.Maui.Graphics.BitmapExportContext +~Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext.Bitmap.get -> SkiaSharp.SKBitmap +~Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext.SKImage.get -> SkiaSharp.SKImage +~Microsoft.Maui.Graphics.Skia.SkiaCanvas.Canvas.get -> SkiaSharp.SKCanvas +~Microsoft.Maui.Graphics.Skia.SkiaCanvas.Canvas.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FillColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FillColor.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FillPaint.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FillPaintWithAlpha.get -> SkiaSharp.SKPaint +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.Font.get -> Microsoft.Maui.Graphics.IFont +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.Font.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FontColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FontColor.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FontPaint.get -> SkiaSharp.SKPaint +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.FontPaint.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.GetImagePaint(float sx, float sy) -> SkiaSharp.SKPaint +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.GetShadowPaint(float sx, float sy) -> SkiaSharp.SKPaint +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.Reset(SkiaSharp.SKPaint fontPaint, SkiaSharp.SKPaint fillPaint, SkiaSharp.SKPaint strokePaint) -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SetFillPaintShader(SkiaSharp.SKShader shader) -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SetStrokeDashPattern(float[] pattern, float strokeDashOffset, float strokeSize) -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.SkiaCanvasState(Microsoft.Maui.Graphics.Skia.SkiaCanvasState prototype) -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.StrokeColor.get -> Microsoft.Maui.Graphics.Color +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.StrokeColor.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.StrokePaint.set -> void +~Microsoft.Maui.Graphics.Skia.SkiaCanvasState.StrokePaintWithAlpha.get -> SkiaSharp.SKPaint +~Microsoft.Maui.Graphics.Skia.SkiaCanvasStateService.CreateCopy(Microsoft.Maui.Graphics.Skia.SkiaCanvasState prototype) -> Microsoft.Maui.Graphics.Skia.SkiaCanvasState +~Microsoft.Maui.Graphics.Skia.SkiaCanvasStateService.CreateNew(object context) -> Microsoft.Maui.Graphics.Skia.SkiaCanvasState +~Microsoft.Maui.Graphics.Skia.SkiaCanvasStateService.Reset(Microsoft.Maui.Graphics.Skia.SkiaCanvasState currentState) -> void +~Microsoft.Maui.Graphics.Skia.SkiaImage.Downsize(float maxWidth, float maxHeight, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Skia.SkiaImage.Downsize(float maxWidthOrHeight, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Skia.SkiaImage.Draw(Microsoft.Maui.Graphics.ICanvas canvas, Microsoft.Maui.Graphics.RectF dirtyRect) -> void +~Microsoft.Maui.Graphics.Skia.SkiaImage.PlatformRepresentation.get -> SkiaSharp.SKBitmap +~Microsoft.Maui.Graphics.Skia.SkiaImage.Resize(float width, float height, Microsoft.Maui.Graphics.ResizeMode resizeMode = Microsoft.Maui.Graphics.ResizeMode.Fit, bool disposeOriginal = false) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Skia.SkiaImage.Save(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> void +~Microsoft.Maui.Graphics.Skia.SkiaImage.SaveAsync(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat format = Microsoft.Maui.Graphics.ImageFormat.Png, float quality = 1) -> System.Threading.Tasks.Task +~Microsoft.Maui.Graphics.Skia.SkiaImage.SkiaImage(SkiaSharp.SKBitmap image) -> void +~Microsoft.Maui.Graphics.Skia.SkiaImage.ToPlatformImage() -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Skia.SkiaImageLoadingService.FromStream(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat formatHint = Microsoft.Maui.Graphics.ImageFormat.Png) -> Microsoft.Maui.Graphics.IImage +~Microsoft.Maui.Graphics.Skia.SkiaStringSizeService.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.Skia.SkiaStringSizeService.GetStringSize(string value, Microsoft.Maui.Graphics.IFont font, float fontSize, Microsoft.Maui.Graphics.HorizontalAlignment horizontalAlignment, Microsoft.Maui.Graphics.VerticalAlignment verticalAlignment) -> Microsoft.Maui.Graphics.SizeF +~Microsoft.Maui.Graphics.Skia.SkiaTextLayout.SkiaTextLayout(string value, Microsoft.Maui.Graphics.RectF rect, Microsoft.Maui.Graphics.ITextAttributes textAttributes, Microsoft.Maui.Graphics.LayoutLine callback, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, SkiaSharp.SKPaint paint = null) -> void +~Microsoft.Maui.Graphics.Skia.TextLine.TextLine(string value, float width) -> void +~Microsoft.Maui.Graphics.Skia.TextLine.Value.get -> string +~override Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext.Canvas.get -> Microsoft.Maui.Graphics.ICanvas +~override Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext.Image.get -> Microsoft.Maui.Graphics.IImage +~override Microsoft.Maui.Graphics.Skia.SkiaBitmapExportContext.WriteToStream(System.IO.Stream stream) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.ClipPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode = Microsoft.Maui.Graphics.WindingMode.NonZero) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.DrawImage(Microsoft.Maui.Graphics.IImage image, float x, float y, float width, float height) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.DrawString(string value, float x, float y, float width, float height, Microsoft.Maui.Graphics.HorizontalAlignment horizAlignment, Microsoft.Maui.Graphics.VerticalAlignment vertAlignment, Microsoft.Maui.Graphics.TextFlow textFlow = Microsoft.Maui.Graphics.TextFlow.ClipBounds, float lineSpacingAdjustment = 0) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.DrawString(string value, float x, float y, Microsoft.Maui.Graphics.HorizontalAlignment horizAlignment) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.DrawText(Microsoft.Maui.Graphics.Text.IAttributedText value, float x, float y, float width, float height) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FillColor.set -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FillPath(Microsoft.Maui.Graphics.PathF path, Microsoft.Maui.Graphics.WindingMode windingMode) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.Font.set -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.FontColor.set -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformDrawPath(Microsoft.Maui.Graphics.PathF path) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.PlatformSetStrokeDashPattern(float[] strokePattern, float strokeDashOffset, float strokeSize) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.SetFillPaint(Microsoft.Maui.Graphics.Paint paint, Microsoft.Maui.Graphics.RectF rectangle) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.SetShadow(Microsoft.Maui.Graphics.SizeF offset, float blur, Microsoft.Maui.Graphics.Color color) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.StateRestored(Microsoft.Maui.Graphics.Skia.SkiaCanvasState state) -> void +~override Microsoft.Maui.Graphics.Skia.SkiaCanvas.StrokeColor.set -> void +~static Microsoft.Maui.Graphics.Skia.FontExtensions.ToSKTypeface(this Microsoft.Maui.Graphics.IFont font) -> SkiaSharp.SKTypeface +~static Microsoft.Maui.Graphics.Skia.SKColorExtensions.ToColor(this Microsoft.Maui.Graphics.Color target, float alpha = 1) -> SkiaSharp.SKColor +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsColor(this SkiaSharp.SKColor target) -> Microsoft.Maui.Graphics.Color +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsRotatedAndroidPath(this Microsoft.Maui.Graphics.PathF target, Microsoft.Maui.Graphics.PointF center, float ppu, float zoom, float angle) -> SkiaSharp.SKPath +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSKColor(this Microsoft.Maui.Graphics.Color target) -> SkiaSharp.SKColor +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSKColorMultiplyAlpha(this Microsoft.Maui.Graphics.Color target, float alpha) -> SkiaSharp.SKColor +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSkiaPath(this Microsoft.Maui.Graphics.PathF path, float ppu) -> SkiaSharp.SKPath +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSkiaPath(this Microsoft.Maui.Graphics.PathF path, float ppu, float ox, float oy, float fx, float fy) -> SkiaSharp.SKPath +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSkiaPath(this Microsoft.Maui.Graphics.PathF path, float ppu, float zoom) -> SkiaSharp.SKPath +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSkiaPath(this Microsoft.Maui.Graphics.PathF target) -> SkiaSharp.SKPath +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.AsSkiaPathFromSegment(this Microsoft.Maui.Graphics.PathF target, int segmentIndex, float ppu, float zoom) -> SkiaSharp.SKPath +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.GetPatternBitmap(this Microsoft.Maui.Graphics.PatternPaint patternPaint, float scale = 1) -> SkiaSharp.SKBitmap +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.GetPatternBitmap(this Microsoft.Maui.Graphics.PatternPaint patternPaint, float scaleX, float scaleY, object currentFigure) -> SkiaSharp.SKBitmap +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.ToArgb(this Microsoft.Maui.Graphics.Color target) -> int +~static Microsoft.Maui.Graphics.Skia.SKGraphicsExtensions.ToArgb(this Microsoft.Maui.Graphics.Color target, float alpha) -> int +~static Microsoft.Maui.Graphics.Skia.SkiaImage.FromStream(System.IO.Stream stream, Microsoft.Maui.Graphics.ImageFormat formatHint = Microsoft.Maui.Graphics.ImageFormat.Png) -> Microsoft.Maui.Graphics.IImage +~static Microsoft.Maui.Graphics.Skia.SKPaintExtensions.CreateCopy(this SkiaSharp.SKPaint paint) -> SkiaSharp.SKPaint From 08f0faa8863afa48cd1e5c0407fd3ca576111a3c Mon Sep 17 00:00:00 2001 From: lytico Date: Fri, 23 Feb 2024 13:36:15 +0100 Subject: [PATCH 300/425] [Gtk] BlazorWebView: add examples/BlazorGtkApp --- Microsoft.Maui.sln | 14 +++++ .../samples/BlazorGtkApp/AppState.cs | 10 ++++ .../samples/BlazorGtkApp/BlazorGtkApp.csproj | 23 +++++++ .../BlazorGtkApp/CustomFilesBlazorWebView.cs | 26 ++++++++ .../samples/BlazorGtkApp/Main.razor | 12 ++++ .../samples/BlazorGtkApp/Pages/Index.razor | 25 ++++++++ .../samples/BlazorGtkApp/Pages/Other.razor | 26 ++++++++ .../samples/BlazorGtkApp/Program.cs | 60 +++++++++++++++++++ .../samples/BlazorGtkApp/_Imports.razor | 7 +++ .../samples/BlazorGtkApp/wwwroot/css/app.css | 18 ++++++ .../samples/BlazorGtkApp/wwwroot/index.html | 49 +++++++++++++++ 11 files changed, 270 insertions(+) create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/AppState.cs create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/BlazorGtkApp.csproj create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/CustomFilesBlazorWebView.cs create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/Main.razor create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/Pages/Index.razor create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/Pages/Other.razor create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/Program.cs create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/_Imports.razor create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/wwwroot/css/app.css create mode 100644 src/BlazorWebView/samples/BlazorGtkApp/wwwroot/index.html diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index 7619a0c00a81..ba7851e1a2c1 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -261,6 +261,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITest.NUnit", "src\TestUti EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Sample.Gtk", "src\Controls\samples\Controls.Sample.Gtk\Controls.Sample.Gtk.csproj", "{E3FD165E-E0BE-4263-AC0E-260BA6713AD3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorGtkApp", "src\BlazorWebView\samples\BlazorGtkApp\BlazorGtkApp.csproj", "{1FBAE048-FE7A-4D26-AF5A-23C35320A061}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Components.WebView.Gtk", "src\BlazorWebView\src\Gtk\Microsoft.AspNetCore.Components.WebView.Gtk.csproj", "{544312DA-10C9-4B90-B21D-0C5081BA4EDD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -662,6 +666,14 @@ Global {E3FD165E-E0BE-4263-AC0E-260BA6713AD3}.Debug|Any CPU.Build.0 = Debug|Any CPU {E3FD165E-E0BE-4263-AC0E-260BA6713AD3}.Release|Any CPU.ActiveCfg = Release|Any CPU {E3FD165E-E0BE-4263-AC0E-260BA6713AD3}.Release|Any CPU.Build.0 = Release|Any CPU + {1FBAE048-FE7A-4D26-AF5A-23C35320A061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FBAE048-FE7A-4D26-AF5A-23C35320A061}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FBAE048-FE7A-4D26-AF5A-23C35320A061}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FBAE048-FE7A-4D26-AF5A-23C35320A061}.Release|Any CPU.Build.0 = Release|Any CPU + {544312DA-10C9-4B90-B21D-0C5081BA4EDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {544312DA-10C9-4B90-B21D-0C5081BA4EDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {544312DA-10C9-4B90-B21D-0C5081BA4EDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {544312DA-10C9-4B90-B21D-0C5081BA4EDD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -783,6 +795,8 @@ Global {4EDE89FC-7C84-4855-8DD8-D7C8B128A974} = {42AB9AE1-631D-4AD4-85B7-910FF0940BDB} {624D161D-762C-45F7-9CBC-9929BA5D13EF} = {1BA0121E-0B83-4C8F-81BE-C293E7E35DCE} {E3FD165E-E0BE-4263-AC0E-260BA6713AD3} = {E1082E26-D700-4127-9329-66D673FD2D55} + {1FBAE048-FE7A-4D26-AF5A-23C35320A061} = {A8E9400E-70DD-421F-8609-1C2FA4AE8E71} + {544312DA-10C9-4B90-B21D-0C5081BA4EDD} = {ED7F28E0-D0AF-417D-983D-3D874EEE8554} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50} diff --git a/src/BlazorWebView/samples/BlazorGtkApp/AppState.cs b/src/BlazorWebView/samples/BlazorGtkApp/AppState.cs new file mode 100644 index 000000000000..ac81a0bb65f6 --- /dev/null +++ b/src/BlazorWebView/samples/BlazorGtkApp/AppState.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace BlazorGtkApp +{ + public class AppState + { + public int Counter { get; set; } + } +} diff --git a/src/BlazorWebView/samples/BlazorGtkApp/BlazorGtkApp.csproj b/src/BlazorWebView/samples/BlazorGtkApp/BlazorGtkApp.csproj new file mode 100644 index 000000000000..8dbefb4c92d8 --- /dev/null +++ b/src/BlazorWebView/samples/BlazorGtkApp/BlazorGtkApp.csproj @@ -0,0 +1,23 @@ + + + + + + $(_MauiDotNetTfm)-gtk + 3.24 + Exe + enable + + + + + + + + + + + + + + diff --git a/src/BlazorWebView/samples/BlazorGtkApp/CustomFilesBlazorWebView.cs b/src/BlazorWebView/samples/BlazorGtkApp/CustomFilesBlazorWebView.cs new file mode 100644 index 000000000000..560ad5040e28 --- /dev/null +++ b/src/BlazorWebView/samples/BlazorGtkApp/CustomFilesBlazorWebView.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNetCore.Components.WebView.Gtk; +using Microsoft.Extensions.FileProviders; +using WebViewAppShared; + +namespace BlazorGtkApp +{ + public class CustomFilesBlazorWebView : BlazorWebView + { + public override IFileProvider CreateFileProvider(string contentRootDir) + { + var inMemoryFiles = new InMemoryStaticFileProvider( + fileContentsMap: new Dictionary + { + { "customindex.html", StaticFilesContents.CustomIndexHtmlContent }, + }, + // The contentRoot is ignored here because in WinForms it would include the absolute physical path to the app's content, which this provider doesn't care about + contentRoot: null); + + return new CompositeFileProvider(inMemoryFiles, base.CreateFileProvider(contentRootDir)); + } + } +} diff --git a/src/BlazorWebView/samples/BlazorGtkApp/Main.razor b/src/BlazorWebView/samples/BlazorGtkApp/Main.razor new file mode 100644 index 000000000000..92540ddde04c --- /dev/null +++ b/src/BlazorWebView/samples/BlazorGtkApp/Main.razor @@ -0,0 +1,12 @@ + + + Home | + Other +
        + +
        + +

        Not found

        +

        Sorry, there's nothing here.

        +
        +
        diff --git a/src/BlazorWebView/samples/BlazorGtkApp/Pages/Index.razor b/src/BlazorWebView/samples/BlazorGtkApp/Pages/Index.razor new file mode 100644 index 000000000000..84aafcb5dfbd --- /dev/null +++ b/src/BlazorWebView/samples/BlazorGtkApp/Pages/Index.razor @@ -0,0 +1,25 @@ +@page "/" +@inject AppState AppState +@using WebViewAppShared + +

        Hello, world!

        + +

        The current count is @AppState.Counter

        + + + + +

        This is a shared component

        + + +@code { + void IncrementCount() + { + AppState.Counter++; + } + + void TriggerException() + { + throw new InvalidTimeZoneException("This is an exception from an event handler"); + } +} diff --git a/src/BlazorWebView/samples/BlazorGtkApp/Pages/Other.razor b/src/BlazorWebView/samples/BlazorGtkApp/Pages/Other.razor new file mode 100644 index 000000000000..b763f9c0cb85 --- /dev/null +++ b/src/BlazorWebView/samples/BlazorGtkApp/Pages/Other.razor @@ -0,0 +1,26 @@ +@page "/other" +@inject NavigationManager NavigationManager + +
        + Here is another page. Looks like navigation works. + + +
        + +
        + +