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


像我這樣的菜鳥,寫程序一般就是拖控件,雙擊,然后寫上執行的代碼,這樣在窗口中就有很多事件代碼,如果要實現各按鈕的狀態,那得在很多地方修改代碼,極為復雜.通過參考CSHARPDEVELOP的代碼就說明和網上各位朋友的示例,在這里,自己實現了一個很簡單的插件程序,方便程序的開發,每個功能可以獨立開發,也方便維護.現在給大家講講其方法.先上張圖片:

由於我這個插件使用了DEVEXPRESS的控件,所有要運行就需要安裝,在這里我們就不使用DEV的控件了.

首先,我們需要定義一個接口,該接口定義了一個工具欄的按鈕要執行的動作:ICommnd

 public  interface ICommand
    {
         void Run();
    }

接着我們申明一個Abstract的類: 

public abstract class AbstractCommand:ICommand 
    { 
        public abstract void Run();
        public virtual bool IsEnable { get; set; }
        public virtual string Caption { get; set; }
   }

在本抽象類中我們增加了兩個虛的屬性,一個代表該按鈕的狀態,另一個是按鈕的標題.后面我們在

說如很使用.

再申明一個接口:IStatusUpdate    ,用於規定按鈕更新狀態和標題的方法  

public interface IStatusUpdate
    {
        void UpdateStatus();
        void UpdateText();
    }

 再申明一有類:ToolBarButton,本類繼承於工具欄類和IStatusUpdate接口 ,我們使用該類根據

AbstractCommand的子類來生成對應的按鈕.代碼如下:

 public partial class ToolBarButton :ToolStripButton,IStatusUpdate    
 {
         AbstractCommand info = null;
//提供了一個構造函數,需要傳入AbstractCommand的子類,子類包含了按鈕所要執行的功能和其標題、狀態.
         public ToolBarButton(AbstractCommand info)
         {
             this.info = info;
             this.Text = info.Caption;
             this.Enabled = info.IsEnable; 
            this.DisplayStyle = ToolStripItemDisplayStyle.Text;
             this.Click += new EventHandler(ToolBarButton_Click);
         }
        void ToolBarButton_Click(object sender, EventArgs e)
         {//在該按鈕被按下后執行AbstractCommand子類的Run函數
             if (this.info != null) info.Run();
         }
        public void UpdateStatus() 
        {//更新其狀態
             if (this.info != null) this.Enabled = info.IsEnable;
         }
        public void UpdateText()
         {//更新其標題
               if (this.info != null) this.Text = info.Caption;
         }
     }
 }

當我們要使用該框架來生成一個按鈕時只需要申明一類並繼承於:AbstractCommand類就可以了:

public class test:AbstractCommand
     {
         public override void Run()
         {
             MessageBox.Show("Test");
         } 
        public override bool IsEnable
         {
             get
             {//該按鈕對應狀態的變化,我們是根據判斷C:\\1.TXT是否存在來確定的.
                 return System.IO.File.Exists("c:\\1.txt");
             }
             set 
            {
                 base.IsEnable = value;
             }
         }
         public override string Caption
         {
             get 
            { 
                return "Test";
             } 
            set 
            {
                 base.Caption = value; 
            }
         }
    }

現在我們的程序還沒有主窗口,我們需要增加一個主窗口,在這里為了簡單,直接將生成按鈕的代碼寫在了里面,在實際應用時,使用反射將其生成.

前面寫了要更新按鈕的狀態,但是並沒有地方調用了該函數,所以在主窗口中增加了一個事件,在

該事件中更新其狀態: Application.Idle += new EventHandler(Application_Idle);

 

void Application_Idle(object sender, EventArgs e)
        {
            this.UpdateToolBarButtonSatus();
        }
        public void UpdateToolBarButtonSatus()
        {
            foreach (var t in list)
            {
                t.UpdateStatus();
                t.UpdateText();
            }
        }

在這就只實現了增加一個按鈕,當然你可自己再仿照test類再寫一個類,並在workbench類中繼續增加其實例,即可要增加按鈕.

下一篇我們對其進行改造,讓其通過反射來動態增加按鈕.這樣我們就可以不用重新編譯主窗口,要增加一個按鈕只需要生成一個類然后編譯成一個DLL 就可以了.

最后附上完整代碼:

http://files.cnblogs.com/city-hunter/ExampleAddin.rar

 

 

 

 

 


免責聲明!

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



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