SharpDevelop浅析_2_User Interface
创建易扩展且功能模块松散耦合的应用程序
http://www.cnblogs.com/michael-zhang/articles/629724.html
Demo界面及功能解释
相关概念
Demo代码分析
总结
Demo下载
1、Demo界面及功能解释:
启动界面:
SharpDevelop浅析_2_User Interface 支持打开图片:
SharpDevelop浅析_2_User Interface 支持打开网页:
SharpDevelop浅析_2_User Interface 功能说明:程序有个浮动窗口显示当前磁盘文件,选择文件并双击后在中心窗口中以适当的察看器打开文件;持拖曳打开文件;程序关闭后再次启动时能够“记忆”前一次程序关闭时的窗体大小位置及打开过的文件。
2、相关概念:
主窗体部分: Workbench
磁盘文件查看窗口: Pad
文件查看窗口: ViewContent
说明:
Pad可以使用ICSharpCode.Core的Addin插件机制来扩充Pad,如Visual Studio的资源管理器、类查看器、属性窗口、消息窗口等都属于Pad
ViewContent同样支持插件扩充,根据不同的文件类型使用不同的控件来处理显示,Demo中已实现的文件类型支持:网页文件、图片、普通文本,Visual Studio中的代码窗口、窗体设计器、资源编辑器、对象查看器等都属于ViewContent
Workbench与WorkbenchLayout结合使用来控制主窗口的外观显示,如普通的MDI(PhotoShop?)或Demo使用的WeifenLuo.WinFormsUI.Docking显示方式……
3、Demo代码分析
(注:下面的分析前提是你已经了解如何使用ICSharpCode.Core的Addin插件机制)
通 过上面的界面及功能说明,可以确定程序至少应包括接口声明、基本实现两个项目,而接口中又分为:Pad接口、ViewContent接口、 Workbench接口,这样的程序设计重点与难点在哪呢?思考后的结果应该是接口,从接口中能看到程序各部分是如何交互的,以及插件的扩展点,接口的设 计好坏决定着程序的易维护性与易扩展性,所以下面就重点看接口的定义(附介绍相关对象的创建等):
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface Pad接口
1
SharpDevelop浅析_2_User Interface // Core|Interface 定义部分:
2
SharpDevelop浅析_2_User Interface public interface IPadContent : IDisposable
3
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
4
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface System.Windows.Forms.Control Control
SharpDevelop浅析_2_User Interface { get; }
5
SharpDevelop浅析_2_User Interface 6
SharpDevelop浅析_2_User Interface void RedrawContent();
7
SharpDevelop浅析_2_User Interface }
8
SharpDevelop浅析_2_User Interface public class PadDescriptor : IDisposable
9
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
10
SharpDevelop浅析_2_User Interface Codon codon;
11
SharpDevelop浅析_2_User Interface IPadContent padContent;
12
SharpDevelop浅析_2_User Interface bool padContentCreated;
13
SharpDevelop浅析_2_User Interface 14
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface public string Title
SharpDevelop浅析_2_User Interface {
15
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface get
SharpDevelop浅析_2_User Interface {
16
SharpDevelop浅析_2_User Interface return codon.Properties["title"];
17
SharpDevelop浅析_2_User Interface }
18
SharpDevelop浅析_2_User Interface }
19
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface public string Icon
SharpDevelop浅析_2_User Interface {
20
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface get
SharpDevelop浅析_2_User Interface {
21
SharpDevelop浅析_2_User Interface return codon.Properties["icon"];
22
SharpDevelop浅析_2_User Interface }
23
SharpDevelop浅析_2_User Interface }
24
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface public string Class
SharpDevelop浅析_2_User Interface {
25
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface get
SharpDevelop浅析_2_User Interface {
26
SharpDevelop浅析_2_User Interface return codon.Properties["class"];
27
SharpDevelop浅析_2_User Interface }
28
SharpDevelop浅析_2_User Interface }
29
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface public IPadContent PadContent
SharpDevelop浅析_2_User Interface {
30
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface get
SharpDevelop浅析_2_User Interface {
31
SharpDevelop浅析_2_User Interface CreatePad();
32
SharpDevelop浅析_2_User Interface return padContent;
33
SharpDevelop浅析_2_User Interface }
34
SharpDevelop浅析_2_User Interface }
35
SharpDevelop浅析_2_User Interface public void CreatePad()
36
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
37
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface if (!padContentCreated)
SharpDevelop浅析_2_User Interface {
38
SharpDevelop浅析_2_User Interface padContentCreated = true;
39
SharpDevelop浅析_2_User Interface padContent = (IPadContent)codon.AddIn.CreateObject(Class);
40
SharpDevelop浅析_2_User Interface }
41
SharpDevelop浅析_2_User Interface }
42
SharpDevelop浅析_2_User Interface //
SharpDevelop浅析_2_User Interface 省略部分方法、属性
43
SharpDevelop浅析_2_User Interface public PadDescriptor(Codon codon)
44
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
45
SharpDevelop浅析_2_User Interface this.codon = codon;
46
SharpDevelop浅析_2_User Interface }
47
SharpDevelop浅析_2_User Interface }
48
SharpDevelop浅析_2_User Interface // Gui项目中的实现
49
SharpDevelop浅析_2_User Interface class PadContentWrapper : DockContent
50
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
51
SharpDevelop浅析_2_User Interface PadDescriptor padDescriptor; //通过此对象来获取相关属性
52
SharpDevelop浅析_2_User Interface //
SharpDevelop浅析_2_User Interface 53
SharpDevelop浅析_2_User Interface } 看到IPadContent接口返回一个WinForm的Control控件,此控件在 实现时被相应的窗体获取并适当地显示,Demo中的磁盘查看器Pad返回的Control是一个UserConrol,使用了TreeView和 ListView组合。注意IPadContent接口中定义返回一个Control而非Form是很聪明的技巧,可以看到实现端的 PadContentWrapper继承自WeifenLuo.WinFormsUI.DockContent,这依赖于实现端的表现方式,而接口可以不 受影响。PadDescriptor是个辅助类,用以返回Pad相关的属性信息,包括返回IPadContent的实例对象。
接下来看Pad的xml声明及客户端调用:
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface Pad声明及使用
1
SharpDevelop浅析_2_User Interface //取自Entry项目的SD_UI.addin
2
SharpDevelop浅析_2_User Interface <Path name = "/SharpDevelop/Workbench/Pads">
3
SharpDevelop浅析_2_User Interface <!--
4
SharpDevelop浅析_2_User Interface ProjectBrowser
5
SharpDevelop浅析_2_User Interface ClassBrowser
6
SharpDevelop浅析_2_User Interface SideBar
7
SharpDevelop浅析_2_User Interface ErrorList
8
SharpDevelop浅析_2_User Interface TaskList
9
SharpDevelop浅析_2_User Interface CompilerMessageView
10
SharpDevelop浅析_2_User Interface PropertyPad
11
SharpDevelop浅析_2_User Interface SearchResults
12
SharpDevelop浅析_2_User Interface Bookmarks
13
SharpDevelop浅析_2_User Interface DefinitionView
14
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface 15
SharpDevelop浅析_2_User Interface -->
16
SharpDevelop浅析_2_User Interface <Pad id = "FileScout"
17
SharpDevelop浅析_2_User Interface category = "Tools"
18
SharpDevelop浅析_2_User Interface title = "${res:MainWindow.Windows.FileScoutLabel}"
19
SharpDevelop浅析_2_User Interface icon = "PadIcons.FileBrowser"
20
SharpDevelop浅析_2_User Interface shortcut = "Control|Alt|F"
21
SharpDevelop浅析_2_User Interface class = "SDUserInterface.GUI.Pad.FileScout"/>
22
SharpDevelop浅析_2_User Interface </Path>
23
SharpDevelop浅析_2_User Interface // 取自Gui项目的DefaultWorkbench.cs
24
SharpDevelop浅析_2_User Interface void InitializeWorkspace()
25
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
26
SharpDevelop浅析_2_User Interface //
SharpDevelop浅析_2_User Interface 27
SharpDevelop浅析_2_User Interface ArrayList contents = AddInTree.GetTreeNode("/SharpDevelop/Workbench/Pads").BuildChildItems(this);
28
SharpDevelop浅析_2_User Interface foreach (PadDescriptor content in contents)
29
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
30
SharpDevelop浅析_2_User Interface if (content != null)
31
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
32
SharpDevelop浅析_2_User Interface ShowPad(content);
33
SharpDevelop浅析_2_User Interface }
34
SharpDevelop浅析_2_User Interface }
35
SharpDevelop浅析_2_User Interface //
SharpDevelop浅析_2_User Interface 36
SharpDevelop浅析_2_User Interface }
配置文件中的class指定了实现IPadContent的一个类型(全称限定名),使用时通过ICSharpCode.Core的AddInTree对象构建相关PadDescriptor集合……
下面来看ViewContent的定义:
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface ViewContent接口
1
SharpDevelop浅析_2_User Interface // Core|Interface 定义部分:
2
SharpDevelop浅析_2_User Interface public interface IViewContent : IDisposable
3
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
4
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface Control Control
SharpDevelop浅析_2_User Interface { get; set; }
5
SharpDevelop浅析_2_User Interface 6
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface IWorkbenchWindow WorkbenchWindow
SharpDevelop浅析_2_User Interface { get; set; }
7
SharpDevelop浅析_2_User Interface 8
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface string TitleName
SharpDevelop浅析_2_User Interface { get; set; }
9
SharpDevelop浅析_2_User Interface 10
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface string FileName
SharpDevelop浅析_2_User Interface { get; set; }
11
SharpDevelop浅析_2_User Interface 12
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface bool IsReadOnly
SharpDevelop浅析_2_User Interface { get; }
13
SharpDevelop浅析_2_User Interface 14
SharpDevelop浅析_2_User Interface void Load(string fileName);
15
SharpDevelop浅析_2_User Interface 16
SharpDevelop浅析_2_User Interface event EventHandler TitleNameChanged;
17
SharpDevelop浅析_2_User Interface }
18
SharpDevelop浅析_2_User Interface public class DisplayBindingDescriptor
19
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
20
SharpDevelop浅析_2_User Interface object binding = null;
21
SharpDevelop浅析_2_User Interface Codon codon;
22
SharpDevelop浅析_2_User Interface 23
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface public IDisplayBinding Binding
SharpDevelop浅析_2_User Interface {
24
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface get
SharpDevelop浅析_2_User Interface {
25
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface if (binding == null)
SharpDevelop浅析_2_User Interface {
26
SharpDevelop浅析_2_User Interface binding = codon.AddIn.CreateObject(codon.Properties["class"]);
27
SharpDevelop浅析_2_User Interface }
28
SharpDevelop浅析_2_User Interface return binding as IDisplayBinding;
29
SharpDevelop浅析_2_User Interface }
30
SharpDevelop浅析_2_User Interface }
31
SharpDevelop浅析_2_User Interface 32
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface public Codon Codon
SharpDevelop浅析_2_User Interface {
33
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface get
SharpDevelop浅析_2_User Interface {
34
SharpDevelop浅析_2_User Interface return codon;
35
SharpDevelop浅析_2_User Interface }
36
SharpDevelop浅析_2_User Interface }
37
SharpDevelop浅析_2_User Interface 38
SharpDevelop浅析_2_User Interface public DisplayBindingDescriptor(Codon codon)
39
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
40
SharpDevelop浅析_2_User Interface this.codon = codon;
41
SharpDevelop浅析_2_User Interface }
42
SharpDevelop浅析_2_User Interface 43
SharpDevelop浅析_2_User Interface public bool CanAttachToFile(string fileName)
44
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
45
SharpDevelop浅析_2_User Interface string fileNameRegex = codon.Properties["fileNamePattern"];
46
SharpDevelop浅析_2_User Interface if (fileNameRegex == null || fileNameRegex.Length == 0) // no regex specified
47
SharpDevelop浅析_2_User Interface return true;
48
SharpDevelop浅析_2_User Interface return Regex.IsMatch(fileName, fileNameRegex, RegexOptions.IgnoreCase);
49
SharpDevelop浅析_2_User Interface }
50
SharpDevelop浅析_2_User Interface }
51
SharpDevelop浅析_2_User Interface public interface IDisplayBinding
52
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
53
SharpDevelop浅析_2_User Interface bool CanCreateContentForFile(string fileName);
54
SharpDevelop浅析_2_User Interface 55
SharpDevelop浅析_2_User Interface IViewContent CreateContentForFile(string fileName);
56
SharpDevelop浅析_2_User Interface }
57
SharpDevelop浅析_2_User Interface // Gui项目中的实现:
58
SharpDevelop浅析_2_User Interface public class SdiWorkspaceWindow : DockContent, IWorkbenchWindow
59
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
60
SharpDevelop浅析_2_User Interface IViewContent content;
61
SharpDevelop浅析_2_User Interface //
SharpDevelop浅析_2_User Interface 62
SharpDevelop浅析_2_User Interface }
可以看到IViewContent同样是返回一个Conrol,供使用端(SdiWorkspaceWindow)根据需要封装组合; DisplayBindingDescriptor同样是个辅助类,除了返回ViewContent的相关属性信息外,提供了bool CanAttachToFile(string fileName)方法,用以判断当前显示插件是否可以显示相关类型的文件,这里的判断是通过配置文件中的fileNamePattern属性作正则判断 (注:文件名称符合一定规则的可能会用到此属性,一般不常用),注意到该辅助类返回了一个IDisplayBinding接口,查看该接口的方法可以看到 使用它来更进一步地判断当前文件是否是可支持类型(通过文件扩展名或试读取等方式),如果属于该插件支持类型的文件则创建并返回 IViewContenet接口。ViewContent插件的声明如下:
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface ViewContent插件声明
1
SharpDevelop浅析_2_User Interface <Path name = "/SharpDevelop/Workbench/DisplayBindings">
2
SharpDevelop浅析_2_User Interface <DisplayBinding id = "Browser"
3
SharpDevelop浅析_2_User Interface supportedformats = "Web Pages"
4
SharpDevelop浅析_2_User Interface class = "SDUserInterface.GUI.ViewContent.BrowserDisplayBinding"/>
5
SharpDevelop浅析_2_User Interface <DisplayBinding id = "Text"
6
SharpDevelop浅析_2_User Interface insertafter = "Browser"
7
SharpDevelop浅析_2_User Interface supportedformats = "Text Files,Source Files"
8
SharpDevelop浅析_2_User Interface class = "SDUserInterface.GUI.ViewContent.TextViewDisplayBinding" />
9
SharpDevelop浅析_2_User Interface <DisplayBinding id = "Image"
10
SharpDevelop浅析_2_User Interface insertbefore = "Text"
11
SharpDevelop浅析_2_User Interface supportedformats = "图片"
12
SharpDevelop浅析_2_User Interface class = "SDUserInterface.GUI.ViewContent.ImageDisplayBinding" />
13
SharpDevelop浅析_2_User Interface </Path>
值得注意的是insertbefore, insertafter 属性,此属性指明获取所有DisplayBindingDescriptor后的先后顺序,如:一个.rtf文件可以由Office-Word和记事本打开,一般要优先选择使用Word打开。
获取ViewContent对象的过程如下:双击磁盘文件Pad中的一个文件项时,调用FileService中的OpenFile(string fileName)方法,相关代码如下:
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface 获取/使用ViewContent
1
SharpDevelop浅析_2_User Interface // 取自Gui项目中的Common/FileService.cs
2
SharpDevelop浅析_2_User Interface public static IWorkbenchWindow OpenFile(string fileName)
3
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
4
SharpDevelop浅析_2_User Interface //
SharpDevelop浅析_2_User Interface 5
SharpDevelop浅析_2_User Interface IDisplayBinding binding = DisplayBindingService.GetBindingPerFileName(fileName);
6
SharpDevelop浅析_2_User Interface 7
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface if (binding != null)
SharpDevelop浅析_2_User Interface {
8
SharpDevelop浅析_2_User Interface binding.CreateContentForFile(fileName);
9
SharpDevelop浅析_2_User Interface WorkbenchSingleton.Workbench.ShowView(newContent);
10
SharpDevelop浅析_2_User Interface //
SharpDevelop浅析_2_User Interface 11
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface } else
SharpDevelop浅析_2_User Interface {
12
SharpDevelop浅析_2_User Interface throw new ApplicationException("Can't open " + fileName + ", no display codon found.");
13
SharpDevelop浅析_2_User Interface }
14
SharpDevelop浅析_2_User Interface return GetOpenFile(fileName);
15
SharpDevelop浅析_2_User Interface }
16
SharpDevelop浅析_2_User Interface // 取自Gui项目中的Common/DisplayBindingService.cs
17
SharpDevelop浅析_2_User Interface static DisplayBindingDescriptor GetCodonPerFileName(string filename)
18
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
19
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface foreach (DisplayBindingDescriptor binding in bindings)
SharpDevelop浅析_2_User Interface {
20
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface if (binding.CanAttachToFile(filename))
SharpDevelop浅析_2_User Interface {
21
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface if (binding.Binding != null && binding.Binding.CanCreateContentForFile(filename))
SharpDevelop浅析_2_User Interface {
22
SharpDevelop浅析_2_User Interface return binding;
23
SharpDevelop浅析_2_User Interface }
24
SharpDevelop浅析_2_User Interface }
25
SharpDevelop浅析_2_User Interface }
26
SharpDevelop浅析_2_User Interface return null;
27
SharpDevelop浅析_2_User Interface }
接下来看主窗体的定义:
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface Workbench接口
1
SharpDevelop浅析_2_User Interface public interface IWorkbench
2
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
3
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface string Title
SharpDevelop浅析_2_User Interface { get; set; }
4
SharpDevelop浅析_2_User Interface 5
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface List<IViewContent> ViewContentCollection
SharpDevelop浅析_2_User Interface { get; }
6
SharpDevelop浅析_2_User Interface 7
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface List<PadDescriptor> PadContentCollection
SharpDevelop浅析_2_User Interface { get; }
8
SharpDevelop浅析_2_User Interface 9
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface IWorkbenchWindow ActiveWorkbenchWindow
SharpDevelop浅析_2_User Interface { get; }
10
SharpDevelop浅析_2_User Interface 11
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface object ActiveContent
SharpDevelop浅析_2_User Interface { get; }
12
SharpDevelop浅析_2_User Interface 13
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface IWorkbenchLayout WorkbenchLayout
SharpDevelop浅析_2_User Interface { get; set; }
14
SharpDevelop浅析_2_User Interface 15
SharpDevelop浅析_2_User Interface void ShowView(IViewContent content);
16
SharpDevelop浅析_2_User Interface 17
SharpDevelop浅析_2_User Interface void CloseAllViews();
18
SharpDevelop浅析_2_User Interface 19
SharpDevelop浅析_2_User Interface void CloseView(IViewContent content);
20
SharpDevelop浅析_2_User Interface 21
SharpDevelop浅析_2_User Interface void ShowPad(PadDescriptor content);
22
SharpDevelop浅析_2_User Interface 23
SharpDevelop浅析_2_User Interface PadDescriptor GetPad(Type type);
24
SharpDevelop浅析_2_User Interface 25
SharpDevelop浅析_2_User Interface void RedrawAllComponents();
26
SharpDevelop浅析_2_User Interface }
27
SharpDevelop浅析_2_User Interface public interface IWorkbenchLayout
28
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface {
29
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface bool FullScreen
SharpDevelop浅析_2_User Interface { get; set; }
30
SharpDevelop浅析_2_User Interface 31
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface IWorkbenchWindow ActiveWorkbenchwindow
SharpDevelop浅析_2_User Interface { get; }
32
SharpDevelop浅析_2_User Interface 33
SharpDevelop浅析_2_User Interface
SharpDevelop浅析_2_User Interface object ActiveContent
SharpDevelop浅析_2_User Interface { get; }
34
SharpDevelop浅析_2_User Interface 35
SharpDevelop浅析_2_User Interface void Attach(IWorkbench workbench);
36
SharpDevelop浅析_2_User Interface 37
SharpDevelop浅析_2_User Interface void Detach();
38
SharpDevelop浅析_2_User Interface 39
SharpDevelop浅析_2_User Interface void ShowPad(PadDescriptor content);
40
SharpDevelop浅析_2_User Interface 41
SharpDevelop浅析_2_User Interface void ShowPad(PadDescriptor content,bool bActivateIt);
42
SharpDevelop浅析_2_User Interface 43
SharpDevelop浅析_2_User Interface IWorkbenchWindow ShowView(IViewContent content);
44
SharpDevelop浅析_2_User Interface 45
SharpDevelop浅析_2_User Interface void RedrawAllComponents();
46
SharpDevelop浅析_2_User Interface 47
SharpDevelop浅析_2_User Interface void LoadConfiguration();
48
SharpDevelop浅析_2_User Interface void StoreConfiguration();
49
SharpDevelop浅析_2_User Interface }
IWorkbench定义主窗体,IWorkbenchLayout定义窗体布局,可以看到IWorkbench的两个重要属性是Pad和 ViewContent的对象集合(维护已打开的窗体记录,避免重复打开等作用),其实现类的ShowPad()/ShowView()方法执行的操作即 向对应的集合添加成员,然后调用IWorkbenchLayout的ShowPad()/ShowView()。IWorkbenchLayout的 LoadConfiguration()和StoreConfiguration()方法用以在窗体加载或关闭时执行加载或保存子窗口布局的操作。
至此Demo的核心已分析完了,我们可以根据定义的接口扩展程序,如增加项目管理/查看Pad, 增加.swf等文件查看的ViewContent, 或更换主界面显示为普通MDI方式……
4、总结:
此Demo更说明了ICSharpCode.Core的插件支持可以应用到很多的方面:
a, 界面组成部分Pad
b, 界面中不同类型的文件查看器ViewContent
c, 磁盘文件查看Pad的下侧文件列表针对不同文件显示相关图标(详见SD_UI.addin文件的"/Workspace/Icons"层次下的定义)
...
SharpDevelop的这种界面设计方案使得应用程序很容易扩展和进一步开发,而不与已开发的模块冲突;从中得到的启发是应用程序要重点设计接口(契约)以及处理对象间的关系……
说明:Demo代码基本来源于SharpDevelop源码,删改了部分代码以使Demo精简和突出重点。