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 -