From 2f22c813843b0492810cb44acacbf0da8a83d7db Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Wed, 17 Jan 2024 17:16:50 +0000 Subject: [PATCH] WIP --- .../DesktopBar.cs} | 24 ++-- .../DesktopBar/DesktopBarHost.cs | 76 ++++++++++++ .../DesktopBarPlacemenet.cs} | 2 +- .../DesktopBarPresenter.cs} | 18 +-- .../DesktopBarPresenter.xaml} | 46 +++----- .../DesktopBarPresenterTemplateSettings.cs} | 10 +- .../DesktopFlyout/DesktopFlyoutHost.cs | 104 ---------------- Hyperbar.Windows.Controls/Themes/Generic.xaml | 2 +- .../AppBarWindowPlacement.cs | 9 ++ Hyperbar.Windows.Interop/HwndExtensions.cs | 57 +-------- Hyperbar.Windows.Interop/NativeMethods.txt | 3 +- Hyperbar.Windows.Interop/Screen.cs | 111 ++++++++++++++++++ .../SystemInformationHelper.cs | 34 ++++++ .../WindowMessageListener.cs | 46 ++++++++ Hyperbar.Windows.Interop/WindowSnapping.cs | 110 +++++++++++++++++ .../Extensions/WindowExtensions.cs | 23 ++-- Hyperbar.Windows/App.xaml.cs | 2 +- .../Lifecycles/AppConfiguration.cs | 2 +- Hyperbar.Windows/Lifecycles/AppInitializer.cs | 2 +- .../Lifecycles/ConfigurationChangedHandler.cs | 2 +- .../Views/WidgetSplitButtonView.xaml | 19 +-- 21 files changed, 471 insertions(+), 231 deletions(-) rename Hyperbar.Windows.Controls/{DesktopFlyout/DesktopFlyout.cs => DesktopBar/DesktopBar.cs} (61%) create mode 100644 Hyperbar.Windows.Controls/DesktopBar/DesktopBarHost.cs rename Hyperbar.Windows.Controls/{DesktopFlyout/DesktopFlyoutPlacement.cs => DesktopBar/DesktopBarPlacemenet.cs} (70%) rename Hyperbar.Windows.Controls/{DesktopFlyout/DesktopFlyoutPresenter.cs => DesktopBar/DesktopBarPresenter.cs} (51%) rename Hyperbar.Windows.Controls/{DesktopFlyout/DesktopFlyoutPresenter.xaml => DesktopBar/DesktopBarPresenter.xaml} (62%) rename Hyperbar.Windows.Controls/{DesktopFlyout/DesktopFlyoutPresenterTemplateSettings.cs => DesktopBar/DesktopBarPresenterTemplateSettings.cs} (77%) delete mode 100644 Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutHost.cs create mode 100644 Hyperbar.Windows.Interop/AppBarWindowPlacement.cs create mode 100644 Hyperbar.Windows.Interop/Screen.cs create mode 100644 Hyperbar.Windows.Interop/SystemInformationHelper.cs create mode 100644 Hyperbar.Windows.Interop/WindowMessageListener.cs create mode 100644 Hyperbar.Windows.Interop/WindowSnapping.cs diff --git a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyout.cs b/Hyperbar.Windows.Controls/DesktopBar/DesktopBar.cs similarity index 61% rename from Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyout.cs rename to Hyperbar.Windows.Controls/DesktopBar/DesktopBar.cs index bf369e3..d18c823 100644 --- a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyout.cs +++ b/Hyperbar.Windows.Controls/DesktopBar/DesktopBar.cs @@ -2,30 +2,30 @@ namespace Hyperbar.Windows.Controls; -public class DesktopFlyout : +public class DesktopBar : DependencyObject { public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), - typeof(object), typeof(DesktopFlyout), + typeof(object), typeof(DesktopBar), new PropertyMetadata(null)); public static readonly DependencyProperty PlacementProperty = DependencyProperty.Register(nameof(Placement), - typeof(DesktopFlyoutPlacement), typeof(DesktopFlyout), - new PropertyMetadata(DesktopFlyoutPlacement.Left, OnPlacementPropertyChanged)); + typeof(DesktopBarPlacemenet), typeof(DesktopBar), + new PropertyMetadata(DesktopBarPlacemenet.Left, OnPlacementPropertyChanged)); - private readonly DesktopFlyoutHost host; - private readonly DesktopFlyoutPresenter presenter; + private readonly DesktopBarHost host; + private readonly DesktopBarPresenter presenter; - public DesktopFlyout() + public DesktopBar() { - presenter = new DesktopFlyoutPresenter + presenter = new DesktopBarPresenter { Parent = this }; - host = new DesktopFlyoutHost(presenter); + host = new DesktopBarHost(presenter); host.Activate(); } @@ -35,16 +35,16 @@ public class DesktopFlyout : set => SetValue(ContentProperty, value); } - public DesktopFlyoutPlacement Placement + public DesktopBarPlacemenet Placement { - get => (DesktopFlyoutPlacement)GetValue(PlacementProperty); + get => (DesktopBarPlacemenet)GetValue(PlacementProperty); set => SetValue(PlacementProperty, value); } private static void OnPlacementPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) { - if (dependencyObject is DesktopFlyout sender) + if (dependencyObject is DesktopBar sender) { sender.OnPlacementPropertyChanged(); } diff --git a/Hyperbar.Windows.Controls/DesktopBar/DesktopBarHost.cs b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarHost.cs new file mode 100644 index 0000000..d26c5b0 --- /dev/null +++ b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarHost.cs @@ -0,0 +1,76 @@ +using Microsoft.UI.Xaml; +using Hyperbar.Windows.UI; +using Windows.Foundation; +using WindowStyle = Hyperbar.Windows.Interop.WindowStyle; +using ExtendedWindowStyle = Hyperbar.Windows.Interop.ExtendedWindowStyle; +using Hyperbar.Windows.Interop; +using Microsoft.UI.Xaml.Media; + +namespace Hyperbar.Windows.Controls; + +internal class DesktopBarHost : Window +{ + private readonly DesktopBarPresenter presenter; + private DesktopBarPlacemenet placement; + private readonly WindowSnapping windowSnapping; + + public DesktopBarHost(DesktopBarPresenter presenter) + { + this.SetOpacity(0); + this.SetStyle(WindowStyle.SysMenu | WindowStyle.Visible); + this.SetStyle(ExtendedWindowStyle.NoActivate); + this.MoveAndResize(0, 0, 0, 0); + this.SetTopMost(true); + this.SetIsAvailableInSwitchers(false); + + SystemBackdrop = new MicaBackdrop(); + windowSnapping = WindowSnapping.Create(this.GetHandle()); + + this.presenter = presenter; + presenter.Loaded += OnLoaded; + Content = presenter; + } + + internal void UpdatePlacement(DesktopBarPlacemenet placement) + { + this.placement = placement; + UpdatePlacement(); + } + + internal void UpdatePlacement() + { + presenter.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + double size = Math.Min(presenter.DesiredSize.Height, presenter.DesiredSize.Width); + + switch (placement) + { + case DesktopBarPlacemenet.Left: + windowSnapping.Snap(AppBarWindowPlacement.Left, (int)size); + break; + + case DesktopBarPlacemenet.Top: + windowSnapping.Snap(AppBarWindowPlacement.Top, (int)size); + break; + + case DesktopBarPlacemenet.Right: + windowSnapping.Snap(AppBarWindowPlacement.Right, (int)size); + break; + + case DesktopBarPlacemenet.Bottom: + windowSnapping.Snap(AppBarWindowPlacement.Bottom, (int)size); + break; + + default: + break; + } + + presenter.UpdatePlacementState(placement); + } + + private void OnLoaded(object sender, + RoutedEventArgs args) + { + UpdatePlacement(); + this.SetOpacity(255); + } +} \ No newline at end of file diff --git a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPlacement.cs b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarPlacemenet.cs similarity index 70% rename from Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPlacement.cs rename to Hyperbar.Windows.Controls/DesktopBar/DesktopBarPlacemenet.cs index 8095a23..6d7be5f 100644 --- a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPlacement.cs +++ b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarPlacemenet.cs @@ -1,6 +1,6 @@ namespace Hyperbar.Windows.Controls; -public enum DesktopFlyoutPlacement +public enum DesktopBarPlacemenet { Left, Top, diff --git a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPresenter.cs b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarPresenter.cs similarity index 51% rename from Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPresenter.cs rename to Hyperbar.Windows.Controls/DesktopBar/DesktopBarPresenter.cs index cdfb884..b493eba 100644 --- a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPresenter.cs +++ b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarPresenter.cs @@ -4,20 +4,20 @@ using Microsoft.UI.Xaml.Data; namespace Hyperbar.Windows.Controls; -public class DesktopFlyoutPresenter : +public class DesktopBarPresenter : ContentControl { public static readonly DependencyProperty TemplateSettingsProperty = DependencyProperty.Register(nameof(TemplateSettings), - typeof(DesktopFlyoutPresenterTemplateSettings), typeof(DesktopFlyoutPresenter), + typeof(DesktopBarPresenterTemplateSettings), typeof(DesktopBarPresenter), new PropertyMetadata(null)); - internal new DesktopFlyout? Parent; + internal new DesktopBar? Parent; - public DesktopFlyoutPresenter() + public DesktopBarPresenter() { - DefaultStyleKey = typeof(DesktopFlyoutPresenter); - TemplateSettings = new DesktopFlyoutPresenterTemplateSettings(); + DefaultStyleKey = typeof(DesktopBarPresenter); + TemplateSettings = new DesktopBarPresenterTemplateSettings(); } protected override void OnApplyTemplate() @@ -30,11 +30,11 @@ public class DesktopFlyoutPresenter : }); } - public DesktopFlyoutPresenterTemplateSettings TemplateSettings + public DesktopBarPresenterTemplateSettings TemplateSettings { - get => (DesktopFlyoutPresenterTemplateSettings)GetValue(TemplateSettingsProperty); + get => (DesktopBarPresenterTemplateSettings)GetValue(TemplateSettingsProperty); set => SetValue(TemplateSettingsProperty, value); } - internal void UpdatePlacementState(DesktopFlyoutPlacement placement) => VisualStateManager.GoToState(this, $"{placement}Placement", true); + internal void UpdatePlacementState(DesktopBarPlacemenet placement) => VisualStateManager.GoToState(this, $"{placement}Placement", true); } \ No newline at end of file diff --git a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPresenter.xaml b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarPresenter.xaml similarity index 62% rename from Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPresenter.xaml rename to Hyperbar.Windows.Controls/DesktopBar/DesktopBarPresenter.xaml index 97b1ce7..e3b542b 100644 --- a/Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPresenter.xaml +++ b/Hyperbar.Windows.Controls/DesktopBar/DesktopBarPresenter.xaml @@ -5,32 +5,30 @@ xmlns:controls="using:Hyperbar.Windows.Controls"> - - - + + + - - - + + + - 1 -