前兩篇我們已經實現了功能按鈕與界面的分離,其實也只是工具欄與其執行的功能代碼與界面的分離,其作用還非常有限,因為他無法獲取到主窗口的任何東西,無法進行操作,比如主界面有一個TextBox,那么這個按鈕還不能訪問到,也無法對其進行操作。我們今天就來完成View的設計,讓工具欄的按鈕能夠訪問窗口中的內容,同時窗口中的內容也是根據插件來自動生成。
首先我們來實現View插件的生成代碼。View即為主窗口中的一個mdi窗口
生成一個接口:IViewContent
public interface IViewContent { Control ViewControl { get; set; } string Title { get; set; } }
該接口用來提供一個mdi窗口的標題訪問和其界面中Control的訪問。
然后再生成一個AbstractViewContrent的類:
public class AbstractViewContent : IViewContent { public System.Windows.Forms.Control control = null; public AbstractViewContent() { } public virtual System.Windows.Forms.Control ViewControl { get { return this.control; } set { this.control = value; } } public virtual string Title { get; set; } }
實際上這個類我們可要可不要,要的目的是為了和前面的Button類一致,都是Abstract的類。
然后再添加一個窗口,將該窗口繼承於Form的同時繼承於IViewContent接口。 public partial class BaseForm : Form,IViewContent
這個類用於窗口mdi子窗口,這樣我們可以根據form is IViewContent來判斷一個MDI窗口是否來自於插件
在WorkBench中添加以下函數:
private void AddView(AbstractViewContent abstractViewContent) { BaseForm form = new BaseForm(); form.Text = abstractViewContent.Title; form.ViewControl = abstractViewContent.ViewControl; form.MdiParent = this; form.ViewControl.Dock = DockStyle.Fill; form.Show(); }
在 private void LoadAddin(string path)函數中進行修改:
if (obj is IViewContent) { AddView((AbstractViewContent)obj); }
這樣我們就將MDI窗口添加大了主窗口中(當然要將主窗口設計為MDI容器)
這樣我們就完成了基本框架的設計。
接下來我們看如何使用該框架來增加一個MDI窗口(View)
首先申明一個類,讓他繼承於:AbstractViewContent,覆寫其2個屬性:
public class view : ExampleAddin.AbstractViewContent { private TextBox txtbox = new TextBox(); public override System.Windows.Forms.Control ViewControl { get { return txtbox; } set { base.ViewControl = value; } } public override string Title { get { return "test"; } set { base.Title = value; } } }
我們可以看到其標題為test,界面中的控件是一個TextBox,
將這個類編譯為一個dll,名字命名為:*.addin.dll,放到同樣的目錄下。運行,可以看到在主窗口中出現了一個MDI窗口,並且其上有一個TextBox控件。
那我們在工具欄中如何能夠了訪問呢??
剛才我們已經看到,我們的View窗口都是繼承於IViewContent,所以我們可以將該View窗口(即MDI窗口)轉換為IViewContent接口。這樣我們就可以訪問到他的ViewControl屬性了。當然我們要操作插件窗口中的控件,我們也必然要對這個插件的控件有所了解,比如這個例子中,我們就知道他的界面中有一個TextBox控件,即ViewControl屬性就是TextBox控件,這樣就可以在工具欄按鈕插件的Run函數中來操作了:
public override void Run() { var form = WorkBenchSingleTon.WorkBench.ActiveMdiChild; if (form is IViewContent) { ((TextBox)((IViewContent)form).ViewControl).Text = DateTime.Now.ToString(); } }
在這里也體現了使用SingleTon 的好處,我們可以在任何地方調用到workBench。
至此,我們就完成了該簡單的插件框架設計。當然功能有限,不過你可以據此進行擴展,比如增加菜單欄、PAD等。
按照慣例在最后附上demo:
http://files.cnblogs.com/city-hunter/ExampleAddin3.rar
需要在C盤根目錄下建立1.txt文件來使能工具欄按鈕,第一個按鈕為操作View中的TextBox的值 ,后兩個是以前的例子。