This commit is contained in:
TheXamlGuy
2024-01-17 17:16:50 +00:00
parent 86603a6567
commit 2f22c81384
21 changed files with 471 additions and 231 deletions
@@ -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();
}
@@ -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);
}
}
@@ -1,6 +1,6 @@
namespace Hyperbar.Windows.Controls;
public enum DesktopFlyoutPlacement
public enum DesktopBarPlacemenet
{
Left,
Top,
@@ -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);
}
@@ -5,32 +5,30 @@
xmlns:controls="using:Hyperbar.Windows.Controls">
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<StaticResource x:Key="DesktopFlyoutPresenterBackground" ResourceKey="AcrylicInAppFillColorDefaultBrush" />
<StaticResource x:Key="DesktopFlyoutPresenterForeground" ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="DesktopFlyoutPresenterBorderBrush" ResourceKey="ControlStrokeColorDefaultBrush" />
<StaticResource x:Key="DesktopBarPresenterBackground" ResourceKey="AcrylicInAppFillColorDefaultBrush" />
<StaticResource x:Key="DesktopBarPresenterForeground" ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="DesktopBarPresenterBorderBrush" ResourceKey="ControlStrokeColorDefaultBrush" />
</ResourceDictionary>
<ResourceDictionary x:Key="Light">
<StaticResource x:Key="DesktopFlyoutPresenterBackground" ResourceKey="AcrylicInAppFillColorDefaultBrush" />
<StaticResource x:Key="DesktopFlyoutPresenterForeground" ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="DesktopFlyoutPresenterBorderBrush" ResourceKey="ControlStrokeColorDefaultBrush" />
<StaticResource x:Key="DesktopBarPresenterBackground" ResourceKey="AcrylicInAppFillColorDefaultBrush" />
<StaticResource x:Key="DesktopBarPresenterForeground" ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="DesktopBarPresenterBorderBrush" ResourceKey="ControlStrokeColorDefaultBrush" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
<Thickness x:Key="DesktopFlyoutPresenterBorderThemeThickness">1</Thickness>
<Style TargetType="controls:DesktopFlyoutPresenter">
<Setter Property="Background" Value="{ThemeResource DesktopFlyoutPresenterBackground}" />
<Setter Property="Foreground" Value="{ThemeResource DesktopFlyoutPresenterForeground}" />
<Setter Property="BorderBrush" Value="{ThemeResource DesktopFlyoutPresenterBorderBrush}" />
<Setter Property="BorderThickness" Value="{ThemeResource DesktopFlyoutPresenterBorderThemeThickness}" />
<Setter Property="CornerRadius" Value="{ThemeResource OverlayCornerRadius}" />
<Thickness x:Key="DesktopBarPresenterBorderThemeThickness">0</Thickness>
<Style TargetType="controls:DesktopBarPresenter">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{ThemeResource DesktopBarPresenterForeground}" />
<Setter Property="BorderBrush" Value="{ThemeResource DesktopBarPresenterBorderBrush}" />
<Setter Property="BorderThickness" Value="{ThemeResource DesktopBarPresenterBorderThemeThickness}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:DesktopFlyoutPresenter">
<ControlTemplate TargetType="controls:DesktopBarPresenter">
<Border x:Name="Container" Background="Transparent">
<Border
x:Name="BackgroundElement"
MinWidth="48"
MinHeight="48"
MinWidth="40"
Margin="16"
Background="{TemplateBinding Background}"
BackgroundSizing="OuterBorderEdge"
BorderBrush="{TemplateBinding BorderBrush}"
@@ -49,18 +47,10 @@
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="PlacementStates">
<VisualState x:Name="DefaultPlacement" />
<VisualState x:Name="BottomPlacement">
</VisualState>
<VisualState x:Name="TopPlacement">
</VisualState>
<VisualState x:Name="LeftPlacement">
</VisualState>
<VisualState x:Name="RightPlacement">
</VisualState>
<VisualState x:Name="BottomPlacement" />
<VisualState x:Name="TopPlacement" />
<VisualState x:Name="LeftPlacement" />
<VisualState x:Name="RightPlacement" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
@@ -2,26 +2,26 @@
namespace Hyperbar.Windows.Controls;
public class DesktopFlyoutPresenterTemplateSettings : DependencyObject
public class DesktopBarPresenterTemplateSettings : DependencyObject
{
public static readonly DependencyProperty HeightProperty =
DependencyProperty.Register(nameof(Height),
typeof(double), typeof(DesktopFlyoutPresenterTemplateSettings),
typeof(double), typeof(DesktopBarPresenterTemplateSettings),
new PropertyMetadata(0d));
public static readonly DependencyProperty NegativeHeightProperty =
DependencyProperty.Register(nameof(NegativeHeight),
typeof(double), typeof(DesktopFlyoutPresenterTemplateSettings),
typeof(double), typeof(DesktopBarPresenterTemplateSettings),
new PropertyMetadata(0d));
public static readonly DependencyProperty NegativeWidthProperty =
DependencyProperty.Register(nameof(NegativeWidth),
typeof(double), typeof(DesktopFlyoutPresenterTemplateSettings),
typeof(double), typeof(DesktopBarPresenterTemplateSettings),
new PropertyMetadata(0d));
public static readonly DependencyProperty WidthProperty =
DependencyProperty.Register(nameof(Width),
typeof(double), typeof(DesktopFlyoutPresenterTemplateSettings),
typeof(double), typeof(DesktopBarPresenterTemplateSettings),
new PropertyMetadata(0d));
public double Height
@@ -1,104 +0,0 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Hyperbar.Windows.UI;
using Windows.Foundation;
using WinUIEx;
using WindowStyle = Hyperbar.Windows.Interop.WindowStyle;
using ExtendedWindowStyle = Hyperbar.Windows.Interop.ExtendedWindowStyle;
namespace Hyperbar.Windows.Controls;
internal class DesktopFlyoutHost : Window
{
private readonly DesktopFlyoutPresenter presenter;
private bool loaded;
private DesktopFlyoutPlacement placement;
public DesktopFlyoutHost(DesktopFlyoutPresenter presenter)
{
SystemBackdrop = new TransparentTintBackdrop();
this.SetOpacity(0);
this.Snap(WindowPlacement.Top, 0, 0);
this.SetStyle(WindowStyle.SysMenu | WindowStyle.Visible);
this.SetStyle(ExtendedWindowStyle.NoActivate);
this.SetTopMost(true);
this.SetIsAvailableInSwitchers(false);
Border root = new();
root.Loaded += OnLoaded;
Content = root;
this.presenter = presenter;
}
internal void UpdatePlacement(DesktopFlyoutPlacement placement)
{
this.placement = placement;
// Not ready
if (!loaded)
{
return;
}
presenter.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
double height = presenter.DesiredSize.Height;
double width = presenter.DesiredSize.Width;
switch (placement)
{
case DesktopFlyoutPlacement.Left:
this.Snap(WindowPlacement.Left, height, width);
break;
case DesktopFlyoutPlacement.Top:
this.Snap(WindowPlacement.Top, width, height);
break;
case DesktopFlyoutPlacement.Right:
this.Snap(WindowPlacement.Right, height, width);
break;
case DesktopFlyoutPlacement.Bottom:
this.Snap(WindowPlacement.Bottom, width, height);
break;
default:
break;
}
presenter.TemplateSettings.SetValue(DesktopFlyoutPresenterTemplateSettings.HeightProperty, height);
presenter.TemplateSettings.SetValue(DesktopFlyoutPresenterTemplateSettings.WidthProperty, width);
presenter.TemplateSettings.SetValue(DesktopFlyoutPresenterTemplateSettings.NegativeHeightProperty, -height);
presenter.TemplateSettings.SetValue(DesktopFlyoutPresenterTemplateSettings.NegativeWidthProperty, -width);
presenter.UpdatePlacementState(placement);
}
private void OnChildSizeChanged(object sender,
SizeChangedEventArgs args) => UpdatePlacement(placement);
private void OnLoaded(object sender,
RoutedEventArgs args)
{
this.SetOpacity(255);
if (Content is Border border)
{
border.Child = presenter;
double height = presenter.DesiredSize.Height;
double width = presenter.DesiredSize.Width;
presenter.SizeChanged += OnChildSizeChanged;
}
loaded = true;
UpdatePlacement(placement);
}
}
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ms-appx:///Hyperbar.Windows.Controls/DesktopFlyout/DesktopFlyoutPresenter.xaml" />
<ResourceDictionary Source="ms-appx:///Hyperbar.Windows.Controls/DesktopBar/DesktopBarPresenter.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>