zoukankan      html  css  js  c++  java
  • C#一步一步实现插件框架的示例(三)

    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:

    https://files.cnblogs.com/city-hunter/ExampleAddin3.rar

    需要在C盘根目录下建立1.txt文件来使能工具栏按钮,第一个按钮为操作View中的TextBox的值 ,后两个是以前的例子。

  • 相关阅读:
    Redis 主从复制与哨兵
    前端面试中让你困惑的闭包、原型、原型链究竟是什么?
    Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略[转]
    nodejs 制作项目目录树代码
    nprogress页面加载进度条
    koa2 从入门到进阶之路 (一)
    原生js 封装好了的ajax 带钩子版本 可封装成对象
    JS
    Javascript面向对象编程(三):非构造函数的继承
    Java 内部类
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2878815.html
Copyright © 2011-2022 走看看