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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEEDToolBox.ViewModels;
using CommunityToolkit.Mvvm.Input;
using System.ComponentModel;
using XFEEDToolBox.Core.Presentation;
namespace XFEEDToolBox.Views;
public sealed partial class RefitPage : Page
{
    public ToolboxViewModel ViewModel => App.ViewModel;
    public IAsyncRelayCommand AddShipToListAction{get;}
    public RefitPage()
    {
        AddShipToListAction=new AsyncRelayCommand(AddShipToListAsync,()=>ViewModel.RefitCanAddToList);
        InitializeComponent();NavigationCacheMode=Microsoft.UI.Xaml.Navigation.NavigationCacheMode.Required;
        Loaded+=(_,_)=>{ViewModel.PropertyChanged+=UpdateActions;AddShipToListAction.NotifyCanExecuteChanged();};
        Unloaded+=(_,_)=>ViewModel.PropertyChanged-=UpdateActions;
    }
    private void UpdateActions(object? sender,PropertyChangedEventArgs args)
    {if(args.PropertyName==nameof(ViewModel.RefitCanAddToList))AddShipToListAction.NotifyCanExecuteChanged();}
    protected override void OnNavigatedTo(Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); RefitShipModel.ResumePage(); RefitOverviewPanel.ResumePage(); }
    protected override async void OnNavigatedFrom(Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); await Task.WhenAll(RefitShipModel.SuspendPageAsync(),RefitOverviewPanel.SuspendPageAsync()); }
    private async void OpenEdsyLinks(object sender,RoutedEventArgs args)
    {
        var editor=new EdsyLinkPanel{DataContext=ViewModel};
        var dialog=new ContentDialog{Title="EDSY 装配链接",Content=editor,CloseButtonText="关闭",XamlRoot=XamlRoot,DefaultButton=ContentDialogButton.Close};
        await dialog.ShowAsync();
    }
    private async Task AddShipToListAsync(CancellationToken token)
    {
        if(await ViewModel.AddRefitToListAsync(token)) AppShellPage.Current?.ShowUpgradeFlyout();
        else if(!token.IsCancellationRequested)
        {
            var flyout=new Flyout { Content=new TextBlock { Text=ViewModel.RefitResult,TextWrapping=TextWrapping.Wrap,MaxWidth=380 } };
            flyout.ShowAt(AddShipToListButton);
        }
    }
    private void SlotGridSizeChanged(object sender,SizeChangedEventArgs args)
    {
        if(SlotList.ItemsPanelRoot is not ItemsWrapGrid panel)return;
        var width=Math.Max(160,args.NewSize.Width-16);var columns=Math.Max(1,(int)(width/230));
        panel.ItemWidth=width/columns;panel.ItemHeight=202;
    }
    private void ChangeModule(object sender,RoutedEventArgs args)
    {
        if(sender is Button {Tag:RefitSlotLiveRow slot})
        {
            ViewModel.BeginRefitModuleSelection(slot);
            AppShellPage.Current?.Navigate(typeof(RefitModulePickerPage));
        }
    }
    private void PageScrollSizeChanged(object sender,SizeChangedEventArgs args)=>SizePage();
    private void SizePage()
    {
        if(PageLayout is null)return;
        var minimum=PageScroll.ActualWidth<740?1320:800;
        PageLayout.Height=Math.Max(PageScroll.ActualHeight,minimum);
    }
    private void WorkbenchSizeChanged(object sender,SizeChangedEventArgs args)
    {
        if(CategoryPanel is null||InspectorPanel is null)return;
        var stacked=args.NewSize.Width<740;
        CategoryColumn.Width=new(args.NewSize.Width<1100?184:230);
        SlotColumn.Width=new(1,GridUnitType.Star);
        InspectorColumn.Width=stacked?new(0):new(1.25,GridUnitType.Star);
        StackedInspectorRow.Height=stacked?new(1.15,GridUnitType.Star):new(0);
        Grid.SetColumn(InspectorPanel,stacked?0:2);Grid.SetRow(InspectorPanel,stacked?1:0);Grid.SetColumnSpan(InspectorPanel,stacked?2:1);
        SizePage();
    }
    private void PropertiesGridSizeChanged(object sender,SizeChangedEventArgs args)
    {
        var columns=args.NewSize.Width>=620;
        PropertiesSecondColumn.Width=columns?new(1,GridUnitType.Star):new(0);
        Grid.SetColumn(EngineeringProperties,columns?1:0);Grid.SetRow(EngineeringProperties,columns?0:1);
    }
    private void InspectorTabChanged(SelectorBar sender,SelectorBarSelectionChangedEventArgs args)
    {
        if(ModuleDataView is null||ModuleEngineeringView is null||EngineeringGradePanel is null)return;
        var engineering=sender.Items.IndexOf(sender.SelectedItem)==1;
        ModuleDataView.Visibility=engineering?Visibility.Collapsed:Visibility.Visible;
        ModuleEngineeringView.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
        EngineeringGradePanel.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
        CurrentProgressBlock.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
    }
    private void InspectorTabsSizeChanged(object sender,SizeChangedEventArgs args)
        =>Controls.OutfittingSelectorSizing.Fit(InspectorTabs);
    private void InspectorTabsLoaded(object sender,RoutedEventArgs args)=>Controls.OutfittingSelectorSizing.Fit(InspectorTabs);
}