394 lines
14 KiB
C#
394 lines
14 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|
||
}
|