【WPF.NET开发】WPF中的XAML资源
本文内容
- 使用 XAML 中的资源
- 静态和动态资源
- 静态资源
- 动态资源
- 样式、DataTemplate 和隐式键
资源是可以在应用中的不同位置重复使用的对象。 资源的示例包括画笔和样式。 本概述介绍如何使用 Extensible Application Markup Language (XAML) 中的资源。 你还可以使用代码创建和访问资源。
备注
本文所述的 XAML 资源与应用资源不同,后者通常指添加到应用中的文件,例如内容、数据或嵌入式文件。
1、使用 XAML 中的资源
下面的示例将 SolidColorBrush 定义为页面根元素上的资源。 该示例随后引用资源,并使用它来设置多个子元素的属性,其中包括 Ellipse、TextBlock 和 Button。
<Page Name="root"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
><Page.Resources><SolidColorBrush x:Key="MyBrush" Color="Gold"/><Style TargetType="Border" x:Key="PageBackground"><Setter Property="Background" Value="Blue"/></Style><Style TargetType="TextBlock" x:Key="TitleText"><Setter Property="Background" Value="Blue"/><Setter Property="DockPanel.Dock" Value="Top"/><Setter Property="FontSize" Value="18"/><Setter Property="Foreground" Value="#4E87D4"/><Setter Property="FontFamily" Value="Trebuchet MS"/><Setter Property="Margin" Value="0,40,10,10"/></Style><Style TargetType="TextBlock" x:Key="Label"><Setter Property="DockPanel.Dock" Value="Right"/><Setter Property="FontSize" Value="8"/><Setter Property="Foreground" Value="{StaticResource MyBrush}"/><Setter Property="FontFamily" Value="Arial"/><Setter Property="FontWeight" Value="Bold"/><Setter Property="Margin" Value="0,3,10,0"/></Style></Page.Resources><StackPanel><Border Style="{StaticResource PageBackground}"><DockPanel><TextBlock Style="{StaticResource TitleText}">Title</TextBlock><TextBlock Style="{StaticResource Label}">Label</TextBlock><TextBlock DockPanel.Dock="Top" HorizontalAlignment="Left" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" /><Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button><Ellipse DockPanel.Dock="Top" HorizontalAlignment="Left" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="40" /></DockPanel></Border></StackPanel>
</Page>
每个框架级元素(FrameworkElement 或 FrameworkContentElement)都具有 Resources 属性,该属性是包含已定义资源的 ResourceDictionary 类型。 你可以在任何元素上定义资源,例如 Button。 但是,最常在根元素上定义资源,本示例中的根元素为 Page。
资源字典中的每个资源都必须具有唯一键。 在标记中定义资源时,可通过 x:Key 指令来分配唯一键。 通常情况下,这个键是一个字符串;但是,也可使用相应的标记扩展将其设置为其他对象类型。 资源的非字符串键用于 WPF 中的某些功能区,尤其是样式、组件资源和数据样式。
你可以使用具有资源标记扩展语法(指定资源的键名)的已定义资源。 例如,将资源用作另一个元素上的属性的值。
<Button Background="{StaticResource MyBrush}"/>
<Ellipse Fill="{StaticResource MyBrush}"/>
在前面的示例中,如果 XAML 加载程序处理 Button 上 Background 属性的值 {StaticResource MyBrush}
,则资源查找逻辑会首先检查 Button 元素的资源字典。 如果 Button 没有资源键 MyBrush
的定义(在该示例中没有;其资源集合为空),则查找逻辑接下来会检查 Button 的父元素,即 Page。 如果在 Page 根元素上定义资源,则 Page 的逻辑树中的所有元素都可以访问它。 而且,你可以重复使用相同的资源来设置接受与该资源所表示类型相同的类型的所有属性的值。 在前面的示例中,同一 MyBrush
资源设置两个不同的属性:Button 的 Background 和 Rectangle 的 Fill。
2、静态和动态资源
资源可引用为静态资源或动态资源。 可通过使用
StaticResource 标记扩展或
DynamicResource 标记扩展创建引用。 标记扩展是 XAML 的一项功能,可以通过使用标记扩展来处理属性字符串并将对象返回到 XAML 加载程序,从而指定对象引用。
使用标记扩展时,通常会以字符串的形式提供一个或多个由该特定标记扩展处理的参数。
StaticResource 标记扩展通过在所有可用的资源字典中查找键值来处理键。 处理在加载期间进行,即加载过程需要分配属性值时。DynamicResource 标记扩展
则通过创建表达式来处理键,而且表达式会保持未计算状态,直至应用运行为止。当应用实际运行时,表达式会进行计算并提供一个值。
在引用某个资源时,下列注意事项可能会对于使用静态资源引用还是使用动态资源引用产生影响:
-
确定如何为应用创建资源的整体设计(在每页上、在应用程序中、在宽松的 XAML 中或在仅包含资源的程序集中)时,请考虑以下事项:
-
应用的功能。 实时更新资源是否为应用要求的一部分?
-
该资源引用类型的相应查找行为。
-
特定的属性或资源类型,以及这些类型的本机行为。
3、静态资源
在以下情况下,最适合使用静态资源引用:
-
应用设计将其大多数资源集中到页面或应用程序级资源字典中。 静态资源引用不基于运行时行为(例如重载页面)重新计算。 因此,根据资源和应用设计,如果避免不必要地使用大量动态资源引用,可能会一定程度地提高性能。
-
要设置不在 DependencyObject 或 Freezable 上的属性的值。
-
要创建的资源字典将编译成 DLL,并将打包为应用的一部分或在应用间共享。
-
要为自定义控件创建主题,并要定义在主题中使用的资源。 在这种情况下,通常不希望执行动态资源引用查找行为,而是希望执行静态资源引用行为,以确保查找可预测并自包含到主题中。 使用动态资源引用时,即使主题中的引用也会在运行时前保持未计算状态。 而且,主题可能会得到应用,但某个本地元素仍会重新定义主题正尝试引用的键,并且该本地元素在查找期间会排在主题之前。 如果发生这种情况,主题的行为将偏离预期方式。
-
要使用资源设置大量依赖属性。 依赖属性会通过属性系统启用有效值缓存功能;因此,如果为可在加载时进行计算的依赖属性提供了值,则该依赖属性不必检查是否存在重新计算的表达式并可返回最后一个有效值。 此项技术可以提高性能。
-
想为所有使用者更改基础资源,或想通过使用 x:Shared 属性为每个使用者维护单独的可写实例。
静态资源查找行为
下面介绍属性或元素引用静态资源时自动发生的查找过程:
-
查找进程在用于设置属性的元素所定义的资源字典中查找请求的键。
-
查找过程随后会向上遍历逻辑树,以查找父元素及其资源字典。 此过程到达根元素后才会停止。
-
检查应用资源。 应用资源就是 Application 对象为 WPF 应用定义的资源字典中的资源。
从资源字典中进行的静态资源引用必须引用已在资源引用前进行过词法定义的资源。 静态资源引用无法解析前向引用。 因此,请设计资源字典的结构,以便在每个相应资源字典的开头或邻近开头的位置定义资源。
静态资源查找可以扩展到主题或系统资源中,但此查找受支持只是因为 XAML 加载程序推迟了请求。 为了让页面加载时的运行时主题正确地应用到应用,这种延迟是必需的。 但是,不建议使用对已知仅在主题中存在或作为系统资源存在的键的静态资源引用,因为如果用户实时更改主题,不会重新计算此类引用。 请求主题或系统资源时,动态资源引用更为可靠。 例外情况是当主题元素自身请求另一个资源。 出于上述原因,这些引用应该是静态资源引用。
因找不到静态资源引用而引发的异常行为各不相同。 如果资源被延迟,则异常会在运行时发生。 如果资源未延迟,则异常会在加载时发生。
4、动态资源
在以下情况下,最适合使用动态资源:
-
资源(包括系统资源或用户可设置的资源)的值取决于直到运行时才知道的条件。 例如,你可以创建 setter 值(引用由 SystemColors、SystemFonts 或 SystemParameters 公开的系统属性)。 这些值是真正的动态值,因为它们最终来自用户和操作系统的运行时环境。 或许还拥有可能会发生变化的应用程序级主题,而页面级资源访问也必须捕获其中的变化。
-
要为自定义控件创建或引用主题样式。
-
打算在应用生存期内调整 ResourceDictionary 的内容。
-
拥有存在相互依赖关系且可能需要进行前向引用的复杂资源结构。 静态资源引用不支持前向引用,但动态资源引用支持,因为资源在运行时之前不需要计算,所以前向引用是一个不相关的概念。
-
要引用从编译或工作集的角度来看很大的资源,而且该资源在页面加载时可能不会立即使用。 页面加载时,始终会从 XAML 加载静态资源引用。 但是,动态资源引用在使用前不会加载。
-
要创建的样式的 setter 值可能来自受主题或其他用户设置影响的其他值。
-
要将资源应用于可能会在应用生存期内在逻辑树中重定父级的元素。 父级更改后,资源查找范围也可能会随之更改;因此,如果希望重定父级的元素的资源基于新范围重新进行计算,请始终使用动态资源引用。
动态资源查找行为
如果调用 FindResource 或 SetResourceReference,则动态资源引用的资源查找行为会与代码中的查找行为并行执行:
-
查找在用于设置属性的元素所定义的资源字典中查找请求的键:
-
如果元素定义 Style 属性,则该元素的 System.Windows.FrameworkElement.Style 将检查其 Resources 字典。
-
如果元素定义 Template 属性,则检查该元素的 System.Windows.FrameworkTemplate.Resources 字典。
-
-
查找会向上遍历逻辑树,以查找父元素及其资源字典。 此过程到达根元素后才会停止。
-
检查应用资源。 应用资源就是 Application 对象为 WPF 应用定义的资源字典中的资源。
-
检查主题资源字典中当前处于活动状态的主题。 如果主题在运行时发生更改,则会重新计算值。
-
检查系统资源。
异常行为(如果有)各不相同:
-
如果 FindResource 调用请求了某个资源但未找到该资源,则会引发异常。
-
如果 TryFindResource 调用请求了某个资源但未找到该资源,不会引发任何异常,并且返回的值为
null
。 如果要设置的属性不接受null
,则仍有可能引发更深的异常(取决于要设置的单独属性)。 -
如果 XAML 中的动态资源引用请求了某个资源但未找到该资源,则行为取决于常规属性系统。 常规行为即存在资源的级别上没有发生属性设置操作时执行的行为。 例如,如果尝试使用无法计算的资源来设置个别按钮元素上的背景,则值设置操作不会产生任何结果,但有效值可能仍来自属性系统和值优先级中的其他参与者。 例如,背景值可能仍来自在本地定义的某个按钮样式,或来自主题样式。 对于并非由主题样式定义的属性,资源计算失败后的有效值可能来自属性元数据中的默认值。
限制
动态资源引用存在一些重要限制。 必须至少满足以下条件之一:
-
要设置的属性必须是 FrameworkElement 或 FrameworkContentElement 上的属性。 该属性必须由 DependencyProperty 支持。
-
该引用用于
StyleSetter
内的值。 -
要设置的属性必须是 Freezable(以 FrameworkElement 或 FrameworkContentElement 属性的值或 Setter 值的形式提供)上的属性。
由于要设置的属性必须是 DependencyProperty 或 Freezable 属性,大多数属性更改都可以传播到 UI,这是因为属性更改(更改的动态资源值)会经由属性系统确认。 大多数控件都包含相应的逻辑;当 DependencyProperty 有所更改且该属性可能会影响布局时,该逻辑将强制使用控件的其他布局。 但是,并不保证所有使用 DynamicResource 标记扩展作为其值的属性都能在 UI 中提供实时更新。 此功能可能仍会因属性、属性所属的类型,甚至应用的逻辑结构而异。
5、样式、DataTemplate 和隐式键
尽管 ResourceDictionary 中的所有项都必须具有键,但这并不意味着所有资源都必须具有显式 x:Key
。 多种对象类型在定义为资源时都支持隐式键,其键值会与另一属性的值绑定。 这类键被称为隐式键,而 x:Key
属性为显式键。 任何隐式键都可通过指定显式键来覆盖。
关于资源,一个重要的方案就是用于定义 Style。 事实上,Style 几乎总会作为资源字典中的条目进行定义,因为样式在本质上可供重复使用。
控件样式可通过隐式键来创建和引用。 用于定义控件默认外观的主题样式依赖于该隐式键。 从请求的角度来看,隐式键是控件本身的 Type。 从定义资源的角度来看,隐式键是样式的 TargetType。 因此,如果要创建自定义控件的主题或要创建会与现有主题样式交互的样式,则无需为该 Style 指定 x:Key 指令。 另外,如果想要使用主题样式,则根本无需指定任何样式。 例如,即使 Style 资源似乎没有键,以下样式定义仍起作用:
<Style TargetType="Button"><Setter Property="Background"><Setter.Value><LinearGradientBrush><GradientStop Offset="0.0" Color="AliceBlue"/><GradientStop Offset="1.0" Color="Salmon"/> </LinearGradientBrush></Setter.Value></Setter> <Setter Property="FontSize" Value="18"/>
</Style>
该样式确实具有一个键:隐式键 typeof(System.Windows.Controls.Button)
。 在标记中,可以直接将 TargetType 指定为类型名称(或者,可以选择使用 {x:Type...},以返回 Type。
通过 WPF 使用的默认主题样式机制,即使 Button 本身不尝试指定其 Style 属性或对样式的特定资源引用,该样式也将作为页面上 Button 的运行时样式应用。 在页面中定义的样式位于查找序列中的靠前位置(在主题字典样式之前),其所用的键与主题字典样式的键相同。 可以在页面上的任意位置指定 <Button>Hello</Button>
,使用 Button
的 TargetType 定义的样式将应用于该按钮。 如果需要,仍可为此样式显式指定与 TargetType 的类型值相同的键,以求在标记中清楚明示,但这是可选的。
如果 OverridesDefaultStyle 为 true
,则样式的隐式键不会应用于控件。 (另请注意,OverridesDefaultStyle 可能被设置为控件类的本机行为的一部分,而不是在控件的实例上显式设置。)此外,为了支持在派生类方案中使用隐式键,控件必须替代 DefaultStyleKey(作为 WPF 的一部分提供的所有现有控件都包括此替代)。
DataTemplate 也有一个隐式键。 DataTemplate 的隐式键是 DataType 属性值。 DataType 也可以作为类型的名称来指定,而不是使用 {x:Type...} 来显式指定。
相关文章:
【WPF.NET开发】WPF中的XAML资源
本文内容 使用 XAML 中的资源静态和动态资源静态资源动态资源样式、DataTemplate 和隐式键 资源是可以在应用中的不同位置重复使用的对象。 资源的示例包括画笔和样式。 本概述介绍如何使用 Extensible Application Markup Language (XAML) 中的资源。 你还可以使用代码创建和…...
ChatGPT 淘金潮(全)
原文:The ChatGPT GoldRush 译者:飞龙 协议:CC BY-NC-SA 4.0 一、ChatGPT 简介 什么是 ChatGPT? ChatGPT 是由 OpenAI 基于 GPT-4 架构创建的大型语言模型。它旨在理解和回应自然语言文本输入,使得可以与机器进行对话…...

【零基础入门Python数据分析】Anaconda3 JupyterNotebookseaborn版
目录 一、安装环境 python介绍 anaconda介绍 jupyter notebook介绍 anaconda3 环境安装 解决JuPyter500:Internal Server Error问题-CSDN博客 Jupyter notebook快捷键操作大全 二、Python基础入门 数据类型与变量 数据类型 变量及赋值 布尔类型与逻辑运算…...
C++面试:单例模式、工厂模式等简单的设计模式 创建型、结构型、行为型设计模式的应用技巧
理解和能够实现基本的设计模式是非常重要的。这里,我们将探讨两种常见的设计模式:单例模式和工厂模式,并提供一些面试准备的建议。 目录 单例模式 (Singleton Pattern) 工厂模式 (Factory Pattern) 面试准备 1. 理解设计模式的基本概念…...
Oracle JDK 8 中的 computeIfAbsent 方法及实践
Java 8 引入了一系列新特性,其中之一是对 Map 接口的增强,其中包括了 computeIfAbsent 方法。这个方法为处理映射提供了一种便捷而强大的方式,允许在键不存在或对应的值为 null 时,动态计算新的值并将其放入映射。在本篇博客中&am…...

华为设备vlan下配置MSTP,STP选举
核心代码,不同实例,承载不同流量,为每个实例设置一个根网桥达到分流的效果 stp region-config //进入stp区域的设置 region-name R1 //区域命名为R1 instance 1 vlan 10 …...
案例学Python:filter()函数的用法,高级!
大家好,这里是程序员晚枫,又来分享有用的Python知识了。 Python之所以好用,是因为有大量用于科学计算的内置函数和第三方库。用好这些第三方库,可以显著提高我们编程的速度和质量。 今天我们一起来看一下Python中一个重要的内置…...

jmeter--7.BeanShell
目录 1. beanshell常用语法 1.1 log:日志写入 1.2 vars:设置和引用局部变量(同线程组) 1.3 props:设置和引用全局变量(跨线程组) 1.4 prev:获取前一个请求返回的信息 2. beans…...

第 3 场 蓝桥杯小白入门赛 解题报告 | 珂学家 | 单调队列优化的DP + 三指针滑窗
前言 整体评价 T5, T6有点意思,这场小白入门场,好像没真正意义上的签到,整体感觉是这样。 A. 召唤神坤 思路: 前后缀拆解 #include <iostream> #include <algorithm> #include <vector> using namespace std;int main()…...
debian apt 装 mysql8
MySQL :: MySQL 8.0 参考手册 :: 2.5.5 使用来自 Oracle 的 Debian 软件包在 Linux 上安装 MySQL apt install -f lsb-release gnupg wget https://repo.mysql.com//mysql-apt-config_0.8.29-1_all.deb dpkg -i mysql-apt-config…...

LeetCode 每日一题 Day 37-43
终于考完试了,寒假期间将会每天持续更新! 447. 回旋镖的数量(Day 37) 给定平面上 n 对 互不相同 的点 points ,其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧…...

产品百度百科怎么创建?产品如何上百度百科?
百度百科作为一个权威的信息平台,承载着巨大的流量和曝光度。对于一个产品来说,能够在百度百科上拥有一席之地,无疑是一种极高的荣誉,同时也是提升品牌知名度、增加信任度的重要手段。产品百度百科不仅能够详细、全面地介绍产品信…...

Vue keep-alive的使用和原理解析
✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…...
Fine-tuning:个性化AI的妙术
在本篇文章中,我们将深入探讨Fine-tuning的概念、原理以及如何在实际项目中运用它,以此为初学者提供一份入门级的指南。 一、什么是大模型 ChatGPT大模型今年可谓是大火,在正式介绍大模型微调技术之前,为了方便大家理解,我们先对大模型做一个直观的抽象。 本质上,现在…...

说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系
Kubernetes v1.20版本 的 release note 里说 deprecated docker。并且在后续版本 v1.24 正式删除了 dockershim 组件,这对我们有什么影响呢?Kubernetes 1.20: The Raddest Release | Kubernetes 为了搞明白这件事情,以及理解一系列容器名词 …...

x-cmd pkg | trash-cli - 类 Unix 系统的命令行垃圾桶
目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 trash-cli 是类 Unix 系统的命令行垃圾桶,用于移动文件到回收站,同时会记录文件的原地址和删除日期。 该工具使用与 GNOME、KDE 和 XFCE 等桌面环境相同的垃圾桶,所以即使是非 …...

基于Java+SpringBoot+vue实现图书借阅和销售商城一体化系统
基于JavaSpringBootvue实现图书借阅和销售商城一体化系统 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系…...

集成xxljob项目如何迁移到K8S
前言 大家好,今天我们将基于XXL-Job,探讨任务调度迁移到云端的相关话题。 XXL-Job是一款功能强大、易用可靠的国产分布式任务调度平台,是目前国内使用比较广泛的分布式任务调度平台之一。它的主要特点包括: 支持分布式、多线程…...
类型“{}”上不存在属性“xxx”。ts(2339)-解决方案集锦
类型“{}”上不存在属性“xxx”。ts(2339)-解决方案集锦 文章目录 类型“{}”上不存在属性“xxx”。ts(2339)-解决方案集锦一、方案一(优先尝试)二、方案二(优先尝试)三、方案三这该是多么痛苦的一篇笔记啊!࿰…...
【MQTT】使用MQTT在Spring Boot项目中实现异步消息通信
目录 使用MQTT在Spring Boot项目中实现异步消息通信步骤1:引入MQTT库依赖步骤2:配置MQTT连接信息步骤3:创建MQTT配置类步骤4:发送MQTT消息发布MQTT消息消费MQTT消息 总结 前置文章: (一)MQTT协议…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...