C# WPF通过反射及Ioc容器加载并显示其它项目界面(精品)

news2024/10/5 13:51:47

概述

    这节主要通过发射+Caliburn.Micro自带的ioc容器实现加载并显示其它项目中的界面.实现效果如下: 

96de8da0dc8d67784c6ce63b10b9be3d.gif

具体实现

   -. ①首先在引导程序页面通过发射加载类库,并将视图注入ioc容器,这里为了实现解耦合注入了ICommonBasePage接口类型:

private void ExternalLoad()
        {
            //container = new SimpleContainer();
            //container.Instance(container);


            var asmPath = Assembly.GetAssembly(typeof(HelloBootstrapper)).Location;
            var path = Directory.GetParent(asmPath).FullName;
            string filePath = Path.Combine(path, "PluginTest.dll");


            //var assembly = Assembly.GetAssembly(typeof(PageBase));
            //container.AllTypesOf<ShellViewModel>(assembly);
            var assembly = Assembly.LoadFile(filePath);
            assembly.GetTypes()
                    .Where(type => type.IsClass)
                    .Where(type => type.Name.EndsWith("ViewModel"))
                    .ToList()
                     .ForEach(viewModelType => container.RegisterPerRequest(
                       typeof(ICommonBasePage), viewModelType.ToString(), viewModelType));


            //container
            //    .Singleton<IWindowManager, WindowManager>()
            //    .Singleton<IEventAggregator, EventAggregator>()
            //    .PerRequest<MainWindowViewModel>();
        }

接口定义在单独的类库中:

public interface ICommonBasePage
    {
        void ShowNewWindow();
    }

加入程序集到IEnumerable<Assembly>

protected override IEnumerable<Assembly> SelectAssemblies()
        {
            string filePath = Path.Combine(Directory.GetCurrentDirectory(), "PluginTest.dll");


            var assembly = Assembly.LoadFile(filePath);
            return new[] { Assembly.GetExecutingAssembly(), assembly };
        }

-.②PluginTest是要加载显示的项目:

PluginTestViewModel.cs源码如下:

using CommonShareBase;
using System.ComponentModel.Composition;
using System.Windows;


namespace PluginTest
{
    //[PluggablePart(name: "PluginTestViewModel", desciption: "This is PluginTestViewModel content pluggable part.", displayNameResourceKey: "PluginTestViewModel")]
    //[Export("PluginTestViewModel", typeof(IPluggablePart))]
    //[PartCreationPolicy(CreationPolicy.Shared)]
    ///也可以这样
    [Export(typeof(ICommonBasePage))]
    public class PluginTestViewModel : ICommonBasePage
    {
        //public void PreparePart(IPluggablePartContext pluggablePartContext)
        //{
        //    //throw new NotImplementedException();
        //}


        public void ShowNewWindow()
        {
            MessageBox.Show("dotnet讲堂");
        }
    }
}

PluginTestView.xaml代码如下:

<UserControl x:Class="PluginTest.PluginTestView"
             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" 
             xmlns:local="clr-namespace:PluginTest"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />


        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Button Name="ShowNewWindow" Content="ShowNewWindow" Grid.Row="0" Grid.Column="0"  FontSize="35" Background="LightBlue"/>
    </Grid>
</UserControl>

-. ③在调用的地方先定义ICommonBasePage 类型的VM:

public ICommonBasePage PluginTestViewModel { get; set; }

按钮事件里面从ioc获取视图并给界面赋值:

public void IocTest4()
        {
            //通过接口实现解耦合
            var shellVM = IoC.Get<ICommonBasePage>();
            //shellVM.ShowNewWindow();


            PluginTestViewModel = shellVM;
            ActivateItemAsync(PluginTestViewModel);
        }

源码下载

链接:https://pan.baidu.com/s/1wtNduWVUiFV46WwWE4hrEw

提取码:6666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你安装Zookeeper 及可视化插件ZooInspector、ZKUI

手把手教你安装Zookeeper 一、下载Zookeeper二、配置并启动1. 服务端配置2. 启动服务端3. 客户端验证 三、图形化管理工具1. ZooInspector2. ZKUI 一、下载Zookeeper 环境预备&#xff1a;请确保JDK正确安装 我们先进入 官网发布页面 根据推荐&#xff0c;推荐直接使用最近…

Web漏洞-敏感信息泄露-后台地址爆破

实验目的 通过爬虫去爬取网站目录&#xff0c;然后将爬取到目录进行展现&#xff0c;同时也可以匹配关键目录&#xff0c;如&#xff1a;admin,manger等。 实验环境 实验环境&#xff1a;kali 实验工具&#xff1a;Dirb 实验原理 默认情况下后台地址是不应被搜索引擎爬取到…

回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测

回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度…

window11系统基于 wsl2 安装Linux发行版ubuntu,并安装docker及vscode

前景介绍&#xff1a; WSL是“Windows Subsystem for Linux”的缩写&#xff0c;顾名思义&#xff0c;WSL就是Windows系统的Linux子系统&#xff0c;其作为Windows组件搭载在Windows10周年更新&#xff08;1607&#xff09;后的Windows系统中。 既然WSL是“子系统”&#xff…

数据库视图与索引经典题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 视图与索引视图&#xff1a;定义视图创建视图删除视图查询视图视图的作用 索引索引的概念索引的类型设计索引 视图与索引 视图&#xff1a; 视图是从一个或几个基…

RabbitMQ系列(20)--RabbitMQ备份交换机

前言&#xff1a;上一篇文章我们提到当交换机确认消息失败或者交换机发送消息到队列失败&#xff0c;都可以通过回调方法让生产者重新发送消息&#xff0c;除此之外另一种方法就是通过备份交换机的方式保证消息的不丢失&#xff0c;当生产者无法把消息投递给交换机&#xff0c;…

剑指 Offer 67: 把字符串转换成整数

这道题使用的办法是先判断是否有符号&#xff0c;把空格消除&#xff0c;然后用一个标志位判断是否为负数。当遇到这种问题记得调用Integer中的MIN_VALUE和MAX_VALUE这样最方便。 class Solution {public int strToInt(String str) {//去前后空格char[] chars str.trim().toCh…

SpringMVC JDK17 SpringFramework6x Tomcat10遇到的找不到资源404问题以及SercletException

发生资源找不到异常 本人使用Tomcat9 与 jdk17 时无任何冲突可以随便使用 Springframework6x系列 对应的应该时tomcat10版本 在使用过程中遇到两个问题 1.依赖问题 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</a…

【Java】链表LinkedList

文章目录 一、链表1.1 链表的概念1.2 链表的结构 二、LinkedList的简介三、LinkedList的使用3.1 构造方法3.2 常见操作3.3 遍历方法 四、LinkedList的模拟实现五、LinkedList 和 ArrayList 的区别 一、链表 1.1 链表的概念 链表&#xff08;Linked List&#xff09;是一种常见…

hive数据的导入导出

一、hive 的数据导入 Linux本地文件以及数据格式&#xff1a; 在hive中创建表&#xff1a; create table t_user( id int ,name string ) row format delimited fields terminated by "," lines terminated by \n stored as textfile;stored as常见的几种格式 1.…

举例说明ChatGPT模型是怎么进行无监督学习的

ChatGPT&#xff0c;也称为生成式预训练Transformer&#xff08;GPT&#xff09;&#xff0c;是一种基于Transformer架构的自然语言处理模型。虽然在实际应用中&#xff0c;它主要用于有监督学习任务&#xff0c;但在训练初期&#xff0c;它会经历无监督学习阶段。以下是一个简…

LNMP实战部署(电影网站搭建)

第三阶段基础 时 间&#xff1a;2023年7月5日 参加人&#xff1a;全班人员 内 容&#xff1a; 目录 LNMP架构及应用部署&#xff1a;&#xff08;单台服务器部署&#xff09; 一、安装nginx&#xff1a;&#xff08;源码安装&#xff09; 二、安装mysql数据库&#xf…

LVS+Keepalived 群集及搭建

文章目录 一.keepalived 概述1.keepalived服务重要功能1.1 管理LvS负载均衡器软件1.2 支持故障自动切换 (failover)1.3 实现LVS集中节点的健康检查 (health checking)1.4 实现LVS负载调度器 节点服务器的高可用性 (HA) 2. keepalived 高可用故障切换转移原理及VRRP通信原理3.ke…

【C++】提前声明(Forward declaration)好处

C中提前声明&#xff08;Forward declaration&#xff09;好处小结&#xff1a; 减少编译依赖&#xff1a;通过提前声明&#xff0c;可以减少对头文件的依赖。这样可以降低编译时间&#xff0c;因为编译器不需要查看完整的定义&#xff0c;而仅需要知道类型的名称和成员函数的…

利用langchain-ChatGLM实现基于本地知识库的问答应用

目录 1 原理 2 开发部署 2.1 安装环境 2.2 加载本地模型 刷B站的时候&#xff0c;无意中看到吴恩达的一个langchain的教程&#xff0c;然后去github上搜了下&#xff0c;发现别人利用langchain和chatGLM做的基于本地知识库的问答应用挺好的&#xff0c;学习下。 1 原理 基…

yolov8-mnn C++部署

权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/zaibeijixing/article/details/131581809 ———————————————— 目录 准备工作 1、MNN编…

【Android】CheckBox的自定义样式和使用

需求 在登录页面。我们需要有一个复选框&#xff0c;让用户进行勾选&#xff0c;同意我们的流氓政策和协议&#xff0c;不然就不让用。 实现效果 未选择 已选择 我们知道&#xff0c;这个CheckBox的默认样式是一个正方形&#xff0c;现在改成一个圆形的话&#xff0c;首先需…

我的创作纪念日——我与CSDN的1024天

今天是在CSDN创作的第1024天&#xff0c;是一个非常有意义的天数&#xff0c;故写下此篇文章以表纪念之意。 机缘 我为什么会在CSDN写文章呢&#xff0c;那滴从很久很久以前说起。记得是大一的时候&#xff0c;我们的组原课程的授课老师在一次课堂上问起我们&#xff0c;问我…

AIGC - Easy Diffusion (Stable Diffusion) 图像生成工具的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131524075 版本v2.5.41 Stable Diffusion 图像生成工具是一种基于深度学习的技术&#xff0c;可以从随机噪声中生成高质量的图像&#x…

HFSS仿真T型波导学习笔记

HFSS仿真T型波导 文章目录 HFSS仿真T型波导1、求解器设置2、建模3、激励方式设置4、边界条件设置5、扫频设置6、设计检查&#xff0c;仿真分析7、数据后处理 设计要求&#xff1a; 仿真工作频率为10GHz的T型波导 1、求解器设置 模式驱动求解 2、建模 整个T型波导结构分为2…