像我這樣的菜鳥,寫程序一般就是拖控件,雙擊,然后寫上執行的代碼,這樣在窗口中就有很多事件代碼,如果要實現各按鈕的狀態,那得在很多地方修改代碼,極為復雜.通過參考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