面向 ERP 和管理类应用的现代外壳
您有几十个现有窗体,主窗口仍通过菜单栏打开它们。在左侧放置一个侧边栏,每个区域一个条目,再让 OnSelectionChange 切换隐藏了标签页的 TPageControl 的标签页。徽标显示待处理订单或未读消息,图标栏则把空间还给各个窗体。运行 SidebarApp,即可看到该模式与 sgcDashboard 页面配合工作的效果。
- 侧边栏模式
- 徽标
- 折叠为图标栏
几分钟内为您的应用程序添加现代化导航菜单。一个控件既可以是侧边栏,也可以是手风琴,并能以流畅动画折叠为图标栏,用徽标显示未读数量,且完全支持键盘操作。内置浅色和深色主题。
十项功能,将一组页面变成用户一眼就能找到方向的导航外壳。
一个控件即可涵盖业务应用常用的两种导航样式,以及两者之间的窄图标栏。
布局与模式
大多数业务应用都需要在主窗体左侧放置同样的东西:按区域分组的页面列表,并清楚标出当前页面。把 TsgcVCLNavigationBar 放到窗体上,对齐到左侧,再添加条目即可。分组标题以柔和的颜色为其下方的行命名,且不可被选中。选中的行带有强调色淡底和 3 像素的强调色竖条,用户随时知道自己在哪里。悬停和按下状态、提示以及禁用行都已为您绘制好,所以导航栏第一次运行就显得完整。
Mode := nbmSidebar 是默认样式IsGroup 将条目变为分组标题ItemHeight 和 GroupHeight 设置行高ScrollIntoView 可显示任意条目
布局与模式
设置界面和管理控制台的分区往往多到一屏放不下。将 Mode 设为 nbmAccordion,每个分组标题就变成一个可展开和收起其下条目的分区,右侧带箭头,子条目缩进显示。默认同一时间只展开一个分组,让长菜单保持简短。如果用户需要同时打开多个分区,请设置 AllowMultiExpand。条目、事件和您的代码完全不变。位于第一个标题之前的条目不属于任何分组,始终显示,适合在各分区上方放置“首页”或“仪表盘”入口。
Mode := nbmAccordion 切换整个导航栏Expanded 可通过代码展开或收起分组AllowMultiExpand 允许多个分组同时展开Indent 设置子条目的缩进布局与模式
宽大的侧边栏会挤占用户真正想看的数据空间。设置 Collapsed 后,导航栏会在约 150 毫秒内从展开宽度折叠为窄图标栏。图标栏中只绘制图标,标题变成提示,分组标题变成分隔线,徽标变成圆点,因此不会丢失重要信息。导航栏自行设置宽度,旁边的内容用 alClient 即可自动跟随。将 Collapsed 属性绑定到汉堡按钮、用户设置或窗体宽度,图标栏在侧边栏和手风琴模式下都以相同方式展开和收起。
Collapsed 在两种宽度之间切换ExpandedWidth(220)和 CollapsedWidth(56),单位为逻辑像素AnimateCollapse 开启或关闭动画OnCollapsedChange 在图标栏展开或收起时通知您布局与模式
导航栏只有在切换用户所见内容时才有用。点击或轻触一个已启用的条目,导航栏会选中它,触发 OnItemClick,然后运行该条目的 OnClick。OnSelectionChange 是显示对应页面的唯一位置,例如隐藏了标签页的 TPageControl 的标签页,SidebarApp 演示正是这样构建的。SelectedIndex 可通过代码读取和设置当前页面。对用户暂时无法访问的条目,可以将其禁用并在提示中说明原因,或对不应看到它的角色将其隐藏,选择逻辑照常工作。
SelectedIndex 是用户选择的页面OnSelectionChange 切换页面或框架OnItemClick 和每个条目的 OnClickEnabled、Hint 和 Visible每一行承载的不只是标题:还有图标、计数,以及与您已编写逻辑的链接。
传递信息的条目
用户应该在打开页面之前就看到有事项需要处理。为条目设置 Badge,例如未读数量或“New”字样,导航栏会在行右侧以强调色胶囊形式绘制,文字为黑色或白色,以更清晰者为准。数值变化时通过代码设置,导航栏会自动重绘。在折叠的图标栏中,徽标会变成图标上的圆点。由于徽标是纯文本,同一个属性即可涵盖数量、短标签和状态词,无需任何自定义绘制代码。
Badge 是每个条目的一段短文本Badge 不绘制任何内容AccentColorHint 搭配可解释计数的含义
传递信息的条目
每一行都有一个图标位。让导航栏指向您已在使用的图像列表,并为每个条目设置 ImageIndex,带掩码的图像或 32 位图像只转换一次并缓存,直到列表更改。还没有图像列表?可以改设 Glyph,即一个随主题颜色变化的字母或短符号,演示程序就是这样显示的。禁用的条目以 40% 的不透明度绘制图像,状态一目了然。两者混用也没问题:有图像索引的条目显示图像,其余条目回退为字形,所以您可以逐步添加图标。
Images 和 ImageIndex 用于图像列表Glyph 用于无需图像的字母或符号传递信息的条目 仅限注册版
基于 TActionList 构建的应用程序已将命令、标题和启用规则集中在一处。通过 Action 属性将条目关联到任意 VCL 或 FireMonkey 的 TAction,其 Caption、Enabled、Visible、Hint 和 ImageIndex 会跟随该操作。点击时会以导航栏作为 ActionComponent 执行该操作,OnUpdate 在空闲时运行,因此操作一旦被禁用,条目立即变灰。在 .NET 中,由 Command 和 CommandParameter 完成同样的工作。一个 TActionList 即可同时驱动窗体的菜单、工具栏和键盘快捷键。
Action 将条目关联到任意 TBasicActionOnClick 会取代该操作运行SGC_NAVIGATION_ACTIONS 下编译Command 和 CommandParameter社区版:请改为指定条目的 OnClick 或导航栏的 OnItemClick,而不是操作。
阅读帮助主题这些细节让导航栏更有原生质感,并与您应用程序的其余部分保持一致。
键盘、主题与输出
高级用户无需鼠标即可切换页面,无障碍评审也对此有要求。导航栏可通过 Tab 获得焦点,并在可见且已启用的条目上移动焦点行:上下键逐行移动,Home 和 End 跳转,Enter 或空格激活。在手风琴中,左键收起分组,右键展开分组。虚线焦点框只在使用键盘时出现,焦点与选中的页面相互独立。FireMonkey 导航栏通过 CanFocus 支持相同的按键,因此桌面用户在每个平台上都能获得相同的行为。
TabStopFocusedIndex 是键盘所在的行SelectedIndex 仍是所选页面
键盘、主题与输出
忽略应用程序主题的菜单看起来像是硬加上去的。Theme 根据共享的 sgcUICore 令牌设置表面、边框、文字、分组标题、悬停和强调色,因此使用相同 Theme 的导航栏和 sgcDashboard 完全匹配。AccentColor 会用您的品牌色替换选中条、焦点框和徽标的强调色。放在仪表盘磁贴中的导航栏会自动跟随仪表盘的主题。在运行时切换主题,导航栏会立即重绘,方便您在设置页面中加入深色模式开关。
Theme:utDefault(默认,跟随应用程序主题)、utLight 或 utDarkAccentColor 为 $AARRGGBB 值,0 表示沿用主题强调色
键盘、主题与输出
文档、可视化测试和 Web 后端有时需要的是菜单的图片,而不是菜单本身。sgcNavigation_Render 中的渲染器无需窗口,也无需 VCL 或 FireMonkey,即可绘制 TsgcNavigationModel,因此控制台程序、服务或服务器都能将同一个导航栏输出为 PNG 或 SVG。该单元可在所有平台上构建,包括 Linux64,缩放参数可为高 DPI 屏幕生成清晰的图像。将您的图像列表传给渲染器,导出的图片就会显示与运行中的应用程序相同的图标。
sgcNavigationSaveToPNG 写入 PNG 文件或流sgcNavigationSaveToSVG 将同一导航栏写为 SVGsgcNavigationRender 可在任意 sgcUICore 画布上绘制sgcUI 套件演示中的 sgcNavigation:使用内置模拟数据、可离线运行的完整应用程序。
ERP 侧边栏把十个模块归入六个标题之下。
Altamira ERP →
交易台外壳:已折叠的图标栏位于交易台旁。
Altamira Markets →
浅色主题下的控制室外壳。
Altamira Plant →
PMO 侧边栏,带风险和超负荷人员的实时徽章。
Altamira PMO →
您有几十个现有窗体,主窗口仍通过菜单栏打开它们。在左侧放置一个侧边栏,每个区域一个条目,再让 OnSelectionChange 切换隐藏了标签页的 TPageControl 的标签页。徽标显示待处理订单或未读消息,图标栏则把空间还给各个窗体。运行 SidebarApp,即可看到该模式与 sgcDashboard 页面配合工作的效果。
配置界面会把几十个页面归入“Sales”“Inventory”和“Admin”等几个标题之下。手风琴一次只展开一个分区,使用 AllowMultiExpand 则可展开多个,Action 关联则复用您 TActionList 中的命令和启用规则。键盘用户可用方向键在各分区之间移动。Accordion 演示包含三个分组、一个展开开关和一个点击日志。
在 Windows、macOS、iOS 和 Android 上运行的 FireMonkey 应用程序,不应该在每个平台上使用不同的菜单。TsgcFMXNavigationBar 的条目、模式和事件与 VCL 导航栏相同,适用于 WinForms、WPF 和 Avalonia 的 .NET 导航栏也沿用相同的名称。同时发布 Delphi 桌面应用和 .NET 工具的团队只需保持一套思维模型。SidebarFMX 是侧边栏演示的 FireMonkey 版本。
Delphi、C++ Builder 和 C# 中使用相同的 API:带分组、徽标、禁用条目和折叠按钮的手风琴导航栏。
procedure TMainForm.CreateNavigation;
var
oItem: TsgcNavigationItem;
begin
// an accordion bar on the left, dark theme, several groups open at once
FNav := TsgcVCLNavigationBar.Create(Self);
FNav.Parent := Self;
FNav.Align := alLeft;
FNav.Mode := nbmAccordion;
FNav.AllowMultiExpand := True;
FNav.Theme := utDark;
// a group header (third parameter True), then the items under it
FNav.Items.AddItem('Sales', '', True);
FNav.Items.AddItem('Orders', 'O');
FNav.Items.AddItem('Invoices', 'I').Badge := '3';
FNav.Items.AddItem('Admin', '', True);
oItem := FNav.Items.AddItem('Users', 'U');
oItem.Hint := 'Manage the users';
oItem := FNav.Items.AddItem('Billing', 'B');
oItem.Enabled := False;
FNav.SelectedIndex := 1;
FNav.OnItemClick := NavItemClick;
FNav.OnSelectionChange := NavSelectionChange;
// a Collapse button folds the bar into an icon rail with an animation
FNav.AnimateCollapse := True;
FButton.Caption := 'Collapse';
FButton.OnClick := ButtonClick;
end;
procedure TMainForm.NavItemClick(Sender: TObject; aItem: TsgcNavigationItem);
begin
Caption := 'Clicked: ' + aItem.Caption;
end;
procedure TMainForm.NavSelectionChange(Sender: TObject);
begin
FPanel.Caption := FNav.Items[FNav.SelectedIndex].Caption + ' page';
end;
procedure TMainForm.ButtonClick(Sender: TObject);
begin
FNav.Collapsed := not FNav.Collapsed;
end;#include <vcl.h>
#include <Vcl.ExtCtrls.hpp>
#include "sgcUICore_Theme.hpp"
#include "sgcNavigation_Model.hpp"
#include "sgcNavigation_VCL.hpp"
class TNavHandler : public TObject
{
public:
TsgcVCLNavigationBar *Nav;
TPanel *Content;
void __fastcall ItemClick(TObject *Sender, TsgcNavigationItem *aItem);
void __fastcall SelectionChange(TObject *Sender);
void __fastcall CollapseClick(TObject *Sender);
};
void __fastcall TNavHandler::ItemClick(TObject *Sender, TsgcNavigationItem *aItem)
{
Content->Caption = "Clicked: " + aItem->Caption;
}
void __fastcall TNavHandler::SelectionChange(TObject *Sender)
{
Content->Caption = Nav->Items->Items[Nav->SelectedIndex]->Caption + " page";
}
void __fastcall TNavHandler::CollapseClick(TObject *Sender)
{
Nav->Collapsed = !Nav->Collapsed; // animated fold into an icon rail
}
void __fastcall CreateNavigation(TForm *Form, TNavHandler *Handler)
{
// an accordion bar on the left, dark theme, several groups open at once
TsgcVCLNavigationBar *Nav = new TsgcVCLNavigationBar(Form);
Nav->Parent = Form;
Nav->Align = alLeft;
Nav->Mode = nbmAccordion;
Nav->AllowMultiExpand = true;
Nav->AnimateCollapse = true;
Nav->Theme = utDark;
// a group header (third parameter true), then the items under it
Nav->Items->AddItem("Sales", "", true);
Nav->Items->AddItem("Orders", "O", false);
Nav->Items->AddItem("Invoices", "I", false)->Badge = "3";
Nav->Items->AddItem("Admin", "", true);
Nav->Items->AddItem("Users", "U", false)->Hint = "Manage the users";
Nav->Items->AddItem("Billing", "B", false)->Enabled = false;
Nav->SelectedIndex = 1;
TPanel *Content = new TPanel(Form);
Content->Parent = Form;
Content->Align = alClient;
Handler->Nav = Nav;
Handler->Content = Content;
Nav->OnItemClick = Handler->ItemClick;
Nav->OnSelectionChange = Handler->SelectionChange;
TButton *Button = new TButton(Form);
Button->Parent = Content;
Button->Caption = "Collapse";
Button->OnClick = Handler->CollapseClick;
}using System;
using System.Windows.Forms;
using esegece.sgcUICore;
using esegece.sgcNavigation;
internal class MainForm : Form
{
private readonly TsgcWinFormsNavigationBar Nav = new TsgcWinFormsNavigationBar();
private readonly Label lblPage = new Label { Dock = DockStyle.Fill };
private readonly Button btnCollapse = new Button { Text = "Collapse", Dock = DockStyle.Top };
public MainForm()
{
// an accordion bar on the left, dark theme, several groups open at once
Nav.Dock = DockStyle.Left;
Nav.Mode = TsgcNavigationMode.nbmAccordion;
Nav.AllowMultiExpand = true;
Nav.AnimateCollapse = true;
Nav.Theme = TsgcUITheme.utDark;
// a group header (third parameter true), then the items under it
Nav.Items.AddItem("Sales", "", true);
Nav.Items.AddItem("Orders", "O");
Nav.Items.AddItem("Invoices", "I").Badge = "3";
Nav.Items.AddItem("Admin", "", true);
Nav.Items.AddItem("Users", "U").Hint = "Manage the users";
Nav.Items.AddItem("Billing", "B").Enabled = false;
Nav.SelectedIndex = 1;
Nav.OnItemClick = (sender, item) => Text = "Clicked: " + item.Caption;
Nav.OnSelectionChange = sender => lblPage.Text = Nav.Items[Nav.SelectedIndex].Caption + " page";
// the Collapse button folds the bar into an icon rail with an animation
btnCollapse.Click += (s, e) => Nav.Collapsed = !Nav.Collapsed;
Controls.Add(lblPage);
Controls.Add(btnCollapse);
Controls.Add(Nav);
}
}dotnet add package esegece.sgcNavigation.WinFormsSidebarApp 和 Accordion 演示提供 VCL 和 C++ Builder 版本,以及适用于 Delphi 的 FireMonkey 版本;.NET 版本则提供 WinForms、WPF 和 Avalonia 项目。
一个驱动隐藏标签页 PageControl 的侧边栏,带图标、徽标、禁用条目、折叠按钮、主题下拉框和 sgcDashboard KPI 页面。完整验证应用外壳模式。
三个分组 Sales、Inventory 和 Admin,一个 AllowMultiExpand 开关、Action 关联和点击日志。它使用了 Action 关联,因此需要注册版或试用版。
使用 TsgcFMXNavigationBar 为 FireMonkey 构建的侧边栏演示,仅适用于 Delphi。条目、模式和事件与 VCL 版本相同,可用于 Windows、macOS 和移动平台。
sgcNavigation 包含在每个 sgcUI 版本中(从 Standard 起),也可单独购买。sgcNavigation 同时包含在 All-Access 捆绑包中。
免费的社区版(NuGet 上的 esegece.sgcNavigation.Community)包含除条目 Action 关联之外的所有功能。
| 功能 | 社区版(免费) | 注册版 |
|---|---|---|
| Sidebar and accordion modes | ✓ | ✓ |
| Collapse to an animated icon rail | ✓ | ✓ |
| Icons, glyphs and badges | ✓ | ✓ |
| Keyboard navigation | ✓ | ✓ |
| Light and dark themes, accent colour | ✓ | ✓ |
| Headless PNG and SVG output | ✓ | ✓ |
| Action links (Delphi) and Command (.NET) | − | ✓ |
| 组件 | 目标 |
|---|---|
| TsgcVCLNavigationBar | Delphi 和 C++ Builder,VCL (sgcNavigation_VCL) |
| TsgcFMXNavigationBar | Delphi 和 C++ Builder,FireMonkey (sgcNavigation_FMX) |
| TsgcNavigationItem, TsgcNavigationItems, TsgcNavigationModel | 框架无关的模型 (sgcNavigation_Model) |
| TsgcWinFormsNavigationBar | .NET,WinForms |
| TsgcWpfNavigationBar | .NET,WPF |
| TsgcAvaloniaNavigationBar | .NET,Avalonia |
| 目标 | 组件 | 平台 |
|---|---|---|
| Delphi 7 至 13,VCL | TsgcVCLNavigationBar | Win32 和 Win64 |
| Delphi XE6 至 13,FireMonkey | TsgcFMXNavigationBar | Windows、macOS、iOS、Android 和 Linux (FMXLinux) |
| C++ Builder 2007 至 13 | TsgcVCLNavigationBar, TsgcFMXNavigationBar | 生成的 .hpp 头文件和静态库 |
| Delphi 10.2 至 13,框架无关 | 模型和无界面 PNG 与 SVG 渲染器 | Linux64,例如在服务器上渲染导航栏 |
| .NET Framework 4.7.2、.NET 8、9 和 10 | TsgcWinFormsNavigationBar、WPF 和 Avalonia 导航栏 | WinForms、WPF 和 Avalonia |
两者都有。Mode 属性可在同一个控件上于 nbmSidebar 和 nbmAccordion 之间切换,条目和事件完全相同,因此您可以在项目后期改变主意,或将两种样式作为用户偏好提供。每种模式也都可以折叠为图标栏。
可以。处理 OnSelectionChange,显示与 SelectedIndex 对应的页面,例如隐藏了标签页的 TPageControl 的标签页,或按需创建框架。SidebarApp 演示正是这样构建的,并承载了一个 sgcDashboard KPI 页面。
支持。TsgcFMXNavigationBar 自 Delphi XE6 起面向 Windows、macOS、iOS、Android 和 Linux (FMXLinux),条目、模式和事件与 VCL 导航栏相同。FireMonkey 图像列表需要 Delphi XE8 或更高版本;更早的版本请使用每个条目的 Glyph。
仅缺少条目的 Action 关联,在 .NET 中即 Command 和 CommandParameter 属性。请改用条目的 OnClick 或导航栏的 OnItemClick。其他所有功能,包括图标栏、徽标、主题和无界面输出,社区版都有。请参阅版本。
不可以。.NET 移植版没有设计器动词或集合编辑器,因此条目不会被序列化,需要在代码中添加,通常放在窗体或窗口的构造函数中。在 Delphi 和 C++ Builder 中,Items 集合可在设计时用标准集合编辑器编辑。
清晰。所有尺寸都是逻辑像素乘以显示器的缩放比例,因此行、图标和徽标在任何 DPI 下都很清晰。在 WinForms 中,宽度和高度与 VCL 一样按 DPI / 96 缩放,在 WPF 和 Avalonia 中则使用设备无关单位。
可以。sgcNavigationSaveToPNG 和 sgcNavigationSaveToSVG 无需窗口,也无需 VCL 或 FireMonkey,即可根据模型渲染导航栏,自 Delphi 10.2 起在 Linux64 上同样可用。可用于文档、视觉回归测试,或展示应用程序菜单的网页。
Delphi、C++ Builder 和 .NET,涵盖每款 sgcUI 产品。