构建IDE框架:Wide IDE的介绍与使用

在开发应用程序的过程中,经常需要创建、编辑、保存文件或远程脚本等。大多数开发者都会创建这样的工具应用以简化工作或生活。作者在学习WPF、PRISM、MVVM的同时,也创建了一个类似于Visual Studio 2012的IDE应用程序——Wide IDE框架。Wide不仅仅是一个框架,它是一个模块集合,可以帮助快速构建类似VS 2012的应用程序。每个模块都可以参与构建IDE,并为应用程序添加新功能。

Wide框架允许通过创建PRISM模块来构建应用程序。这样,可以将应用程序的每个功能区域的代码模块化。

如果真的打算构建一个带有调试器的IDE,可以使用Wide,但强烈建议查看Visual Studio Extensibility (VSX)框架或其他实际的IDE,如SharpDevelop、Eclipse或Netbeans。

关于PRISM模块

PRISM模块的背景信息和教程可以在Code Project上找到,这些教程对于理解如何构建模块非常有帮助。

Wide中的模块

Wide附带了两个模块和各种开箱即用的功能:

  • 核心模块(必需)
  • 用于可定制的启动屏幕
  • 用于菜单(支持带图标的常规菜单、可勾选的菜单)
  • 用于工具栏(菜单视图模型可以重用于工具栏)
  • IDE中可以添加多个工具栏(参见演示)
  • 主题(VS2010、VS2012 Light主题和无主题)
  • ThemeManager用于添加/删除主题
  • 用于状态栏(开发中)
  • 打开文件服务与参与处理程序(可以基于扩展名或文件内容)
  • 保存和恢复布局以及打开文档
  • 日志模块(用于日志工具)

理解Wide框架

由于Wide模块基本上是PRISM模块,将首先描述框架中代码的组织方式。

Wide.Interfaces - 包含应用程序所需的所有接口、抽象类。创建的每个模块(通常为每个模块创建一个项目),需要引用这个项目/DLL。这个项目还包含PRISM中事件聚合器使用的事件。 Wide.Core - 包含应用程序工作所需的所有核心服务。大多数类都是内部/密封的。 Wide.Splash - 包含启动屏幕的基础实现。可以通过在模块加载之前向Unity容器注册自己的启动屏幕版本来覆盖启动屏幕。参见示例应用程序。 Wide.Shell - 包含Shell的两种实现,这将是应用程序托管的主窗口。两种风格是Metro(用于类似VS 2012的应用程序)和Regular(较旧的VS风格应用程序)。这可以通过向Bootstrapper的构造函数传递一个值来定义。 Wide.Tools.Logger - 包含日志模块。这是如何为自己的应用程序编写模块的好例子。这不是应用程序的必需模块。 Wide.Settings - 正在开发中。这个模块是为应用程序提供一个类似Visual Studio设置窗口的设置窗口。同样,其他模块可以参与设置管理器。

上面的类图显示了Wide.Interfaces项目中类的组织方式。下面描述了一些重要类:

  • ContentViewModel - 这是需要继承的类,以创建自己类型的文档。参见Wide.Core项目中的TextViewModel.cs,了解如何创建自己的类型。
  • MenuItemViewModel - 这是需要创建的类,以创建菜单。这个菜单需要添加到AbstractMenuItem单例对象。检查Loader.cs以获取如何添加菜单的详细信息。
  • ToolbarViewModel - 这个类用于创建工具栏。好处是,工具栏项可以从MenuItemViewModel对象创建。再次,检查Loader.cs以获取详细信息。

还有一些服务被Wide.Core项目添加到应用程序中。可以通过尝试解析它们对应的接口来访问这些服务。一些重要服务包括:

  • IWorkspace - 工作区本身。也可以在所有模块加载之前注册自己的工作区,这可以在应用程序中使用。检查VS2012TestApp项目以获取更多信息。
  • IOpenFileService - 一个通用的文件打开服务,调用OpenFileDialog并返回适当的ContentViewModel。
  • IContentHandlerRegistry - 另一个重要服务,可以注册将处理的内容类型。例如:如果ContentViewModel只能用于".cs"文件,可以创建一个CSFileHandler(实现IContentHandler),并将其注册到这个服务。IOpenFileService将调用所有处理程序以检查处理程序是否可以打开文件 - 如果可以,第一个可以打开文件的处理程序可以处理并返回ContentViewModel。例如,检查Wide.Core中的AllFileHandler.cs。
  • AbstractMenuItem - 这也是一个服务以及一个抽象类,可以继承它来创建自己的菜单项。检查Loader.cs。
  • IToolbarService - 这是一个有趣的服务,它在Shell上引入了一个工具栏窗格。每个ToolbarViewModel可以创建一个新的工具栏,并可以注册到这个服务。目前,位置(band, index)没有被应用程序存储 - 支持是存在的,但尚未实现。
  • IThemeManager - 这个服务用于向应用程序添加主题并设置应用程序的当前主题。检查Wide.Interfaces项目中的DarkTheme.cs。
  • ICommandManager - 这个服务用于注册命令与键以促进命令的重用。
  • ILoggerService - 日志模块注册了一个NLogService作为单例。可以创建自己的日志服务,并在加载常规模块之前注册它,这样就可以使用首选的日志库。

创建一个简单的应用程序

使用Wide创建类似IDE的应用程序将会非常简单。Wide基于Unity容器。WideBootstrapper继承自UnityBootstrapper,并带有一些开箱即用的功能,如为应用程序创建启动屏幕、创建Shell等。

应用程序需要引用所有依赖库和Wide库。以下是用于获取简单Wide应用程序的代码:

C# public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); new WideBootstrapper().Run(); } }

有关如何使用Wide的更多信息,请查看测试应用程序:

在Nuget上的示例应用程序

也可以使用Nuget安装Wide。以下是安装并快速开始使用Wide的步骤:

  1. 创建一个WPF应用程序项目(4.0)- 给它起个名字。
  2. 项目创建后,删除MainWindow.xaml和App.xaml(需要这样做,因为NuGet将使用新文件更新项目)。
  3. 打开包管理器控制台(视图 > 其他窗口 > 包管理器控制台)。
  4. 输入"Install-Package Wide.Example -Pre"(NuGet)。
  5. 一旦包安装完成 - 打开App.xaml的属性,并将构建操作设置为"ApplicationDefinition"。
  6. 将NLog.config的"复制到输出目录"设置为"始终复制"。

示例应用程序的截图

类似VS 2012的应用程序:

类似VS 2010的应用程序:

使用的库

Wide使用了许多开源项目构建:

  • AvalonDock - 用于停靠(神奇的控件)。
  • Prism - 用于依赖注入和事件。
  • MahApps Metro - 窗口的Metro外观和感觉。
  • AvalonEdit - 在#D中使用的通用文本编辑器。
  • Unity Container - 应用程序使用的容器。
  • NLog - 用于日志记录目的。
  • Extended WPF toolkit - 尚未使用。将用于设置管理器。

在构建Wide的过程中,能够查看各种开源项目,学习并最重要的是回馈项目。

  • 应用程序的设置管理器
  • 状态栏服务
  • 深色、Expression主题
  • 更多根据用户请求(如果有的话)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485