XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEExtension.NetCore.WinUIHelper.Interface.Services;
using XFEExtension.NetCore.WinUIHelper.Utilities;
using XFEEDToolBox.ViewModels;
using XFEEDToolBox.Services;

namespace XFEEDToolBox.Views;

public sealed partial class AppShellPage : Page
{
    public static AppShellPage? Current { get; private set; }
    public ToolboxViewModel ViewModel => App.ViewModel;
    public Page? CurrentPage => NavigationFrame.Content as Page;
    private readonly INavigationViewService navigation = ServiceManager.GetService<INavigationViewService>();
    private FloatingUpgradeList? floatingUpgradeList;
    public AppShellPage()
    {
        Current = this; InitializeComponent();
        UpgradeListPanel.ExpandRequested+=ExpandUpgradeList;UpgradeListPanel.DetailsRequested+=ShowUpgradeDetails;
        App.MainWindow.Closed+=(_,_)=>floatingUpgradeList?.Dispose();
        void UpdateProfileFooter()=>ProfileFooterText.Visibility=Navigation.IsPaneOpen?Visibility.Visible:Visibility.Collapsed;
        Navigation.RegisterPropertyChangedCallback(NavigationView.IsPaneOpenProperty,(_,_)=>UpdateProfileFooter());
        Loaded+=(_,_)=>UpdateProfileFooter();
        App.MainWindow.SetTitleBar(TitleRegion);
        TitleActions.SizeChanged+=(_,_)=>UpdateTitleInput();TitleRegion.SizeChanged+=(_,_)=>UpdateTitleInput();Loaded+=(_,_)=>UpdateTitleInput();
        App.MainWindow.AppWindow.Changed+=(_,_)=>UpdateTitleInput();
        navigation.Initialize(Navigation, NavigationFrame);
        navigation.NavigationService.Navigated += (_, _) =>
        {
            Navigation.Header=null;var map=CurrentPage is NavigationPage or CurrentSystemPage or SystemMapCataloguePage;
            ContentLayout.Padding=map?new Thickness(0):new Thickness(24,10,24,0);ContentLayout.RowSpacing=map?0:12;
        };
        navigation.NavigateTo<MainPage>();
    }
    public void Navigate(Type page) => navigation.NavigateTo(page==typeof(GalaxyMapPage)?typeof(NavigationPage):page);
    private void OpenUpgradeDetails(object sender,RoutedEventArgs e)=>ShowUpgradeDetails();
    internal void ShowUpgradeDetails(){UpgradeListFlyout.Hide();Navigate(typeof(UpgradeListPage));}
    internal void ShowUpgradeFlyout()=>UpgradeListFlyout.ShowAt(UpgradeListButton);
    private void ExpandUpgradeList()
    {
        UpgradeListFlyout.Hide();
        try
        {
            if(floatingUpgradeList is {} existing){existing.Show();return;}
            var point=UpgradeListButton.TransformToVisual(this).TransformPoint(new(UpgradeListButton.ActualWidth,UpgradeListButton.ActualHeight));var scale=XamlRoot.RasterizationScale;var position=App.MainWindow.AppWindow.Position;
            var popup=new FloatingUpgradeList(WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow),position.X+(int)((point.X-400)*scale),position.Y+(int)(point.Y*scale));floatingUpgradeList=popup;
            popup.Closed+=()=>floatingUpgradeList=null;
        }
        catch(Exception error){ViewModel.ShowError("悬浮清单未打开:"+error.Message);ShowUpgradeFlyout();}
    }
    private void OpenProfile(object sender,RoutedEventArgs args){ProfileFlyout.Hide();Navigate(typeof(ProfilePage));}
    private void CopyCommanderId(object sender,RoutedEventArgs args)
    {
        if(ViewModel.ProfileCommanderId=="未读取")return;
        var content=new Windows.ApplicationModel.DataTransfer.DataPackage();content.SetText(ViewModel.ProfileCommanderId);
        Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(content);
        ToolTipService.SetToolTip(CopyCommanderIdButton,"已复制 CMDR ID");
    }
    private void UpdateTitleInput()
    {
        if(XamlRoot is null)return;var origin=TitleActions.TransformToVisual(this).TransformPoint(new(0,0));var scale=XamlRoot.RasterizationScale;
        var title=App.MainWindow.AppWindow.TitleBar;
        if(title.Height>0)TitleRow.Height=new GridLength(title.Height/scale);
        TitleRegion.Padding=new Thickness(18,0,Math.Max(0,title.RightInset/scale)+24,0);
        Microsoft.UI.Input.InputNonClientPointerSource.GetForWindowId(App.MainWindow.AppWindow.Id).SetRegionRects(Microsoft.UI.Input.NonClientRegionKind.Passthrough,[new Windows.Graphics.RectInt32((int)(origin.X*scale),(int)(origin.Y*scale),(int)Math.Ceiling(TitleActions.ActualWidth*scale),(int)Math.Ceiling(TitleActions.ActualHeight*scale))]);
    }
}