WPF 与 C# 融合开发:从基础到高级应用(一)

WPF 与 C# 融合开发:从基础到高级应用

一、C# 语言基础回顾

1.1 C# 语言概述

C# 是微软开发的一种现代、面向对象的编程语言,它融合了 C、C++ 和 Java 等语言的优点,具有简洁、安全、高效等特点。C# 广泛应用于 Windows 平台的应用开发,是开发 WPF 应用程序的首选语言。

1.2 数据类型与变量

1.2.1 值类型

值类型直接存储数据的值,在栈上分配内存。常见的值类型包括整数类型(如 sbyteushortuintulong 等)、浮点类型(decimal 常用于财务计算,具有高精度)、布尔类型和字符类型。例如:

decimal price = 123.45m;
bool isMember = false;
1.2.2 引用类型

引用类型存储的是数据的引用,在堆上分配内存。类、接口、数组、委托和字符串都是引用类型。例如:

string message = "Hello, C#!";
int[] numbers = new int[5];
1.2.3 变量声明与作用域

变量在使用前必须声明,并且具有一定的作用域。作用域决定了变量的可见性和生命周期。例如:

{int localVariable = 10; // 局部变量,作用域在大括号内
}
// 这里无法访问 localVariable

1.3 控制结构

1.3.1 条件语句

除了常见的 if - else 和 switch 语句,C# 还支持三元运算符 ?:,用于简洁地表达简单的条件判断。例如:

int age = 20;
string status = age >= 18 ? "成年人" : "未成年人";
1.3.2 循环语句

C# 提供了 forwhiledo - while 和 foreach 循环。foreach 循环常用于遍历数组或集合。例如:

string[] names = { "Alice", "Bob", "Charlie" };
foreach (string name in names)
{Console.WriteLine(name);
}

1.4 方法和类

1.4.1 方法定义和调用

方法是具有特定功能的代码块,可以接受参数并返回值。方法可以重载,即方法名相同但参数列表不同。例如:

class Calculator
{public int Add(int a, int b){return a + b;}public double Add(double a, double b){return a + b;}
}
1.4.2 类的封装和继承

类是对象的蓝图,封装了数据和行为。继承允许一个类继承另一个类的属性和方法,提高代码的复用性。例如:

class Animal
{public void Eat(){Console.WriteLine("动物吃东西");}
}class Cat : Animal
{public void Meow(){Console.WriteLine("猫叫");}
}

1.5 异常处理

C# 提供了 try - catch - finally 语句来处理异常。try 块中放置可能会抛出异常的代码,catch 块用于捕获和处理异常,finally 块无论是否发生异常都会执行。例如:

try
{int result = 10 / 0;
}
catch (DivideByZeroException ex)
{Console.WriteLine("除数不能为零:" + ex.Message);
}
finally
{Console.WriteLine("无论是否异常,此代码都会执行");
}

二、WPF 基础架构

2.1 WPF 概述

WPF 是微软为 Windows 平台开发的新一代用户界面框架,它引入了 DirectX 图形渲染引擎,支持硬件加速,能够创建出高质量的 2D 和 3D 图形界面。WPF 使用 XAML 来描述用户界面,实现了界面设计和代码逻辑的分离。

2.2 XAML 基础

2.2.1 XAML 语法规则

XAML 是一种基于 XML 的标记语言,遵循 XML 的语法规则。标签用于表示控件和元素,属性用于设置控件的特性。例如:

<Button Content="点击我" Width="100" Height="30"/>
2.2.2 命名空间的使用

在 XAML 中,命名空间用于引用不同的程序集和类型。常见的命名空间包括 http://schemas.microsoft.com/winfx/2006/xaml/presentation 和 http://schemas.microsoft.com/winfx/2006/xaml。例如:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="My Window" Height="350" Width="525"><!-- 窗口内容 -->
</Window>

2.3 布局控件

2.3.1 Grid 布局

Grid 布局将界面划分为行和列的网格,控件可以放置在指定的单元格中。可以通过 RowDefinitions 和 ColumnDefinitions 来定义行和列的大小。例如:

<Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Label Content="用户名:" Grid.Row="0" Grid.Column="0"/><TextBox Grid.Row="0" Grid.Column="1"/>
</Grid>
2.3.2 StackPanel 布局

StackPanel 布局按顺序排列子控件,可以是水平排列或垂直排列。通过 Orientation 属性来指定排列方向。例如:

<StackPanel Orientation="Horizontal"><Button Content="按钮1"/><Button Content="按钮2"/>
</StackPanel>
2.3.3 WrapPanel 布局

WrapPanel 布局当子控件超出其宽度或高度时,会自动换行或换列排列。例如:

<WrapPanel><Button Content="按钮1"/><Button Content="按钮2"/><Button Content="按钮3"/>
</WrapPanel>

2.4 控件基础

2.4.1 常见控件介绍

WPF 提供了丰富的控件,如 ButtonTextBoxLabelListBoxComboBox 等。每个控件都有其特定的用途和属性。例如:

<StackPanel><Label Content="请输入文本:"/><TextBox Name="inputTextBox"/><Button Content="提交" Click="Button_Click"/>
</StackPanel>
2.4.2 控件事件处理

控件的事件可以在 XAML 中指定事件处理方法,也可以在代码中动态注册。例如,处理按钮的 Click 事件:

private void Button_Click(object sender, RoutedEventArgs e)
{string input = inputTextBox.Text;MessageBox.Show("你输入的文本是:" + input);
}

三、WPF 数据绑定深入探究

3.1 数据绑定基础

3.1.1 数据绑定概念

数据绑定是 WPF 的核心特性之一,它允许将 UI 元素的属性与数据源的属性进行关联,实现数据的自动更新。

3.1.2 简单数据绑定示例

假设有一个 Person 类:

public class Person
{public string Name { get; set; }public int Age { get; set; }
}

在 XAML 中进行数据绑定:

<StackPanel><TextBlock Text="{Binding Name}"/><TextBlock Text="{Binding Age}"/>
</StackPanel>

在代码隐藏文件中设置数据上下文:

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();Person person = new Person { Name = "David", Age = 28 };DataContext = person;}
}

3.2 数据绑定模式

3.2.1 单向绑定

单向绑定是指数据源的属性值发生变化时,UI 元素会更新,但 UI 元素的变化不会影响数据源。使用 Mode=OneWay 来指定单向绑定。例如:

<TextBlock Text="{Binding Name, Mode=OneWay}"/>
3.2.2 双向绑定

双向绑定允许数据源和 UI 元素之间的相互更新。使用 Mode=TwoWay 来指定双向绑定。例如:

<TextBox Text="{Binding Name, Mode=TwoWay}"/>
3.2.3 单向到源绑定

单向到源绑定是指 UI 元素的变化会更新数据源,但数据源的变化不会影响 UI 元素。使用 Mode=OneWayToSource 来指定单向到源绑定。

3.3 数据模板

3.3.1 数据模板概念

数据模板用于定义如何显示数据源中的数据。可以使用数据模板来定制列表框、组合框等控件中数据的显示方式。

3.3.2 数据模板示例

假设有一个 Employee 类:

public class Employee
{public string Name { get; set; }public int EmployeeId { get; set; }
}

在 XAML 中定义数据模板:

<Window.Resources><DataTemplate x:Key="EmployeeTemplate"><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}" Margin="5"/><TextBlock Text="{Binding EmployeeId}" Margin="5"/></StackPanel></DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding Employees}" ItemTemplate="{StaticResource EmployeeTemplate}"/>

在代码隐藏文件中设置数据源:

public partial class MainWindow : Window
{public ObservableCollection<Employee> Employees { get; set; }public MainWindow(){InitializeComponent();Employees = new ObservableCollection<Employee>{new Employee { Name = "Eve", EmployeeId = 3 },new Employee { Name = "Frank", EmployeeId = 4 }};DataContext = this;}
}

3.4 数据验证

3.4.1 数据验证概念

数据验证用于确保用户输入的数据符合特定的规则。WPF 提供了多种方式来实现数据验证,如自定义验证规则、使用 IDataErrorInfo 接口等。

3.4.2 自定义验证规则示例

定义一个自定义验证规则类:

public class AgeValidationRule : ValidationRule
{public override ValidationResult Validate(object value, CultureInfo cultureInfo){int age;if (!int.TryParse(value.ToString(), out age)){return new ValidationResult(false, "年龄必须是数字");}if (age < 0 || age > 120){return new ValidationResult(false, "年龄必须在 0 到 120 之间");}return ValidationResult.ValidResult;}
}

在 XAML 中使用自定义验证规则:

<TextBox><TextBox.Text><Binding Path="Age" UpdateSourceTrigger="PropertyChanged"><Binding.ValidationRules><local:AgeValidationRule/></Binding.ValidationRules></Binding></TextBox.Text>
</TextBox>

四、WPF 样式与模板高级应用

4.1 样式基础

4.1.1 样式概念

样式是一组属性值的集合,用于定义控件的外观和行为。可以使用样式来统一应用程序中相同类型控件的外观。

4.1.2 样式定义与使用

在 XAML 中定义样式:

<Window.Resources><Style TargetType="Button"><Setter Property="Background" Value="LightBlue"/><Setter Property="Foreground" Value="White"/><Setter Property="FontSize" Value="16"/></Style>
</Window.Resources>
<Button Content="Styled Button"/>

4.2 模板基础

4.2.1 模板概念

模板用于定义控件的可视化结构。可以使用模板来完全自定义控件的外观。

4.2.2 模板定义与使用

例如,自定义按钮的模板:

<Window.Resources><Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}"CornerRadius="5"><ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/></Border></ControlTemplate></Setter.Value></Setter></Style>
</Window.Resources>
<Button Content="Custom Button"/>

4.3 资源管理

4.3.1 资源概念

资源是可以在应用程序中重复使用的对象,如样式、模板、图像等。可以将资源定义在 XAML 的 Resources 部分,然后在需要的地方引用。

4.3.2 资源的使用

例如,定义一个颜色资源并在样式中使用:

<Window.Resources><SolidColorBrush x:Key="MyButtonBackground" Color="Green"/><Style TargetType="Button"><Setter Property="Background" Value="{StaticResource MyButtonBackground}"/></Style>
</Window.Resources>
<Button Content="Button with Resource"/>

4.4 主题和皮肤切换

4.4.1 主题和皮肤概念

主题和皮肤用于改变应用程序的整体外观。可以通过切换不同的资源字典来实现主题和皮肤的切换。

4.4.2 主题切换示例

创建不同的资源字典文件,如 LightTheme.xaml 和 DarkTheme.xaml,在代码中动态加载不同的资源字典:

private void SwitchToLightTheme()
{ResourceDictionary lightTheme = new ResourceDictionary();lightTheme.Source = new Uri("LightTheme.xaml", UriKind.Relative);Application.Current.Resources.MergedDictionaries.Clear();Application.Current.Resources.MergedDictionaries.Add(lightTheme);
}private void SwitchToDarkTheme()
{ResourceDictionary darkTheme = new ResourceDictionary();darkTheme.Source = new Uri("DarkTheme.xaml", UriKind.Relative);Application.Current.Resources.MergedDictionaries.Clear();Application.Current.Resources.MergedDictionaries.Add(darkTheme);
}

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

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

相关文章

【Linux】IP协议

目录 一、IP协议的概念 二、IP协议的报头 &#xff08;一&#xff09;IP协议报文的封装、解包和分用 &#xff08;二&#xff09;8位生存时间 &#xff08;三&#xff09;IP分片 三、IP协议的网段划分 &#xff08;一&#xff09;为什么需要网段划分 &#xff08;二&am…

如何快速下载并安装 Postman?

从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作&#xff0c;帮助初学者快速上手。 Postman 下载及安装教程(2025最新)

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现&#xff1a; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文…

【深度学习的数学】导数

导数的定义。好像是从极限开始的。比如说&#xff0c;函数f(x)在点xa处的导数&#xff0c;就是当h趋近于0时&#xff0c;[f(ah) - f(a)]除以h的极限&#xff0c;对吧&#xff1f;公式应该是这样的&#xff1a;f’(a) lim_{h→0} [f(ah) - f(a)] / h。这个极限如果存在的话&…

word文件转换为Markdown格式

目录 一、前言1.1、poi-ooxml、docx4j、aspose-words对比二、poi-ooxml技术实现一、前言 顺应时代技术的变更及高效协同理念的影响,非结构化信息展示、存储、应用等也由传统文档向在线协同文档的演变,类似腾讯在线文档。   目前大多数在线文档支持的是Markdown格式,因此这…

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…

langserve搭建方法

文章目录 安装 langserver安装 langchain-cli创建langserve脚手架使用poetry管理包 安装 langserver pip install langserve安装 langchain-cli pip install langchain-cli创建langserve脚手架 langchain app new 项目名后续交互界面全回车&#xff0c;接着cd到 项目名 目录…

网络基础-路由器和交换机工作配置

三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机&#xff08;链路层&#xff09;mac地址表的数据转发路由器&#xff08;网络层&#xff09; ip路由表的数据转发 隔离广播域…

mysql高级,mysql体系结构,mysql引擎,存储过程,索引,锁

1.mysql体系结构 1&#xff09; 连接层 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作…

Unity高清渲染管线

Unity高清渲染管线——1 unity高清渲染管线是渲染管线的一种&#xff0c;在看完《创造高清3D虚拟世界》这本书的前两章以及第三张第二小节后终于对unity的高清渲染管线也是有了一个初步的认知&#xff0c;以下是我个人理解仅作参考&#xff1a; unity高清渲染管线项目模板比起…

Python基础语法元素(学习笔记)

实例1&#xff1a;温度转换 # TempConvert.py #为单行注释 多行注释为: 这里写内容 TempStr input("请输入带有符号的温度值&#xff1a;") if TempStr[-1] in [F,f] :C (eval(TempStr[0:-1])-32)/1.8print("转换后的温度是{:.2f}C".format(C)) e…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持&#xff0c;其中包括两个重要的函数&#xff1a;std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具&#xff0c;而 TensorBoardX 是其社区驱动的替代品&#xff0c;支持 PyTorch 等其他框架。以下是它…

flutter-实现瀑布流布局及下拉刷新上拉加载更多

文章目录 1. 效果预览2. 结构分析3. 完整代码4. 总结 1. 效果预览 在 Flutter 应用开发中&#xff0c;瀑布流布局常用于展示图片、商品列表等需要以不规则但整齐排列的内容。同时&#xff0c;下拉刷新和上拉加载更多功能&#xff0c;能够极大提升用户体验&#xff0c;让用户方…

【day2】数据结构刷题 栈

一 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

YAML是什么?

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种以数据为中心、高度可读的序列化语言&#xff0c;广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析&#xff1a; 1. 定义与历史演变 全称与定位&#xff1a; YAML的全称最初为“Yet…

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题&#xff0c;微服务雪崩问题就是指在微服务架构中&#xff0c;当一个服务出现故障时&#xff0c;由于服务之间的依赖关系&#xff0c;故障可能会传播到其他服务&#xff0c;从而导致了大规模的服务失败&#xff0c;系统无法正…

反序列化漏洞

前提概要 本文章主要用于分享反序列化漏洞基础学习&#xff0c;以下是对反序列化漏洞的一些个人解析&#xff0c;请大家结合参考其他文章中的相关信息进行归纳和补充。 反序列化漏洞描述 反序列化漏洞是指程序在对输入的字节流进行反序列化时&#xff0c;因缺乏充分的验证和过…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…