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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using Microsoft.UI.Xaml.Media;
using XFEEDToolBox.ViewModels;
namespace XFEEDToolBox.Controls;

public sealed partial class RefitShipOverview : UserControl
{
    private bool measuringHeight;
    public ToolboxViewModel ViewModel=>App.ViewModel;
    public RefitShipOverview(){InitializeComponent();}
    private GridLength Portion(double value)=>new(Math.Max(0,value),GridUnitType.Star);
    private GridLength Remaining(double value)=>new(Math.Max(0,1-value),GridUnitType.Star);
    private string ShipName(string type)=>Core.Localization.ChineseNames.Ship(type);
    private Brush PowerBrush(bool overloaded)=>(Brush)Resources[overloaded?"OutfittingOverload":"OutfittingOrange"];
    public void ResumePage()=>OverviewShipModel.ResumePage();
    public Task SuspendPageAsync()=>OverviewShipModel.SuspendPageAsync();
    private void OverviewTabsLoaded(object sender,RoutedEventArgs args)
    {OutfittingSelectorSizing.Fit(OverviewTabs);ReserveViewHeight(OverviewLayout.ActualWidth);}
    private void OverviewTabsSizeChanged(object sender,SizeChangedEventArgs args)=>OutfittingSelectorSizing.Fit(OverviewTabs);
    private void OverviewTabChanged(SelectorBar sender,SelectorBarSelectionChangedEventArgs args)
    {
        if(SpecificationsPanel is null||DefencePanel is null||WeaponPanel is null||CapacityPanel is null)return;
        ShowView(sender.Items.IndexOf(sender.SelectedItem));
        SummaryViewName.Text=sender.SelectedItem?.Text??"常规";
    }
    private void ShowView(int index)
    {
        SpecificationsPanel.Visibility=PowerPanel.Visibility=index==0?Visibility.Visible:Visibility.Collapsed;
        DefencePanel.Visibility=index==1?Visibility.Visible:Visibility.Collapsed;
        WeaponPanel.Visibility=index==2?Visibility.Visible:Visibility.Collapsed;
        CapacityPanel.Visibility=index==3?Visibility.Visible:Visibility.Collapsed;
    }
    private void OpenShipDetails(object sender,RoutedEventArgs args)=>Views.AppShellPage.Current?.Navigate(typeof(Views.RefitShipDetailsPage));
    private void ReserveViewHeight(double width)
    {
        if(measuringHeight||width<=0||OverviewLayout is null)return;
        measuringHeight=true;
        var selected=OverviewTabs.Items.IndexOf(OverviewTabs.SelectedItem);double height=0;
        try
        {
            // Measure every view at this width before reserving their common
            // height. Collapsed panels must be measured too, including wrapping
            // and the stacked power panel at narrow widths.
            OverviewLayout.MinHeight=0;
            for(var index=0;index<4;index++)
            {
                ShowView(index);OverviewLayout.Measure(new(width,double.PositiveInfinity));
                height=Math.Max(height,OverviewLayout.DesiredSize.Height);
            }
        }
        finally
        {
            ShowView(selected);OverviewLayout.MinHeight=Math.Ceiling(height);measuringHeight=false;
        }
    }
    private void OverviewSizeChanged(object sender,SizeChangedEventArgs args)
    {
        if(measuringHeight||PowerPanel is null||IdentityPanel is null)return;
        var stacked=args.NewSize.Width<1120;var compact=args.NewSize.Width<700;
        IdentityColumn.Width=compact?new(0):new(130);PowerColumn.Width=stacked?new(0):new(1,GridUnitType.Star);
        IdentityPanel.Visibility=compact?Visibility.Collapsed:Visibility.Visible;
        Grid.SetColumn(SpecificationsPanel,compact?0:1);Grid.SetColumnSpan(SpecificationsPanel,compact?2:1);
        Grid.SetColumn(PowerPanel,stacked?0:2);Grid.SetRow(PowerPanel,stacked?1:0);Grid.SetColumnSpan(PowerPanel,stacked?3:1);
        ModelColumn.Width=new(compact?108:150);
        foreach(var panel in new[]{DefencePanel,WeaponPanel,CapacityPanel})
        {
            Grid.SetColumn(panel,compact?0:1);Grid.SetColumnSpan(panel,compact?3:2);
            var narrow=args.NewSize.Width<900;
            panel.ColumnDefinitions[1].Width=narrow?new(0):new(1,GridUnitType.Star);
            var right=(FrameworkElement)panel.Children[1];Grid.SetColumn(right,narrow?0:1);Grid.SetRow(right,narrow?1:0);
        }
        ReserveViewHeight(args.NewSize.Width);
    }
}