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

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

接着上一篇博客, 那里实现了简单的控制台加载插件,在这里通过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实现简单的插件化开发的更多相关文章

  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. HDU 1280 前m大的数 基数排序

    http://acm.hdu.edu.cn/showproblem.php?pid=1280 题目大意: 给你N(N<=3000)个数(这些数不超过5000),要求输出他们两两相加后和最大的M( ...

  2. ARM+linux学习过程(2)安装vmware-tool过程与错误解决

    安装: 点击Ubuntu VMware菜单的-VM-Install VMware Tools 这时,在Ubuntu下会自动加载Linux版的VMware Tools的安装光盘镜像.你会看到虚拟机的桌面 ...

  3. 教你写Http框架(二)——三个样例带你深入理解AsyncTask

    这个标题大家不要奇怪,扯Http框架怎么扯到AsyncTask去了,有两个原因:首先是Http框架除了核心http理论外.其技术实现核心也是线程池 + 模板 + handler,而AsyncTask又 ...

  4. 分层抽样(Stratified sampling)

    1. 基本概念 统计学理论中,分层抽样针对的是对一个总体(population)进行抽样的方法.尤其适用于当总体内部,子总体(subpopulations)间差异较大时.每一个 subpopulati ...

  5. diff_mysql_table_exec.py

    #!/usr/bin/env python #-*- encoding: utf8 -*- import mysql.connector import sys import re import dat ...

  6. 【u125】最大子树和

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课 ...

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

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

  8. [Angular] How to styling ng-content

    Let's say you are builing a reuseable component. The style structure like this: div > input If yo ...

  9. 【基础练习】【线性DP】codevs3641 上帝选人题解

    这道题目的数据最后一个有问题,特殊处理了 上题目 题目描写叙述 Description 世界上的人都有智商IQ和情商EQ.我们用两个数字来表示人的智商和情商,数字大就代表其对应智商或情商高. 如今你面 ...

  10. iOS开发:父子控制器简介:

    #import "ViewController.h" #import "ScoietyViewController.h" #import "HotVi ...