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

XFEWorkflow

【WinUI】XFE基于windows的工作流

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEWorkflow.Controls;

public sealed class DetailsWorkspace : Grid
{
    public ContentControl Master { get; } = new() { HorizontalContentAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Stretch };
    public ContentControl Details { get; } = new() { HorizontalContentAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Stretch };
    public PaneSplitter Splitter { get; } = new() { Reverse = true };
    private readonly ColumnDefinition detailWidth = new() { Width = new(360) };
    private readonly RowDefinition detailHeight = new() { Height = new(280) };
    private readonly string key;
    private bool? narrow;
    public DetailsWorkspace(string key)
    {
        this.key = key; Children.Add(Master); Children.Add(Splitter); Children.Add(Details);
        Microsoft.UI.Xaml.Automation.AutomationProperties.SetName(Splitter, "调整列表与详情大小");
        SizeChanged += (_, _) => UpdateLayoutMode(); Loaded += (_, _) => UpdateLayoutMode();
    }
    private void UpdateLayoutMode()
    {
        var vertical = ActualWidth < 820;
        if (narrow == vertical) { Splitter.ApplyPreferredSize(); return; }
        narrow = vertical; ColumnDefinitions.Clear(); RowDefinitions.Clear();
        Grid.SetColumn(Master, 0); Grid.SetRow(Master, 0);
        if (vertical)
        {
            RowDefinitions.Add(new()); RowDefinitions.Add(new() { Height = new(8) }); RowDefinitions.Add(detailHeight);
            Grid.SetColumn(Splitter, 0); Grid.SetColumn(Details, 0); Grid.SetRow(Splitter, 1); Grid.SetRow(Details, 2); Splitter.Orientation = Orientation.Horizontal;
            Splitter.Bind(key + ".height", 280, 140, 500, () => detailHeight.ActualHeight, value => detailHeight.Height = new(value), () => ActualHeight - 160);
        }
        else
        {
            ColumnDefinitions.Add(new()); ColumnDefinitions.Add(new() { Width = new(8) }); ColumnDefinitions.Add(detailWidth);
            Grid.SetRow(Splitter, 0); Grid.SetRow(Details, 0); Grid.SetColumn(Splitter, 1); Grid.SetColumn(Details, 2); Splitter.Orientation = Orientation.Vertical;
            Splitter.Bind(key + ".width", 360, 260, 600, () => detailWidth.ActualWidth, value => detailWidth.Width = new(value), () => ActualWidth - 340);
        }
    }
}