原文:[Songqw.Net 基础]WPF实现简单的插件化开发

版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/article/details/50895733

接着上一篇博客, 那里实现了简单的控制台加载插件,在这里通过WPF实现,做个备份.

WPF控件空间经常会与WinFrom混淆,要记得WPF控件是引用 using System.Windows.Controls;

1.构建控件:

WpfPart1.xaml

  1. <UserControl x:Class="Songqw.Net.Plugins.Test.WPFPlugins.WpfPart1"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6. mc:Ignorable="d"
  7. d:DesignHeight="300" d:DesignWidth="300">
  8. <Grid>
  9. <Grid.Background>
  10. <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
  11. <GradientStop Color="#FF7C44F5" Offset="0"/>
  12. <GradientStop Color="White" Offset="1"/>
  13. </LinearGradientBrush>
  14. </Grid.Background>
  15. </Grid>
  16. </UserControl>

 

WpfPart1.xaml.cs

  1. using System;
  2. using System.Windows.Controls;
  3. using Songqw.Net.Plugins.Interface;
  4. namespace Songqw.Net.Plugins.Test.WPFPlugins
  5. {
  6. /// <summary>
  7. /// WpfPart1.xaml 的交互逻辑
  8. /// </summary>
  9. public partial class WpfPart1 : UserControl, IPluginMember
  10. {
  11. public WpfPart1()
  12. {
  13. InitializeComponent();
  14. }
  15. public string PluginName()
  16. {
  17. return "WpfPart1";
  18. }
  19. public int PluginId()
  20. {
  21. return GetHashCode();
  22. }
  23. public object InitPlugin()
  24. {
  25. return this;
  26. }
  27. public object InitPlugin(object[] paras)
  28. {
  29. return this;
  30. }
  31. public bool DisposePlugin()
  32. {
  33. throw new NotImplementedException();
  34. }
  35. }
  36. }

WpfPart2 同上, 修改下名称即可.

测试WPF程序:

MainWindow.xaml

  1. <Window x:Class="Songqw.Net.Plugins.Test.WpfApplication.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="WPF插件测试程序" Height="350" Width="525">
  5. <Grid>
  6. <Grid.RowDefinitions>
  7. <RowDefinition Height="20"/>
  8. <RowDefinition Height="100*"/>
  9. <RowDefinition Height="30"/>
  10. </Grid.RowDefinitions>
  11. <Grid.ColumnDefinitions>
  12. <ColumnDefinition Width="120"/>
  13. <ColumnDefinition Width="100*"/>
  14. </Grid.ColumnDefinitions>
  15. <StackPanel x:Name="PartPanel" Margin="0,4,0,2" Grid.Row="1"/>
  16. <Grid x:Name="PartGrid"
  17. HorizontalAlignment="Left" Height="320" VerticalAlignment="Top" Width="397"
  18. Grid.Column="1"
  19. Grid.Row="0"
  20. Grid.RowSpan="3" Background="#FF686868"/>
  21. <Label Content="加载插件数量 : 0 "
  22. Name="NumLabel"
  23. Grid.Row="0"
  24. Grid.Column="0"
  25. VerticalAlignment="Top" Height="20" Padding="5,0" Margin="5,0"/>
  26. <Button Content="选择目录"
  27. Grid.Row="2"
  28. Grid.Column="0"
  29. HorizontalAlignment="Left" VerticalAlignment="Top"
  30. Margin="21,3,0,0" Width="75" Click="Button_Click"
  31. />
  32. </Grid>
  33. </Window>

MainWindow.xaml.cs:

  1. using System;
  2. using System.Windows;
  3. using System.Windows.Forms;
  4. using Songqw.Net.Plugins.Interface;
  5. using Songqw.Net.Plugins.Tool;
  6. using Application = System.Windows.Forms.Application;
  7. using Button = System.Windows.Controls.Button;
  8. namespace Songqw.Net.Plugins.Test.WpfApplication
  9. {
  10. /// <summary>
  11. /// MainWindow.xaml 的交互逻辑
  12. /// </summary>
  13. public partial class MainWindow : Window
  14. {
  15. public MainWindow()
  16. {
  17. InitializeComponent();
  18. }
  19. private void Button_Click(object sender, RoutedEventArgs e)
  20. {
  21. var folderBrowserDialog = new FolderBrowserDialog();
  22. folderBrowserDialog.SelectedPath = Application.StartupPath;
  23. folderBrowserDialog.ShowDialog();
  24. if (!string.IsNullOrEmpty(folderBrowserDialog.SelectedPath))
  25. {
  26. PartGrid.Children.Clear();
  27. PartPanel.Children.Clear();
  28. var plugins = LoadLibrary.LoadDocument(Application.StartupPath);
  29. if (plugins != null && plugins.Length > 0)
  30. {
  31. foreach (Type t in plugins)
  32. {
  33. var instance = LoadLibrary.InitClassByType(t) as IPluginMember;
  34. if (instance == null)
  35. continue;
  36. var btn = new System.Windows.Controls.Button
  37. {
  38. Tag = instance,
  39. Content = instance.PluginName(),
  40. Height = 25
  41. };
  42. btn.Click += btn_Click;
  43. PartPanel.Children.Add(btn);
  44. }
  45. NumLabel.Content = string.Format("加载插件数量 : {0}", plugins.Length);
  46. }
  47. }
  48. }
  49. void btn_Click(object sender, RoutedEventArgs e)
  50. {
  51. PartGrid.Children.Clear();
  52. var btn = sender as Button;
  53. var instance = btn.Tag as IPluginMember;
  54. var ui = instance.InitPlugin();
  55. var uiElement = ui as UIElement;
  56. PartGrid.Children.Add(uiElement);
  57. }
  58. }
  59. }

测试效果:

实际使用时, 可以通过InitPlugin 方法传递参数, 进行赋值等操作.   资源释放方面需要额外注意....

[Songqw.Net 基础]WPF实现简单的插件化开发的更多相关文章

  1. [Songqw.Net 基础]WPF插件化中同步Style

    原文:[Songqw.Net 基础]WPF插件化中同步Style 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/a ...

  2. 零基础ASP.NET Core MVC插件式开发

    零基础ASP.NET Core MVC插件式开发 一个项目随着业务模块的不断增加,系统会越来越庞大.如果参与开发的人员越多,管理起来也难度也很大.面对这样的情况,首先想到的是模块化插件式开发,根据业务 ...

  3. NET 平台下的插件化开发内核

    .NET 平台下的插件化开发内核(Rabbit Kernel)   每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...

  4. 《Android插件化开发指南》面世

    本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...

  5. Android 插件化开发(一):Java 反射技术介绍

    写在前面:学习插件化开发推荐书籍<Android 插件化开发指南>,本系列博客所整理知识部分内容出自此书. 在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到J ...

  6. apisix docker镜像构建及插件化开发

    高能劝退:lua开发,适合小白看!!! 前段时间有个项目,用的java程序做网关,压测tps只有1k多点,惨不忍睹. 后来公司有个大佬改用apisix做网关,tps飙升到1w多. 于是对神奇的apis ...

  7. Android组件化和插件化开发

    http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...

  8. Android插件化开发

    客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...

  9. JavaScript插件化开发

    大熊君JavaScript插件化开发 一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那 ...

随机推荐

  1. AE开发概念辨析

    樱木 原文 AE开发之概念辨析2,AE开发涉及相关概念,AE开发相关概念 1 AE中的类库 AE总共包括了21个子库,分别是SYSTEM,SYSTEMUI,GEOMETRY,DISPLAY,SERVE ...

  2. 【跟我一起学Unity3D】代码中分割图片而且载入帧序列动画

    在Cocos2dx中.对大图的处理已经封装好了一套自己的API,可是在Unity3D中貌似没有类似的API(好吧,实际上是有的,并且功能更强大),或者说我没找到. 只是这也在情理之中,毕竟Unity3 ...

  3. Vue源码--深入模板渲染

    原文链接:https://geniuspeng.github.io/2018/02/07/vue-compile/ 之前整理了vue的响应式原理,在这里有一点是一直很模糊的,就是何时去new一个wat ...

  4. 具体解释https是怎样确保安全的

    Https 介绍 什么是Https HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer).是以安全为目标的HTTP通道,简单讲是 ...

  5. event.relatedTarget、event.fromElement、event.toElement

    在标准DOM中,mouseover和mouseout所发生的元素可以通过event.target来访问,相关元素通过event.relatedTarget属性来访问.event.relatedTarg ...

  6. Docker容器应用日志查看

    原文:Docker容器应用日志查看 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/benben_2015/article/details/80708 ...

  7. Xmem

    http://blog.csdn.net/jthink_/article/details/43302615

  8. spring+aspectJ的实现

    AspectJ:(Java社区里最完整最流行的AOP框架) spring自身也有一套AOP框架,但相比较于AspectJ,更推荐AspectJ 在Spring2.0以上版本中,可以使用基于Aspect ...

  9. android应用开发 button显示两行文本

    自己写了个电话拨号器的程序给男朋友玩,用来专门打我的手机号,为了把界面做的好看一点,须要用到显示两行文本的button.在网上搜罗了两种方法,记录在以下.跟大家一起分享一下,希望能帮到须要的人. 方法 ...

  10. [转至云风的博客]谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇)

    « 谈谈陌陌争霸在数据库方面踩过的坑(芒果篇) | 返回首页 | linode 广告时间 » 谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇) 注:陌陌争霸的数据库部分我没有参与具体设计,只是参与 ...