[Songqw.Net 基础]WPF实现简单的插件化开发
原文:[Songqw.Net 基础]WPF实现简单的插件化开发
接着上一篇博客, 那里实现了简单的控制台加载插件,在这里通过WPF实现,做个备份.
WPF控件空间经常会与WinFrom混淆,要记得WPF控件是引用 using System.Windows.Controls;
1.构建控件:
WpfPart1.xaml
<UserControl x:Class="Songqw.Net.Plugins.Test.WPFPlugins.WpfPart1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF7C44F5" Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
</Grid>
</UserControl>
WpfPart1.xaml.cs
using System;
using System.Windows.Controls;
using Songqw.Net.Plugins.Interface;
namespace Songqw.Net.Plugins.Test.WPFPlugins
{
/// <summary>
/// WpfPart1.xaml 的交互逻辑
/// </summary>
public partial class WpfPart1 : UserControl, IPluginMember
{
public WpfPart1()
{
InitializeComponent();
}
public string PluginName()
{
return "WpfPart1";
}
public int PluginId()
{
return GetHashCode();
}
public object InitPlugin()
{
return this;
}
public object InitPlugin(object[] paras)
{
return this;
}
public bool DisposePlugin()
{
throw new NotImplementedException();
}
}
}
WpfPart2 同上, 修改下名称即可.
测试WPF程序:
MainWindow.xaml
<Window x:Class="Songqw.Net.Plugins.Test.WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WPF插件测试程序" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="100*"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition Width="100*"/>
</Grid.ColumnDefinitions>
<StackPanel x:Name="PartPanel" Margin="0,4,0,2" Grid.Row="1"/>
<Grid x:Name="PartGrid"
HorizontalAlignment="Left" Height="320" VerticalAlignment="Top" Width="397"
Grid.Column="1"
Grid.Row="0"
Grid.RowSpan="3" Background="#FF686868"/>
<Label Content="加载插件数量 : 0 "
Name="NumLabel"
Grid.Row="0"
Grid.Column="0"
VerticalAlignment="Top" Height="20" Padding="5,0" Margin="5,0"/>
<Button Content="选择目录"
Grid.Row="2"
Grid.Column="0"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="21,3,0,0" Width="75" Click="Button_Click"
/>
</Grid>
</Window>
MainWindow.xaml.cs:
using System;
using System.Windows;
using System.Windows.Forms;
using Songqw.Net.Plugins.Interface;
using Songqw.Net.Plugins.Tool;
using Application = System.Windows.Forms.Application;
using Button = System.Windows.Controls.Button;
namespace Songqw.Net.Plugins.Test.WpfApplication
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var folderBrowserDialog = new FolderBrowserDialog();
folderBrowserDialog.SelectedPath = Application.StartupPath;
folderBrowserDialog.ShowDialog();
if (!string.IsNullOrEmpty(folderBrowserDialog.SelectedPath))
{
PartGrid.Children.Clear();
PartPanel.Children.Clear();
var plugins = LoadLibrary.LoadDocument(Application.StartupPath);
if (plugins != null && plugins.Length > 0)
{
foreach (Type t in plugins)
{
var instance = LoadLibrary.InitClassByType(t) as IPluginMember;
if (instance == null)
continue;
var btn = new System.Windows.Controls.Button
{
Tag = instance,
Content = instance.PluginName(),
Height = 25
};
btn.Click += btn_Click;
PartPanel.Children.Add(btn);
}
NumLabel.Content = string.Format("加载插件数量 : {0}", plugins.Length);
}
}
}
void btn_Click(object sender, RoutedEventArgs e)
{
PartGrid.Children.Clear();
var btn = sender as Button;
var instance = btn.Tag as IPluginMember;
var ui = instance.InitPlugin();
var uiElement = ui as UIElement;
PartGrid.Children.Add(uiElement);
}
}
}
测试效果:
实际使用时, 可以通过InitPlugin 方法传递参数, 进行赋值等操作. 资源释放方面需要额外注意....
[Songqw.Net 基础]WPF实现简单的插件化开发的更多相关文章
- [Songqw.Net 基础]WPF插件化中同步Style
原文:[Songqw.Net 基础]WPF插件化中同步Style 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/a ...
- 零基础ASP.NET Core MVC插件式开发
零基础ASP.NET Core MVC插件式开发 一个项目随着业务模块的不断增加,系统会越来越庞大.如果参与开发的人员越多,管理起来也难度也很大.面对这样的情况,首先想到的是模块化插件式开发,根据业务 ...
- NET 平台下的插件化开发内核
.NET 平台下的插件化开发内核(Rabbit Kernel) 每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...
- 《Android插件化开发指南》面世
本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...
- Android 插件化开发(一):Java 反射技术介绍
写在前面:学习插件化开发推荐书籍<Android 插件化开发指南>,本系列博客所整理知识部分内容出自此书. 在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到J ...
- apisix docker镜像构建及插件化开发
高能劝退:lua开发,适合小白看!!! 前段时间有个项目,用的java程序做网关,压测tps只有1k多点,惨不忍睹. 后来公司有个大佬改用apisix做网关,tps飙升到1w多. 于是对神奇的apis ...
- Android组件化和插件化开发
http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...
- Android插件化开发
客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...
- JavaScript插件化开发
大熊君JavaScript插件化开发 一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那 ...
随机推荐
- AE开发概念辨析
樱木 原文 AE开发之概念辨析2,AE开发涉及相关概念,AE开发相关概念 1 AE中的类库 AE总共包括了21个子库,分别是SYSTEM,SYSTEMUI,GEOMETRY,DISPLAY,SERVE ...
- 【跟我一起学Unity3D】代码中分割图片而且载入帧序列动画
在Cocos2dx中.对大图的处理已经封装好了一套自己的API,可是在Unity3D中貌似没有类似的API(好吧,实际上是有的,并且功能更强大),或者说我没找到. 只是这也在情理之中,毕竟Unity3 ...
- Vue源码--深入模板渲染
原文链接:https://geniuspeng.github.io/2018/02/07/vue-compile/ 之前整理了vue的响应式原理,在这里有一点是一直很模糊的,就是何时去new一个wat ...
- 具体解释https是怎样确保安全的
Https 介绍 什么是Https HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer).是以安全为目标的HTTP通道,简单讲是 ...
- event.relatedTarget、event.fromElement、event.toElement
在标准DOM中,mouseover和mouseout所发生的元素可以通过event.target来访问,相关元素通过event.relatedTarget属性来访问.event.relatedTarg ...
- Docker容器应用日志查看
原文:Docker容器应用日志查看 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/benben_2015/article/details/80708 ...
- Xmem
http://blog.csdn.net/jthink_/article/details/43302615
- spring+aspectJ的实现
AspectJ:(Java社区里最完整最流行的AOP框架) spring自身也有一套AOP框架,但相比较于AspectJ,更推荐AspectJ 在Spring2.0以上版本中,可以使用基于Aspect ...
- android应用开发 button显示两行文本
自己写了个电话拨号器的程序给男朋友玩,用来专门打我的手机号,为了把界面做的好看一点,须要用到显示两行文本的button.在网上搜罗了两种方法,记录在以下.跟大家一起分享一下,希望能帮到须要的人. 方法 ...
- [转至云风的博客]谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇)
« 谈谈陌陌争霸在数据库方面踩过的坑(芒果篇) | 返回首页 | linode 广告时间 » 谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇) 注:陌陌争霸的数据库部分我没有参与具体设计,只是参与 ...