[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 方法传递参数, 进行赋值等操作.   资源释放方面需要额外注意....

目录
相关文章
|
5天前
|
设计模式 开发框架 JavaScript
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
100 3
|
5天前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统
|
10天前
|
存储 设计模式 编解码
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
【11月更文挑战第5天】本文分析了.NET 8.0 通用管理平台在模块化、WinForms 和 WPF 方面的优势。模块化设计提升了系统的可维护性和可扩展性,提高了代码复用性;WinForms 提供了丰富的控件库和简单易用的开发模式,技术成熟稳定;WPF 支持强大的数据绑定和 MVVM 模式,具备丰富的图形和动画功能,以及灵活的布局系统。
|
5天前
|
开发框架 JavaScript 前端开发
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
|
28天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
33 1
|
1月前
|
设计模式 前端开发 C#
使用 Prism 框架实现导航.NET 6.0 + WPF
使用 Prism 框架实现导航.NET 6.0 + WPF
84 10
|
1月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
1月前
|
C# Windows
一款基于.NET开发的简易高效的文件转换器
一款基于.NET开发的简易高效的文件转换器
|
1月前
|
开发框架 缓存 前端开发
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!

热门文章

最新文章