如何创建类似 VS 2012 的应用程序 - Wide IDE Framework (v0.1)






4.64/5 (24投票s)
使用 WPF、PRISM 和其他开源项目构建的协作式 IDE 框架
介绍
我经常遇到需要打开、编辑、保存文件/远程脚本等的应用程序。我相信大多数开发人员都会创建此类实用程序应用程序来使他们的工作/生活更轻松。由于我想学习 WPF、PRISM、MVVM 并创建一个类似 IDE 的应用程序,因此我创建了 **Wide IDE framework**。Wide 不是一个框架,而是一组模块,可以帮助快速构建类似 VS 2012 的应用程序。与所有模块化的 PRISM 应用程序一样,模块可以参与构建 IDE,同时为应用程序添加新功能。
Wide 框架允许您通过创建参与构建 IDE 的 PRISM 模块来构建您的应用程序。这样,您可以对应用程序的每个功能区域的代码进行模块化。
背景
如果您希望认真构建一个带有调试器等的 IDE,可以使用 Wide,但我强烈建议您研究 Visual Studio Extensibility (VSX) 框架或其他实际的 IDE,例如 SharpDevelop、Eclipse 或 Netbeans。
PRISM 模块背景
图片来自 http://msdn.microsoft.com/en-us/library/gg405479(v=pandp.40).aspx
Code Project 上有一些 PRISM 教程,阅读它们将有助于理解模块是如何构建的。
Wide 中的模块
Wide 附带两个模块和各种开箱即用的功能
核心模块(必需)
- 用于可自定义启动屏幕
- 用于菜单(支持带图标的常规菜单,可勾选的菜单)
- 用于工具栏(菜单视图模型可重用于工具栏)
- 可以向 IDE 添加多个工具栏(请查看演示)
- 主题(VS2010、VS2012 浅色主题和无主题)
- ThemeManager 用于添加/删除主题
- 用于状态栏(开发中)
- 具有协作处理程序的打开文件服务(可以基于扩展名甚至文件内容)
- 保存和恢复布局以及打开文档
Logger 模块(用于日志工具)
理解 Wide 框架
由于 Wide 模块本质上是 PRISM 模块,我将从描述框架中代码的组织方式开始。
- Wide.Interfaces - 包含应用程序所需的所有接口、抽象类。您创建的每个模块(我通常为每个模块创建一个项目)都需要引用此项目/DLL。此项目还包含 PRISM 中的事件聚合器使用的事件。
- Wide.Core - 包含应用程序运行所需的所有核心服务。大多数类都是内部/密封的。
- Wide.Splash - 包含启动屏幕的基本实现。您可以通过在模块加载之前将自己的启动屏幕版本注册到 Unity Container 来覆盖启动屏幕。请参阅示例应用程序。
- 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
将调用所有 Handlers 来检查 Handler 是否可以打开文件 - 如果可以,第一个能打开文件的 Handler 将进行处理并返回 ContentViewModel。例如,请参阅 Wide.Core 中的 *AllFileHandler.cs*。 - AbstractMenuItem - 这也是一个服务,以及一个抽象类,您可以继承它来创建您自己的菜单项类型。请参阅 *Loader.cs*。
- IToolbarService - 这是一个有趣的服务,它在 Shell 中引入了一个工具栏面板。每个 ToolbarViewModel 都可以创建一个新的工具栏并注册到此服务。目前,应用程序不存储位置(条带、索引) - 支持是存在的,但尚未实现。
- IThemeManager - 此服务用于向应用程序添加主题并设置应用程序的当前主题。请参阅 Wide.Interfaces 项目中的 *DarkTheme.cs*。
- ICommandManager - 此服务用于通过键注册命令,以促进命令的可重用性。
- ILoggerService - 日志模块将 NLogService 注册为单例。您可以创建自己的日志服务并在加载常规模块之前注册它,这样您就可以使用您偏好的日志记录库。
创建一个简单的应用程序
使用 Wide 创建类似 IDE 的应用程序将非常简单。Wide 基于 Unity 容器。WideBootstrapper
继承自 UnityBootstrapper
,并附带了一些基本的开箱即用功能,例如为应用程序创建启动屏幕、创建 Shell 等。
您的应用程序需要引用所有依赖库和 Wide 库。以下代码用于获取一个简单的 Wide 应用程序。
//Simple application without toolbar, menus etc
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
new WideBootstrapper().Run();
}
}
有关如何使用 Wide 的更多信息,请查看测试应用程序:https://github.com/chandramouleswaran/Wide
Nuget 上的示例应用程序
您也可以通过 Nuget 安装 Wide。以下是安装并快速开始使用 Wide 的步骤。
- 创建一个 WPF 应用程序项目(4.0)- 给它起任何名字
- 项目创建后,删除 *MainWindow.xaml* 和 *App.xaml*(这是必需的,因为 NuGet 将用新文件更新项目)。
- 打开程序包管理器控制台(视图 > 其他窗口 > 程序包管理器控制台)
- 键入 "Install-Package Wide.Example -Pre"(NuGet)
- 安装程序包后,打开 *App.xaml* 的属性,并将生成操作设置为 "ApplicationDefinition"
- 将 *NLog.config* 的复制到输出目录设置为 "始终复制"
来自示例应用的截图
使用的库
Wide 使用各种开源项目构建而成。
- AvalonDock - 用于停靠(神奇的控件)
- Prism - 用于依赖注入和事件
- MahApps Metro - 窗口的 Metro 外观和感觉
- AvalonEdit - #D 中使用的通用文本编辑器
- Unity Container - 应用程序使用的容器
- NLog - 用于日志记录
- Extended WPF toolkit - 尚未使用。将用于设置管理器。
在构建 Wide 的过程中,我得以研究各种开源项目,学习并最重要的是为项目做出贡献。
未来计划
- 应用程序的设置管理器
- 状态栏服务
- 黑暗、Expression 主题
- 根据用户要求(如有)添加更多内容
一些开源项目有构建得很好的部分,其中一些被用在了我的项目中。
- EDI - Visual Studio 2010 主题设置得非常完美。菜单和工具栏的主题是从该项目中“借鉴”的。
- MetroLikeWindow - 存在一些 bug,但总体而言,它为窗口增加了光晕效果。为 MahApps.Metro 做出了贡献。
- CBR - 一个真正优秀且维护良好的漫画书阅读器。
- StackOverflow - 我的大部分问题都可以在这里找到答案。
关注点
尽管框架看起来很简单,但在我每天下午 5 点的工作时间之外,我花了几个月的时间才构建出来。我曾研究过 SoapBox core、Gemini - 其他类似的 WPF 解决方案,但从头开始构建能让你更好地学习语言并理解技术。如果我的代码有任何错误或可以改进的地方,请告诉我,以便我改进框架并更新文章。
总的来说,我认为在这个创建 Wide 的过程中,我已经成为了一个 Github、CodeProject、Codeplex、Stackoverflow 和 #D 的瘾君子。我喜欢社交编码,如果您也喜欢社交编码,请贡献 Wide / 如果您有任何反馈或问题,请与我联系。
历史
- 2013 年 3 月 1 日 - 在 NuGet 中添加了库和示例。
- 2013 年 2 月 24 日 - Wide 的第一个版本发布到 Code Project。将根据请求/反馈添加更多详细信息。