C# WPF MVVM开发框架Caliburn.Micro快速搭建③

01

启动项目

  1.  打开Visual Studio

  2. 创建一个名为“Caliburn.Micro.Hello”的新WPF应用程序

  3. 添加对Caliburn.Micro Nuget包的引用,最新的版本是4.0.173,更新日期2021年5月9日 (2021/5/9)

    0804ae6864109247ba7c7155a9bc847e.png

  4. 删除“MainWindow.xaml”并从“App.xaml”中删除StartupUri,使其如下所示:

<Application x:Class="Caliburn.Micro.Hello.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:Caliburn.Micro.Hello"><Application.Resources></Application.Resources>
</Application>

既然Caliburn.Micro更喜欢ViewModel优先的方法,让我们从这里开始。

①创建第一个ViewModel,创建一个新类并将其称为“ShellViewModel”。

②打开ShellViewModel.cs并使用以下代码进行实现:

using System.Windows;namespace Caliburn.Micro.Hello.ViewModels
{public class ShellViewModel : PropertyChangedBase{string name;public string Name{get { return name; }set{name = value;NotifyOfPropertyChange(() => Name);NotifyOfPropertyChange(() => CanSayHello);}}public bool CanSayHello{get { return !string.IsNullOrWhiteSpace(Name); }}public void SayHello(){MessageBox.Show(string.Format("Hello {0}!", Name)); //Don't do this in real life :)}}

请注意,ShellViewModel继承自PropertyChangedBase。这是一个基类,它实现了属性更改通知的基础结构,并自动执行UI线程封送。它会派上用场:)

现在我们有了ViewModel,让我们创建引导程序。引导程序将配置框架并告诉它该做什么。

创建一个名为“HelloBootstrapper”的新类。您可以使用以下一小段代码:

namespace Caliburn.Micro.Hello {public class HelloBootstrapper : BootstrapperBase {public HelloBootstrapper() {Initialize();}protected override void OnStartup(object sender, StartupEventArgs e) {DisplayRootViewFor<ShellViewModel>();}}
}

bootsapper允许您使用DisplayRootViewFor<TViewModel>()指定根视图模型的类型。“根视图模型”是Caliburn.Micro将实例化并用于显示应用程序的视图模型。

接下来,我们需要实现“HelloBootstrapper”,以便它在启动时运行。为此,请更新App.xaml,将引导程序添加到您的资源中,如下所示:

02

WPF

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:Caliburn.Micro.Hello"x:Class="Caliburn.Micro.Hello.App"><Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary><local:HelloBootstrapper x:Key="bootstrapper" /></ResourceDictionary></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
</Application>

我们所要做的就是在应用程序中放置一个Caliburn.Micro引导程序。资源和它将完成其余的工作。现在,运行应用程序。您应该看到如下内容:

d0d636ae60a9c2dd252e0142a5a1896e.png

Caliburn.Micro创建了ShellViewModel,但不知道如何在没有视图的情况下渲染它。那么,让我们创建一个视图,让它查找。

创建名为“ShellView”的新用户控件(WPF)。使用以下xaml:

<UserControl x:Class="Caliburn.Micro.Hello.ShellView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Height="450" Width="800"><StackPanel><Label Content="Hello please write your name" /><TextBox x:Name="Name" /><Button x:Name="SayHello"Content="Click Me" /></StackPanel>
</UserControl>

再次运行应用程序。您现在应该可以看到UI:

e61beeeb352fa04345062d93f747aec2.png

在文本框中键入内容将启用该按钮,单击该按钮将显示一条消息:

3a2939b30073aefc6b8049ef4832f6bc.png

03

工作原理

Caliburn.Micro使用一个简单的命名约定来定位ViewModels的视图。本质上,它接受全名并从中删除“Model”。

因此,给定:MyApp.ViewModels.MyViewModel

它将查找:MyApp.Views.MyView

并排查看视图和ViewModel,可以看到带有x:Name=“Name”的文本框绑定到ViewModel上的“Name”属性。您还可以看到,带有x:Name=“SayHello”的按钮绑定到ViewMModel上具有相同名称的方法。CanSayHello属性通过禁用按钮来保护对SayHello操作的访问。这些是Caliburn.Micro的ActionMessage和Conventions功能的基础。

还有很多东西要展示。接下来,我们可以集成一个IoC容器,比如MEF。

原文标题:Caliburn.Micro Xaml made easy

原文链接:https://caliburnmicro.com/documentation/configuration

翻译:dotnet编程大全

C#技术群 : 添加小编微信,mm1552923备注:进群!

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

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

相关文章

静态成员变量和静态成员函数(static)

数据成员可以分静态变量、非静态变量两种. 静态成员&#xff1a;静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存…

中国院士最多的县:共走出26位院士,百位高校校长,一万名教授

全世界只有3.14 % 的人关注了爆炸吧知识本文由科研大匠&#xff08;Id:keyandajiang&#xff09;综合整理自学术志、网易新闻、算法与数学之美“昔孟母&#xff0c;择邻处&#xff0c;子不学&#xff0c;断机杼”&#xff0c;从孟母为了给儿子创造良好的读书环境&#xff0c;以…

linux下A免密码登录B

linux下A免密码登录B现在有两台linux服务器A&#xff1a;192.168.1.111&#xff0c;B&#xff1a;192.168.1.1121、在A&#xff08;192.168.123.111&#xff09;生成公钥私钥对&#xff0c;命令如下&#xff1a;ssh-keygen -t rsa -P ‘’,如图&#xff1a;-P表示密码&#xf…

mysql between 查询不出来_mysql的语句优化

(1)mysql避免全表扫描1、应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a; select id from t where num is null,不能用null作索引&#xff0c;任何包含null值的列都将不会被包含在索引中。即…

链表之删除链表a/b处的节点

题目: 删除链表a/b处的节点 比如链表1、2、3、4、5 如果a/b=r; 如果0<r<1/5;删除节点1 如果1/5<r<2/5;删除节点2 如果2/5<r<3/5;删除节点3 如果3/5<r<4/5;删除节点4 如果4/5<r<5/5;删除节点5 思路: 得到我们需要删除链表的第几个的值,假设…

大开眼界!终于等到这部每一帧都是壁纸的纪录片!

全世界只有3.14 % 的人关注了爆炸吧知识中国&#xff0c;拥有七大水系&#xff0c;超过2600个自然湖泊&#xff0c;299.7万平方公里海洋面积。生活在陆地&#xff0c;周遭的一切都是被水体所包裹。但还从来没有哪一部纪录片&#xff0c;系统探秘过中国水下。水面之上&#xff0…

C#9.0 每个开发人员都必须知道的4个特性

在 .NET 5.0 的发布中&#xff0c;不仅统一了框架&#xff0c;微软还在C#9.0中推出了一些新特性。本版本中,印象深刻的功能:Init-only setters (初始化设置器)Records (记录)Top-level statements (顶级语句)Pattern matching (模式匹配)Init-only setters (初始化设置器)以前&…

Binary Search二分法搜索C++程序

二分法基本上学计算机的都听过&#xff0c;但是有人不知道的就是其实二分法是减治法的思想。 所谓减治法和分治法有一个主要差别就是减治法是减去一般&#xff0c;就是分治之后只需要解决原问题的一半就可以了得到全局问题的解了。所以速度很快。 下面是二分法的递归程序和非递…

linux 后台一直执行的sh

echo "nohup /home/test/inosync.sh &" >> /etc/rc.local转载于:https://blog.51cto.com/837877/1069581

求两个数的最小公约数和最小公倍数

题目: 求两个数的最小公约数和最小公倍数 思路: 求最大公约数: 欧几里得在其《几何原本》中提出的欧几里得算法,有称辗转相除法, 具体做法是如果q和r分别是m除以n的商及玉树,m=nq+r,那么m和n的最大公约数等于n和 r的最大公约数 求最小公倍数:最小公倍数等于a*b/他…

idea mysql 创建表_idea 根据数据库表自动创建持久化类

TODO&#xff1a;Go语言goroutine和channel使用TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理.使用的时候在函数前面加"go"这个 ...翻译&#xff1a;使用 ASP&period;NET MVC 4&comma; EF&comma;…

.NET 6新特性试用 | Nuget包验证

前言我们常常需要将.NET类库打包成Nuget包&#xff0c;以便多个项目公用。一旦修改类库&#xff0c;尽管代码可以运行&#xff0c;并成功打包成新版本&#xff0c;看起来一切正常&#xff0c;但是你无法保证该更改是安全且兼容的。而在.Net 6中&#xff0c;提供了包验证工具&am…

php基础系列:从用户登录处理程序学习mysql扩展基本操作

用户注册和登录是网站开发最基本的功能模块之一&#xff0c;现在通过登录处理程序代码来学些下php对mysql的基本操作。 本身没有难点&#xff0c;主要是作为开发人员&#xff0c;应该能做到手写这些基本代码&#xff0c;算是自己加强记忆&#xff0c;同时希望能给初学者一些参考…

SSIS package 更新 variable

在Package中声明一个variable&#xff0c;在package运行的过程中&#xff0c;SSIS如何update Variable&#xff1f; 第一种方法&#xff1a;使用 Script Task 来更新Variable的值 1&#xff0c;创建一个variable &#xff0c;VariableName是VarCode&#xff0c;并将变量传递到脚…

socket第三方库 AsyncSocket(GCDAsyncSocket)

为什么80%的码农都做不了架构师&#xff1f;>>> Socket描述了一个IP、端口对。它简化了程序员的操作&#xff0c;知道对方的IP以及PORT就可以给对方发送消息&#xff0c;再由服务器端来处理发送的这些消息。所以&#xff0c;Socket一定包含了通信的双发&#xff0c…

想给男友一个惊喜,没想到是这样的结局......

1 想给男友一个惊喜&#xff08;via.澎湃新闻&#xff09;▼2 花10w买了副画&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 台北温馨一幕▼4 把土豆切成丁&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 你为何如此自信&#xff1f;&#xff08;素材…

NS 802.11函数分析(一)

recv函数有两个作用&#xff0c;不仅是接收其他节点发送的包&#xff0c;而且当节点接收到其他包的时候也会调用recv&#xff08;&#xff09; 首先给出NS2中recv的源码&#xff0c;和一些注释&#xff1a; 1 void2 Mac802_11::recv(Packet *p, Handler *h)3 {4 struct hdr…

Android之怎么隐藏EditText光标和自动显示键盘

不废话,先爆照 让EditText不现实光标 关键代码: android:focusable="true" android:focusableInTouchMode="true" 写这个父视图里面 下面是全部代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"…

0408~送给小伙伴的汉堡包

经过一番的结对编程&#xff0c;同学院们对Ta有什么想法呢&#xff1f; 用汉堡包的方式评价一下自己的合作伙伴。 开始囉~~~~~~~~ 第一片面包&#xff1a;解决问题的能力还是蛮强的&#xff0c;在编程的过程中精力集中&#xff0c;遇到不懂的问题积极查找相关资料&#xff0c;而…

基于事件驱动架构构建微服务第14部分:查询API

原文链接&#xff1a;https://logcorner.com/building-micro-services-through-event-driven-architecture-part14-query-api/在本教程中&#xff0c;我将展示如何构建一个查询API&#xff0c;使用命令查询职责分离(CQRS)模式在微服务架构中实现查询。读取模型的目标是构建一个…