WPF基础知识(续)
六、WPF 中的样式和模板
- 样式定义:
- 可以在 XAML 中定义样式来统一 UI 元素的外观和风格。样式可以定义在资源字典中,也可以直接在窗口或控件的
Resources
属性中定义。例如,定义一个按钮的样式:
- 可以在 XAML 中定义样式来统一 UI 元素的外观和风格。样式可以定义在资源字典中,也可以直接在窗口或控件的
<Window.Resources><Style TargetType="Button"><Setter Property="Background" Value="Blue" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style>
</Window.Resources>
<Grid><Button Content="按钮1" /><Button Content="按钮2" />
</Grid>
- 也可以为样式指定一个
Key
,然后通过StaticResource
来应用样式。例如:
<Window.Resources><Style x:Key="MyButtonStyle" TargetType="Button"><Setter Property="Background" Value="Green" /><Setter Property="Foreground" Value="Yellow" /><Setter Property="FontSize" Value="18" /></Style>
</Window.Resources>
<Grid><Button Content="按钮1" Style="{StaticResource MyButtonStyle}" /><Button Content="按钮2" />
</Grid>
- 模板创建:
- 可以创建控件模板来完全自定义控件的外观。例如,创建一个自定义的按钮模板:
<Window.Resources><ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"><Grid><Rectangle Fill="{TemplateBinding Background}" /><TextBlock Text="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" /></Grid></ControlTemplate><Style x:Key="MyButtonStyle" TargetType="Button"><Setter Property="Template" Value="{StaticResource MyButtonTemplate}" /></Style>
</Window.Resources>
<Grid><Button Content="按钮1" Style="{StaticResource MyButtonStyle}" Background="Red" />
</Grid>
七、WPF 中的动画
- 简单动画:
- 可以使用
Storyboard
来定义动画。例如,实现一个按钮的宽度从 100 逐渐增加到 200 的动画:
- 可以使用
<Window.Resources><Storyboard x:Key="ButtonWidthAnimation"><DoubleAnimation Storyboard.TargetProperty="Width" From="100" To="200" Duration="0:0:5" /></Storyboard>
</Window.Resources>
<Grid><Button Content="按钮1" Width="100" Click="Button_Click"><Button.Triggers><EventTrigger RoutedEvent="Button.Click"><BeginStoryboard Storyboard="{StaticResource ButtonWidthAnimation}" /></EventTrigger></Button.Triggers></Button>
</Grid>
- 复杂动画:
- 可以组合多个动画来实现更复杂的效果。例如,同时实现按钮的宽度增加和颜色变化的动画:
<Window.Resources><Storyboard x:Key="ButtonAnimation"><DoubleAnimation Storyboard.TargetProperty="Width" From="100" To="200" Duration="0:0:5" /><ColorAnimation Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" From="Red" To="Blue" Duration="0:0:5" /></Storyboard>
</Window.Resources>
<Grid><Button Content="按钮1" Width="100" Background="Red" Click="Button_Click"><Button.Triggers><EventTrigger RoutedEvent="Button.Click"><BeginStoryboard Storyboard="{StaticResource ButtonAnimation}" /></EventTrigger></Button.Triggers></Button>
</Grid>
八、WPF 应用程序的部署
- 打包应用程序:
- 可以使用 Visual Studio 的发布功能来打包 WPF 应用程序。在项目属性中选择 “发布” 选项卡,然后按照向导进行操作,可以选择发布到本地文件夹、网络共享或创建安装包等。
- 可以设置发布的目标平台、版本号、更新策略等选项。例如,如果希望应用程序能够自动更新,可以设置相关的更新选项,指定更新服务器的地址等。
- 安装包创建:
- 可以使用专门的安装包制作工具,如 Inno Setup、WiX 等,来创建更复杂的安装包。这些工具可以让你更精细地控制安装过程,包括添加自定义安装界面、设置安装目录、注册系统服务等。
- 例如,使用 Inno Setup 创建安装包时,需要编写一个脚本文件,定义安装包的各种属性和安装步骤。在脚本中可以指定应用程序的文件、图标、安装目录、开始菜单快捷方式等信息。
九、WPF 中的命令模式
1. 命令基础概念
在 WPF 里,命令模式是一种实现交互逻辑与 UI 分离的有效方式。它将操作封装成对象,这样就能在不同的 UI 元素之间复用,也方便进行测试和维护。WPF 自带了ICommand
接口,这是命令的核心抽象,任何实现了该接口的类都能当作命令来用。
2. 自定义命令实现
下面是一个自定义命令的示例:
using System;
using System.Windows.Input;public class RelayCommand : ICommand
{private readonly Action<object> _execute;private readonly Predicate<object> _canExecute;public RelayCommand(Action<object> execute) : this(execute, null){}public RelayCommand(Action<object> execute, Predicate<object> canExecute){_execute = execute;_canExecute = canExecute;}public event EventHandler CanExecuteChanged{add { CommandManager.RequerySuggested += value; }remove { CommandManager.RequerySuggested -= value; }}public bool CanExecute(object parameter){return _canExecute == null || _canExecute(parameter);}public void Execute(object parameter){_execute(parameter);}
}
在上述代码中,RelayCommand
类实现了ICommand
接口。_execute
字段存储要执行的操作,_canExecute
字段用于判断命令是否可以执行。
3. 命令在 XAML 中的使用
以下是如何在 XAML 中使用自定义命令:
<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp1"Title="MainWindow" Height="350" Width="525"><Window.DataContext><local:MainViewModel/></Window.DataContext><Grid><Button Content="执行命令" Command="{Binding MyCommand}" /></Grid>
</Window>
在这个例子中,按钮的Command
属性绑定到了MainViewModel
中的MyCommand
命令。
4. 命令在 ViewModel 中的实现
using System.Windows.Input;public class MainViewModel
{public ICommand MyCommand { get; private set; }public MainViewModel(){MyCommand = new RelayCommand(ExecuteMyCommand);}private void ExecuteMyCommand(object parameter){// 这里是命令执行的具体逻辑}
}
在MainViewModel
类中,创建了一个RelayCommand
实例并赋值给MyCommand
属性,当按钮被点击时,ExecuteMyCommand
方法就会被调用。
十、WPF 中的多线程
1. 线程安全问题
在 WPF 中,UI 元素只能由创建它们的线程来访问和修改,这就是所谓的单线程单元(STA)模型。如果在其他线程中尝试访问 UI 元素,就会抛出InvalidOperationException
异常。因此,在进行多线程操作时,需要特别注意线程安全问题。
2. 使用Dispatcher
更新 UI
Dispatcher
是 WPF 中用于处理线程间通信的机制。可以使用Dispatcher.Invoke
或Dispatcher.BeginInvoke
方法来在 UI 线程中执行代码。以下是一个简单的示例:
using System;
using System.Threading;
using System.Windows;namespace WpfApp1
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();Thread workerThread = new Thread(DoWork);workerThread.Start();}private void DoWork(){// 模拟耗时操作Thread.Sleep(2000);// 使用Dispatcher更新UIthis.Dispatcher.Invoke(() =>{MessageBox.Show("工作完成");});}}
}
在这个例子中,创建了一个新线程来执行DoWork
方法,在DoWork
方法中使用Dispatcher.Invoke
方法在 UI 线程中显示消息框。
3. 使用Task
和async/await
在.NET 中,Task
和async/await
是处理异步操作的推荐方式。以下是一个使用async/await
的示例:
using System;
using System.Threading.Tasks;
using System.Windows;namespace WpfApp1
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DoAsyncWork();}private async void DoAsyncWork(){await Task.Run(() =>{// 模拟耗时操作Thread.Sleep(2000);});MessageBox.Show("异步工作完成");}}
}
在这个例子中,DoAsyncWork
方法被标记为async
,使用await
关键字等待Task.Run
方法返回的任务完成,之后的代码会在 UI 线程中继续执行,这样就避免了直接使用Dispatcher
的复杂性。
十一、WPF 中的资源管理
1. 资源基础概念
在 WPF 中,资源是可以被多个元素共享的对象,例如画笔、画刷、样式、模板等。资源可以定义在多个位置,如窗口、控件、应用程序级别等。
2. 资源的定义和使用
以下是在窗口资源中定义一个画刷资源并使用它的示例:
<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Window.Resources><SolidColorBrush x:Key="MyBrush" Color="Red"/></Window.Resources><Grid><Button Content="按钮" Background="{StaticResource MyBrush}" /></Grid>
</Window>
在这个例子中,在Window.Resources
中定义了一个名为MyBrush
的画刷资源,然后在按钮的Background
属性中使用StaticResource
引用该资源。
3. 资源的查找顺序
WPF 在查找资源时,会按照一定的顺序进行。首先会在当前元素的资源字典中查找,如果找不到,会向上查找父元素的资源字典,直到找到资源或者到达应用程序级别的资源字典。如果仍然找不到,就会抛出ResourceReferenceKeyNotFoundException
异常。
4. 动态资源和静态资源
- 静态资源:使用
StaticResource
标记扩展,在编译时解析资源引用。一旦解析完成,就不会再改变。 - 动态资源:使用
DynamicResource
标记扩展,在运行时解析资源引用。如果资源发生变化,使用该资源的元素会自动更新。以下是使用动态资源的示例:
<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Window.Resources><SolidColorBrush x:Key="MyBrush" Color="Red"/></Window.Resources><Grid><Button Content="按钮" Background="{DynamicResource MyBrush}" /></Grid>
</Window>
十二、WPF 中的打印功能
1. 基本打印流程
在 WPF 中实现打印功能,通常需要以下几个步骤:
- 创建
PrintDialog
对象,用于显示打印对话框。 - 获取要打印的内容,例如
Visual
对象。 - 调用
PrintDialog
的PrintVisual
方法进行打印。
2. 简单打印示例
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;namespace WpfApp1
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();PrintButton.Click += PrintButton_Click;}private void PrintButton_Click(object sender, RoutedEventArgs e){PrintDialog printDialog = new PrintDialog();if (printDialog.ShowDialog() == true){// 创建一个简单的可视化内容StackPanel printContent = new StackPanel();TextBlock textBlock = new TextBlock();textBlock.Text = "这是要打印的内容";printContent.Children.Add(textBlock);// 打印可视化内容printDialog.PrintVisual(printContent, "打印内容");}}}
}
在这个示例中,点击按钮会弹出打印对话框,用户选择打印设置后,会打印一个包含文本的StackPanel
。
3. 打印复杂内容
如果要打印复杂的内容,例如文档、报表等,可以使用DocumentPaginator
和FixedDocument
等类。以下是一个打印FixedDocument
的示例:
private void PrintFixedDocument()
{PrintDialog printDialog = new PrintDialog();if (printDialog.ShowDialog() == true){FixedDocument fixedDocument = new FixedDocument();// 创建一个页面FixedPage fixedPage = new FixedPage();TextBlock textBlock = new TextBlock();textBlock.Text = "这是固定文档的内容";fixedPage.Children.Add(textBlock);PageContent pageContent = new PageContent();((IAddChild)pageContent).AddChild(fixedPage);fixedDocument.Pages.Add(pageContent);// 打印固定文档printDialog.PrintDocument(fixedDocument.DocumentPaginator, "打印固定文档");}
}
十三、WPF 中的触控和手势支持
1. 触控事件
WPF 支持多种触控事件,如TouchDown
、TouchMove
、TouchUp
等。可以通过处理这些事件来实现与触控设备的交互。以下是一个简单的示例:
<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid TouchDown="Grid_TouchDown"><TextBlock Text="触摸我" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center" /></Grid>
</Window>
private void Grid_TouchDown(object sender, TouchEventArgs e)
{MessageBox.Show("触摸事件触发");
}
在这个示例中,当用户触摸网格时,会弹出消息框。
2. 手势识别
WPF 还支持手势识别,例如捏合、旋转等手势。可以使用ManipulationStarting
、ManipulationDelta
、ManipulationCompleted
等事件来处理手势。以下是一个简单的捏合手势示例:
<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid ManipulationStarting="Grid_ManipulationStarting" ManipulationDelta="Grid_ManipulationDelta"><Rectangle Width="100" Height="100" Fill="Red" RenderTransformOrigin="0.5,0.5"><Rectangle.RenderTransform><ScaleTransform /></Rectangle.RenderTransform></Rectangle></Grid>
</Window>
private void Grid_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{e.ManipulationContainer = this;e.Handled = true;
}private void Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{Rectangle rectangle = sender as Rectangle;ScaleTransform scaleTransform = rectangle.RenderTransform as ScaleTransform;scaleTransform.ScaleX *= e.DeltaManipulation.Scale.X;scaleTransform.ScaleY *= e.DeltaManipulation.Scale.Y;e.Handled = true;
}
在这个示例中,用户可以通过捏合手势来缩放矩形。
十四、WPF 中的性能优化
1. 控件虚拟化
当需要显示大量数据时,使用控件虚拟化可以显著提高性能。例如,ListBox
、ListView
等控件都支持虚拟化。可以通过设置VirtualizingStackPanel.IsVirtualizing
属性为True
来启用虚拟化。
<ListBox VirtualizingStackPanel.IsVirtualizing="True"><!-- 大量数据项 -->
</ListBox>
启用虚拟化后,只有当前可见的项会被创建和渲染,而不是一次性创建所有项。
2. 减少布局计算
布局计算是一个比较耗时的操作,因此可以尽量减少布局的嵌套层次。例如,避免使用过多的嵌套Grid
或StackPanel
。另外,使用Measure
和Arrange
方法的优化版本,如MeasureOverride
和ArrangeOverride
,可以自定义布局行为,减少不必要的计算。
3. 资源管理优化
合理管理资源,避免创建过多的资源对象。例如,对于一些常用的画刷、画笔等资源,可以定义为静态资源并在多个地方共享使用。另外,及时释放不再使用的资源,避免内存泄漏。
4. 图像优化
如果应用程序中使用了大量的图像,要注意图像的格式和大小。使用合适的图像格式,如 PNG、JPEG 等,并且对图像进行压缩处理,减少图像的文件大小。另外,使用BitmapCache
可以缓存图像,提高渲染性能。
<Image Source="image.jpg"><Image.CacheMode><BitmapCache /></Image.CacheMode>
</Image>
十五、WPF 与数据库交互
1. 连接数据库
在 WPF 中可以使用多种方式连接数据库,例如使用Entity Framework
、ADO.NET
等。以下是一个使用ADO.NET
连接 SQL Server 数据库的示例:
using System;
using System.Data.SqlClient;namespace WpfApp1
{class DatabaseHelper{public static void ConnectToDatabase(){string connectionString = "Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD";using (SqlConnection connection = new SqlConnection(connectionString)){try{connection.Open();Console.WriteLine("数据库连接成功");}catch (Exception ex){Console.WriteLine("数据库连接失败: " + ex.Message);}}}}
}
2. 数据查询和显示
连接数据库后,可以进行数据查询并将结果显示在 WPF 界面上。以下是一个简单的查询示例:
private void DisplayData()
{string connectionString = "Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD";using (SqlConnection connection = new SqlConnection(connectionString)){string query = "SELECT * FROM YourTable";SqlCommand command = new SqlCommand(query, connection);try{connection.Open();SqlDataReader reader = command.ExecuteReader();while (reader.Read()){// 处理查询结果string column1Value = reader["Column1"].ToString();// 显示数据}reader.Close();}catch (Exception ex){MessageBox.Show("数据查询失败: " + ex.Message);}}
}
3. 使用Entity Framework
Entity Framework
是一个强大的对象关系映射(ORM)框架,可以简化数据库操作。以下是一个使用Entity Framework
的示例:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;namespace WpfApp1
{public class MyDbContext : DbContext{public DbSet<YourEntity> YourEntities { get; set; }}public class YourEntity{public int Id { get; set; }public string Name { get; set; }}class Program{static void Main(){using (MyDbContext context = new MyDbContext()){var entities = context.YourEntities.ToList();foreach (var entity in entities){// 处理实体数据}}}}
}
使用Entity Framework
可以将数据库表映射为实体类,通过操作实体类来进行数据库操作,避免了直接编写 SQL 语句的复杂性。
相关文章:
WPF基础知识(续)
六、WPF 中的样式和模板 样式定义: 可以在 XAML 中定义样式来统一 UI 元素的外观和风格。样式可以定义在资源字典中,也可以直接在窗口或控件的Resources属性中定义。例如,定义一个按钮的样式: <Window.Resources><Sty…...
Go 语言 sync 包使用教程
Go 语言 sync 包使用教程 Go 语言的 sync 包提供了基本的同步原语,用于在并发编程中协调 goroutine 之间的操作。 1. 互斥锁 (Mutex) 互斥锁用于保护共享资源,确保同一时间只有一个 goroutine 可以访问。 特点: 最基本的同步原语&#x…...
MybatisPlus(SpringBoot版)学习第四讲:常用注解
目录 1.TableName 1.1 问题 1.2 通过TableName解决问题 1.3 通过全局配置解决问题 2.TableId 2.1 问题 2.2 通过TableId解决问题 2.3 TableId的value属性 2.4 TableId的type属性 2.5 雪花算法 1.背景 2.数据库分表 ①垂直分表 ②水平分表 1>主键自增 2>取…...
集成开发环境革新:IntelliJ IDEA与Cursor AI的智能演进
集成开发环境革新:IntelliJ IDEA 与 Cursor AI 的智能演进 集成开发环境(IDE) 是软件开发者必不可少的工具。一个优秀的 IDE 不仅能够帮助编写和调试代码,还能集成版本控制和代码优化等多种功能。如今,随着人工智能&a…...
Qt弹出新窗口并关闭(一个按钮)
参考:Qt基础 练习:弹出新窗口并关闭的两种实现方式(两个按钮、一个按钮)_qt打开一个窗口另一个关闭-CSDN博客 实现: 一个按钮,点击一次,按钮的名字从open window变为close window,…...
暴力搜索算法详解与TypeScript实战
# 暴力搜索算法详解与TypeScript实战## 什么是暴力搜索?暴力搜索(Brute Force Search)是算法领域最基础的解题方法之一,其核心思想是**系统性地枚举所有可能的候选解**,并验证每个候选解是否满足问题条件。这种方法不依…...
[识记]Mysql8 远程授权
今天在测试docker时,因更换为Mysql8,使用SQL方式实现远程授权,其方式方法同于Mysql,但语句稍有不同,仅供参考。 登录mysql mysql -u root -p 输入密码: [请依据交互输入你的mysql密码]切换数据库 use mysql;选择需要…...
5.1 WPF路由事件以及文本样式
一、路由事件 WPF中存在一种路由事件(routed event),该事件将发送到包含该控件所在层次的所有控件,如果不希望继续向更高的方向传递,只要设置e.Handled true即可。 这种从本控件-->父控件->父的父控件的事件&am…...
做规控算法时用到的一些简单函数和功能(c++)(持续更新中)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、将偏航角转换为四元数二、RCLCPP_INFO_STREAM(rclcpp::get_logger("mission_planner"),"(打印标志位)"<<…...
android studio 运行flutter项目
在Android Studio中运行Flutter项目 简介 Flutter是一个流行的跨平台移动应用开发框架,而Android Studio是一种强大的集成开发环境,支持Flutter开发。本文将介绍如何在Android Studio中运行Flutter项目,让开发者能够更加方便地进行Flutter应…...
如何用 Postman 进行高效的 Mock 测试?
Postman 是一个强大的 API 开发和测试工具,它可以让你轻松地创建和发送各种 HTTP 请求,查看响应结果,并进行调试和优化。但是有时候,你可能还没有开发好后端服务,或者想要模拟不同的响应场景,这时候就可以使…...
1718_js事件
目录 事件基础 一 DOM0级事件 1.1添加事件 1.2删除事件 二 DOM2级事件 2.1 添加事件 2.2 移除事件 三 常见的鼠标事件 四 其他事件 五 事件对象 5.1 获取事件对象 5.2 兼容写法 六 七、键盘事件 7.2键盘码 7.3 组合键 八、事件对象的属性 九、 事件冒泡 十…...
OpenCV图像输入输出模块imgcodecs
《OpenCV计算机视觉开发实践:基于Python(人工智能技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 要处理图像,第一步就是把图像文件从磁盘上读取到内存,处理完毕后再保存到内存,所以…...
OAS光学分析软件 | 高光束反射器设计案例
简介 在光学设计领域,满足特定的光束要求并符合相关标准规范是设计的关键目标。本次设计旨在借助 OAS 光学分析软件,打造一个符合欧洲经委会(ECE)规定的高光束反射器。欧洲经委会对狭窄宽度(高)波束图案有…...
检查指定的IP地址和端口号是否可以连接
是的,Socket 类可以直接用来检查指定的IP地址和端口号是否可以连接。以下是一个简单的Java代码示例,展示如何使用 Socket 类来检查连接是否可用: import java.net.Socket; import java.net.UnknownHostException; public class NetworkCheck…...
【商城实战(93)】商城高并发实战:分布式锁与事务处理深度剖析
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
【C++】模拟实现一颗二叉搜索树
❤️欢迎来到我的博客❤️ 前言 搜索二叉树是在二叉树的基础上加了一个特征:左子树的所有节点都小于根,右子树的所有节点都大于根(每一颗子树都要满足) 因为这个特性的存在,使得他特别擅长搜索数据 比如我要寻找10&a…...
vue 点击放大,图片预览效果
背景: 在vue框架element组件的背景下,我们对图片点击放大(单张);如果是多张图片,要支持左右滑动查看多张图片(多张)。 图片单张放大,el-image图片组件,或者原生的img标签。previewSrcList string[单个] 图片…...
AI知识补全(七):AI Agent 智能代理是什么?
名人说:人生如逆旅,我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(六):RLHF 人类反馈…...
Java 中各种锁的使用详解
Java 锁的使用详解 Java 提供了多种锁机制来处理并发编程中的同步问题。下面我将通过代码示例来展示各种锁的使用方法和特点。 锁的选择指南 以下是选择合适锁的指南: 基本锁类型演示 // 由于这是在 Node.js 环境中模拟 Java 锁的概念,我们将使用注释…...
【GreenHills】GHS解决客户端在连接的时候提示在黑名单
1、 文档目标 解决GHS网络版客户在客户端连接的时候出现黑名单的问题 2、 问题场景 用于解决GHS的网络版客户在搭建完服务端后,客户端去连接服务的时候出现提示“在黑名单中”等情况(如图2-1和图2-2)。但是在服务器上面并没有设置黑名单。 …...
智能运维时代的网络拓扑管理:乐维监控的架构可视化实践
在数字化转型的浪潮中,企业IT基础设施正经历着前所未有的复杂化进程。当数以千计的网络设备、服务器、存储系统构成庞大网络体系时,如何实现全局可视化管理已成为企业数字化转型的关键命题。乐维监控网络拓扑系统作为新一代智能运维平台的核心组件&#…...
GitHub美化个人主页3D图表显示配置操作
这个功能主要是用的这个开源仓库:https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话,我的个人主页:https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可,…...
Arduino示例代码讲解:Serial Event example 连续事件例子
Arduino示例代码讲解:Serial Event example 连续事件例子 Serial Event example 连续事件例子功能概述硬件部分:软件部分:代码逐行解释定义变量`setup()` 函数`loop()` 函数`serialEvent()` 函数工作原理Serial Event example 连续事件例子 这段代码是一个Arduino示例程序,…...
Java基础关键_031_反射(一)
目 录 一、概述 二、获取 Class 的三种方式 1.Class.forName("完整全限定类名") 2.getClass() 3.class 属性 三、通过反射机制实例化对象 1.newInstance()(已过时) 2.配置文件利用反射机制实例化对象 四、反射 Class 的 Field 1.获取 P…...
verilog/systemverilog中的位序问题
verilog或者systemverilog中在使用位选择时,必须按照定义的大小端顺序进行位选操作,比如定义了reg [11:0] data,在使用data的中间4位时,必须使用data[7:4],不能使用data[4:7]。 如下示例: module tb;reg […...
JVM考古现场(十三):混沌重启——从量子永生到宇宙热寂的终极编译
开篇:鸿蒙初判熵火燎原"诸君可曾窥见《诛仙剑阵》终章里那冻结的量子递归?当Project Omega的热寂算法冰封时空熵增,当意识编译器的玻尔兹曼大脑撕裂熵障,此刻我们将踏碎归墟晶壁,在第十三维度叩问:从代…...
CARLA常见技术问题集锦(一)地图与场景构建篇
编者荐语: 在自动驾驶技术加速落地的今天,CARLA 仿真引擎凭借其开源生态与高保真仿真能力,已成为全球开发者构建智能驾驶算法的核心工具之一。随着虚幻引擎 5.5 的全面升级,CARLA 0.10.0 版本实现了视觉革命:Lumen 全…...
视图、MySQL、触发器、存储过程、流程控制语句
DAY19.1 Java核心基础 MySQL 视图 数据库中的一张虚拟的表,允许不同用户和不同程序以不同的方式查询同一张表的数据 基于数据表,创建一个虚拟的表,然后可以选择需要展示的字段 为不同的用户创建不同的视图,一个视图包含薪资&…...
多层感知机(MLP)全面指南
多层感知机(MLP) 是一种人工神经网络,由多个神经元层组成。MLP中的神经元通常使用非线性激活函数,使得网络能够学习数据中的复杂模式。MLP 在机器学习中非常重要,因为它能够学习数据中的非线性关系,使其成为分类、回归和模式识别等任务中的强大模型。 神经网络基础 神经…...
【第13届蓝桥杯C/C++B组省赛】顺子日期
答案:14 1.数组办法解决 思路:前四个元素已经确定,分别枚举其他元素的合法性 #include <stdio.h> int main() {int a[8] {2,0,2,0,0,0,0,0};int month[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};int i,j;int count 0;for(i 1;…...
智慧医疗胃癌检测数据集VOC+YOLO格式487张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):487 标注数量(xml文件个数):487 标注数量(txt文件个数):487 标注…...
每日一题-力扣-2716: 最小化字符串长度 0328
LeetCode 2716: 最小化字符串长度问题剖析 题目解读 LeetCode 2716 是一道关于字符串操作的算法题。这道题乍看复杂,实则蕴含着优雅的数学规律。题目要求通过一系列特定的删除操作来最小化字符串的长度: 给定一个下标从 0 开始的字符串 s每次操作可以选…...
量子计算:开启未来计算的新纪元
一、引言 在当今数字化时代,计算技术的飞速发展深刻地改变了我们的生活和工作方式。从传统的电子计算机到如今的高性能超级计算机,人类在计算能力上取得了巨大的进步。然而,随着科技的不断推进,我们面临着越来越多的复杂问题&…...
安卓车载app面经
java部分 常见集合类 List 继承了Collection接口的一个接口,List中的数据是有序的,可重复的 实现类 在Java中,List 是一个接口,它属于 Java Collections Framework 的一部分。List 接口代表了一个有序的集合(有时…...
JAVA SE :认识数组
目录 1.概念 2.数组的创建和初始化 2.1 创建 2.2 初始化 3.数组的使用 4.认识引用数据类型 4.1 JVM的内存分布 4.2 基本数据类型和引用数据类型 4.3 null的认识 5.二维数组 6.Arrays类的了解和使用 1.概念 数组用于存储一定数量相同类型的数据,可以看…...
深入理解机器学习之TF-IDF:文本特征提取的核心技术
文章目录 引言一、什么是TF-IDF?二、TF-IDF的数学原理1. 词频(TF)计算2. 逆文档频率(IDF)计算3. TF-IDF计算 三、TF-IDF的Python实现1.数据文件介绍2.导入库3.读取数据4.数据预处理5.对单词进行排序6.全部代码 四、结语 引言 在自然语言处理(NLP)和文本挖掘领域&am…...
Anaconda Jupyter 默认启动位置修改
Anaconda Jupyter 默认启动位置修改 本篇给大家分享的事关于Anaconda Jupyter的保存路径修改方法。 我们使用Anaconda Jupyter默认启动时,通常会跳转进入C盘的用户目录下,如下图所示。 但是很多时候我们使用 Jupyter 的场景并不在C盘,因为它…...
CNG汽车加气站操作工备考真题及答案解析【判断题】
1、燃气经营许可证按照燃气经营规模和类别实行分级审批。(√) 解析:不同规模和类别的燃气经营,其许可证审批级别不同,以确保经营活动的规范和安全。 2、依照《安全生产法》的规定,安全生产监督检查人员对检…...
es 3期 第27节-运用Script脚本实现复杂需求
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案
全场景智能监控聚合平台:打破边界,赋能高效协同 在数字化转型加速的今天,海量视频监控设备、多样化的编码协议与复杂的业务场景,让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…...
B494:开关电源领域的PWM控制新星
在电子技术飞速发展的今天,高效的电源管理系统成为各类电子设备稳定运行的关键。B494电压驱动型脉宽调制(PWM)控制集成电路以其卓越的性能和丰富的功能,成为开关电源设计领域的焦点。 一、B494:开关电源领域的PWM控制…...
03 相机标定图像采集
学完本文,您将获取一下技能: 1:如何提升标定质量,如选择标定板,标定图像采集的注意事项, 2:实现标定图像自动筛选的代码 3:量产场景如何通过一张图像来标定相机 为了实现良好的标定效果,以下因素在标定数据采集前必须设置得当。 标定板选择 标定板尺寸准确材料平…...
详解Spark executor
在 Apache Spark 中,Executor(执行器) 是运行在集群工作节点(Worker Node)上的进程,负责执行具体的计算任务并管理数据。它是 Spark 分布式计算的核心组件之一,直接决定了任务的并行度和资源利用…...
约束文件SDC常用命令
约束文件SDC常用命令 定义时钟create_clock -name CLK-period 2 [get_ports_clk]告诉工具主时钟周期是2ns(频率500MHz),从clk端口输入 输入信号延迟set_input_delay 0.5 -clock CLK [get_ports data_in]数据进芯片前,外部电路已消耗0.5ns,综合要预留这段“堵车时间”。 输出…...
流量分析2
一,webshell流量 [GKCTF 2021]签到 先看协议分级,大部分是tcp,里面有http的基于的行文本数据占了很大的比重,看看里面有什么 过滤http的流量 点击一条流量,里面的内容进去后面有基于行的文本数据, 先解he…...
23种设计模式-组合(Composite)设计模式
组合设计模式 🚩什么是组合设计模式?🚩组合设计模式的特点🚩组合设计模式的结构🚩组合设计模式的优缺点🚩组合设计模式的Java实现🚩代码总结🚩总结 🚩什么是组合设计模式…...
数据库概述
文章目录 数据库1、什么是数据库?2、数据库的分类关系型数据库非关系型数据库优缺点 3、MySQL数据库的安装和使用3.1 卸载3.2 安装命令行操作 4、 Navicat For MySQL连接MySQL新建数据库新建表在表中添加数据执行SQL语句 数据库 1、什么是数据库? 数据…...
C# System.Text.Encoding 使用详解
总目录 前言 在C#编程中,处理字符串和字节数组之间的转换是一个常见的任务。System.Text.Encoding类及其派生类提供了丰富的功能,帮助开发者实现不同字符编码之间的转换。本文将详细讲解System.Text.Encoding类的使用方法,包括常用编码的介绍…...
js 对象深拷贝的五种方法
js 对象深拷贝 今天遇到一个bug ,子组件页面修改了内容,但是按了取消保存按钮,没有将数据传回父组件的,但是父组件的数据改了,原因是通过子组件接受父组件的参数对象层级深没有做深拷贝的原因。 在 JavaScript 中&…...