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

C# XAML 基础:构建现代 Windows 应用程序的 UI 语言

在现代 Windows 应用程序开发中,XAML (eXtensible Application Markup Language) 扮演着至关重要的角色。作为一种基于 XML 的声明性语言,XAML 为 WPF (Windows Presentation Foundation)、UWP (Universal Windows Platform) 和 Xamarin.Forms 应用程序提供了强大的用户界面定义能力。本文将全面介绍 XAML 的基础知识,帮助开发者快速掌握这一核心技术。

一、XAML 概述

1.1 什么是 XAML

XAML 是一种基于 XML 的标记语言,由微软开发,专门用于初始化.NET 对象层次结构。它最初是为 WPF 设计的,后来扩展到 Silverlight、Windows Phone、UWP 和 Xamarin.Forms 等平台。

XAML 的主要特点包括:

  • 声明性语法:通过标记而非代码定义 UI

  • 分离关注点:将 UI 设计与业务逻辑分离

  • 可扩展性:支持自定义控件和组件

  • 工具支持:Visual Studio 提供可视化设计器和 XAML 编辑器

1.2 XAML 与 C# 的关系

XAML 和 C# 在应用程序开发中扮演着互补的角色:

  • XAML 负责:

    • 定义用户界面布局

    • 设置控件属性和样式

    • 声明数据绑定和资源

    • 组织可视化元素层次结构

  • C# 负责:

    • 实现业务逻辑

    • 处理用户交互事件

    • 管理应用程序状态

    • 提供数据源和计算

两者通过"代码后置"(code-behind)机制关联,每个 XAML 文件通常对应一个 .xaml.cs 文件,包含与之相关的 C# 代码。

二、XAML 基础语法

2.1 基本文档结构

一个典型的 XAML 文档结构如下:

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Main Window" Height="350" Width="525"><Grid><!-- 控件和布局在这里定义 --></Grid>
</Window>

关键元素说明:

  • 根元素:通常是 Window、Page 或 UserControl

  • x:Class 属性:指定关联的代码后置类

  • xmlns 声明:定义 XML 命名空间

2.2 命名空间

XAML 使用 XML 命名空间来区分不同类型的内容:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  // 默认命名空间,包含 WPF 核心控件
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"           // XAML 命名空间,提供 XAML 特定功能
xmlns:local="clr-namespace:MyApp"                                // 自定义命名空间

2.3 属性语法

XAML 提供多种设置属性的方式:

  1. 特性语法(Attribute Syntax):

    <Button Content="点击我" Background="Red"/>
  2. 属性元素语法(Property Element Syntax):

    <Button><Button.Content>点击我</Button.Content><Button.Background>Red</Button.Background>
    </Button>
  3. 内容属性语法(Content Property Syntax):

    <Button>点击我</Button>

三、XAML 布局系统

WPF 提供了强大的布局系统,通过不同的布局面板实现灵活的界面设计。

3.1 常用布局面板

Grid(网格布局)

<Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="2*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Button Grid.Row="0" Grid.Column="0" Content="按钮1"/><Button Grid.Row="1" Grid.Column="1" Content="按钮2"/>
</Grid>

StackPanel(栈式布局)

<StackPanel Orientation="Vertical"><Button Content="按钮1"/><Button Content="按钮2"/><Button Content="按钮3"/>
</StackPanel>

DockPanel(停靠布局)

<DockPanel LastChildFill="True"><Button DockPanel.Dock="Top" Content="顶部"/><Button DockPanel.Dock="Left" Content="左侧"/><Button Content="填充剩余空间"/>
</DockPanel>

Canvas(绝对定位布局)

<Canvas><Button Canvas.Left="50" Canvas.Top="30" Content="按钮1"/><Button Canvas.Left="100" Canvas.Top="80" Content="按钮2"/>
</Canvas>

3.2 布局属性

所有布局面板都支持以下重要属性:

  • Margin:元素与周围空间的边距

  • Padding:元素内容与边框的内边距

  • HorizontalAlignment/VerticalAlignment:元素在可用空间内的对齐方式

  • Width/Height:显式设置尺寸

  • MinWidth/MaxWidth/MinHeight/MaxHeight:尺寸限制

四、XAML 控件

4.1 基本控件

文本相关控件

<Label Content="用户名:" Target="{Binding ElementName=textBox1}"/>
<TextBox x:Name="textBox1" Text="输入文本"/>
<TextBlock Text="只读文本" TextWrapping="Wrap"/>
<PasswordBox PasswordChar="*"/>

按钮控件

<Button Content="普通按钮" Click="Button_Click"/>
<ToggleButton Content="切换按钮"/>
<RepeatButton Content="重复按钮" Delay="500" Interval="100"/>

选择控件

<CheckBox Content="复选框" IsChecked="True"/>
<RadioButton Content="单选按钮1" GroupName="Group1" IsChecked="True"/>
<RadioButton Content="单选按钮2" GroupName="Group1"/><ComboBox SelectedIndex="0"><ComboBoxItem Content="选项1"/><ComboBoxItem Content="选项2"/>
</ComboBox><ListBox SelectionMode="Multiple"><ListBoxItem Content="项目1"/><ListBoxItem Content="项目2"/>
</ListBox>

4.2 高级控件

数据展示控件

<DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="姓名" Binding="{Binding Name}"/><DataGridCheckBoxColumn Header="活跃" Binding="{Binding IsActive}"/></DataGrid.Columns>
</DataGrid>

导航控件

<TabControl><TabItem Header="选项卡1"><TextBlock Text="内容1"/></TabItem><TabItem Header="选项卡2"><TextBlock Text="内容2"/></TabItem>
</TabControl>

五、XAML 数据绑定

数据绑定是 XAML 最强大的功能之一,实现了 UI 与数据的自动同步。

5.1 绑定基础

<TextBox x:Name="sourceTextBox" Text="Hello"/>
<TextBlock Text="{Binding ElementName=sourceTextBox, Path=Text}"/>

5.2 绑定模式

模式描述示例
OneWay源到目标的单向绑定{Binding Path=Name, Mode=OneWay}
TwoWay双向绑定{Binding Path=Age, Mode=TwoWay}
OneTime一次性绑定{Binding Path=Version, Mode=OneTime}
OneWayToSource目标到源的单向绑定{Binding Path=SearchText, Mode=OneWayToSource}
Default默认模式(取决于属性){Binding Path=IsEnabled}

5.3 数据转换

<TextBlock Text="{Binding Path=BirthDate, StringFormat='出生日期: {0:yyyy-MM-dd}'}"/>
<TextBlock Text="{Binding Path=Temperature, Converter={StaticResource TemperatureConverter}}"/>

六、XAML 样式和模板

6.1 样式 (Style)

<Window.Resources><Style x:Key="HighlightButton" TargetType="Button"><Setter Property="Background" Value="LightBlue"/><Setter Property="FontWeight" Value="Bold"/><Setter Property="Margin" Value="5"/></Style>
</Window.Resources><Button Style="{StaticResource HighlightButton}" Content="样式按钮"/>

6.2 控件模板 (ControlTemplate)

<ControlTemplate x:Key="RoundButtonTemplate" TargetType="Button"><Grid><Ellipse Fill="{TemplateBinding Background}" Stroke="Black"/><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid>
</ControlTemplate>

6.3 数据模板 (DataTemplate)

<DataTemplate DataType="{x:Type local:Customer}"><StackPanel Orientation="Horizontal"><Image Source="{Binding Photo}" Width="50" Height="50"/><TextBlock Text="{Binding Name}" FontSize="14"/></StackPanel>
</DataTemplate>

七、MVVM 模式实践

MVVM (Model-View-ViewModel) 是 XAML 应用程序的推荐架构模式。

7.1 MVVM 组件

  1. Model:数据模型和业务逻辑

  2. View:XAML 定义的 UI

  3. ViewModel:连接 View 和 Model 的中间层

7.2 基本实现

ViewModel 示例

public class MainViewModel : INotifyPropertyChanged
{private string _userName;public string UserName{get => _userName;set{_userName = value;OnPropertyChanged();}}public ICommand SubmitCommand { get; }public MainViewModel(){SubmitCommand = new RelayCommand(Submit);}private void Submit(){MessageBox.Show($"Hello, {UserName}!");}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

View 示例

<Window.DataContext><local:MainViewModel/>
</Window.DataContext><StackPanel><TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}"Margin="5"/><Button Content="提交" Command="{Binding SubmitCommand}" Margin="5"/>
</StackPanel>

八、XAML 开发最佳实践

  1. 命名约定

    • 控件名称使用 x:Name 属性

    • 遵循 控件类型+用途 的命名方式(如 btnSubmit

  2. 资源管理

    • 将样式和模板放在资源字典中

    • 使用合并资源字典组织大型项目

  3. 性能优化

    • 使用虚拟化控件处理大数据集

    • 避免不必要的复杂可视化树

    • 谨慎使用动画和特效

  4. 可维护性

    • 保持 XAML 结构清晰

    • 使用注释标记重要部分

    • 将复杂界面分解为用户控件

结语

XAML 作为现代 Windows 应用程序开发的核心技术,提供了强大的声明式 UI 开发能力。通过本文的介绍,您应该已经掌握了 XAML 的基础知识和关键概念。要成为 XAML 专家,还需要在实践中不断探索其高级特性和最佳实践。

随着 .NET 生态系统的不断发展,XAML 技术也在持续进化,如 WinUI 3 和 .NET MAUI 都为 XAML 带来了新的可能性。掌握 XAML 基础将为您的 Windows 应用程序开发之路奠定坚实的基础。

 

相关文章:

C# XAML 基础:构建现代 Windows 应用程序的 UI 语言

在现代 Windows 应用程序开发中&#xff0c;XAML (eXtensible Application Markup Language) 扮演着至关重要的角色。作为一种基于 XML 的声明性语言&#xff0c;XAML 为 WPF (Windows Presentation Foundation)、UWP (Universal Windows Platform) 和 Xamarin.Forms 应用程序提…...

Linux运维笔记:服务器感染 netools 病毒案例

文章目录 背景排查过程1. 发现异常2. 检测隐藏进程3. 尝试终止进程4. 深入分析进程 处理步骤1. 禁用 Cron 任务2. 删除恶意文件3. 终止恶意进程4. 重启系统 注意事项总结 提示&#xff1a;本文记录了一起 Linux 服务器感染恶意软件&#xff08;疑似挖矿病毒&#xff09;的排查与…...

(面试)获取View宽高的几种方式

Android 中获取 View 宽高的几种方式&#xff0c;以及它们的适用场景和注意事项&#xff1a; 1. View.getWidth() 和 View.getHeight() 原理: 直接从 View 对象中获取已经计算好的宽度和高度。 优点: 简单直接。 缺点: 在 onCreate()、onStart() 等生命周期方法中&#xff0…...

【Linux】进程地址空间揭秘(初步认识)

10.进程地址空间&#xff08;初步认识&#xff09; 文章目录 10.进程地址空间&#xff08;初步认识&#xff09;一、进程地址空间的实验现象解析二、进程地址空间三、虚拟内存管理补充&#xff1a;数据的写时拷贝&#xff08;浅谈&#xff09;补充&#xff1a;页表&#xff08;…...

设计模式——备忘录设计模式(行为型)

摘要 备忘录设计模式是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获对象的内部状态并在需要时恢复。它包含三个关键角色&#xff1a;原发器&#xff08;Originator&#xff09;、备忘录&#xff08;Memento&#xff09;和负责人&#xff08;Car…...

吴恩达:构建自动化评估并不需要大量投入,从一些简单快速的示例入手,然后逐步迭代!

吴恩达老师又来信了。 这次他分享了一个重要观点&#xff1a;构建自动化评估并不需要大量投入。从一些简单快速的示例入手&#xff0c;然后逐步迭代&#xff01; 以下是我对原文的翻译&#xff1a; 亲爱的朋友们&#xff1a; 我注意到&#xff0c;许多生成式 AI 应用项目在系…...

鸿蒙OSUniApp内存管理优化实战:从入门到精通#三方框架 #Uniapp

UniApp内存管理优化实战&#xff1a;从入门到精通 在开发 UniApp 应用时&#xff0c;特别是针对鸿蒙设备的开发过程中&#xff0c;内存管理往往成为影响应用性能的关键因素。本文将结合实际项目经验&#xff0c;深入探讨 UniApp 应用的内存优化策略&#xff0c;帮助开发者构建…...

Vue-5-基于JavaScript和plotly.js绘制数据分析类图表

文章目录 1 折线图示例1.1 网页基本结构1.2 绘图流程1.2.1 type图表类型1.2.2 mode显示方式1.2.3 marker数据点的样式1.3 横坐标为时间戳1.3.1 xaxis.type坐标值类型1.3.2 xaxis.tickformat格式1.4 悬停时展示毫秒数2 一个变量2.1 箱线图2.2 小提琴图2.3 直方图3 两个变量3.1 折…...

UI自动化测试的革新,新一代AI工具MidScene.js实测!

前言 AI已经越来越深入地走入我们的实际工作,在软件测试领域,和AI相关的新测试工具、方法也层出不穷。在之前我们介绍过结合 mcp server 实现 AI 驱动测试的案例,本文我们将介绍一个近期崭露头角的国产AI测试工具 Midscene.js Midscene.js简介 MidScene.js 是由字节跳动 w…...

StarRocks的几种表模型

## 一、引言&#xff1a;OLAP场景下的表模型挑战 在实时分析领域&#xff0c;数据表的设计直接影响查询性能、存储效率和更新灵活性。StarRocks作为新一代极速全场景MPP数据库&#xff0c;针对不同的业务场景提供了多样化的表模型解决方案。每种模型通过独特的存储结构和预计算…...

4. Qt对话框(2)

在上节中已经学习了对话框的确认和取消&#xff0c;本节内容继续接上节完成登录对话框实例并得到登录信息。 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 实现登录对话框 1.1 功能需要 得到登录信息&#xff0c;需要…...

2025-5-31-C++ 学习 字符串(终)

字符串 2025-5-31-C 学习 字符串&#xff08;终&#xff09;P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 说明/提示题解代码 P1597 语句解析题目背景题目描述输入格式输出格式输入…...

Android Studio 2022.2.1.20 汉化教程

查看Android Studio 版本 Android Studio Flamingo | 2022.2.1 Patch 2 下载&#xff1a;https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions/stable...

第17讲、odoo18可视化操作代码生成模块

1. 模块概述 代码框架生成模块是一个专为Odoo开发者设计的工具&#xff0c;旨在简化模块开发过程中的重复性工作。该模块允许开发者通过定义模型名称和字段&#xff0c;自动生成相应的Python代码、XML视图和CSV权限配置文件&#xff0c;从而大幅提高开发效率。通过这种方式&am…...

golang -- slice 底层逻辑

目录 一、前言二、结构三、创建3.1 根据 make创建3.2 通过数组创建 四、内置append追加元素4.1 追加元素4.2 是否扩容4.2.1 不扩容4.2.2 扩容 总结 一、前言 前段时间学了go语言基础&#xff0c;过了一遍之后还是差很多&#xff0c;所以又结合几篇不同资料重新学习了一下相关…...

SOC-ESP32S3部分:26-物联网MQTT连云

飞书文档https://x509p6c8to.feishu.cn/wiki/IGCawAgqFibop7kO83KcsDFBnNb ESP-MQTT 是 MQTT 协议客户端的实现&#xff0c;MQTT 是一种基于发布/订阅模式的轻量级消息传输协议。ESP-MQTT 当前支持 MQTT v5.0。 特性 支持基于 TCP 的 MQTT、基于 Mbed TLS 的 SSL、基于 WebSo…...

从前端工程化角度解析 Vite 打包策略:为何选择 Rollup 而非 esbuild。

文章目录 前言一、esbuild 与 Rollup 的技术特性对比1、esbuild&#xff1a;极速开发利器&#xff0c;功能尚待完善2、Rollup&#xff1a;专业打包工具&#xff0c;功能全面强大 二、Vite 打包策略的工程化考量因素1、开发阶段与生产阶段的需求差异2、功能完整性与生态兼容性3、…...

三层架构 vs SOA vs 微服务:该选谁?

三层架构 vs SOA vs 微服务:该选谁? 一、从单体到分布式:架构演进的必然性 最早的系统架构通常是单体架构(Monolithic Architecture),所有功能都打包在一个应用里,部署方便,但扩展性和灵活性有限。后来,为了让系统更具可维护性,三层架构成为主流。但当业务变得复杂…...

制造业的未来图景:超自动化与劳动力转型的双重革命

市场现状&#xff1a;传统制造业的转型阵痛 当前全球制造业正站在历史性变革的十字路口。埃森哲对552位工厂经理的全球调研显示&#xff0c;60%的受访者将劳动力转型视为首要战略任务​​&#xff0c;而63%的工厂正在加速部署自动化技术[1]。超过​75%的工厂经理​​认为&…...

使用Haproxy搭建Web群集

一、基础环境准备 服务器规划 67 HAProxy调度器&#xff1a;1台 (2核4G&#xff0c;CentOS 7/8) Web服务器&#xff1a;至少2台&#xff08;如Nginx/Apache&#xff0c;建议192.168.1.101-102&#xff09; 客户端测试机&#xff1a;1台&#xff08;Windows/Linux&#xff09;…...

【Unity】相机 Cameras

1 前言 主要介绍官方文档中相机模块的内容。 关于“9动态分辨率”&#xff0c;这部分很多API文档只是提了一下&#xff0c;具体细节还需要自己深入API才行。 2 摄像机介绍 Unity 场景在三维空间中表示游戏对象。由于观察者的屏幕是二维屏幕&#xff0c;Unity 需要捕捉视图并将…...

如何在 Solana 上发币,并创建初始流动性让项目真正“动”起来?

在 Solana 上发行代币如今已不再是技术门槛&#xff0c;而是市场策略和执行效率的较量。如果你只是简单发了一个代币&#xff0c;却没为它建立流动性和市场机制&#xff0c;那么它就只是一个“死币”。 本文将带你一步步理解&#xff0c;如何从发币到建立流动性池&#xff0c;…...

C++.凸包算法

C.凸包算法 1. 凸包算法概述1.1 凸包的定义1.2 凸包算法的应用场景 2. Graham扫描算法2.1 算法原理2.2 C代码实现2.3 示例分析Mermaid图示 3. Andrew算法3.1 算法原理3.2 C代码实现3.3 示例分析Mermaid图示 4. 算法性能比较4.1 时间复杂度分析Graham扫描算法Andrew算法性能对比…...

C++ 游戏开发详细流程

&#x1f9e0; 第一阶段&#xff1a;项目规划与架构设计 关键词&#xff1a;系统性、模块化、可扩展性 1.1 目标明确 游戏类型&#xff1a;2D / 2.5D / 3D / VR平台选择&#xff1a;PC、主机、移动设备多人/单人&#xff1a;是否含网络模块&#xff08;决定是否使用 socket、U…...

核心机制:滑动窗口

TCP 协议 1.确认应答 可靠传输的核心机制 2.超时重传 可靠传输的核心机制 3.连接管理 TCP/网络 最高的面试题 三次握手,建立连接(必须是 三次) 四次挥手,断开连接(可能是 三次) 核心机制四:滑动窗口 算法中的"滑动窗口" 出自 TCP 前面的三个…...

苹果电脑深度清理,让老旧Mac重焕新生

在日常使用苹果电脑的过程中&#xff0c;随着时间推移&#xff0c;系统内会积累大量冗余数据&#xff0c;导致电脑运行速度变慢、磁盘空间紧张。想要让设备恢复流畅&#xff0c;苹果电脑深度清理必不可少。那么&#xff0c;如何进行苹果电脑深度清理呢&#xff1f;接下来为你详…...

Hadoop复习(一)

初识Hadoop 分别从选择题、大题和复习Linux命令来复习 选择题 问题 1 单项选择难度级别 3 2 分 下面哪一个不属于Google的三驾马车&#xff1f; 答案选项组 GFS NDFS BigTable MapReduce 问题 2 单项选择难度级别 3 2 分 Hadoop 3.x版本支持最低的JDK版本是&#x…...

微服务面试(分布式事务、注册中心、远程调用、服务保护)

1.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&#xff1a; 跨数据源的分布式事务跨服务的分布式事务综合情况 我们之前解决分布式事务问题是直接使用Seata框架的AT模式&#xff0c;但是解决分布式事务…...

高性能MYSQL(三):性能剖析

一、性能剖析概述 &#xff08;一&#xff09;关于性能优化 1.什么是性能&#xff1f; 我们将性能定义为完成某件任务所需要的时间度量&#xff0c;换句话说&#xff0c;性能即响应时间&#xff0c;这是一个非常重要的原则。 我们通过任务和时间而不是资源来测量性能。数据…...

Go 语言中的 panic 详解

Go 语言中的 panic 详解 在 Go 语言中&#xff0c;panic 是一种用于处理​​不可恢复错误​​的机制。当程序遇到无法继续执行的严重错误时&#xff0c;会自动或手动触发 panic&#xff0c;终止当前函数的执行&#xff0c;并开始进行​​堆栈展开​​&#xff08;stack unwind…...