500 lines
18 KiB
C#
500 lines
18 KiB
C#
using AntdUI;
|
||
using AntdUIDemo.Controls;
|
||
using AntdUIDemo.Languages;
|
||
using AntdUIDemo.Models;
|
||
using AntdUIDemo.Utils;
|
||
using AntdUIDemo.Views;
|
||
using AntdUIDemo.Views.SubView;
|
||
using Microsoft.Win32;
|
||
using System;
|
||
using System.CodeDom;
|
||
using System.Linq;
|
||
using System.Windows.Forms;
|
||
|
||
namespace AntdUIDemo
|
||
{
|
||
public partial class MainWindow : AntdUI.Window
|
||
{
|
||
private UserControl currControl;
|
||
private bool isUpdatingTabs = false;//用于阻止Tabs更新
|
||
private bool isLight = true;
|
||
// 定义一个语言切换事件
|
||
public event EventHandler LanguageChanged;
|
||
public MainWindow()
|
||
{
|
||
InitializeComponent();
|
||
//加载菜单
|
||
LoadMenu();
|
||
//初始化数据
|
||
InitData();
|
||
//绑定事件
|
||
BindEventHandler();
|
||
}
|
||
|
||
// 触发事件
|
||
protected virtual void OnLanguageChanged(EventArgs e)
|
||
{
|
||
LanguageChanged?.Invoke(this, e);
|
||
}
|
||
|
||
private void InitData()
|
||
{
|
||
dropdown_translate.SelectedValue = dropdown_translate.Items[0];
|
||
//根据系统亮暗初始化一次
|
||
isLight = ThemeHelper.IsLightMode();
|
||
button_color.Toggle = !isLight;
|
||
ThemeHelper.SetColorMode(this, isLight);
|
||
//初始化消息弹出位置
|
||
Config.ShowInWindow = true;
|
||
|
||
UserControl control = new Wellcome { Dock = DockStyle.Fill };
|
||
AutoDpi(control);
|
||
panel_content.Controls.Add(control);
|
||
|
||
//global
|
||
tabs.Pages[0].Text = AntdUI.Localization.Get("home", "主页");
|
||
}
|
||
|
||
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.Click += Tabs_Click;
|
||
tabs.SelectedIndexChanged += Tabs_SelectedIndexChanged;
|
||
dropdown_translate.SelectedValueChanged += Dropdown_translate_SelectedValueChanged;
|
||
//监听系统深浅色变化
|
||
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
|
||
}
|
||
|
||
private void Tabs_Click(object sender, EventArgs e)
|
||
{
|
||
// 强制转换 EventArgs 为 MouseEventArgs
|
||
MouseEventArgs mouseEventArgs = e as MouseEventArgs;
|
||
|
||
if (mouseEventArgs != null)
|
||
{
|
||
if (mouseEventArgs.Button == MouseButtons.Right)
|
||
{
|
||
string closeall = AntdUI.Localization.Get("closeall", "关闭所有选项卡");
|
||
var menulist = new AntdUI.IContextMenuStripItem[]
|
||
{
|
||
new AntdUI.ContextMenuStripItem(closeall)
|
||
{
|
||
IconSvg= "CloseOutlined"
|
||
}
|
||
};
|
||
|
||
AntdUI.ContextMenuStrip.open(tabs, item =>
|
||
{
|
||
if (item.Text == closeall)
|
||
{
|
||
tabs.SelectedIndex = 0;
|
||
// 只清除从第二个页面开始的控件
|
||
for (int i = 1; i < tabs.Pages.Count; i++)
|
||
{
|
||
tabs.Pages[i].Controls.Clear();
|
||
}
|
||
|
||
// 移除除了第一个页面之外的所有页面
|
||
if (tabs.Pages.Count > 1)
|
||
{
|
||
tabs.Pages.RemoveRange(1, tabs.Pages.Count - 1); // 从索引1开始,移除后面的所有页面
|
||
}
|
||
}
|
||
|
||
}, menulist);
|
||
}
|
||
}
|
||
}
|
||
|
||
private void Dropdown_translate_SelectedValueChanged(object sender, ObjectNEventArgs e)
|
||
{
|
||
dropdown_translate.SelectedValue = e.Value;
|
||
if (e.Value.ToString() == "English")
|
||
{
|
||
AntdUI.Localization.Provider = new Localizer_enus();
|
||
AntdUI.Localization.SetLanguage("en-US");
|
||
}
|
||
else
|
||
{
|
||
AntdUI.Localization.Provider = null;
|
||
AntdUI.Localization.SetLanguage("zh-CN");
|
||
}
|
||
tabs.Pages[0].Text = AntdUI.Localization.Get("home", "主页");
|
||
|
||
Refresh();
|
||
LoadMenu();
|
||
SelectMenu();
|
||
//通知子窗口
|
||
OnLanguageChanged(EventArgs.Empty);
|
||
}
|
||
|
||
private void Tabs_SelectedIndexChanged(object sender, IntEventArgs e)
|
||
{
|
||
SelectMenu();
|
||
}
|
||
|
||
private void Button_collapse_Click(object sender, EventArgs e)
|
||
{
|
||
if (menu.Collapsed)
|
||
{
|
||
menu.Width = (int)(250 * Config.Dpi);
|
||
}
|
||
else
|
||
{
|
||
menu.Width = (int)(70 * 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))
|
||
{
|
||
string title = AntdUI.Localization.Get("systemset", "系统设置");
|
||
AntdUI.Modal.open(new AntdUI.Modal.Config(this, title, form, TType.Info)
|
||
{
|
||
CloseIcon = true,
|
||
BtnHeight = 0,
|
||
});
|
||
}
|
||
}
|
||
|
||
private void LoadMenu(string filter = "")
|
||
{
|
||
menu.Items.Clear();
|
||
|
||
string lang = AntdUI.Localization.CurrentLanguage;
|
||
var menuItems = DataUtil.MenuItems_zhcn;
|
||
var menuIcons = DataUtil.MenuIcons_zhcn;
|
||
if (lang.StartsWith("en"))
|
||
{
|
||
menuItems = DataUtil.MenuItems_enus;
|
||
menuIcons = DataUtil.MenuIcons_enus;
|
||
}
|
||
|
||
foreach (var rootItem in menuItems)
|
||
{
|
||
var rootKey = rootItem.Key.ToLower();
|
||
var rootMenu = new AntdUI.MenuItem
|
||
{
|
||
Text = rootItem.Key,
|
||
IconSvg = 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 SelectMenu()
|
||
{
|
||
if (isUpdatingTabs) return;
|
||
var text = tabs.SelectedTab?.Text; // 使用安全导航操作符,防止 SelectedTab 为 null
|
||
if (string.IsNullOrEmpty(text)) // 检查 text 是否为 null 或空
|
||
{
|
||
return; // 如果 text 为空,直接退出方法
|
||
}
|
||
//首页
|
||
if (text == AntdUI.Localization.Get("home", "主页"))
|
||
{
|
||
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 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)
|
||
{
|
||
isUpdatingTabs = true;
|
||
tabs.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage
|
||
isUpdatingTabs = false;
|
||
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);
|
||
this.LanguageChanged += ((IconDemo)control).OnLanguageChanged;
|
||
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 "Splitter":
|
||
control = new SplitterDemo();
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
}
|