104 lines
3.0 KiB
C#
104 lines
3.0 KiB
C#
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 System.Diagnostics;
|
|
|
|
namespace Hyperbar.Windows.Controls;
|
|
|
|
internal class DesktopFlyoutHost : Window
|
|
{
|
|
private readonly DesktopFlyoutPresenter presenter;
|
|
private bool loaded;
|
|
private DesktopFlyoutPlacement placement;
|
|
|
|
public DesktopFlyoutHost(DesktopFlyoutPresenter presenter)
|
|
{
|
|
Border root = new();
|
|
root.Loaded += OnLoaded;
|
|
Content = root;
|
|
|
|
this.presenter = presenter;
|
|
|
|
this.SetOpacity(0);
|
|
this.SetStyle(WindowStyle.SysMenu | WindowStyle.Visible);
|
|
this.SetTopMost(true);
|
|
this.SetIsShownInSwitchers2(false);
|
|
}
|
|
|
|
internal async 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;
|
|
|
|
Debug.WriteLine(height);
|
|
Debug.WriteLine(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);
|
|
|
|
await Task.Delay(TimeSpan.FromSeconds(4));
|
|
|
|
presenter.UpdatePlacementState(placement);
|
|
}
|
|
|
|
private void OnChildSizeChanged(object sender,
|
|
SizeChangedEventArgs args) => UpdatePlacement(placement);
|
|
|
|
private void OnLoaded(object sender,
|
|
RoutedEventArgs args)
|
|
{
|
|
SystemBackdrop = new TransparentTintBackdrop();
|
|
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);
|
|
}
|
|
} |