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

XFEToolBox

【WPF】XFE工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using ToolControls = XFEToolBox.WpfCore.Controls;

namespace XFEToolBox.Client.Views.Windows;

public partial class ControlGalleryWindow
{
    private static ScenarioPreviewResult BuildInfoBarScenarios()
    {
        var actionStatus = ScenarioStatus("尚未执行提示条操作");
        var actionButton = new Button { Content = "查看日志" };
        actionButton.Click += (_, _) => actionStatus.Text = "已请求打开构建日志";
        var infoBar = new ToolControls.InfoBar
        {
            Title = "工具构建完成",
            Message = "共生成 9 个文件,没有警告。",
            Severity = ToolControls.InfoBarSeverity.Success,
            IsOpen = true,
            IsClosable = true,
            ActionContent = actionButton
        };

        return Scenarios(Scenario(
            "可操作状态通知",
            "在同一条通知中切换信息等级、显示状态和右侧操作,覆盖完成、警告及错误反馈。",
            ScenarioPreviewStack(infoBar, actionStatus),
            ChoiceParameter("Severity", Enum.GetNames<ToolControls.InfoBarSeverity>(), 1,
                (_, value) => infoBar.Severity = Enum.Parse<ToolControls.InfoBarSeverity>(value)),
            ToggleParameter("IsOpen", true, value => infoBar.IsOpen = value),
            ToggleParameter("ActionContent", true, value => infoBar.ActionContent = value ? actionButton : null)));
    }

    private static ScenarioPreviewResult BuildCommandBarScenarios()
    {
        var status = ScenarioStatus("主要命令:2 · 辅助命令:1");
        var commandBar = new ToolControls.CommandBar { Header = "项目文件" };
        var create = new Button { Content = "新建" };
        ToolControls.ButtonAssist.SetIsPrimary(create, true);
        var refresh = new Button { Content = "刷新", Margin = new Thickness(8, 0, 0, 0) };
        var more = new Button { Content = "更多" };
        create.Click += (_, _) => status.Text = "已请求新建文件";
        refresh.Click += (_, _) => status.Text = "文件列表已刷新";
        more.Click += (_, _) => status.Text = "已打开更多操作";
        commandBar.Items.Add(create);
        commandBar.Items.Add(refresh);
        commandBar.SecondaryContent = more;
        var compactItems = false;

        return Scenarios(Scenario(
            "项目操作栏",
            "标题、主要命令集合与靠右辅助操作作为一个工具栏场景统一调整。",
            ScenarioPreviewStack(commandBar, status),
            TextParameter("Header", "项目文件", value => commandBar.Header = value),
            ActionParameter("Items", "切换 1 / 2 个主要命令", () =>
            {
                compactItems = !compactItems;
                commandBar.Items.Clear();
                commandBar.Items.Add(create);
                if (!compactItems)
                    commandBar.Items.Add(refresh);
                status.Text = $"主要命令:{commandBar.Items.Count}";
            }),
            ToggleParameter("SecondaryContent", true, value =>
            {
                commandBar.SecondaryContent = value ? more : null;
                status.Text = value ? "辅助命令已显示" : "辅助命令已隐藏";
            })));
    }

    private static ScenarioPreviewResult BuildExpanderScenarios()
    {
        var detailText = new TextBlock
        {
            Text = "最大并发:8 · 超时:30 秒",
            Foreground = new SolidColorBrush(Color.FromRgb(80, 80, 99)),
            TextWrapping = TextWrapping.Wrap
        };
        var expander = new Expander
        {
            Header = "高级网络设置",
            IsExpanded = true,
            Content = new Border
            {
                Padding = new Thickness(4, 10, 4, 4),
                Child = detailText
            }
        };

        return Scenarios(Scenario(
            "渐进披露高级设置",
            "常用设置保持简洁,需要时再展开标题下的详细内容。",
            ScenarioPreviewStack(expander),
            TextParameter("Header", "高级网络设置", value => expander.Header = value),
            ToggleParameter("IsExpanded", true, value => expander.IsExpanded = value),
            TextParameter("Content", detailText.Text, value => detailText.Text = value)));
    }

    private static ScenarioPreviewResult BuildImageScenarios()
    {
        var image = new Image
        {
            Width = 230,
            Height = 145,
            Source = ResourceImage("Resources/Image/default_tool_icon.png"),
            Stretch = Stretch.Uniform,
            HorizontalAlignment = HorizontalAlignment.Left
        };
        var sources = new[]
        {
            ResourceImage("Resources/Image/default_tool_icon.png"),
            ResourceImage("Resources/Image/toolbox.png"),
            ResourceImage("Resources/Image/console.png")
        };

        var roundedImage = new Image
        {
            Width = 230,
            Height = 145,
            Source = ResourceImage("Resources/Image/toolbox.png"),
            Stretch = Stretch.UniformToFill,
            HorizontalAlignment = HorizontalAlignment.Left
        };
        var roundedStyle = Application.Current.TryFindResource("UnifiedRoundedImageStyle") as Style;
        roundedImage.Style = roundedStyle;

        return Scenarios(
            Scenario(
                "资源图与缩放策略",
                "切换图片来源与 Stretch,比较完整显示、填充裁剪和原始比例。",
                ScenarioPreviewStack(image),
                ChoiceParameter("Source", new[] { "默认图标", "工具箱", "控制台" }, 0,
                    (index, _) => image.Source = sources[index]),
                ChoiceParameter("Stretch", Enum.GetNames<Stretch>(), 1,
                    (_, value) => image.Stretch = Enum.Parse<Stretch>(value))),
            Scenario(
                "圆角封面图",
                "工具卡片封面使用 UnifiedRoundedImageStyle,关闭后可直接对比普通 Image。",
                ScenarioPreviewStack(roundedImage),
                ToggleParameter("Style", true, value => roundedImage.Style = value ? roundedStyle : null)));
    }

    private static ScenarioPreviewResult BuildPersonPictureScenarios()
    {
        var fallback = new ToolControls.PersonPicture
        {
            Width = 72,
            Height = 72,
            DisplayName = "XFE 工作室室长",
            IsOnline = true,
            HorizontalAlignment = HorizontalAlignment.Left
        };
        var imageProfile = new ToolControls.PersonPicture
        {
            Width = 72,
            Height = 72,
            DisplayName = "Control Developer",
            ProfilePicture = ResourceImage("Resources/Image/default_tool_icon.png"),
            HorizontalAlignment = HorizontalAlignment.Left
        };

        return Scenarios(
            Scenario(
                "姓名首字头像",
                "没有图片时根据 DisplayName 自动生成首字,并可叠加在线状态点。",
                ScenarioPreviewStack(fallback, ScenarioStatus("主窗口左下角也使用同一头像规则")),
                TextParameter("DisplayName", fallback.DisplayName, value => fallback.DisplayName = value),
                ToggleParameter("IsOnline", true, value => fallback.IsOnline = value)),
            Scenario(
                "图片头像",
                "提供 ProfilePicture 后优先显示图片,关闭后回退到姓名首字。",
                ScenarioPreviewStack(imageProfile),
                ToggleParameter("ProfilePicture", true,
                    value => imageProfile.ProfilePicture = value ? ResourceImage("Resources/Image/default_tool_icon.png") : null)));
    }

    private static ScenarioPreviewResult BuildCarouselScenarios()
    {
        var allItems = CreateCarouselItems();
        var playbackCarousel = new ToolControls.Carousel
        {
            Height = 235,
            ImageList = new ObservableCollection<ToolControls.CarouselImageItem>(allItems),
            AutoPlay = true,
            Interval = TimeSpan.FromSeconds(4)
        };
        var playbackStatus = ScenarioStatus("自动播放:4 秒切换");

        var contentCarousel = new ToolControls.Carousel
        {
            Height = 235,
            ImageList = new ObservableCollection<ToolControls.CarouselImageItem>(allItems),
            AutoPlay = false
        };
        var showingAll = true;

        return Scenarios(
            Scenario(
                "自动推荐轮播",
                "控制自动播放与切换间隔,适用于首页推荐和教程入口。",
                ScenarioPreviewStack(playbackCarousel, playbackStatus),
                ToggleParameter("AutoPlay", true, value =>
                {
                    playbackCarousel.AutoPlay = value;
                    playbackStatus.Text = value ? $"自动播放:{playbackCarousel.Interval.TotalSeconds:0} 秒切换" : "自动播放已暂停";
                }),
                SliderParameter("Interval", 1, 10, 4, value =>
                {
                    playbackCarousel.Interval = TimeSpan.FromSeconds(value);
                    playbackStatus.Text = $"切换间隔:{value:0} 秒";
                })),
            Scenario(
                "轮播内容集合",
                "在完整推荐集和单项公告之间切换,观察导航箭头与圆点随 ImageList 自动变化。",
                ScenarioPreviewStack(contentCarousel),
                ActionParameter("ImageList", "切换单项 / 三项数据", () =>
                {
                    showingAll = !showingAll;
                    contentCarousel.ImageList = showingAll
                        ? new ObservableCollection<ToolControls.CarouselImageItem>(CreateCarouselItems())
                        : new ObservableCollection<ToolControls.CarouselImageItem>(CreateCarouselItems().Take(1));
                })));
    }

    private static ScenarioPreviewResult BuildDataGridScenarios()
    {
        var fullRows = new[]
        {
            new ScenarioPreviewRow("Base64 密钥生成器", "已就绪", "1.2.0"),
            new ScenarioPreviewRow("局域网文件传输", "运行中", "1.1.0"),
            new ScenarioPreviewRow("代码行统计", "已完成", "1.1.0")
        };
        var grid = new DataGrid
        {
            Height = 220,
            AutoGenerateColumns = false,
            IsReadOnly = true,
            ItemsSource = fullRows
        };
        AddDataGridColumns(grid, true);
        var status = ScenarioStatus("3 行 · 3 列 · 只读");
        var fullData = true;
        var fullColumns = true;

        return Scenarios(Scenario(
            "工具任务表格",
            "切换数据集合、列配置和编辑模式,模拟日志、任务列表及批量结果。",
            ScenarioPreviewStack(grid, status),
            ActionParameter("ItemsSource", "切换完整 / 单行数据", () =>
            {
                fullData = !fullData;
                grid.ItemsSource = fullData ? fullRows : fullRows.Take(1).ToArray();
                status.Text = $"{(fullData ? 3 : 1)} 行 · {grid.Columns.Count} 列";
            }),
            ActionParameter("Columns", "切换 2 / 3 列", () =>
            {
                fullColumns = !fullColumns;
                AddDataGridColumns(grid, fullColumns);
                status.Text = $"{(fullData ? 3 : 1)} 行 · {grid.Columns.Count} 列";
            }),
            ToggleParameter("IsReadOnly", true, value =>
            {
                grid.IsReadOnly = value;
                status.Text = value ? "单元格只读" : "双击单元格可编辑";
            })));
    }

    private static ScenarioPreviewResult BuildTabViewScenarios()
    {
        var tabs = new ToolControls.TabView { Height = 205, SelectedIndex = 0 };
        AddTabViewItems(tabs, true);
        var selectedParameter = LiveValueParameter("SelectedItem", "概览", out var selectedText);
        tabs.SelectionChanged += (_, _) => selectedText.Text = (tabs.SelectedItem as TabItem)?.Header?.ToString() ?? "无";
        var allItems = true;

        return Scenarios(Scenario(
            "同级页面切换",
            "动态改变页面集合和选择状态,选中页签始终与当前内容面板保持连接。",
            ScenarioPreviewStack(tabs),
            ActionParameter("Items", "切换 2 / 3 个页面", () =>
            {
                allItems = !allItems;
                AddTabViewItems(tabs, allItems);
            }),
            SliderParameter("SelectedIndex", 0, 2, 0,
                value => tabs.SelectedIndex = Math.Min(tabs.Items.Count - 1, (int)value)),
            selectedParameter));
    }

    private static ScenarioPreviewResult BuildNavigationViewScenarios()
    {
        var navigation = new ToolControls.NavigationView
        {
            Height = 235,
            NavigationWidth = new GridLength(165),
            SelectedIndex = 0
        };
        AddNavigationItems(navigation, true);
        var allItems = true;

        return Scenarios(Scenario(
            "设置页左侧导航",
            "调整导航宽度、页面数量和当前子页,验证长页面下的独立导航区域。",
            ScenarioPreviewStack(navigation),
            SliderParameter("NavigationWidth", 120, 240, 165,
                value => navigation.NavigationWidth = new GridLength(value)),
            ActionParameter("Items", "切换 2 / 3 个页面", () =>
            {
                allItems = !allItems;
                AddNavigationItems(navigation, allItems);
            }),
            SliderParameter("SelectedIndex", 0, 2, 0,
                value => navigation.SelectedIndex = Math.Min(navigation.Items.Count - 1, (int)value))));
    }

    private static ScenarioPreviewResult BuildCommandPreviewScenarios()
    {
        var preview = new ToolControls.CommandPreviewBox
        {
            Label = "等价命令",
            CommandText = "dotnet publish -c Release --output ./artifacts",
            IsSyntaxHighlightingEnabled = true,
            CopyButtonText = "复制命令"
        };

        return Scenarios(Scenario(
            "发布命令确认",
            "修改说明、原始命令、着色开关与复制按钮文字;复制结果始终保持原始命令。",
            ScenarioPreviewStack(preview),
            TextParameter("Label", preview.Label, value => preview.Label = value),
            TextParameter("CommandText", preview.CommandText, value => preview.CommandText = value),
            ToggleParameter("IsSyntaxHighlightingEnabled", true, value => preview.IsSyntaxHighlightingEnabled = value),
            TextParameter("CopyButtonText", preview.CopyButtonText, value => preview.CopyButtonText = value)));
    }

    private static ScenarioPreviewResult BuildXamlCodeViewerScenarios()
    {
        var viewer = new ToolControls.XamlCodeViewer
        {
            Height = 150,
            Text = """
                   <!-- 工具页面标题 -->
                   <Grid Margin="16">
                       <TextBlock Text="XFE 工具页面" FontWeight="SemiBold" />
                   </Grid>
                   """,
            IsSyntaxHighlightingEnabled = true
        };

        return Scenarios(Scenario(
            "只读 XAML 示例",
            "切换语法着色或替换示例文本,验证标签、属性、字符串和注释的颜色层次。",
            ScenarioPreviewStack(viewer),
            TextParameter("Text", viewer.Text, value => viewer.Text = value),
            ToggleParameter("IsSyntaxHighlightingEnabled", true, value => viewer.IsSyntaxHighlightingEnabled = value)));
    }

    private static ScenarioPreviewResult BuildScrollTextScenarios()
    {
        var status = ScenarioStatus("长路径会在溢出时滚动");
        var control = new ToolControls.ScrollTextBlock
        {
            Width = 250,
            Height = 34,
            InnerText = "C:\\XFEToolBox\\EditorWorkspaces\\LanFileTransfer\\Code\\ViewModels",
            InnerForeground = new SolidColorBrush(Color.FromRgb(75, 75, 96)),
            AutoRolling = true,
            RollingBack = true,
            RollingTimeMillisecond = 4200,
            HorizontalAlignment = HorizontalAlignment.Left
        };

        return Scenarios(Scenario(
            "窄区域长路径",
            "通过文本长度、自动滚动开关和动画时长模拟工具名称、路径及任务标题。",
            ScenarioPreviewStack(control, status),
            TextParameter("InnerText", control.InnerText, value => control.InnerText = value),
            ToggleParameter("AutoRolling", true, value =>
            {
                control.AutoRolling = value;
                if (value) control.StartRolling(); else control.EndRolling();
                status.Text = value ? "自动滚动已启用" : "自动滚动已停止";
            }),
            SliderParameter("RollingTimeMillisecond", 1000, 10000, 4200,
                value => control.RollingTimeMillisecond = value)));
    }

    private static ScenarioPreviewResult BuildMiniToolButtonScenarios()
    {
        var tool = new ToolControls.MiniToolButton
        {
            ToolName = "局域网文件传输",
            IconSource = ResourceImage("Resources/Image/wrench_tool.png"),
            TextColor = new SolidColorBrush(Color.FromRgb(76, 76, 98)),
            ProgressVisibility = Visibility.Visible,
            ProgressValue = 64,
            HorizontalAlignment = HorizontalAlignment.Left
        };
        var icons = new[]
        {
            ResourceImage("Resources/Image/wrench_tool.png"),
            ResourceImage("Resources/Image/console.png"),
            ResourceImage("Resources/Image/toolbox.png")
        };

        return Scenarios(Scenario(
            "工具快捷入口",
            "名称、图标和任务进度一起构成主界面工具卡片中的紧凑入口。",
            ScenarioPreviewStack(tool, ScenarioStatus("悬停图标可观察名称滚动")),
            TextParameter("ToolName", tool.ToolName, value => tool.ToolName = value),
            ChoiceParameter("IconSource", new[] { "扳手", "控制台", "工具箱" }, 0,
                (index, _) => tool.IconSource = icons[index]),
            SliderParameter("ProgressValue", 0, 100, 64, value => tool.ProgressValue = value)));
    }

    private static IReadOnlyList<ToolControls.CarouselImageItem> CreateCarouselItems() =>
    [
        new() { Image = ResourceImage("Resources/Image/toolbox.png"), Badge = "工具开发", Title = "统一控件与主题资源" },
        new() { Image = ResourceImage("Resources/Image/console.png"), Badge = "实时演示", Title = "在画廊中验证交互状态" },
        new() { Image = ResourceImage("Resources/Image/wrench.png"), Badge = "开发参考", Title = "复制 XAML 并快速开始" }
    ];

    private static void AddDataGridColumns(DataGrid grid, bool includeVersion)
    {
        grid.Columns.Clear();
        grid.Columns.Add(new DataGridTextColumn
        {
            Header = "工具",
            Binding = new System.Windows.Data.Binding(nameof(ScenarioPreviewRow.Name)),
            Width = new DataGridLength(1, DataGridLengthUnitType.Star)
        });
        grid.Columns.Add(new DataGridTextColumn
        {
            Header = "状态",
            Binding = new System.Windows.Data.Binding(nameof(ScenarioPreviewRow.Status)),
            Width = 90
        });
        if (includeVersion)
        {
            grid.Columns.Add(new DataGridTextColumn
            {
                Header = "版本",
                Binding = new System.Windows.Data.Binding(nameof(ScenarioPreviewRow.Version)),
                Width = 72
            });
        }
    }

    private static void AddTabViewItems(ToolControls.TabView tabs, bool includeThird)
    {
        tabs.Items.Clear();
        tabs.Items.Add(ConnectedTab("概览", "显示任务概况和主要操作。"));
        tabs.Items.Add(ConnectedTab("日志", "这里展示工具运行日志。"));
        if (includeThird)
            tabs.Items.Add(ConnectedTab("设置", "这里放置工具专属设置。"));
        tabs.SelectedIndex = 0;
    }

    private static void AddNavigationItems(ToolControls.NavigationView navigation, bool includeThird)
    {
        navigation.Items.Clear();
        navigation.Items.Add(Tab("常规", "工具名称、默认行为与启动选项。"));
        navigation.Items.Add(Tab("网络", "连接地址、端口和超时设置。"));
        if (includeThird)
            navigation.Items.Add(Tab("高级", "日志级别、缓存与诊断选项。"));
        navigation.SelectedIndex = 0;
    }

    private sealed class ScenarioPreviewRow(string name, string status, string version)
    {
        public string Name { get; set; } = name;
        public string Status { get; set; } = status;
        public string Version { get; set; } = version;
    }
}