随着互联网技术的发展,网页设计变得越来越重要。SVG(Scalable Vector Graphics,可缩放矢量图形)因其优秀的缩放性能和灵活性,成为了网页设计中不可或缺的一部分。然而,现有的大多数SVG设计工具,如Adobe Illustrator、Inkscape、SVG-Edit等,都是从设计师的角度出发,而非程序员。对于开发者来说,需要一个能够将JavaScript、HTML与SVG集成在一起,实现完整功能的网页设计工具。此外,即时预览和调试功能对于快速开发也是必不可少的。
在Windows Forms开发环境中,希望简化SVG风格的网页设计。本文将介绍如何开发这样一个工具,它将包括以下组件及其功能:
首先,选择了ICSharpCode.TextEditor作为SVG/HTML/JavaScript编辑器,它具有漂亮的语法高亮功能,但缺少SVG文件设置。修改了源代码中的SyntaxModes.xml,添加了.svg扩展名。重建项目后,svg文件将显示语法高亮。
public MyUserControl() {
InitializeComponent();
// 添加ICSharpCode.TextEditor到panel1
editor = new TextEditorControl();
editor.Dock = DockStyle.Fill;
editor.FileName = defaultNewFileName;
editor.IsReadOnly = false;
editor.Text = File.ReadAllText(Path.Combine(Application.StartupPath, "template.svg")).Replace("@content", "");
editor.Document.DocumentChanged += new DocumentEventHandler((sender, e) => { SetModifiedFlag(true); });
this.splitContainer1.Panel1.Controls.Add(editor);
// 添加chrome到panel2
browser = new ChromiumWebBrowser("");
this.splitContainer1.Panel2.Controls.Add(browser);
splitContainer1.Panel2.Resize += Panel2_Resize;
// 允许浏览器使用本地资源
BrowserSettings browserSettings = new BrowserSettings();
browserSettings.FileAccessFromFileUrls = CefState.Enabled;
browserSettings.UniversalAccessFromFileUrls = CefState.Enabled;
browser.BrowserSettings = browserSettings;
browser.IsBrowserInitializedChanged += BrowserInitializedChanged;
}
其次,使用CefSharp.WinForms作为浏览器,而不是VS标准WebBrowser,因为CefSharp采用了Google Chrome,能够更好地渲染复杂的SVG。但有一些限制,需要指定项目平台目标为x86或x64,并且仅支持.net framework 5.5.2。可以使用以下命令在NuGet Package Manager Console中添加引用到项目:
PM> Install-Package CefSharp.WinForms
然后,将上述组件包装到SplitContainer控件中,并打包为一个用户控件MyUserControl.cs:
public MyUserControl() {
InitializeComponent();
// 添加ICSharpCode.TextEditor到panel1
editor = new TextEditorControl();
editor.Dock = DockStyle.Fill;
editor.FileName = defaultNewFileName;
editor.IsReadOnly = false;
editor.Text = File.ReadAllText(Path.Combine(Application.StartupPath, "template.svg")).Replace("@content", "");
editor.Document.DocumentChanged += new DocumentEventHandler((sender, e) => { SetModifiedFlag(true); });
this.splitContainer1.Panel1.Controls.Add(editor);
// 添加chrome到panel2
browser = new ChromiumWebBrowser("");
this.splitContainer1.Panel2.Controls.Add(browser);
splitContainer1.Panel2.Resize += Panel2_Resize;
// 允许浏览器使用本地资源
BrowserSettings browserSettings = new BrowserSettings();
browserSettings.FileAccessFromFileUrls = CefState.Enabled;
browserSettings.UniversalAccessFromFileUrls = CefState.Enabled;
browser.BrowserSettings = browserSettings;
browser.IsBrowserInitializedChanged += BrowserInitializedChanged;
}
最后,使用SimpleHTTPServer作为轻量级服务器,非常容易调用。将该类复制到项目中,并在Form_load/Form_Closing事件处理器中调用start/stop。如果出现“访问被拒绝”的错误,请以管理员身份运行以下命令:
netsh http add urlacl url=http://localhost:8085/ user=Everyone listen=yes
所有组件集成后,创建了一个Windows Forms项目来打包它们,并在该项目中提供了文件新建/打开/保存/刷新等功能。不想浪费时间来解释细节,可以运行并跟踪每个功能以了解细节。
所有功能都在工具栏中定义。
此外,为编辑器添加了上下文菜单,大部分代码来自ICSharpCode的示例项目。它提供了书签、查找/替换和XML片段提取功能。
最后,想与分享如何通过YouTube视频使用这个工具来剪切/粘贴其他SVG艺术作品的片段到作品中。
视频链接:
视频中的示例文件来自openclipart.org。
发现了一些有趣的SVG应用: