C#一步一步實現插件框架的示例(三)


C#一步一步實現插件框架的示例(一)

C#一步一步實現插件框架的示例(二)

前兩篇我們已經實現了功能按鈕與界面的分離,其實也只是工具欄與其執行的功能代碼與界面的分離,其作用還非常有限,因為他無法獲取到主窗口的任何東西,無法進行操作,比如主界面有一個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的值 ,后兩個是以前的例子。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM