当前位置: 首页 > news >正文

从桌面端到移动端,.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&#xff08;. NET MAUI&#xff09;的市场吸引力与日俱增&#xff0c;这是微软最新的开发平台&#xff0c;允许开发者使用单个代码库创建跨平台应用程序。尽管很多WPF开发人员还没有跟上 .NET MAUI的潮流&#xff0c;但我们将在这篇文章中为大家展示他的潜…...

[Python]... 和pass

2.9 … 和pass 在Python中pass语句是用来在语法上需要一个语句的地方占位的。它不会执行任何操作。 ...是一个特殊的值&#xff0c;表示省略或未完成的代码。它可以用来实现抽象基类&#xff0c;也可以用来在语法上需要一个语句的地方占位&#xff0c;通常情况下&#xff0c;.…...

【信息安全案例】——软件解密技术(以OllyDbg为例)

目录 &#x1f552; 1. 软件解密技术&#x1f558; 1.1 概述&#x1f558; 1.2 爆破&#x1f558; 1.3 跟踪注册&#x1f558; 1.4 写出注册 &#x1f552; 2. 破解相关问题&#x1f558; 2.1 破解程度&#x1f558; 2.2 破解线索 &#x1f552; 3. 实验&#xff1a;使用 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安装包最后一步的时候&#xff0c;显示 Failed to start service MySQL57. 只有在任务处于完成状态(RanToCompletion、Fau 这时候 检查要么windows下面mysql的卸载残留没…...

前端知识复习一

1.页面导入样式时&#xff0c;使用link和import有什么区别&#xff1f; link属于html标签&#xff0c;import是css提供的。页面加载的同时&#xff0c;link同时也会加载&#xff1b;import引用的css等到页面加载完再加载 2.js函数有哪几种声明方式&#xff1f; 表达式和声明…...

低代码赋能生物药企数字化

一、关于复宏汉霖 汉霖是复星在2010年投资孵化的一家生物医药公司&#xff0c;经过这十几年的发展&#xff0c;2019年在港股上市&#xff0c;是生物药企18A企业之一。 经过这些年的发展&#xff0c;我们在管线方面布局了肿瘤、肢体、免疫、眼科类&#xff0c;从早研阶段到临床…...

【计算机视觉】最后显示的CIFAR-100数据集照片很模糊怎么解决?

文章目录 一、前言二、如何解决2.1 使用图像增强技术2.2 使用插值方法2.3 使用更高分辨率的图像数据集2.4 手动调整图像尺寸 三、总结 一、前言 如果从CIFAR-100数据集加载的图像显示模糊&#xff0c;可能有几个可能的原因&#xff1a; 分辨率较低&#xff1a;CIFAR-100数据集…...

OJ 系统未解决或者有疑问问题:

34101 - 全排列问题 时间限制 : 1 秒 内存限制 : 128 MB 输出自然数 1 到 n 所有不重复的排列&#xff0c;即 n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入 n(1≤n≤9) 输出 由 1&#xff5e;n 组成的所有不重复的数字序列&#xff0c;每…...

《游戏编程模式》--优化模式--学习

在线阅读&#xff1a; 优化模式 游戏设计模式 参考文章&#xff1a; GameDesignPattern_U3D_Version/Assets/010OptimizationPatterns at master TYJia/GameDesignPattern_U3D_Version GitHub 数据局部性介绍了计算机的存储层次以及如何使用其以获得优势。 脏标识帮你避开…...

电脑照片怎么导入苹果手机?三个妙招帮你解决!

案例&#xff1a;电脑有很多照片&#xff0c;该如何导入苹果手机&#xff1f; 【家人们&#xff0c;电脑里面的照片怎么样可以快速导入到苹果手机&#xff1f;求方法&#xff01;】 导入电脑照片到苹果手机是一个常见的需求&#xff0c;尤其是当您希望在手机上随时欣赏和分享这…...

换个花样玩C++(13)一文深度全面剖析类构造,析构,赋值运算和移动构造

为什么我要把C++类的构造,析构函数,赋值运算符重载函数,移动构造函数还要拿出来嚼一嚼,因为最近面试的一些3-7年经验的程序员,我每次都会问一些特别基础的问题,但是我总是得不到想要的答案,我就在思考,是不是大家都觉得有些知识点太简单了,流于高大上的东西,而我个人…...

这是一篇使用ChatGPT生成的关于隐私计算的文章

标题&#xff1a;隐私计算&#xff1a;直白介绍和算法实现 简介&#xff1a; 随着数字化时代的发展&#xff0c;隐私保护成为了一个日益重要的话题。隐私计算作为一种保护个人隐私的方法&#xff0c;具有广泛的应用前景。本篇博客将为您提供一个直白的介绍&#xff0c;解释隐私…...

Docker持久化固定容器IP

基于Docker引擎创建Docker容器&#xff0c;在默认条件下创建容器是bridge桥接模式&#xff0c;启动容器IP地址是DHCP随机分配并且递增的&#xff0c;而且容器之间可以互相通信&#xff0c;网段也是固定的。 当Docker容器一旦关闭再次启动&#xff0c;就会导致容器的IP地址再次重…...

Filter和Interceptor和Aspect

Filter过滤器 过滤器可以拦截到方法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出过滤操作。 过滤器 依赖于servlet容器。在实现上&#xff0c;基于函数回调&#xff0c;它可以对几乎所有请求进行过滤&#xff0c;一个过滤器实例只能在 容…...

maven 项目依赖加载不出来

1.依赖加载不出来&#xff0c;查看pom.xml放的位置是否对了 2.1下载mvn到本地&#xff0c;进行解压 2.2新建系统变量MAVEN_HOME&#xff0c;值直接指向安装目录D:\apache-maven-3.9.2 2.3path变量中增加&#xff1a;%MAVEN_HOME%\bin 2.4若仓库位置不在C盘用户下&#xff0…...

Python collections模块

1.简介 collections 是 python 的内置模块&#xff0c;提供了很多方便且高性能的关于集合的操作&#xff0c;掌握这些知识有助于提高代码的性能和可读性。 2.常用功能 2.1 namedtuple 功能详解 namedtuple() 返回一个新的元组子类&#xff0c;且规定了元组的元素的个数&…...

Qt-学习 QJson协议解析

内容来源于哔站视频&#xff0c;仅仅作为自己的笔记记录&#xff0c;感兴趣的小伙伴去原作品大call(此处给作者三鞠躬&#xff09;&#xff0c;Json以及Json在Qt中的使用 【Qt/C/C】_哔哩哔哩_bilibili 目录 1、Json介绍&#xff1a; 1.1 Json的定义 1.2 Json的数据格式 1…...

Git的安装与连接

在软件开发中&#xff0c;版本控制是非常重要的一环。Git是一种流行的版本控制工具&#xff0c;它可以帮助开发者管理代码并协作开发。本文将介绍如何连接Git。 首先&#xff0c;我们需要安装Git。在Windows上&#xff0c;可以从Git官网下载安装程序。在Linux上&#xff0c;可…...

MySQL5.0完全卸载教程

一、停止MySQL服务 在系统服务中找到mysql服务并停止即可。 二、卸载mysql应用程序 在控制面板中卸载mysql应用程序 三、删除mysql文件夹 找到mysql一开始安装路径的文件夹&#xff0c;然后删除掉该整个文件夹。 四、删除注册表 &#xff08;1&#xff09;按winR键&#xff0c;…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...