WPF从初学者到专家:实战项目经验分享与总结

在这里插入图片描述
在这里插入图片描述

WPF从初学者到专家:实战项目经验分享与总结

  • 一、前言
  • 二、WPF 基础概念与入门
    • 2.1 什么是 WPF
    • 2.2 XAML 基础
    • 2.3 数据绑定基础
  • 三、第一个 WPF 项目:简单的待办事项列表
    • 3.1 项目需求分析
    • 3.2 项目搭建与界面设计
    • 3.3 业务逻辑实现
  • 四、中级项目:音乐播放器应用
    • 4.1 项目需求分析
    • 4.2 界面设计与布局
    • 4.3 多媒体功能实现
  • 五、高级项目:企业级办公自动化平台(回顾与进阶)
    • 5.1 项目回顾与优化
    • 5.2 引入 MVVM 模式
    • 5.3 性能优化与安全性增强
  • 六、项目中常见问题与解决方法
    • 6.1 内存泄漏问题
    • 6.2 界面卡顿问题
    • 6.3 数据绑定错误
  • 七、总结与展望
  • 结束语
  • 优质源码分享

WPF从初学者到专家:实战项目经验分享与总结 ,Windows Presentation Foundation(WPF)作为微软推出的新一代图形系统,为开发者提供了强大的用户界面开发工具。对于想要深入学习 WPF 的开发者来说,从理论知识到实际项目的跨越是必经之路。在这个过程中,积累的实战经验不仅能帮助我们更好地掌握 WPF 技术,还能提升解决实际问题的能力。本文将分享从 WPF 初学者逐步成长为专家的实战项目经验,涵盖基础知识、项目实践、问题解决以及技术进阶等方面。

一、前言

    在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。

    在当今数字化时代,桌面应用程序的用户界面(UI)设计至关重要,它直接影响着用户体验与产品的竞争力。而 WPF(Windows Presentation Foundation)作为微软推出的一款强大的 UI 框架,其布局系统更是构建精美界面的核心要素。WPF 布局系统为开发者提供了丰富多样的布局方式,能够轻松应对各种复杂的界面设计需求,无论是简洁明了的工具软件,还是功能繁杂的企业级应用,都能借助其打造出令人惊艳的视觉效果与流畅的交互体验。

    WPF从入门到精通专栏,旨在为读者呈现一条从对 WPF(Windows Presentation Foundation)技术懵懂无知到精通掌握的学习路径。首先从基础入手,介绍 WPF 的核心概念,涵盖其独特的架构特点、开发环境搭建流程,详细解读布局系统、常用控件以及事件机制等基础知识,帮助初学者搭建起对 WPF 整体的初步认知框架。随着学习的深入,进阶部分聚焦于数据绑定、样式模板、动画特效等关键知识点,进一步拓展 WPF 开发的能力边界,使开发者能够打造出更为个性化、交互性强的桌面应用界面。高级阶段则涉及自定义控件开发、MVVM 设计模式应用、多线程编程等深层次内容,助力开发者应对复杂的业务需求,构建大型且可维护的应用架构。同时,通过实战项目案例解析,展示如何将所学知识综合运用到实际开发中,从需求分析到功能实现再到优化测试,全方位积累实践经验。此外,还探讨了性能优化、与其他技术集成以及安全机制等拓展性话题,让读者对 WPF 技术在不同维度有更深入理解,最终实现对 WPF 技术的精通掌握,具备独立开发高质量桌面应用的能力。

🛕 点击进入WPF从入门到精通专栏

在这里插入图片描述

二、WPF 基础概念与入门

2.1 什么是 WPF

    WPF 是基于.NET Framework 的图形系统,它融合了矢量图形、丰富的文本支持、动画和多媒体等特性,旨在为 Windows 应用程序提供一致的、灵活的用户界面开发体验。与传统的 Windows Forms 不同,WPF 采用 XAML(可扩展应用程序标记语言)来定义界面,将界面设计与代码逻辑分离,这使得设计师和开发者可以更高效地协作。

2.2 XAML 基础

    XAML 是一种基于 XML 的标记语言,用于描述 WPF 应用程序的用户界面。它允许通过声明性语法创建 UI 元素,例如按钮、文本框、窗口等。下面是一个简单的 XAML 示例,展示如何创建一个包含按钮的窗口:

<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="My First WPF Window" Height="350" Width="525"><Grid><Button Content="Click Me!" HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid>
</Window>

    在这个示例中,<Window>元素定义了一个窗口,<Grid>是一个布局容器,<Button>则是一个按钮控件。通过设置属性,如Content、HorizontalAlignment和VerticalAlignment,可以定义按钮的显示内容和位置。

2.3 数据绑定基础

    数据绑定是 WPF 的核心特性之一,它允许将 UI 元素与数据源进行绑定,实现数据的双向同步。例如,将一个文本框的Text属性绑定到一个数据对象的属性上,当数据对象的属性值发生变化时,文本框的内容也会自动更新,反之亦然。

<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Data Binding Example" Height="350" Width="525"><Grid><StackPanel><TextBox Text="{Binding Name}" Margin="5"/><TextBlock Text="{Binding Name}" Margin="5"/></StackPanel></Grid>
</Window>public class Person
{private string _name;public string Name{get { return _name; }set{_name = value;// 这里可以添加属性变更通知的代码,如使用INotifyPropertyChanged接口}}
}

    在上述代码中,TextBoxTextBlockText属性都绑定到了Person类的Name属性上。虽然这里没有完整实现属性变更通知,但展示了数据绑定的基本用法。

三、第一个 WPF 项目:简单的待办事项列表

3.1 项目需求分析

    创建一个简单的待办事项列表应用程序,用户可以添加、删除和标记待办事项。每个待办事项包含一个任务描述和一个完成状态。

3.2 项目搭建与界面设计

    首先,在 Visual Studio 中创建一个新的 WPF 项目。然后,在 XAML 中设计界面:

<Window x:Class="TodoListApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Todo List" Height="350" Width="525"><Grid><StackPanel Margin="10"><TextBox x:Name="txtTask" Margin="5"/><Button Content="Add Task" Click="AddTask_Click" Margin="5"/><ListView x:Name="lstTasks" Margin="5"><ListView.View><GridView><GridViewColumn Header="Task" DisplayMemberBinding="{Binding Task}"/><GridViewColumn Header="Completed" DisplayMemberBinding="{Binding Completed}"/></GridView></ListView.View></ListView><Button Content="Delete Selected Task" Click="DeleteTask_Click" Margin="5"/></StackPanel></Grid>
</Window>

    这个界面包含一个文本框用于输入新任务,一个按钮用于添加任务,一个列表视图用于显示任务列表,以及一个按钮用于删除选中的任务。

3.3 业务逻辑实现

    在 C# 代码中实现添加和删除任务的功能:

using System.Collections.ObjectModel;
using System.Windows;namespace TodoListApp
{public partial class MainWindow : Window{private ObservableCollection<TodoItem> _todoItems;public MainWindow(){InitializeComponent();_todoItems = new ObservableCollection<TodoItem>();lstTasks.ItemsSource = _todoItems;}private void AddTask_Click(object sender, RoutedEventArgs e){string task = txtTask.Text.Trim();if (!string.IsNullOrEmpty(task)){_todoItems.Add(new TodoItem { Task = task, Completed = false });txtTask.Text = "";}}private void DeleteTask_Click(object sender, RoutedEventArgs e){TodoItem selectedItem = lstTasks.SelectedItem as TodoItem;if (selectedItem!= null){_todoItems.Remove(selectedItem);}}}public class TodoItem{public string Task { get; set; }public bool Completed { get; set; }}
}

    在这个实现中,使用ObservableCollection<TodoItem>来存储待办事项列表,这样当集合中的元素发生变化时,列表视图会自动更新。

四、中级项目:音乐播放器应用

4.1 项目需求分析

    开发一个功能较为完善的音乐播放器,支持播放、暂停、停止、上一曲、下一曲功能,显示歌曲列表和当前播放歌曲信息,并且具备简单的音量控制。

4.2 界面设计与布局

    使用 XAML 设计一个美观的界面,包含歌曲列表区域、播放控制按钮区域、歌曲信息显示区域和音量控制滑块:

<Window x:Class="MusicPlayerApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Music Player" Height="450" Width="600"><Grid><StackPanel Margin="10"><ListView x:Name="lstSongs" Margin="5"><ListView.View><GridView><GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}"/><GridViewColumn Header="Artist" DisplayMemberBinding="{Binding Artist}"/></GridView></ListView.View></ListView><StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5"><Button Content="Play" Click="Play_Click" Margin="5"/><Button Content="Pause" Click="Pause_Click" Margin="5"/><Button Content="Stop" Click="Stop_Click" Margin="5"/><Button Content="Previous" Click="Previous_Click" Margin="5"/><Button Content="Next" Click="Next_Click" Margin="5"/></StackPanel><TextBlock x:Name="txtSongInfo" Margin="5"/><Slider x:Name="sliderVolume" Minimum="0" Maximum="1" Value="0.5" Margin="5"/></StackPanel></Grid>
</Window>

4.3 多媒体功能实现

    使用MediaElement控件来实现音乐播放功能,结合ObservableCollection来管理歌曲列表:

using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Media;namespace MusicPlayerApp
{public partial class MainWindow : Window{private ObservableCollection<Song> _songs;private int _currentSongIndex;private MediaElement mediaElement;public MainWindow(){InitializeComponent();_songs = new ObservableCollection<Song>();_songs.Add(new Song { Title = "Song 1", Artist = "Artist 1", FilePath = "song1.mp3" });_songs.Add(new Song { Title = "Song 2", Artist = "Artist 2", FilePath = "song2.mp3" });lstSongs.ItemsSource = _songs;_currentSongIndex = 0;mediaElement = new MediaElement();mediaElement.LoadedBehavior = MediaState.Manual;mediaElement.MediaEnded += MediaElement_MediaEnded;PlayCurrentSong();}private void PlayCurrentSong(){Song currentSong = _songs[_currentSongIndex];mediaElement.Source = new Uri(currentSong.FilePath, UriKind.Relative);mediaElement.Play();txtSongInfo.Text = $"Now Playing: {currentSong.Title} - {currentSong.Artist}";}private void Play_Click(object sender, RoutedEventArgs e){mediaElement.Play();}private void Pause_Click(object sender, RoutedEventArgs e){mediaElement.Pause();}private void Stop_Click(object sender, RoutedEventArgs e){mediaElement.Stop();}private void Previous_Click(object sender, RoutedEventArgs e){if (_currentSongIndex > 0){_currentSongIndex--;PlayCurrentSong();}}private void Next_Click(object sender, RoutedEventArgs e){if (_currentSongIndex < _songs.Count - 1){_currentSongIndex++;PlayCurrentSong();}}private void MediaElement_MediaEnded(object sender, RoutedEventArgs e){if (_currentSongIndex < _songs.Count - 1){_currentSongIndex++;PlayCurrentSong();}}}public class Song{public string Title { get; set; }public string Artist { get; set; }public string FilePath { get; set; }}
}

    在这个实现中,MediaElement负责音乐的播放、暂停和停止等操作,通过Uri来指定要播放的歌曲文件路径。

五、高级项目:企业级办公自动化平台(回顾与进阶)

5.1 项目回顾与优化

    在之前构建的办公自动化平台基础上,进一步优化用户体验和功能。例如,在用户管理模块中,使用DataGrid的内置编辑功能,允许用户直接在表格中编辑员工信息,而无需额外的编辑界面。

<DataGrid x:Name="userDataGrid" ItemsSource="{Binding Users}" IsReadOnly="False"><DataGrid.Columns><DataGridTextColumn Header="ID" Binding="{Binding Id}" IsReadOnly="True"/><DataGridTextColumn Header="姓名" Binding="{Binding Name}"/><DataGridTextColumn Header="部门" Binding="{Binding Department}"/><DataGridTextColumn Header="职位" Binding="{Binding Position}"/></DataGrid.Columns>
</DataGrid>

    在代码中,处理DataGridCellEditEnding事件,保存用户的编辑:

private void userDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{User user = e.Row.DataContext as User;if (user!= null){userService.UpdateUser(user);}
}

5.2 引入 MVVM 模式

    为了更好地分离界面逻辑和业务逻辑,引入 MVVM(Model - View - ViewModel)模式。以任务管理模块为例,创建TaskViewModel类:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;namespace OfficeAutomationApp.ViewModels
{public class TaskViewModel : INotifyPropertyChanged{private ObservableCollection<Task> _tasks;public ObservableCollection<Task> Tasks{get { return _tasks; }set{_tasks = value;OnPropertyChanged();}}public TaskViewModel(){_tasks = new ObservableCollection<Task>();// 初始化任务数据}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}
}

    在 XAML 中,通过DataContext将视图与视图模型绑定:

<ListView x:Name="taskListView" ItemsSource="{Binding Tasks}"><!-- 列定义省略 -->
</ListView>public partial class TaskManagementWindow : Window
{public TaskManagementWindow(){InitializeComponent();DataContext = new TaskViewModel();}
}

5.3 性能优化与安全性增强

    在性能优化方面,对于大数据量的文件管理模块,采用分页加载技术,减少一次性加载的数据量。在数据库查询时,使用存储过程来提高查询效率。
在安全性方面,对用户登录密码采用更复杂的加密算法,如 BCrypt。同时,在数据传输过程中,使用 SSL/TLS 协议来确保数据的安全传输。

六、项目中常见问题与解决方法

6.1 内存泄漏问题

    在 WPF 应用中,不当的事件绑定和资源使用可能导致内存泄漏。例如,在事件处理程序中没有正确解除事件绑定,当对象被销毁时,事件处理程序仍然持有对象的引用,导致对象无法被垃圾回收。解决方法是在对象销毁时,手动解除事件绑定。

public class MyClass : IDisposable
{private SomeObject _someObject;public MyClass(){_someObject = new SomeObject();_someObject.SomeEvent += SomeObject_SomeEvent;}private void SomeObject_SomeEvent(object sender, EventArgs e){// 处理事件}public void Dispose(){_someObject.SomeEvent -= SomeObject_SomeEvent;_someObject = null;}
}

6.2 界面卡顿问题

    当界面上有大量动画或复杂的图形渲染时,可能会出现卡顿现象。可以通过优化图形渲染,如使用硬件加速、减少不必要的重绘等方式来解决。例如,将一些静态图形元素设置为CacheMode = new BitmapCache(),这样可以将元素缓存为位图,减少实时渲染的开销。

<Rectangle Fill="Red" Width="100" Height="100" CacheMode="BitmapCache"/>

6.3 数据绑定错误

    数据绑定过程中可能出现绑定路径错误、数据源属性变更通知未实现等问题。解决方法是仔细检查绑定路径,确保数据源实现了INotifyPropertyChanged接口,以便在属性值发生变化时通知绑定目标更新。

七、总结与展望

    从 WPF 初学者到专家的成长过程中,通过不断地实践项目,我们逐渐掌握了 WPF 的核心概念和技术,如 XAML、数据绑定、布局管理、多媒体处理等。在项目实践中,我们不仅学会了如何开发功能完善的应用程序,还学会了如何解决各种实际问题,如性能优化、安全性增强等。

    展望未来,随着 WPF 技术的不断发展,以及与其他新技术的融合,如.NET Core 的跨平台支持、人工智能技术的应用等,WPF 开发者将有更多的机会和挑战。我们可以进一步探索如何将 WPF 应用与云计算、物联网等领域相结合,开发出更具创新性和实用性的应用程序。同时,持续学习和关注行业动态,不断提升自己的技术水平,将是保持竞争力的关键。

结束语

        展望未来,WPF 布局系统依然有着广阔的发展前景。随着硬件技术的不断革新,如高分辨率屏幕、折叠屏设备的日益普及,WPF 布局系统有望进一步强化其自适应能力,为用户带来更加流畅、一致的体验。在应对高分辨率屏幕时,能够更加智能地缩放和布局元素,确保文字清晰可读、图像不失真;对于折叠屏设备,可动态调整布局结构,充分利用多屏空间,实现无缝切换。

        性能优化方面,微软及广大开发者社区将持续努力,进一步降低复杂布局的计算开销,提高布局更新的效率,使得 WPF 应用在处理大规模数据、动态界面时依然能够保持高效响应。通过改进算法、优化内存管理等手段,让 WPF 布局系统在性能上更上一层楼。

        亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

         愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

        至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


--------------- 业精于勤,荒于嬉 ---------------

请添加图片描述

--------------- 行成于思,毁于随 ---------------

优质源码分享

  • 【百篇源码模板】html5各行各业官网模板源码下载

  • 【模板源码】html实现酷炫美观的可视化大屏(十种风格示例,附源码)

  • 【VUE系列】VUE3实现个人网站模板源码

  • 【HTML源码】HTML5小游戏源码

  • 【C#实战案例】C# Winform贪吃蛇小游戏源码


在这里插入图片描述


     💞 关注博主 带你实现畅游前后端

     🏰 大屏可视化 带你体验酷炫大屏

     💯 神秘个人简介 带你体验不一样得介绍

     🎀 酷炫邀请函 带你体验高大上得邀请


     ① 🉑提供云服务部署(有自己的阿里云);
     ② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
     如🈶合作请联系我,期待您的联系。
    :本文撰写于CSDN平台,作者:xcLeigh所有权归作者所有) ,https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


     亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/145570575(防止抄袭,原文地址不可删除)

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

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

相关文章

一学就会的深度学习基础指令及操作步骤(3)模型训练验证

文章目录 模型训练验证损失函数和优化器模型优化训练函数验证函数模型保存 模型训练验证 损失函数和优化器 loss_function nn.CrossEntropyLoss() # 损失函数 optimizer Adam(model.parameters()) # 优化器&#xff0c;优化参数模型优化 获得模型所有的可训练参数&#x…

Spring Boot 注解大全:全面解析与实战应用

目录 一、Spring Boot 启动与配置相关注解 1.1 SpringBootApplication 1.2 EnableAutoConfiguration 1.3 Configuration 1.4 ComponentScan 二、依赖注入与组件管理注解 2.1 Component 2.2 Service 2.3 Repository 2.4 Controller 2.5 RestController 2.6 Autowired…

【语料数据爬虫】Python爬虫|批量采集征集意见稿数据(1)

前言 本文是该专栏的第5篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“征集意见稿”数据。同时,本文也是采集“征集意见稿”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑…

企业招聘能力提升之道:突破困境,精准纳才

企业招聘能力提升之道&#xff1a;突破困境&#xff0c;精准纳才 在企业运营的广袤版图中&#xff0c;招聘工作无疑是一块至关重要的拼图。然而&#xff0c;不少企业在这片领域中举步维艰&#xff0c;尽管投入了海量的时间与精力&#xff0c;收获的成果却不尽人意。面试环节仿…

AI对前端开发的冲击

Cursor cursor新版本0.46版本号中有部分是改成了新布局其实 Agent 和 Edit 和 Composer 是一样的&#xff0c;为了方便大家使用&#xff0c;我们把它们合并了&#xff0c;Edit 相当于普通模式下的 Composer&#xff0c;Agent 就是代理模式。 快捷键ctrli、ctrll、ctrlk 4o适合…

java中如何把json转化的字符串再转化成json格式

使用org.json库 首先&#xff0c;确保你的项目中已经包含了org.json库。如果你使用Maven&#xff0c;可以在pom.xml中添加以下依赖&#xff1a; <dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20210307…

泛型、泛型上限、泛型下限、泛型通配符

DAY8.1 Java核心基础 泛型 Generics 是指在类定义时不指定类中信息的具体数据类型&#xff0c;而是用一个标识符来代替&#xff0c;当外部实例化对象时再指定具体的数据类型。 在定义类或者接口时不明确指定类中信息的具体数据类型&#xff0c;在实例化时再来指定具体的数据类…

Win10 下搭建免费的 FTP 服务器 FileZilla

一、概述 FileZilla 服务器是一个免费的开源FTP和FTPS服务器&#xff0c;是根据GNU通用公共许可证条款免费发布的开源软件。FileZilla支持FTP、FTPS、SFTP等文件传输协议&#xff0c;相比其他FTP服务器&#xff0c;最大的优势是FileZilla自由(免费)。 FileZilla的官网地址是&a…

C/C++中对字符处理的常用函数

C语言中的 ctype.h 头文件提供了一系列字符分类和转换函数&#xff0c;用于高效处理字符相关操作。这些函数通过接受 int 类型参数&#xff08;需为 unsigned char 或 EOF &#xff08;-1&#xff09;值&#xff09;&#xff0c;返回非零值表示条件正确&#xff0c;返回0表示错…

双指针算法介绍+算法练习(2025)

一、介绍双指针算法 双指针&#xff08;或称为双索引&#xff09;算法是一种高效的算法技巧&#xff0c;常用于处理数组或链表等线性数据结构。它通过使用两个指针来遍历数据&#xff0c;从而减少时间复杂度&#xff0c;避免使用嵌套循环。双指针算法在解决诸如查找、排序、去重…

【每日八股】计算机网络篇(四):HTTP

目录 HTTP 与 HTTPS 的区别&#xff1f;HTTPS 加密与认证的过程&#xff1f;ClientHelloServerHello客户端回应服务端回应 HTTPS 一定安全可靠吗&#xff1f;HTTPS 状态码的含义&#xff1f;HTTP 缓存有哪些实现方式&#xff1f;HTTP 1.0、HTTP 1.1、HTTP 2.0 和 HTTP 3.0 的区…

TMS320F28P550SJ9学习笔记10:软件模拟I2C通信_驱动1.3寸OLED

现在有了具体的I2C通信器件&#xff0c;一块1.3寸OLED屏幕&#xff0c;今日尝试移植配置一下: 本文主要讲的是&#xff0c;使用软件模拟I2C通信 文章提供测试代码讲解、完整工程下载、测试效果图 目录 前置文章&#xff1a; I2C通信引脚&#xff1a; 软件I2C 引脚的初始化&am…

spring boot 发送邮件验证码

一、前置需求 1、准备邮箱 2、登录授权码 qq邮箱在–>设置–>账号POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启服务 二、发送邮件 1、简单邮件 包含邮件标题、邮件正文 2、引入mail启动器 <dependency><groupId>org.springframework.boot</groupI…

塔能科技:智能机箱,为城市安防 “智” 造坚实堡垒

在当今智慧城市建设的浪潮中&#xff0c;城市安防面临着诸多挑战。设备管理难&#xff0c;众多分散的安防设备犹如一盘散沙&#xff0c;难以实现高效统一的管控&#xff1b;数据传输不稳定&#xff0c;关键时刻信息的延迟或丢失&#xff0c;可能导致严重后果。这些问题严重制约…

电商数据分析 电商平台销售数据分析 电商平台数据库设计 揭秘电商怎么做数据分析

《电商参谋数据分析平台方案》&#xff08;28页PPT&#xff09;是一套为电商行业量身定制的一体化解决方案&#xff0c;它通过全链路打通从数据获取到分析的全过程&#xff0c;帮助电商企业实现精细化运营和市场机会的挖掘。该方案针对电商行业在数据获取、加工整合及业务赋能方…

uniapp uview 1.0 跨域h5配置多个代理、如何请求接口

参考文章&#xff1a;uniapp uView1.0跨域h5配置多个代理 官方手册&#xff1a;http 请求 项目中使用&#xff1a; 参考其他博主的文章是在manifest.json中配置代理&#xff0c;但在官方的手册中是直接在script请求的&#xff0c;我尝试请求了下没问题&#xff0c;上线后也不…

MAVEN解决版本依赖冲突

文章目录 一、依赖冲突概念1、什么是依赖冲突2、依赖冲突的原因3、如何解决依赖冲突 二、查看依赖冲突-maven-helper1、安装2、helper使用1、conflicts的阅读顺序&#xff08;从下向上看&#xff09;2、dependencies as List的阅读顺序&#xff08;从下向上看&#xff09;3、de…

79.ScottPlot的MVVM实现 C#例子 WPF例子

如何通过数据绑定在 WPF 中实现动态图像显示 在 WPF 应用程序中&#xff0c;通过数据绑定实现动态图像显示是一种高效且优雅的方式。以下是一个简单的教程&#xff0c;展示如何使用 ScottPlot.WPF 库和 MVVM 模式来实现这一功能。 第一步&#xff1a;安装必要的 NuGet 包 首…

简单工厂 、工厂方法模式和抽象工厂模式

简单工厂 、工厂方法模式和抽象工厂模式 1.模式性质与定位 简单工厂:并非正式的设计模式(属编程习惯),通过单一工厂类根据参数判断创建不同产品,本质是将对象创建逻辑集中管理。 工厂方法:是标准的创建型设计模式,定义抽象创建接口,由子类决定实例化哪个具体产品类,…

热图回归(Heatmap Regression)

热图回归(Heatmap Regression)是一种常用于关键点估计任务的方法,特别是在人体姿态估计中。它的基本思想是通过生成热图来表示某个关键点在图像中出现的概率或强度。以下是热图回归的主要特点和工作原理: 主要特点 热图表示: 每个关键点对应一个热图,热图中的每个像素值…