C# 基於插件的開發框架實現Ribbon界面與功能的分離附DEMO


 

以前寫過一篇文章是實現界面與功能的分離,基於插件的方式,要實現一個功能需要實現一個類,該類繼承於:AbstractToolButtonCommand,而AbstractToolButtonCommand又繼承於:DevExpress.XtraBars.BarButtonItem類,這樣在覆寫父類的一些屬性和方法的時候,VS的提示功能會列出很多屬性,不方便開發,本次對整個結構進行了調整。AbstractToolButtonCommand類只實現了一些必要的接口如:

  public abstract class AbstractToolButtonCommand : AbstractCommand, IMenuCommand, ICommand

    {

        private bool isEnabled = true;

        private bool isVisible = true;

        protected AbstractToolButtonCommand()         {         }

        public virtual string GroupName { get; set; }

        public virtual string PageName { get; set; }

        private string caption = "按鈕";

        public virtual string Caption

        {

            get { return this.caption; }

            set { this.caption = value; }

        }

        public virtual Image smallImage { get; set; }

        public virtual Image largeImage { get; set; }

        public virtual bool IsEnabled

        {

            get

            {

                return this.isEnabled;

            }

            set

            {

                this.isEnabled = value;

            }

        }

        public virtual bool IsVisible

        {

            get

            {

                return this.isVisible;

            }

            set

            {

                this.isVisible = value;

            }

        }

    }

我們要實現一個功能則只需要定義一個類繼承於AbstractToolButtonCommand類且實現相應的屬性和Run函數即可。這樣在主窗口上就會自動加載一按鈕,點擊該按鈕執行相應的功能。將該類編譯成一個獨立的DLL,放置於主程序的相同目錄中,會自動將其反射出來加載:

public class AddOneSec : td.Core.AbstractToolButtonCommand

    {

        public override void Run()

        {

            var t = td.Core.WorkBenchSingleTon.WorkBench.GetActivteTabPage();

            if (t is td.Core.ViewContent)

            {

                {

                    var control = (userControl)t.ViewContentControl;

                    ((userControl)control).txtBox.Text = DateTime.Now.ToString();//設置主窗口中TextBox的值

                }

            }

        }

        public override string PageName  //Ribbon界面中頁面的名字

        {

            get

            {

                return "Home";

            }

            set

            {

                base.PageName = value;

            }

        }

        public override Image smallImage  //設置圖標

        {

            get

            {

                try

                {

                    return Image.FromFile(Application.StartupPath+"\\images\\Drafts_16x16.png");

                }

                catch (Exception ee)

                {

                    return null;

                }

            }

            set

            {  

               base.smallImage = value;  

           }

        }

        public override System.Drawing.Image largeImage

        {

            get

            {

                try

                {

                    return Image.FromFile(Application.StartupPath + "\\images\\Drafts_16x16.png");

                }

                catch (Exception ee)

                {

                    return null;   

              }

            }

            set

            {

                base.largeImage = value;

            }

        }
        public override bool IsEnabled   //按鈕是否有效,這個可以用於權限的判斷,只要在這里設置好條件的判斷,系統會自動更新按鈕的狀態。在這里我是判斷C:\1.TXT是否存在,如果在運行過程中刪除了該文件,則按鈕會自動變成灰色。

        {

            get

            {

                return File.Exists("c:\\1.txt");

            }

            set

            {

                base.IsEnabled = value;

            }

        }

        public override string GroupName   //組名稱

        {

            get

            {

                return "--ok";

            }

            set

            {

                base.GroupName = value;

            }         }

        public override string Caption    //按鈕標題

        {

            get

            {

                return "增加1秒";

            }

            set

            {

                base.Caption = value;

            }

        }

    }

在上 一篇博客中我據介紹了singleton模式,在這里就用到了,主界面使用singleton模式,保證只有一個實例,而且在整個軟件任何地方我都可以通過singleton所提供的workbench屬性訪問到主窗口中的屬性(當然要訪問到主窗口中的控件,需要將控件設置成public )。

在本例中Run函數首先通過workbench所提供的GetActivteTabPage函數獲取當前的頁面,然后轉換成對應的User控件,然后更改該控件上的textbox的值,(為了方便將頁面上所有的控件做成了一個用戶控件,這樣在VIEW中就只需要處理一個UserControl了,這樣就避免將所有的控件的操作放到workbench中,而是分解到了各自的模塊上。)

public override void Run()

        {

            var t = td.Core.WorkBenchSingleTon.WorkBench.GetActivteTabPage();

            if (t is td.Core.ViewContent)

            {

                {

                    var control = (userControl)t.ViewContentControl;

                    ((userControl)control).txtBox.Text = DateTime.Now.ToString();

                 }   

          }  

       }

 

DEMO下載地址:http://download.csdn.net/detail/happyw2004/4986552


免責聲明!

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



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