从桌面端到移动端,.NET MAUI为什么对WPF开发人员更简单?
.NET多平台应用程序UI(. NET MAUI)的市场吸引力与日俱增,这是微软最新的开发平台,允许开发者使用单个代码库创建跨平台应用程序。尽管很多WPF开发人员还没有跟上 .NET MAUI的潮流,但我们将在这篇文章中为大家展示他的潜力,具体来说想描述一下WPF和.NET MAUI之前的共性。
PS:DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。
DevExpress WPF 最新版下载(Q技术交流:674691612)
项目结构
与Xamarin不同,.NET MAUI解决方案包含针对所有目标平台的单个项目。像WPF一样, .NET MAUI项目包含一个App.xaml文件和主视图,另外可以发现AppShell类被用作根视觉元素:

Resources文件夹包含跨每个平台使用的应用程序资源,开发者可以将特定于平台的资源放在Platforms目录的子文件夹中,以便在应用程序启动时执行相关代码。
XAML和代码隐藏
.NET MAUI页面具有与WPF窗口或用户控件相似的结构,根元素包含命名空间声明和x:Class属性,该属性定义了代码背后的类名:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiFirstApp.MainPage">
<ScrollView>
<!--...-->
</ScrollView>
</ContentPage>
InitializeComponent方法是根据XAML自动生成的:
namespace MauiFirstApp;
public partial class MainPage : ContentPage {
public MainPage() {
InitializeComponent();
}
}
绑定
.NET MAUI绑定使用与WPF绑定相似的上下文,它有类似的模式、相对源、转换器等。.NET MAUI使用了与WPF的DataContext类似的概念,唯一的区别是这个属性叫做BindingContext:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiFirstApp"
x:Class="MauiFirstApp.MainPage">
<ContentPage.BindingContext>
<local:ViewModel/>
</ContentPage.BindingContext>
<Label Text="{Binding FirstName}"/>
</ContentPage>
布局
.NET MAUI包含与Grid和StackPanel相似的东西,可以帮助开发者根据业务需求安排可视化元素:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListView Grid.Column="0"/>
<StackLayout Grid.Column="1" WidthRequest="50">
<Button Text="Print"/>
<Button Text="Export"/>
</StackLayout>
</Grid>
资源
资源字典存储应用程序资源(样式、模板、转换器等),开发者可以使用StaticResource或DynamicResource标记扩展来将这些资源应用到元素上:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiFirstApp"
x:Class="MauiFirstApp.MainPage">
<ContentPage.Resources>
<Color x:Key="ButtonBackgroundColor">DarkOrange</Color>
<Color x:Key="ButtonForegroundColor">Black</Color>
</ContentPage.Resources><Button Text="Export"
BackgroundColor="{StaticResource ButtonBackgroundColor}"
TextColor="{StaticResource ButtonForegroundColor}"/>
</ContentPage>
模板
在.NET MAUI中,您可以使用 ControlTemplates 和DataTemplates来保持与WPF相同的UI灵活性:
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<Label Text="{Binding FirstName}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
样式
开发者可以创建显式和隐式样式来将类似的设置应用于多个元素:
<ContentPage.Resources>
<Style TargetType="Button">
<Setter Property="Background" Value="Orange"/>
<Setter Property="TextColor" Value="White"/>
<Setter Property="CornerRadius" Value="4"/>
</Style>
</ContentPage.Resources>
<StackLayout Orientation="Horizontal">
<Button Text="Next"/>
<Button Text="Prev"/>
</StackLayout>
触发器
声明式XAML触发器允许开发者有条件地应用样式:
<ContentPage.Resources>
<Style TargetType="Editor" x:Key="redOnFocusStyle">
<Style.Triggers>
<Trigger TargetType="Editor" Property="IsFocused" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</ContentPage.Resources>
<StackLayout VerticalOptions="Start">
<Editor Text="Red on Focus" Style="{StaticResource redOnFocusStyle}"/>
</StackLayout>
可视化树
与WPF非常相似,可视元素的层次结构允许开发者轻松地识别控件的父元素和子元素,Parent属性包含直接可视父属性和Children属性——直接子属性,主要区别在于.NET MAUI没有逻辑树。
MVVM
.NET MAUI使用与WPF相同的MVVM范例,许多MVVM框架(如Prism)都是跨平台的,因此您不太可能注意到许多差异。下面是一个基本的例子,演示了如何在视图模型中将编辑器绑定到属性,将按钮绑定到命令:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiFirstApp"
x:Class="MauiFirstApp.MainPage">
<ContentPage.BindingContext>
<local:ViewModel/>
</ContentPage.BindingContext>
<StackLayout VerticalOptions="Start">
<Editor Text="{Binding FirstName}"/>
<Button Text="Process" Command="{Binding ProcessUserCommand}"/>
</StackLayout>
</ContentPage>
public class ViewModel : INotifyPropertyChanged {
private string name;
public string FirstName {
get { return name; }
set {
name = value;
OnPropertyChanged();
}
}public ICommand ProcessUserCommand { get; }public ViewModel() {
ProcessUserCommand = new Command(ProcessUser);
}void ProcessUser() {
Console.WriteLine(FirstName);
}public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged([CallerMemberName] string name = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
依赖项属性
.NET MAUI 依赖属性称为可绑定属性,它们使用类似的声明结构:一个静态字段和一个公共属性。BindableProperty.Create方法接受所有与DependencyProperty.Register类似的参数在WPF中注册:
public int MaxValue {
get => (int)GetValue(MaxValueProperty);
set => SetValue(MaxValueProperty, value);
}public static readonly BindableProperty MaxValueProperty =
BindableProperty.Create("MaxValue", typeof(int), typeof(MainPage), 0, propertyChanged: OnMaxValueChanged);private static void OnMaxValueChanged(BindableObject bindable, object oldValue, object newValue) {
// ...
}
结论
WPF和.NET MAUI开发有许多共同之处,如果您熟悉WPF,可以毫不费力地创建一个功能强大的.NET MAUI应用程序。
相关文章:
从桌面端到移动端,.NET MAUI为什么对WPF开发人员更简单?
.NET多平台应用程序UI(. NET MAUI)的市场吸引力与日俱增,这是微软最新的开发平台,允许开发者使用单个代码库创建跨平台应用程序。尽管很多WPF开发人员还没有跟上 .NET MAUI的潮流,但我们将在这篇文章中为大家展示他的潜…...
[Python]... 和pass
2.9 … 和pass 在Python中pass语句是用来在语法上需要一个语句的地方占位的。它不会执行任何操作。 ...是一个特殊的值,表示省略或未完成的代码。它可以用来实现抽象基类,也可以用来在语法上需要一个语句的地方占位,通常情况下,.…...
【信息安全案例】——软件解密技术(以OllyDbg为例)
目录 🕒 1. 软件解密技术🕘 1.1 概述🕘 1.2 爆破🕘 1.3 跟踪注册🕘 1.4 写出注册 🕒 2. 破解相关问题🕘 2.1 破解程度🕘 2.2 破解线索 🕒 3. 实验:使用 OllyD…...
【华为OD机试真题2023B卷 JAVAJS】阿里巴巴找黄金宝箱(I)
华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 阿里巴巴找黄金宝箱(I) 知识点数组前缀和整数范围 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面…...
记录一次windows mysql5.7安装失败的过程
首先下载mysql安装包 windows版本 https://dev.mysql.com/downloads/installer/ 接着 在执行安装mysql msi安装包最后一步的时候,显示 Failed to start service MySQL57. 只有在任务处于完成状态(RanToCompletion、Fau 这时候 检查要么windows下面mysql的卸载残留没…...
前端知识复习一
1.页面导入样式时,使用link和import有什么区别? link属于html标签,import是css提供的。页面加载的同时,link同时也会加载;import引用的css等到页面加载完再加载 2.js函数有哪几种声明方式? 表达式和声明…...
低代码赋能生物药企数字化
一、关于复宏汉霖 汉霖是复星在2010年投资孵化的一家生物医药公司,经过这十几年的发展,2019年在港股上市,是生物药企18A企业之一。 经过这些年的发展,我们在管线方面布局了肿瘤、肢体、免疫、眼科类,从早研阶段到临床…...
【计算机视觉】最后显示的CIFAR-100数据集照片很模糊怎么解决?
文章目录 一、前言二、如何解决2.1 使用图像增强技术2.2 使用插值方法2.3 使用更高分辨率的图像数据集2.4 手动调整图像尺寸 三、总结 一、前言 如果从CIFAR-100数据集加载的图像显示模糊,可能有几个可能的原因: 分辨率较低:CIFAR-100数据集…...
OJ 系统未解决或者有疑问问题:
34101 - 全排列问题 时间限制 : 1 秒 内存限制 : 128 MB 输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入 n(1≤n≤9) 输出 由 1~n 组成的所有不重复的数字序列,每…...
《游戏编程模式》--优化模式--学习
在线阅读: 优化模式 游戏设计模式 参考文章: GameDesignPattern_U3D_Version/Assets/010OptimizationPatterns at master TYJia/GameDesignPattern_U3D_Version GitHub 数据局部性介绍了计算机的存储层次以及如何使用其以获得优势。 脏标识帮你避开…...
电脑照片怎么导入苹果手机?三个妙招帮你解决!
案例:电脑有很多照片,该如何导入苹果手机? 【家人们,电脑里面的照片怎么样可以快速导入到苹果手机?求方法!】 导入电脑照片到苹果手机是一个常见的需求,尤其是当您希望在手机上随时欣赏和分享这…...
换个花样玩C++(13)一文深度全面剖析类构造,析构,赋值运算和移动构造
为什么我要把C++类的构造,析构函数,赋值运算符重载函数,移动构造函数还要拿出来嚼一嚼,因为最近面试的一些3-7年经验的程序员,我每次都会问一些特别基础的问题,但是我总是得不到想要的答案,我就在思考,是不是大家都觉得有些知识点太简单了,流于高大上的东西,而我个人…...
这是一篇使用ChatGPT生成的关于隐私计算的文章
标题:隐私计算:直白介绍和算法实现 简介: 随着数字化时代的发展,隐私保护成为了一个日益重要的话题。隐私计算作为一种保护个人隐私的方法,具有广泛的应用前景。本篇博客将为您提供一个直白的介绍,解释隐私…...
Docker持久化固定容器IP
基于Docker引擎创建Docker容器,在默认条件下创建容器是bridge桥接模式,启动容器IP地址是DHCP随机分配并且递增的,而且容器之间可以互相通信,网段也是固定的。 当Docker容器一旦关闭再次启动,就会导致容器的IP地址再次重…...
Filter和Interceptor和Aspect
Filter过滤器 过滤器可以拦截到方法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出过滤操作。 过滤器 依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,一个过滤器实例只能在 容…...
maven 项目依赖加载不出来
1.依赖加载不出来,查看pom.xml放的位置是否对了 2.1下载mvn到本地,进行解压 2.2新建系统变量MAVEN_HOME,值直接指向安装目录D:\apache-maven-3.9.2 2.3path变量中增加:%MAVEN_HOME%\bin 2.4若仓库位置不在C盘用户下࿰…...
Python collections模块
1.简介 collections 是 python 的内置模块,提供了很多方便且高性能的关于集合的操作,掌握这些知识有助于提高代码的性能和可读性。 2.常用功能 2.1 namedtuple 功能详解 namedtuple() 返回一个新的元组子类,且规定了元组的元素的个数&…...
Qt-学习 QJson协议解析
内容来源于哔站视频,仅仅作为自己的笔记记录,感兴趣的小伙伴去原作品大call(此处给作者三鞠躬),Json以及Json在Qt中的使用 【Qt/C/C】_哔哩哔哩_bilibili 目录 1、Json介绍: 1.1 Json的定义 1.2 Json的数据格式 1…...
Git的安装与连接
在软件开发中,版本控制是非常重要的一环。Git是一种流行的版本控制工具,它可以帮助开发者管理代码并协作开发。本文将介绍如何连接Git。 首先,我们需要安装Git。在Windows上,可以从Git官网下载安装程序。在Linux上,可…...
MySQL5.0完全卸载教程
一、停止MySQL服务 在系统服务中找到mysql服务并停止即可。 二、卸载mysql应用程序 在控制面板中卸载mysql应用程序 三、删除mysql文件夹 找到mysql一开始安装路径的文件夹,然后删除掉该整个文件夹。 四、删除注册表 (1)按winR键,…...
DRM框架深度解析:从fbdev到atomic commit的显存绑定全流程
DRM框架深度解析:从fbdev到atomic commit的显存绑定全流程 在Linux图形驱动开发领域,DRM(Direct Rendering Manager)框架作为现代显示子系统的核心,其显存管理机制直接影响图形性能与稳定性。本文将系统剖析DRM框架中显…...
避坑指南:OpenSIPS 3.1在Docker下的5个常见配置错误(附NAT解决方案)
OpenSIPS 3.1容器化部署实战:5个关键配置陷阱与高效排错手册 当你第一次尝试在Docker中部署OpenSIPS 3.1时,是否遇到过容器正常启动却无法建立会话的情况?这就像在黑暗迷宫中摸索——明明每个转角都看似正确,却总在关键时刻碰壁。…...
FireRedASR Pro学习笔记整理实战:录音转文字,复习效率翻倍
FireRedASR Pro学习笔记整理实战:录音转文字,复习效率翻倍 1. 为什么你需要这个语音转文字工具 作为一名经常需要听课、参加会议的学习者和职场人士,我一直在寻找能够提升笔记效率的工具。直到遇到FireRedASR Pro,这个基于工业级…...
实时行情系统设计:从协议选择到高可用架构,再到数据源选型泵
一、核心问题及解决方案(按踩坑频率排序) 问题 1:误删他人持有锁——最基础也最易犯的漏洞 成因:释放锁时未做身份校验,直接执行 DEL 命令删除键。典型场景:服务 A 持有锁后,业务逻辑耗时超过锁…...
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
文章目录Go 在 Windows 上的安装与环境配置指南一、简介二、下载安装 Go1. 下载 Go 安装包2. 运行安装程序三、验证安装四、配置环境变量1. 配置 GOROOT(通常不需要手动设置)2. 配置 GOPATH(推荐设置)设置方法:3. 配置…...
Windows风扇控制终极指南:Fan Control软件完全掌握
Windows风扇控制终极指南:Fan Control软件完全掌握 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...
GLM-5.1 深度解析:它为什么不只是一个更强的聊天模型?
GLM-5.1 深度解析:它为什么不只是一个更强的聊天模型?很多人看一个新模型,第一反应还是:它聊天强不强?推理行不行?中文味够不够? 但如果把视角放到 2026 年的大模型应用现场,你会发现…...
Multisim仿真NE555驱动NMOS总报错?手把手教你修改仿真参数搞定PWM调光电路
Multisim仿真NE555驱动NMOS报错全解析:从参数调优到实战调光 当你在Multisim中搭建NE555 PWM调光电路时,是否遇到过一接上NMOS就仿真崩溃的尴尬?那个刺眼的"瞬态分析无法收敛"报错窗口,仿佛在嘲笑你连基础电路都搞不定。…...
完整高效解决网易云音乐NCM文件解密难题的实用指南
完整高效解决网易云音乐NCM文件解密难题的实用指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式音乐无法在其他设备播放而烦恼吗?ncmdump正是你需要的NCM文件解密利器,这款工…...
2026年4月OpenClaw如何集成?云端4分钟保姆级方法+大模型APIKey、Skill集成
OpenClaw是什么?OpenClaw能干什么?OpenClaw怎么部署使用?本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务启动、…...
