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

XFEToolBox

【WPF】XFE工具箱

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

namespace XFEToolBox.Client.Views.Windows;

public partial class ControlGalleryWindow
{
    private static ScenarioPreviewResult BuildButtonScenarios()
    {
        var status = ScenarioStatus("命令尚未执行");
        var button = new Button { Content = "生成工具包", HorizontalAlignment = HorizontalAlignment.Left };
        var command = new GalleryCommand(() => status.Text = $"Command 已执行 · {DateTime.Now:HH:mm:ss}");
        button.Command = command;
        ToolControls.ButtonAssist.SetIsPrimary(button, true);

        return Scenarios(Scenario(
            "提交操作",
            "同一场景中调整按钮内容、主次层级和命令绑定,观察外观与行为如何共同变化。",
            ScenarioPreviewStack(button, status),
            TextParameter("Content", "生成工具包", value => button.Content = value),
            ToggleParameter("IsPrimary", true, value => ToolControls.ButtonAssist.SetIsPrimary(button, value)),
            ToggleParameter("Command", true, value => button.Command = value ? command : null)));
    }

    private static ScenarioPreviewResult BuildTextEditorScenarios()
    {
        var status = ScenarioStatus("等待输入");
        var editor = new ToolControls.TextEditor
        {
            Width = 330,
            Height = 40,
            HintText = "输入工具名称",
            HorizontalAlignment = HorizontalAlignment.Left
        };
        editor.TextChanged += (_, _) => status.Text = $"当前输入:{editor.Text} · {editor.Text.Length} 字符";
        var searchIcon = Geometry.Parse("M 9,1 A 8,8 0 1 0 9,17 A 8,8 0 1 0 9,1 M 15,15 L 22,22");

        return Scenarios(Scenario(
            "搜索与命名输入",
            "提示文字、前置图标和圆角共同构成工具页面最常用的单行输入场景。",
            ScenarioPreviewStack(editor, status),
            TextParameter("HintText", editor.HintText, value => editor.HintText = value),
            ToggleParameter("Icon", false, value => editor.Icon = value ? searchIcon : null),
            SliderParameter("EditorCornerRadius", 0, 20, 10,
                value => editor.EditorCornerRadius = new CornerRadius(value))));
    }

    private static ScenarioPreviewResult BuildPasswordEditorScenarios()
    {
        var status = ScenarioStatus("密码长度:8");
        var editor = new ToolControls.PasswordEditor
        {
            Width = 330,
            Height = 40,
            HintText = "输入访问密钥",
            Password = "XFE-2026",
            HorizontalAlignment = HorizontalAlignment.Left
        };
        editor.PasswordChanged += (_, args) => status.Text = $"密码长度:{args?.Password.Length ?? 0}";

        return Scenarios(Scenario(
            "访问密钥输入",
            "使用测试值查看密码同步、明文显隐与遮罩字符;真实密钥不应进入画廊或日志。",
            ScenarioPreviewStack(editor, status),
            TextParameter("Password", editor.Password, value => editor.Password = value),
            ToggleParameter("PasswordVisible", false, value => editor.PasswordVisible = value),
            TextParameter("PasswordMask", "●", value => editor.PasswordMask = string.IsNullOrEmpty(value) ? "●" : value[..1])));
    }

    private static ScenarioPreviewResult BuildAutoSuggestScenarios()
    {
        var status = ScenarioStatus("输入内容以筛选当前候选集合");
        var suggestionSets = new[]
        {
            new[] { "C#", "C++", "TypeScript", "Python", "PowerShell", "Rust", "Kotlin" },
            new[] { "build", "publish", "restore", "test", "clean", "pack" },
            new[] { "首页", "工具箱", "下载专区", "服务器管理" }
        };
        var suggest = new ToolControls.AutoSuggestBox
        {
            Width = 330,
            Height = 40,
            PlaceholderText = "搜索开发语言",
            MinimumPrefixLength = 1,
            ItemsSource = suggestionSets[0],
            HorizontalAlignment = HorizontalAlignment.Left
        };
        suggest.SelectionChanged += (_, _) => status.Text = suggest.SelectedItem is null
            ? "尚未选择建议"
            : $"已选择:{suggest.SelectedItem}";

        return Scenarios(Scenario(
            "候选搜索",
            "切换候选数据、空值提示和触发前缀长度,模拟语言、命令及页面搜索。",
            ScenarioPreviewStack(suggest, status),
            ChoiceParameter("ItemsSource", new[] { "开发语言", "CLI 命令", "工具页面" }, 0,
                (index, _) => suggest.ItemsSource = suggestionSets[index]),
            TextParameter("PlaceholderText", suggest.PlaceholderText, value => suggest.PlaceholderText = value),
            SliderParameter("MinimumPrefixLength", 0, 5, 1,
                value => suggest.MinimumPrefixLength = (int)value)));
    }

    private static ScenarioPreviewResult BuildCheckBoxScenarios()
    {
        var regularStatus = ScenarioStatus("自动保存:开");
        var regular = new CheckBox { Content = "启用自动保存", IsChecked = true };
        regular.Click += (_, _) => regularStatus.Text = $"自动保存:{OnOff(regular.IsChecked)}";

        var inheritedStatus = ScenarioStatus("策略状态:不确定");
        var inherited = new CheckBox
        {
            Content = "继承工作区策略",
            IsThreeState = true,
            IsChecked = null
        };
        inherited.Click += (_, _) => inheritedStatus.Text = $"策略状态:{OnOff(inherited.IsChecked)}";

        return Scenarios(
            Scenario(
                "普通布尔设置",
                "用于明确的启用或关闭设置,标签内容和当前选择状态可同时调整。",
                ScenarioPreviewStack(regular, regularStatus),
                TextParameter("Content", "启用自动保存", value => regular.Content = value),
                TriStateParameter("IsChecked", true, value => regular.IsChecked = value)),
            Scenario(
                "继承状态",
                "三态模式适合表达“继承上级设置”,而不是把不确定状态伪装成第三个普通选项。",
                ScenarioPreviewStack(inherited, inheritedStatus),
                ToggleParameter("IsThreeState", true, value =>
                {
                    inherited.IsThreeState = value;
                    if (!value && inherited.IsChecked is null)
                        inherited.IsChecked = false;
                })));
    }

    private static ScenarioPreviewResult BuildRadioButtonScenarios()
    {
        var status = ScenarioStatus("当前通道:稳定通道");
        var stable = new RadioButton { Content = "稳定通道", GroupName = "GalleryChannel", IsChecked = true };
        var preview = new RadioButton
        {
            Content = "预览通道",
            GroupName = "GalleryChannel",
            Margin = new Thickness(0, 9, 0, 0)
        };
        stable.Checked += (_, _) => status.Text = $"当前通道:{stable.Content}";
        preview.Checked += (_, _) => status.Text = $"当前通道:{preview.Content}";

        return Scenarios(Scenario(
            "发布通道互斥选择",
            "两个选项共享 GroupName;右侧可修改首项内容、分组名和当前选择。",
            ScenarioPreviewStack(stable, preview, status),
            TextParameter("Content", "稳定通道", value => stable.Content = value),
            TextParameter("GroupName", "GalleryChannel", value =>
            {
                stable.GroupName = value;
                preview.GroupName = value;
            }),
            ToggleParameter("IsChecked", true, value => stable.IsChecked = value)));
    }

    private static ScenarioPreviewResult BuildToggleButtonScenarios()
    {
        var status = ScenarioStatus("实时预览:开");
        var toggle = new ToggleButton { Content = "实时预览", IsChecked = true, HorizontalAlignment = HorizontalAlignment.Left };
        var command = new GalleryCommand(() => status.Text = $"Command 收到状态:{OnOff(toggle.IsChecked)}");
        toggle.Command = command;
        toggle.Click += (_, _) => status.Text = $"实时预览:{OnOff(toggle.IsChecked)}";

        return Scenarios(Scenario(
            "保持型工具栏操作",
            "调整保持状态、三态能力与命令绑定,区分持续模式和一次性按钮。",
            ScenarioPreviewStack(toggle, status),
            TriStateParameter("IsChecked", true, value => toggle.IsChecked = value),
            ToggleParameter("IsThreeState", false, value =>
            {
                toggle.IsThreeState = value;
                if (!value && toggle.IsChecked is null)
                    toggle.IsChecked = false;
            }),
            ToggleParameter("Command", true, value => toggle.Command = value ? command : null)));
    }

    private static ScenarioPreviewResult BuildComboBoxScenarios()
    {
        var status = ScenarioStatus("当前配置:Debug");
        var simpleItems = new object[] { "Debug", "Release", "Release / Self-contained" };
        var objectItems = new object[]
        {
            new GalleryChoice("本机调试", "debug"),
            new GalleryChoice("便携发布", "portable"),
            new GalleryChoice("独立发布", "self-contained")
        };
        var combo = new ComboBox
        {
            Width = 310,
            Height = 38,
            ItemsSource = simpleItems,
            SelectedIndex = 0,
            HorizontalAlignment = HorizontalAlignment.Left
        };
        combo.SelectionChanged += (_, _) => status.Text = $"当前项:{combo.SelectedItem}";

        void UseSimpleItems()
        {
            combo.DisplayMemberPath = string.Empty;
            combo.ItemsSource = simpleItems;
            combo.SelectedIndex = 0;
        }

        void UseObjectItems()
        {
            combo.DisplayMemberPath = nameof(GalleryChoice.Name);
            combo.ItemsSource = objectItems;
            combo.SelectedIndex = 0;
        }

        return Scenarios(Scenario(
            "构建配置选择",
            "在字符串集合和业务对象之间切换,并实时改变选中项与显示成员。",
            ScenarioPreviewStack(combo, status),
            ChoiceParameter("ItemsSource", new[] { "字符串集合", "业务对象集合" }, 0,
                (index, _) => { if (index == 0) UseSimpleItems(); else UseObjectItems(); }),
            SliderParameter("SelectedItem", 1, 3, 1,
                value => combo.SelectedIndex = Math.Min(combo.Items.Count - 1, (int)value - 1)),
            ChoiceParameter("DisplayMemberPath", new[] { "自动", "Name" }, 0,
                (index, _) => { if (index == 0) UseSimpleItems(); else UseObjectItems(); })));
    }

    private static ScenarioPreviewResult BuildSliderScenarios()
    {
        var valueText = new TextBlock
        {
            Text = "65",
            Foreground = AccentBrush(),
            FontSize = 16,
            FontWeight = FontWeights.SemiBold,
            HorizontalAlignment = HorizontalAlignment.Center,
            Margin = new Thickness(0, 0, 0, 12)
        };
        var slider = new Slider
        {
            Width = 340,
            Minimum = 0,
            Maximum = 100,
            Value = 65,
            TickFrequency = 5,
            IsSnapToTickEnabled = true
        };
        slider.ValueChanged += (_, _) => valueText.Text = slider.Value.ToString("0.##");

        return Scenarios(Scenario(
            "阈值与步进",
            "在一个完整范围场景中联合调整当前值、上下界和离散步长。",
            ScenarioPreviewStack(valueText, slider, ScenarioStatus("拖动左侧滑块也会实时更新结果")),
            SliderParameter("Value", 0, 100, 65, value => slider.Value = Math.Clamp(value, slider.Minimum, slider.Maximum)),
            SliderParameter("Minimum", 0, 60, 0, value => slider.Minimum = Math.Min(value, slider.Maximum - 1)),
            SliderParameter("Maximum", 40, 200, 100, value => slider.Maximum = Math.Max(value, slider.Minimum + 1)),
            SliderParameter("TickFrequency", 1, 20, 5, value => slider.TickFrequency = value)));
    }

    private sealed record GalleryChoice(string Name, string Value)
    {
        public override string ToString() => Name;
    }
}