Delphi、C++ Builder 和 .NET sgcUI 套件成员

sgcNavigation,适用于 Delphi、C++ Builder 和 .NET 的侧边栏与手风琴导航栏

几分钟内为您的应用程序添加现代化导航菜单。一个控件既可以是侧边栏,也可以是手风琴,并能以流畅动画折叠为图标栏,用徽标显示未读数量,且完全支持键盘操作。内置浅色和深色主题。

VCL、FireMonkey、WinForms、WPF、AvaloniaDelphi 7 至 13 和 C++ Builder 2007 至 13免费的 .NET 社区版包含在 sgcUI Standard 中
SidebarApp 演示:侧边栏包含“工作区”和“业务”分组的 8 个条目,已选中“仪表盘”,右侧有两张 KPI 卡片

应用菜单所需的一切功能

十项功能,将一组页面变成用户一眼就能找到方向的导航外壳。

布局与模式

一个控件即可涵盖业务应用常用的两种导航样式,以及两者之间的窄图标栏。

一个组件打造现代应用侧边栏

布局与模式

一个组件打造现代应用侧边栏

大多数业务应用都需要在主窗体左侧放置同样的东西:按区域分组的页面列表,并清楚标出当前页面。把 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 和每个条目的 OnClick
  • 每个条目的 Enabled、Hint 和 Visible
阅读帮助主题

传递信息的条目

每一行承载的不只是标题:还有图标、计数,以及与您已编写逻辑的链接。

用徽标显示未读数量

传递信息的条目

用徽标显示未读数量

用户应该在打开页面之前就看到有事项需要处理。为条目设置 Badge,例如未读数量或“New”字样,导航栏会在行右侧以强调色胶囊形式绘制,文字为黑色或白色,以更清晰者为准。数值变化时通过代码设置,导航栏会自动重绘。在折叠的图标栏中,徽标会变成图标上的圆点。由于徽标是纯文本,同一个属性即可涵盖数量、短标签和状态词,无需任何自定义绘制代码。

  • Badge 是每个条目的一段短文本
  • 空的 Badge 不绘制任何内容
  • 胶囊使用主题强调色或您的 AccentColor
  • 与 Hint 搭配可解释计数的含义
阅读帮助主题
来自图像列表的图标或字形

传递信息的条目

来自图像列表的图标或字形

每一行都有一个图标位。让导航栏指向您已在使用的图像列表,并为每个条目设置 ImageIndex,带掩码的图像或 32 位图像只转换一次并缓存,直到列表更改。还没有图像列表?可以改设 Glyph,即一个随主题颜色变化的字母或短符号,演示程序就是这样显示的。禁用的条目以 40% 的不透明度绘制图像,状态一目了然。两者混用也没问题:有图像索引的条目显示图像,其余条目回退为字形,所以您可以逐步添加图标。

  • Images 和 ImageIndex 用于图像列表
  • Glyph 用于无需图像的字母或符号
  • VCL 按图像自身尺寸绘制
  • FireMonkey 图像列表自 Delphi XE8 起支持
阅读帮助主题

传递信息的条目 仅限注册版

将条目关联到您的 TAction

基于 TActionList 构建的应用程序已将命令、标题和启用规则集中在一处。通过 Action 属性将条目关联到任意 VCL 或 FireMonkey 的 TAction,其 Caption、Enabled、Visible、Hint 和 ImageIndex 会跟随该操作。点击时会以导航栏作为 ActionComponent 执行该操作,OnUpdate 在空闲时运行,因此操作一旦被禁用,条目立即变灰。在 .NET 中,由 Command 和 CommandParameter 完成同样的工作。一个 TActionList 即可同时驱动窗体的菜单、工具栏和键盘快捷键。

  • Action 将条目关联到任意 TBasicAction
  • 条目的 OnClick 会取代该操作运行
  • 在 SGC_NAVIGATION_ACTIONS 下编译
  • .NET:通过 ICommand 使用 Command 和 CommandParameter

社区版:请改为指定条目的 OnClick 或导航栏的 OnItemClick,而不是操作。

阅读帮助主题

键盘、主题与输出

这些细节让导航栏更有原生质感,并与您应用程序的其余部分保持一致。

键盘优先的导航

键盘、主题与输出

键盘优先的导航

高级用户无需鼠标即可切换页面,无障碍评审也对此有要求。导航栏可通过 Tab 获得焦点,并在可见且已启用的条目上移动焦点行:上下键逐行移动,Home 和 End 跳转,Enter 或空格激活。在手风琴中,左键收起分组,右键展开分组。虚线焦点框只在使用键盘时出现,焦点与选中的页面相互独立。FireMonkey 导航栏通过 CanFocus 支持相同的按键,因此桌面用户在每个平台上都能获得相同的行为。

  • VCL 导航栏默认开启 TabStop
  • 模型的 FocusedIndex 是键盘所在的行
  • SelectedIndex 仍是所选页面
  • 在折叠的图标栏中,提示会显示标题
阅读帮助主题
浅色、深色和您的强调色

键盘、主题与输出

浅色、深色和您的强调色

忽略应用程序主题的菜单看起来像是硬加上去的。Theme 根据共享的 sgcUICore 令牌设置表面、边框、文字、分组标题、悬停和强调色,因此使用相同 Theme 的导航栏和 sgcDashboard 完全匹配。AccentColor 会用您的品牌色替换选中条、焦点框和徽标的强调色。放在仪表盘磁贴中的导航栏会自动跟随仪表盘的主题。在运行时切换主题,导航栏会立即重绘,方便您在设置页面中加入深色模式开关。

  • Theme:utDefault(默认,跟随应用程序主题)、utLight 或 utDark
  • AccentColor 为 $AARRGGBB 值,0 表示沿用主题强调色
  • 与每款 sgcUI 产品使用相同的令牌
  • 仪表盘磁贴会将其主题传递给导航栏
阅读帮助主题
无需窗口即可渲染导航栏

键盘、主题与输出

无需窗口即可渲染导航栏

文档、可视化测试和 Web 后端有时需要的是菜单的图片,而不是菜单本身。sgcNavigation_Render 中的渲染器无需窗口,也无需 VCL 或 FireMonkey,即可绘制 TsgcNavigationModel,因此控制台程序、服务或服务器都能将同一个导航栏输出为 PNG 或 SVG。该单元可在所有平台上构建,包括 Linux64,缩放参数可为高 DPI 屏幕生成清晰的图像。将您的图像列表传给渲染器,导出的图片就会显示与运行中的应用程序相同的图标。

  • sgcNavigationSaveToPNG 写入 PNG 文件或流
  • sgcNavigationSaveToSVG 将同一导航栏写为 SVG
  • sgcNavigationRender 可在任意 sgcUICore 画布上绘制
  • 宽度和高度为逻辑像素乘以缩放比例
阅读帮助主题

查看 sgcNavigation 的实际效果

sgcUI 套件演示中的 sgcNavigation:使用内置模拟数据、可离线运行的完整应用程序。

谁在用 sgcNavigation 构建应用

面向 ERP 和管理类应用的现代外壳

您有几十个现有窗体,主窗口仍通过菜单栏打开它们。在左侧放置一个侧边栏,每个区域一个条目,再让 OnSelectionChange 切换隐藏了标签页的 TPageControl 的标签页。徽标显示待处理订单或未读消息,图标栏则把空间还给各个窗体。运行 SidebarApp,即可看到该模式与 sgcDashboard 页面配合工作的效果。

  • 侧边栏模式
  • 徽标
  • 折叠为图标栏
运行 SidebarApp 演示

设置与管理控制台

配置界面会把几十个页面归入“Sales”“Inventory”和“Admin”等几个标题之下。手风琴一次只展开一个分区,使用 AllowMultiExpand 则可展开多个,Action 关联则复用您 TActionList 中的命令和启用规则。键盘用户可用方向键在各分区之间移动。Accordion 演示包含三个分组、一个展开开关和一个点击日志。

  • 手风琴模式
  • Action 关联
  • 键盘导航
运行 Accordion 演示

各平台一致的导航

在 Windows、macOS、iOS 和 Android 上运行的 FireMonkey 应用程序,不应该在每个平台上使用不同的菜单。TsgcFMXNavigationBar 的条目、模式和事件与 VCL 导航栏相同,适用于 WinForms、WPF 和 Avalonia 的 .NET 导航栏也沿用相同的名称。同时发布 Delphi 桌面应用和 .NET 工具的团队只需保持一套思维模型。SidebarFMX 是侧边栏演示的 FireMonkey 版本。

  • FireMonkey 导航栏
  • 主题
  • .NET 导航栏
运行 SidebarFMX 演示

几行代码实现导航栏

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.WinForms

运行 sgcNavigation 演示

SidebarApp 和 Accordion 演示提供 VCL 和 C++ Builder 版本,以及适用于 Delphi 的 FireMonkey 版本;.NET 版本则提供 WinForms、WPF 和 Avalonia 项目。

SidebarApp

SidebarApp

一个驱动隐藏标签页 PageControl 的侧边栏,带图标、徽标、禁用条目、折叠按钮、主题下拉框和 sgcDashboard KPI 页面。完整验证应用外壳模式。

Accordion

仅限注册版 Accordion

三个分组 Sales、Inventory 和 Admin,一个 AllowMultiExpand 开关、Action 关联和点击日志。它使用了 Action 关联,因此需要注册版或试用版。

SidebarFMX

使用 TsgcFMXNavigationBar 为 FireMonkey 构建的侧边栏演示,仅适用于 Delphi。条目、模式和事件与 VCL 版本相同,可用于 Windows、macOS 和移动平台。

预编译演示

每款 sgcUI 产品的可直接运行的可执行文件,无需安装。

下载 sgcUI_bin.zip →

sgcNavigation 包含在哪些版本中

sgcNavigation 包含在每个 sgcUI 版本中(从 Standard 起),也可单独购买。sgcNavigation 同时包含在 All-Access 捆绑包中。

sgcNavigation 单品包

€149 / 开发者,含完整源代码,1 年更新。

购买 sgcNavigation → 查看价格 →

sgcUI Standard

sgcNavigation、sgcGrid、sgcToolbar和sgcEditors,起价 €380。

查看 Standard →

sgcUI Professional

Standard 加 sgcCharts、sgcDashboard和sgcGauges,起价 €529。

查看 Professional →

sgcUI Enterprise

全部 14 款 sgcUI 产品,起价 €699。

查看 Enterprise →

免费的社区版(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)−✓

支持的框架与平台

sgcNavigation 中的组件

组件目标
TsgcVCLNavigationBarDelphi 和 C++ Builder,VCL (sgcNavigation_VCL)
TsgcFMXNavigationBarDelphi 和 C++ Builder,FireMonkey (sgcNavigation_FMX)
TsgcNavigationItem, TsgcNavigationItems, TsgcNavigationModel框架无关的模型 (sgcNavigation_Model)
TsgcWinFormsNavigationBar.NET,WinForms
TsgcWpfNavigationBar.NET,WPF
TsgcAvaloniaNavigationBar.NET,Avalonia
目标组件平台
Delphi 7 至 13,VCLTsgcVCLNavigationBarWin32 和 Win64
Delphi XE6 至 13,FireMonkeyTsgcFMXNavigationBarWindows、macOS、iOS、Android 和 Linux (FMXLinux)
C++ Builder 2007 至 13TsgcVCLNavigationBar, TsgcFMXNavigationBar生成的 .hpp 头文件和静态库
Delphi 10.2 至 13,框架无关模型和无界面 PNG 与 SVG 渲染器Linux64,例如在服务器上渲染导航栏
.NET Framework 4.7.2、.NET 8、9 和 10TsgcWinFormsNavigationBar、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 上同样可用。可用于文档、视觉回归测试,或展示应用程序菜单的网页。

sgcNavigation 帮助

3,000+开发者
20+年
761+组件
30+API 集成
5平台
30 天退款保证不满意?可在购买后 30 天内申请全额退款。 查看退款政策

立即试用 sgcNavigation

sgcUI 试用版包含 sgcNavigation 和其他所有 sgcUI 产品。