菜单

主界面和系统托盘

相关源文件

本文档解释了 Shadowsocks Windows 的主要用户界面元素,重点关注系统托盘图标和上下文菜单。这些组件是用户与应用程序交互的主要界面。有关服务器配置 UI 的信息,请参阅服务器配置 UI,有关日志记录功能,请参阅日志记录和流量监控

系统托盘集成

Shadowsocks Windows 主要作为一个系统托盘应用程序运行。启动后,应用程序会在 Windows 系统托盘中显示一个图标,提供状态信息和功能访问。

托盘图标的呈现

系统托盘图标使用不同的颜色和叠加层来向用户传达应用程序的状态

  • 图标颜色:指示代理模式
    • 蓝色:全局代理模式已启用
    • 黑色/深色:PAC 模式已启用
    • 灰色:代理已禁用
  • 叠加图标:显示网络流量状态
    • 入站流量指示器 (↓)
    • 出站流量指示器 (↑)
    • 当流量双向流动时显示两个指示器

图标大小会根据屏幕 DPI 设置自动调整,以保持适当的可见性和比例。

来源:shadowsocks-csharp/View/MenuViewController.cs125-226 shadowsocks-csharp/View/MenuViewController.cs313-337

托盘图标还显示包含信息的工具提示文本

  • 应用程序名称和版本
  • 当前代理模式状态
  • 端口号
  • 当前选择的服务器或策略

图标生成过程

托盘图标是根据应用程序状态动态生成的

来源:shadowsocks-csharp/View/MenuViewController.cs125-241

上下文菜单系统

上下文菜单提供对所有应用程序功能的访问。它在应用程序启动时动态构建,并在配置更改时更新。

上下文菜单组织成几个逻辑部分

来源:shadowsocks-csharp/View/MenuViewController.cs257-309

每个菜单项都关联有事件处理程序,当被点击时会执行相应的操作

  1. 系统代理菜单:控制系统代理的配置方式

    • 禁用:关闭代理功能
    • PAC 模式:使用 PAC 脚本确定要代理的流量
    • 全局模式:将所有流量路由到代理
  2. 服务器菜单:管理服务器配置

    • 服务器列表(动态填充)
    • 编辑服务器:打开服务器配置表单
    • 共享选项:用于通过二维码共享服务器设置
  3. PAC 菜单:控制代理自动配置设置

    • 本地 PAC:使用本地 PAC 文件
    • 在线 PAC:使用 URL 中的 PAC 文件
    • PAC 规则的编辑选项
  4. 系统集成选项:

    • 自动启动设置
    • 协议处理程序注册
    • 局域网访问设置
    • 快捷键配置
  5. 帮助与支持:

    • 日志查看器
    • 日志级别控制
    • 检查更新
    • 关于信息

菜单项使用处理本地化的辅助方法创建

CreateMenuItem(string text, EventHandler click)
CreateMenuGroup(string text, MenuItem[] items)

菜单状态会在配置更改时更新,项目会被勾选/取消勾选以反映当前设置。

来源:shadowsocks-csharp/View/MenuViewController.cs246-256 shadowsocks-csharp/View/MenuViewController.cs350-366

对话框窗口

系统托盘菜单提供对多个对话框窗口的访问,用于管理应用程序的各个方面

主要对话框窗口包括

  1. 配置表单:用于编辑服务器配置

    • 通过双击托盘图标或通过上下文菜单访问
    • 管理服务器详细信息、加密设置和插件选项
  2. 日志表单:用于查看应用程序日志

    • 通过上下文菜单或中键单击托盘图标访问
    • 根据详细程度设置显示详细的应用程序日志
  3. WPF 窗口:用于各种配置任务

    • 服务器共享:用于生成和显示服务器配置的二维码
    • 快捷键:用于配置全局快捷键
    • 转发代理:用于设置转发代理配置
    • 在线配置:用于管理基于订阅的配置源

来源:shadowsocks-csharp/View/MenuViewController.cs368-423 shadowsocks-csharp/View/MenuViewController.cs484-535 shadowsocks-csharp/View/MenuViewController.cs749-770

事件通信系统

MenuViewController 通过事件与 ShadowsocksController 通信。这种事件驱动的架构确保了 UI 和核心功能之间的清晰分离。

UI 监听的来自控制器的关键事件

  1. 状态更改事件:

    • EnableStatusChanged:代理启用/禁用时
    • EnableGlobalChanged:切换全局/PAC 模式时
    • ShareOverLANStatusChanged:局域网共享设置更改时
    • ConfigChanged:配置修改时
  2. UI 更新事件:

    • TrafficChanged:发生网络流量时(更新流量指示器)
    • VerboseLoggingStatusChanged:日志级别更改时
    • ShowPluginOutputChanged:插件输出设置更改时
  3. 文件操作事件:

    • PACFileReadyToOpen:PAC 文件准备好打开时
    • UserRuleFileReadyToOpen:用户规则文件准备好打开时
  4. 更新事件:

    • UpdatePACFromGeositeCompleted:PAC 更新完成时
    • UpdatePACFromGeositeError:PAC 更新遇到错误时

来源:shadowsocks-csharp/View/MenuViewController.cs77-106 shadowsocks-csharp/Controller/ShadowsocksController.cs70-89

关键用户交互流程

系统托盘图标交互

来源:shadowsocks-csharp/View/MenuViewController.cs444-458

代理模式切换

代理模式切换工作流程处理代理状态的变化

来源:shadowsocks-csharp/View/MenuViewController.cs599-647 shadowsocks-csharp/Controller/ShadowsocksController.cs312-329

实现细节

托盘图标颜色选择

托盘图标颜色根据当前应用程序状态和 Windows 主题设置确定

代理状态Windows 主题图标颜色
全局模式任意蓝光
PAC 模式细体黑色/深色
PAC 模式深色白色
已禁用细体深灰色
已禁用深色浅灰色

应用程序检测 Windows 10 主题设置,以提供在浅色和深色任务栏主题中都可见的适当图标颜色。

来源:shadowsocks-csharp/View/MenuViewController.cs193-226

托盘图标流量监控

托盘图标使用叠加系统显示实时流量指示器

  1. 控制器在队列中维护流量统计信息
  2. 后台线程每秒更新一次这些统计信息
  3. 检测到流量时,控制器会触发一个 TrafficChanged 事件
  4. MenuViewController 通过更新托盘图标上的相应叠加层进行响应

当代理正在积极传输数据时,这会为用户提供视觉反馈。

来源:shadowsocks-csharp/View/MenuViewController.cs313-337 shadowsocks-csharp/Controller/ShadowsocksController.cs620-659

服务器菜单生成

服务器菜单是根据当前配置动态生成的

  1. 策略被添加到菜单的顶部
  2. 在策略和服务器之间插入了一个分隔符
  3. 从配置中添加服务器(最多 20 个,以防止菜单过长)
  4. 如果服务器超过 20 个,则添加一个摘要项
  5. 当前选定的服务器或策略会被勾选

这允许在服务器和策略之间快速切换。

来源:shadowsocks-csharp/View/MenuViewController.cs653-722

用户体验考量

气球提示

应用程序使用系统托盘中的气球提示(Toast 通知)来传达重要信息

  1. 首次运行时,告知用户应用程序的存在
  2. 更新 PAC 规则后
  3. 检查更新完成后
  4. 发生错误时

气球提示是非侵入性的,用户可以轻松将其关闭。

来源: shadowsocks-csharp/View/MenuViewController.cs428-442 shadowsocks-csharp/View/MenuViewController.cs908-919

国际化支持

UI 元素通过 I18N 系统支持本地化

  1. 菜单项文本通过 I18N.GetString() 方法传递
  2. 当前区域性从 WPF Localization Extension 加载
  3. 这使得 UI 可以适应不同的语言

有关国际化的更多信息,请参阅 国际化 页面。

来源: shadowsocks-csharp/View/MenuViewController.cs248-250