antdui-demo/MainWindow.cs

394 lines
14 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AntdUI;
using AntdUIDemo.Controls;
using AntdUIDemo.Models;
using AntdUIDemo.Utils;
using AntdUIDemo.Views;
using AntdUIDemo.Views.SubView;
using Microsoft.Win32;
using System;
using System.Linq;
using System.Windows.Forms;
namespace AntdUIDemo
{
public partial class MainWindow : AntdUI.Window
{
private UserControl currControl;
private bool isUpdatingTabs = false;
private bool isLight = true;
public MainWindow()
{
InitializeComponent();
//加载菜单
LoadMenu();
//加载欢迎页
InitData();
//绑定事件
BindEventHandler();
}
private void InitData()
{
//根据系统亮暗初始化一次
isLight = ThemeHelper.IsLightMode();
button_color.Toggle = !isLight;
ThemeHelper.SetColorMode(this, isLight);
UserControl control = new Wellcome { Dock = DockStyle.Fill };
AutoDpi(control);
panel_content.Controls.Add(control);
}
private void BindEventHandler()
{
buttonSZ.Click += ButtonSZ_Click;
button_color.Click += Button_color_Click;
input_search.TextChanged += Input_search_textchanged;
menu.SelectChanged += Menu_SelectChanged;
button_collapse.Click += Button_collapse_Click;
tabs.SelectedIndexChanged += Tabs_SelectedIndexChanged;
//监听系统深浅色变化
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
}
private void Tabs_SelectedIndexChanged(object sender, IntEventArgs e)
{
if (isUpdatingTabs) return;
var text = tabs.SelectedTab?.Text; // 使用安全导航操作符,防止 SelectedTab 为 null
if (string.IsNullOrEmpty(text)) // 检查 text 是否为 null 或空
{
return; // 如果 text 为空,直接退出方法
}
//首页
if (text == "首页")
{
return;
}
var rootIndex = 0;
var subIndex = 0;
var menuItemsCopy = menu.Items.ToList(); // 创建副本
for (int i = 0; i < menuItemsCopy.Count; i++)
{
for (int j = 0; j < menuItemsCopy[i].Sub.Count; j++)
{
if (menuItemsCopy[i].Sub[j].Tag.ToString() == text)
{
rootIndex = i;
subIndex = j;
break;
}
}
}
menu.SelectIndex(rootIndex, subIndex, true);
}
private void Button_collapse_Click(object sender, EventArgs e)
{
if (menu.Collapsed)
{
menu.Width = (int)(250 * Config.Dpi);
}
else
{
menu.Width = (int)(50 * Config.Dpi);
}
button_collapse.Toggle = !button_collapse.Toggle;
menu.Collapsed = !menu.Collapsed;
}
private void Input_search_textchanged(object sender, EventArgs e)
{
titlebar.Loading = true;
var text = input_search.Text.ToLower(); // 将输入文本转换为小写,确保搜索不区分大小写
LoadMenu(text); // 传递搜索文本
titlebar.Loading = false;
}
private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
if (e.Category == UserPreferenceCategory.General)
{
isLight = ThemeHelper.IsLightMode();
button_color.Toggle = !isLight;
ThemeHelper.SetColorMode(this, isLight);
}
}
private void Button_color_Click(object sender, EventArgs e)
{
isLight = !isLight;
//这里使用了Toggle属性切换图标
button_color.Toggle = !isLight;
ThemeHelper.SetColorMode(this, isLight);
}
private void ButtonSZ_Click(object sender, EventArgs e)
{
using (var form = new SystemSet(this))
{
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "系统设置", form, TType.Info)
{
CloseIcon = true,
BtnHeight = 0,
});
}
}
private void LoadMenu(string filter = "")
{
menu.Items.Clear();
foreach (var rootItem in DataUtil.MenuItems)
{
var rootKey = rootItem.Key.ToLower();
var rootMenu = new AntdUI.MenuItem { Text = rootItem.Key, IconSvg = DataUtil.MenuIcons.TryGetValue(rootItem.Key, out var icon) ? icon : "UnorderedListOutlined" };
bool rootVisible = false; // 用于标记是否显示根节点
foreach (var item in rootItem.Value)
{
var childText = item.Text.ToLower();
// 如果子节点包含搜索文本
if (childText.Contains(filter))
{
var menuItem = new AntdUI.MenuItem
{
Text = item.Text,
IconSvg = item.IconSvg,
Tag = item.Tag,
};
rootMenu.Sub.Add(menuItem);
rootVisible = true; // 如果有子节点包含,则显示根节点
}
}
// 如果根节点包含搜索文本,或有可见的子节点,则显示根节点
if (rootKey.Contains(filter) || rootVisible)
{
menu.Items.Add(rootMenu);
}
}
}
private void Menu_SelectChanged(object sender, MenuSelectEventArgs e)
{
string name = (string)e.Value.Tag;
// 如果上一个组件是 FloatButtonDemo清理其浮动按钮窗体
if (currControl is FloatButtonDemo floatButtonDemo)
{
floatButtonDemo.CloseFloatButtonForm();
}
// 检查是否已存在同名 TabPage
foreach (var tab in tabs.Pages)
{
if (tab is AntdUI.TabPage existingTab && existingTab.Text == name)
{
tabs.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage
currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null;
return;
}
}
// 如果不存在相应的 TabPage创建新的
UserControl control = null;
switch (name)
{
case "Button":
control = new ButtonDemo();
break;
case "FloatButton":
control = new FloatButtonDemo(this);
break;
case "Icon":
control = new IconDemo(this);
break;
case "Divider":
control = new DividerDemo();
break;
case "FlowPanel":
control = new FlowPanelDemo(this);
break;
case "GridPanel":
control = new GridPanelDemo();
break;
case "Panel":
control = new PanelDemo();
break;
case "StackPanel":
control = new StackPanelDemo();
break;
case "Breadcrumb":
control = new BreadcrumbDemo();
break;
case "Dropdown":
control = new DropDownDemo();
break;
case "Menu":
control = new MenuDemo();
break;
case "Pagination":
control = new PaginationDemo();
break;
case "Steps":
control = new StepsDemo();
break;
case "Checkbox":
control = new CheckBoxDemo();
break;
case "ColorPicker":
control = new ColorPickerDemo();
break;
case "DatePicker":
control = new DatePickerDemo();
break;
case "DatePickerRange":
control = new DatePickerRangeDemo();
break;
case "Input":
control = new InputDemo();
break;
case "InputNumber":
control = new InputNumberDemo();
break;
case "Radio":
control = new RadioDemo();
break;
case "Rate":
control = new RateDemo();
break;
case "Select":
control = new SelectDemo();
break;
case "SelectMultiple":
control = new SelectMultipleDemo();
break;
case "Slider":
control = new SliderDemo();
break;
case "SliderRange":
control = new SliderRangeDemo();
break;
case "Switch":
control = new SwitchDemo();
break;
case "TimePicker":
control = new TimePickerDemo();
break;
case "UploadDragger":
control = new UploadDraggerDemo(this);
break;
case "Avatar":
control = new AvatarDemo();
break;
case "Badge":
control = new BadgeDemo();
break;
case "Calendar":
control = new CalendarDemo(this);
break;
case "Carousel":
control = new CarouselDemo();
break;
case "Collapse":
control = new CollapseDemo(this);
break;
case "Label":
control = new LabelDemo();
break;
case "LabelTime":
control = new LabelTimeDemo();
break;
case "Popover":
control = new PopoverDemo(this);
break;
case "Preview":
control = new PreviewDemo(this);
break;
case "Segmented":
control = new SegmentedDemo();
break;
case "Table":
control = new TableDemo(this);
break;
case "Tabs":
control = new TabsDemo(this);
break;
case "Tag":
control = new TagDemo();
break;
case "Timeline":
control = new TimelineDemo();
break;
case "Tooltip":
control = new TooltipDemo();
break;
case "Tree":
control = new TreeDemo();
break;
case "Alert":
control = new AlertDemo();
break;
case "Drawer":
control = new DrawerDemo(this);
break;
case "Message":
control = new MessageDemo(this);
break;
case "Modal":
control = new ModalDemo(this);
break;
case "Notification":
control = new NotificationDemo(this);
break;
case "Progress":
control = new ProgressDemo();
break;
case "Spin":
control = new SpinDemo(this);
break;
case "ChatList":
control = new ChatListDemo();
break;
case "MsgList":
control = new MsgListDemo();
break;
case "Battery":
control = new BatteryDemo();
break;
case "ContextMenuStrip":
control = new ContextMenuStripDemo(this);
break;
case "Image3D":
control = new Image3DDemo();
break;
case "PageHeader":
control = new PageHeaderDemo(this);
break;
case "Signal":
control = new SignalDemo();
break;
default:
break;
}
if (control != null)
{
//容器添加控件需要调整dpi
control.Dock = DockStyle.Fill;
AutoDpi(control);
AntdUI.TabPage tabPage = new AntdUI.TabPage()
{
Text = name,
};
tabPage.Controls.Add(control);
tabs.Pages.Add(tabPage);
isUpdatingTabs = true;
tabs.SelectedTab = tabPage;
isUpdatingTabs = false;
currControl = control;
}
}
}
}