Caliburn.Micro框架学习笔记——窗体管理对象的基本使用

Caliburn.Micro 的窗口管理器(Window Manager)是一个强大的工具,用于管理 WPF 应用程序中的窗口和对话框。它简化了窗口的创建、显示和关闭等操作,使得视图和视图模型的交互更加直观和易于维护。

它能够实现的功能包括

  1. 显示窗口

    • 打开一个新的窗口,并将指定的视图模型作为其数据上下文。
  2. 显示对话框

    • 打开一个模式对话框,并将指定的视图模型作为其数据上下文。
  3. 显示弹出窗口

    • 显示一个非模态弹出窗口,通常用于消息通知或临时窗口。

使用步骤

配置窗口管理器

AppBootstrapper 中注册 IWindowManager

 internal class Startup : BootstrapperBase{private SimpleContainer _container;public Startup(){this.Initialize();}protected override async void OnStartup(object sender, StartupEventArgs e){IDictionary<string, object> args = new Dictionary<string, object>();args.Add("Width", 500);args.Add("Height", 300);args.Add("Foreground", Brushes.Red);await DisplayRootViewForAsync<MainViewModel>(args);//窗口初始化样式}protected override void Configure(){_container = new SimpleContainer();this._container.Instance(this._container);this._container.Singleton<IEventAggregator, EventAggregator>()//注入事件管理器.Singleton<IWindowManager, MyWindowManager>();//注入窗口管理器this._container.PerRequest<MainViewModel>()//程序中相应的窗口对应的ViewModel.PerRequest<AViewModel>().PerRequest<BViewModel>();}protected override object GetInstance(Type service, string key){return this._container.GetInstance(service, key);}

 其中MyWindowManager为继承了WindowManager的自定义重写后的窗体管理器。

 internal class MyWindowManager : WindowManager{protected override Window EnsureWindow(object model, object view, bool isDialog){Window win = base.EnsureWindow(model, view, isDialog);WindowChrome windowChrome = new WindowChrome();windowChrome.NonClientFrameEdges = NonClientFrameEdges.None;// 这里是设置窗口边框厚度(-1 Win11   0  1   Win10)windowChrome.GlassFrameThickness = new Thickness(-1);windowChrome.UseAeroCaptionButtons = false;WindowChrome.SetWindowChrome(win, windowChrome);return win;}}

使用窗口管理器显示窗口或对话框

在视图模型中通过依赖注入获取 IWindowManager 并使用它显示窗口或对话框。这里就是当我们要在哪里打开哪个窗口时,就在哪里进行依赖注入去使用它。

using Caliburn.Micro;public class ShellViewModel : Screen
{private readonly IWindowManager _windowManager;public ShellViewModel(IWindowManager windowManager){_windowManager = windowManager;}public void ShowAnotherWindow()//打开一个一般窗口{var anotherViewModel = new AnotherViewModel();_windowManager.ShowWindow(anotherViewModel);}public void ShowDialog()//打开模态窗口{var anotherViewModel = new AnotherViewModel();_windowManager.ShowDialog(anotherViewModel);}public void ShowPopup()//类似于泡泡弹窗{var anotherViewModel = new AnotherViewModel();_windowManager.ShowPopup(anotherViewModel);}
}

 当然也可以有如下使用异步的方法来操作

public async void OpenWindow()
{
    // 触发打开另一个窗口
    // 打开一个模态窗口:AView
    // 传参
    string arg = "Hello";

    var vm = IoC.Get<AViewModel>();
    vm.Title = arg;

    //IDictionary<string, object> args = new Dictionary<string, object>();
    //args.Add("Width", 300);
    //args.Add("Height", 200);
    //args.Add("Foreground", Brushes.Red);

    //WindowChrome windowChrome = new WindowChrome();
    //windowChrome.NonClientFrameEdges = NonClientFrameEdges.None;
    //windowChrome.GlassFrameThickness = new Thickness(0);
    //windowChrome.UseAeroCaptionButtons = false;
    //args.Add("WindowChrome.WindowChrome", windowChrome);

    //var result = await windowManager.ShowDialogAsync(vm, settings: args);
    var result = await windowManager.ShowDialogAsync(vm);
    if (result == true)
    {
        // 处理vm 中的数据
        this.Value = vm.Value;
    }


    // 打开一个一般的窗口
    //await windowManager.ShowWindowAsync(vm);


}

public async void OpenPopup()
{
    // 打开一个Popup 
    // Popup内容的数据源
    var vm = IoC.Get<BViewModel>();
    // 这里如果遇到未实例化的异常,首先考虑未注册
    await windowManager.ShowPopupAsync(vm);
}

视图模型基类Screen

Screen 对象是视图模型的基类,提供了生命周期管理和一些辅助功能。通过继承 Screen 类,视图模型可以自动获得生命周期事件的支持,这些事件可以用于管理资源、更新 UI 或执行其他操作

Screen 对象通常用作视图模型的基类,提供以下主要功能:

  • 生命周期管理:通过 OnActivateOnDeactivate 方法管理视图模型的激活和停用。
  • 属性更改通知:通过实现 INotifyPropertyChanged 接口来通知 UI 更新。
  • 协作与导航:通过与 Conductor 对象一起工作,管理复杂的导航和视图模型间的交互
protected override void OnActivate(){base.OnActivate();// Code to run when the view model is activated}protected override void OnDeactivate(bool close){base.OnDeactivate(close);// Code to run when the view model is deactivatedif (close){// Cleanup code if the view model is permanently closed}}public void Save(){// Save logic}

 视图管理基类Conduct<T>

Conductor 是一个负责管理其他视图模型的类。它是一个高级的视图模型,提供了一种机制来协调多个子视图模型的生命周期和显示。Conductor 可以管理单个活动项(一个视图模型)或多个活动项(多个视图模型),根据需要动态地激活或停用这些视图模型。

Conductor 的主要类型

  1. Conductor<T>:管理单个活动项。
  2. Conductor<T>.Collection.OneActive:管理一个活动项集合,其中只有一个项可以处于激活状态。
  3. Conductor<T>.Collection.AllActive:管理一个活动项集合,其中所有项都可以处于激活状态。

主要功能

  • 激活和停用:管理子视图模型的激活和停用。
  • 生命周期管理:协调子视图模型的生命周期事件。
  • 导航:在不同视图模型之间导航。
  • 集合管理:管理多个子视图模型的集合。
  • Conductor 类的主要方法
  • ActivateItem:激活指定的子项。
  • DeactivateItem:停用指定的子项。
  • CloseItem:关闭指定的子项。
  • OnActivate:当 Conductor 被激活时调用。
  • OnDeactivate:当 Conductor 被停用时调用。

 管理单个活动项

public class ShellViewModel : Conductor<object>
{private readonly SimpleContainer _container;public ShellViewModel(SimpleContainer container){_container = container;}public void ShowFirstView(){var firstViewModel = _container.GetInstance<FirstViewModel>();ActivateItem(firstViewModel);}public void ShowSecondView(){var secondViewModel = _container.GetInstance<SecondViewModel>();ActivateItem(secondViewModel);}protected override void OnActivate(){base.OnActivate();ShowFirstView(); // 默认显示第一个视图}
}

其中First和Second的视图均继承自Screen。

管理多个活动项(一个活动)

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{private readonly SimpleContainer _container;public ShellViewModel(SimpleContainer container){_container = container;Items.Add(_container.GetInstance<FirstViewModel>());Items.Add(_container.GetInstance<SecondViewModel>());}protected override void OnActivate(){base.OnActivate();ActivateItem(Items[0]); // 默认激活第一个视图}
}

总结

  • Conductor<T>:管理单个活动项,适用于需要在不同视图模型之间进行单一激活的场景。
  • Conductor<T>.Collection.OneActive:管理一个活动项集合,其中只有一个项可以处于激活状态,适用于需要在多个视图模型之间进行单一激活的场景。
  • Conductor<T>.Collection.AllActive:管理一个活动项集合,其中所有项都可以处于激活状态,适用于需要多个视图模型同时激活的场景。

通过使用 Conductor 类,Caliburn.Micro 提供了一种强大而灵活的方式来管理和协调视图模型的生命周期和导航。这使得开发复杂的、多视图模型的应用程序变得更加容易和高效

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

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

相关文章

大学生社团活动平台系统基于springboot+vue的社团管理系统java项目sprignboot项目

文章目录 大学生社团活动平台一、项目介绍二、部分功能截图三、部分代码展示四、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 大学生社团活动平台 一、项目介绍 基于springbootvue的前后端分离大学生社团活动平台 系统角色 : 学生、社长、管理员 1、学生…

pytorch笔记:topk

1 介绍 返回给定输入张量沿指定维度的最大的 k 个元素 如果没有指定 dim 参数&#xff0c;则默认选择输入张量的最后一个维度如果 largest 设置为 False&#xff0c;则返回最小的 k 个元素。返回一个命名元组 (values, indices)&#xff0c;其中包含每一行在指定维度 dim 上最…

Frida

配置环境 查看ubuntu版本 cat /etc/lsb-release设置时区 dpkg-reconfigure tzdataadb adb&#xff1a;&#xff08;Android Debug Bridge&#xff09;是一个用于在计算机和Android设备之间进行通信的命令行工具。它允许开发人员在计算机上执行各种命令&#xff0c;如安装应…

Git配置SSH-Key

git config --global user.name 沈健 git config --global user.email sjshenjianoutlook.com初次使用 SSH 协议进行代码克隆、推送等操作时&#xff0c;需按下述提示完成 SSH 配置 1 生成 RSA 密钥 ssh-keygen -t rsa2. 获取 RSA 公钥内容&#xff0c;并配置到 SSH公钥 中 …

FENDI CLUB精酿啤酒中原麦汁浓度的高低有何区别?

关于精酿啤酒&#xff0c;有两个关键数据&#xff0c;一个是原麦汁浓度&#xff0c;一个是酒精度。酒精度无非是含酒精的高低&#xff0c;但原麦汁浓度又是什么呢&#xff1f;另外精酿啤酒中原麦汁浓度有高有低&#xff0c;究竟有哪些区别呢&#xff1f; 原麦汁浓度是指啤…

c语言是编程软件还是编程语言?深入解析C语言的本质与定位

c语言是编程软件还是编程语言&#xff1f;深入解析C语言的本质与定位 在科技日新月异的今天&#xff0c;编程语言和编程软件在软件开发中扮演着举足轻重的角色。然而&#xff0c;对于初学者来说&#xff0c;这两者之间的界限往往模糊不清&#xff0c;尤其是对于像C语言这样的经…

息壤,让全网算力随愿可得

【全球云观察 &#xff5c; 科技热点关注】 当下的AIGC时代&#xff0c;算力领域面临的最大挑战是什么&#xff1f; 对于这个问题&#xff0c;仁者见仁&#xff0c;智者见智。但答案中最吸引业界眼球的莫过于&#xff0c;算力调度。为什么呢&#xff1f; 「因时而生」&#xf…

2006NOIP普及组真题 4. 数列

线上OJ&#xff1a; 【06NOIP普及组】数列 思考&#xff1a; 这道题大概率是一道可以使用“瞪眼法”找到规律的题目。我们尝试把数据补充的更多&#xff0c;以便于寻找规律 当 k3 时&#xff0c;k的幂次为1, 3, 9, 27, 81… 从上述推理中&#xff0c;我们发现要输出的幂次和中…

Flutter课程分享 -(系统课程 基础 -> 进阶 -> 实战 仿京东商城)

前言 在移动应用开发的世界中&#xff0c;Flutter 作为一款由 Google 推出的开源 UI 软件开发工具包&#xff0c;正迅速赢得开发者们的青睐。其跨平台、高性能、丰富的组件库以及易于学习的特性&#xff0c;使得 Flutter 成为许多开发者的不二选择。然而&#xff0c;对于初学者…

anaconda python 版本对应关系

如何创建python版本的虚拟环境 conda create -n d2l python3.5输入如下命令即可进入虚拟环境 activate d2lanaconda3版本基础python版本Anaconda3-2024.02-1Python 3.11.7Anaconda3-2023.09-0Python 3.11.5Anaconda3-2023.07-2Python 3.11.4Anaconda3-2023.07-1Python 3.11.3…

纯js仿淘宝多图片封面图插件模板/带视频,带放大镜,带前后端完整代码PHP

功能预览,他依赖jq插件,请自已引入 类似这样 <script type"text/javascript" src"/Application/Admin/Static/js/jquery-2.0.3.min.js"></script>一,前端模板代码 <!--多图功能--><style> charset "utf-8"; .wrap_imgs…

Javaweb基础之工程路径

大家好&#xff0c;这里是教授.F 引入&#xff1a; 工程路径有一个知识点需要注意&#xff1a;就是相对路径。所谓相对路径就是依赖当前位置&#xff1a; 相对路径的定位依赖于当前位置或参考位置。 使用相对路径来解决&#xff0c; 一个非常重要的规则&#xff1a;页面所有的…

H6922 2.8C-40V (最低启动电压2.5V)升压BOOST恒压芯片 5V12V24V升压IC

H6922升压BOOST恒压芯片是一款2.8C-40V &#xff08;最低启动电压2.5V&#xff09;升压BOOST恒压芯片 5V12V24V升压IC 首先&#xff0c;H6922的宽输入电压范围&#xff08;2.8-40V&#xff09;和低启动电压&#xff08;最低2.5V&#xff09;使其能够适应不同复杂的电源环境。无…

[书生·浦语大模型实战营]——训练自己的小助手认知+应用部署到 OpenXLab+复现多模态微调

1.训练自己的小助手认知 微调后的回答&#xff1a; 微调前的回答&#xff1a; 2.应用部署到 OpenXLab 上传的自我认知模型 应用部署在OpenXLab&#xff08;比上次部署方便不少&#xff0c;文档写的更清楚了&#xff0c;棒棒&#xff09;,链接如下应用链接 3.复现多模态…

普通人想自学Python?没弄清楚这些,我劝你还是算了吧......

自学Python&#xff0c;为何你值得一试&#xff1f; 在这个瞬息万变的时代&#xff0c;我们常常听到这样的声音&#xff1a;“自学Python&#xff1f;一般人我还是劝你算了吧。” 这样的言论&#xff0c;仿佛是一堵高墙&#xff0c;阻挡着那些怀揣梦想、渴望探索的普通人。然…

C++模板元编程

C模板元编程 为什么需要模板函数&#xff1f; 避免重复写代码 模板函数定义 使用template <class T> 或者template <typename T>其中T是可以变成任何类型调用时候T会替换成需要的类型 twice<int>会将T替换成int template <class T> T twice(T t) {re…

vue3+ts+element-plus 标签红色波浪形(属性不全)

新建文件shims-element-plus.d.ts,具体配置如下 import {ElAutocomplete,ElBadge,ElBreadcrumb,ElBreadcrumbItem,ElButton,ElCard,ElCheckbox,ElCheckboxGroup,ElCol,ElCollapse,ElCollapseItem,ElColorPicker,ElConfigProvider,ElContainer,ElDatePicker,ElDialog,ElDivide…

谷粒商城实战(031 业务-秒杀功能2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第315p-第p318的内容 秒杀上架 定时上架功能 EnableAsync 异步 EnableScheduling 定时调度 Configuration 配置类 创建上架定时任务类和方法 …

408数据结构-图的存储与基本操作 自学知识点整理

前置知识&#xff1a;图的基本概念 图的存储必须完整、准确地反映顶点集和边集的信息。根据不同图的结构和算法&#xff0c;采用不同的存储方式将对程序的效率产生相当大的影响&#xff0c;因此选取的存储结构应适合于待求解的问题。 图的存储 邻接矩阵法 所谓邻接矩阵存储&a…

每天一个数据分析题(三百四十三)

同环比是帮助阅读者了解维度项表现水平有没有随着时间的推移而得以增长提升&#xff0c;以下对于同环比的说法正确的是&#xff1f; A. 同环比计算方法一般适用于对长周期业务行为结果的观测 B. 若产品具备季节属性特征&#xff0c;则应优先使用同比计算方法 C. 上期值一般指…