天天看点

SharpDevelop浅析_2_User Interface

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精简和突出重点。

继续阅读