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

简介: 原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/article/details/50895733 ...
原文: [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 方法传递参数, 进行赋值等操作.   资源释放方面需要额外注意....

目录
相关文章
|
6天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
38 12
|
4天前
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
|
4天前
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
|
4天前
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
|
4天前
|
网络协议 C#
基于.NET WinForm开发的一款硬件及协议通讯工具
基于.NET WinForm开发的一款硬件及协议通讯工具
|
4天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
4天前
|
SQL 中间件 C#
一个使用 WPF 开发的管理系统
一个使用 WPF 开发的管理系统
|
4天前
|
网络协议 网络安全 C#
基于 WPF 开发的简约,功能强大的终端模拟器
基于 WPF 开发的简约,功能强大的终端模拟器 前言今天大姚给大家推荐一款基于 WPF 开发的简约,功能强大的终端模拟器:ModengTerm。项目介绍ModengTerm是一款基于 WPF 开发的简约,功能强大的终端模拟器,可以用来连接SSH服务器,串口,TCP服务器,Windows命令行等。项目功能支持与SSH服务器,串口,Windows命令行进行交互。可以保存会话信息,方便下次直接登录。支持将终端内容导出为txt和html格式。根据关键字/正则表达式进行历史记录的查找。同步输入功能、历史记录、度可定制化的颜色主题、实时记录日志功能等。项目源码运行设置ModengTerm为启动项目运行:
|
2月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
46 4
|
2月前
|
机器学习/深度学习 人工智能 物联网
.NET 技术:引领未来开发潮流
.NET 技术以其跨平台兼容性、高效的开发体验、强大的性能表现和安全可靠的架构,成为引领未来开发潮流的重要力量。本文深入探讨了 .NET 的核心优势与特点,及其在企业级应用、移动开发、云计算、人工智能等领域的广泛应用,展示了其卓越的应用价值和未来发展前景。
65 5