WPF基于.Net Core
WPF基于.Net Core
因为最近.net core的热门,所以想实现一下.net core框架下的WPF项目,还是MVVM模式,下面就开始吧,简单做一个计算器吧。
使用VS2019作为开发工具
实现MVVM模式
1、实现基础项目
使用VS2019新建WPF App项目

项目名称Common
1.1、修改项目属性
删除项目MainWindow.xaml以及MainWindow.xaml.cs文件
删除App.xaml和App.xaml.cs文件
修改项目输出为类库

添加Command文件夹

2.2、实现ICommand接口
定义BaseCommand类实现ICommand接口
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
namespace Common.Command
{
/// <summary>
/// 实现ICommand接口
/// </summary>
public class BaseCommand : ICommand
{
public Predicate<object> CanExecuteDelegate { get; set; }
public Action<object> ExecuteDelegate { get; set; }
public BaseCommand(Action<object> execute)
{
ExecuteDelegate = execute;
}
public BaseCommand(Action<object> execute, Predicate<object> canExecute)
{
CanExecuteDelegate = canExecute;
ExecuteDelegate = execute;
}
public BaseCommand()
{
}
/// <summary>
/// Defines the method that determines whether the command can execute in its current state.
/// </summary>
public bool CanExecute(object parameter)
{
if (CanExecuteDelegate != null)
return CanExecuteDelegate(parameter);
return true;
}
/// <summary>
/// Occurs when changes occur that affect whether the command should execute.
/// </summary>
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
/// <summary>
/// 执行
/// </summary>
public void Execute(object parameter)
{
try
{
if (ExecuteDelegate != null)
ExecuteDelegate(parameter);
}
catch (Exception ex)
{
string moudle = ExecuteDelegate.Method.DeclaringType.Name + ":" + ExecuteDelegate.Method.Name;
}
}
/// <summary>
/// Raises the CanExecuteChanged event.
/// </summary>
public void InvalidateCanExecute()
{
CommandManager.InvalidateRequerySuggested();
}
}
}
2.3、实现INotifyPropertyChanged接口
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
namespace Common.Command
{
/// <summary>
/// 实现INotifyPropertyChanged接口
/// </summary>
public class NotifyPropertyBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public object Clone()
{
return this.MemberwiseClone();
}
}
}
2、主程序HelloCore
2.1、新建WPF APP项目
项目名称为HelloCore
新建View、ViewModel、Model三个文件夹

删除MainWindow.xaml

2.2、添加窗体MainView.xaml

修改MainView.xaml
<Window x:Class="HelloCore.View.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:HelloCore.View"
mc:Ignorable="d"
Title="HelloCore" Height="350" Width="600">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Text="{Binding Result}" Margin="5"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="HelloCore" Command="{Binding HelloCommand}" Margin="10" Width="80" Height="30"/>
<Button Content="Clear" Command="{Binding ClearCommand}" Margin="10" Width="80" Height="30"/>
</StackPanel>
</Grid>
</Window>
2.3、添加MainViewModel.cs文件

using Common.Command;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
namespace HelloCore.ViewModel
{
public class MainViewModel : NotifyPropertyBase
{
private string _result;
/// <summary>
/// 绑定到界面上TextBox的Text属性上
/// </summary>
public string Result
{
get
{
return _result;
}
set
{
_result = value;
OnPropertyChanged("Result");
}
}
private ICommand _helloCommand;
private ICommand _clearCommand;
public ICommand HelloCommand
{
get
{
return this._helloCommand ?? (this._helloCommand = new BaseCommand()
{
CanExecuteDelegate = x => true,
ExecuteDelegate = x =>
{
Result = "Hello Net Core";
}
});
}
}
public ICommand ClearCommand
{
get
{
return this._clearCommand ?? (this._clearCommand = new BaseCommand()
{
CanExecuteDelegate = x => true,
ExecuteDelegate = x =>
{
Result = "";
}
});
}
}
}
}
2.4、通过DataContext绑定
在MainView.xaml.cs中添加DataContext进行MainView和MainViewModel的绑定
using HelloCore.ViewModel;
using System.Windows;
namespace HelloCore.View
{
/// <summary>
/// MainView.xaml 的交互逻辑
/// </summary>
public partial class MainView : Window
{
MainViewModel vm = new MainViewModel();
public MainView()
{
InitializeComponent();
this.DataContext = vm;
}
}
}
2.5、修改App.xmal文件
修改App.xaml文件,删除StartupUri,添加启动事件以及异常捕捉事件

<Application x:Class="HelloCore.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:HelloCore"
Startup="Application_Startup"
DispatcherUnhandledException="Application_DispatcherUnhandledException">
<Application.Resources>
</Application.Resources>
</Application>
2.6、修改App.xaml.cs文件
using HelloCore.View;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace HelloCore
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
MainView mainWindow;
public App()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionEventHandler);
}
private static void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e)
{
}
/// <summary>
/// 重写Starup函数,程序重这里启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Application_Startup(object sender, StartupEventArgs e)
{
mainWindow = new MainView();
mainWindow.Show();
}
/// <summary>
/// 异常处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
// .Net4.0及之前版本访问剪切板默写情况下可能失败报异常
// OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
var comException = e.Exception as System.Runtime.InteropServices.COMException;
if (comException != null && comException.ErrorCode == -2147221040)
{
e.Handled = true;
}
// 未捕获的异常
e.Handled = true;
}
}
}
2.7、启动程序,观看结果
到这里一个简单的基于.net core的WPF应用程序就完成啦,当然WPF真正的魅力没有展示出来,MVVM模式的意义大概是这样了,实现View和Model的分离

WPF基于.Net Core的更多相关文章
- 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- 如何创建一个基于 .NET Core 3 的 WPF 项目
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)
如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端
一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...
- .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存
注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...
- 基于.NET Core的Hypertext Application Language(HAL)开发库
HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...
- 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...
随机推荐
- Linux系统管理——Linux简介
UNIX与Linux发展史 UNIX发展历史 1.1965年,美国麻省理工学院(MIT),通用电气公司(GE)及AT&T的贝尔实验室联合开发Multics工程计划,其目标是开发一种交互式的具有 ...
- 使用VBS实现SSH远程登录并自动执行命令
set ws=createobject("wscript.shell")ws.run "Putty所在路径\putty.exe -ssh -pw 你的密码 用户名@192 ...
- HTML常用API(位置信息、音频视频)
感谢:链接(讲解的很详细) 位置信息 1.代码: <script type="text/javascript"> navigator.geolocation.getCu ...
- 04 . Docker安全与Docker底层实现
Docker安全 Docker安全性时,主要考虑三个方面 # 1. 由内核的名字空间和控制组机制提供的容器内在安全 # 2. Docker程序(特别是服务端)本身的抗攻击性 # 3. 内核安全性的加强 ...
- node实现文件属性批量修改(时间属性)
前言 在默认情况下,一个文件的创建时间和修改时间是系统自己设定的,我们不能修改该的.但我们有时为了某种特殊需要,为了不让别人一眼看出文件已经给修改了,我们又需要修改文件的创建时间和修改时间.那么如何修 ...
- ca71a_c++_指向函数的指针_通过指针调用函数txwtech
/*ca71a_c++_指向函数的指针_通过指针调用函数用typedef简化函数指针的定义简化前: bool(*pf)(const string&, const string &); ...
- Python学习日志-02
(2)Python如何运行程序 Python解释器简介: Python不仅仅是一门编程语言,它也是一个名为解释器的软件包.解释器是一种让其他程序运行起来的程序.当你编写了一段Python程序,Pyth ...
- 使用IDEA+Gradle构建Spring5源码并调试(手把手教程全图解)
一.前言 说一说我要写这篇文章的初衷吧,前段时间有小伙伴在微信群求教怎样构建spring源码,他在网上找了n个教程跟着后面花了两天时间都没构建好,正好我最近因工作原因从mac换成windows,开 ...
- VMware历史版本下载【1.0~3.0】
前提:此为走HTTP协议的FTP伺服器,而且有直到Vmware3.0[之后就没了]的版本 link:http://linux.mathematik.tu-darmstadt.de/pub/linux/ ...
- WeChair项目Alpha冲刺(5/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第五天 昨日进展: 前端:完成小程序登录态的定义 后端:成功部署项目到服务器并能通过域名访问项目 数据库:调整属性数据类型 2.今日安排 前端:完善 ...