WPF之面板特性

文章目录

    • 1. 概述
    • 2. WPF布局系统基础
      • 2.1 布局过程概述
      • 2.2 布局重新计算的触发条件
      • 2.3 布局重新计算的核心方法
    • 3. WPF内置面板类型及特性
      • 3.1 面板类型概览
      • 3.2 Canvas面板
      • 3.3 StackPanel面板
      • 3.4 WrapPanel面板
      • 3.5 DockPanel面板
      • 3.6 Grid面板
      • 3.7 UniformGrid面板
      • 3.8 VirtualizingStackPanel
    • 4. 面板性能对比与选择指南
      • 4.1 性能特点对比表
      • 4.2 面板选择指南
      • 4.3 约束方向与性能的关系
    • 5. 布局系统工作机制与性能优化
      • 5.1 布局周期详解
      • 5.2 MeasureOverride和ArrangeOverride
      • 5.3 InvalidateMeasure与InvalidateArrange详解
      • 5.4 布局性能优化实践
    • 6. 实际应用场景分析
      • 6.1 复杂表单布局
      • 6.2 动态内容显示
      • 6.3 大数据列表
      • 6.4 绘图和图表应用
    • 7. 总结
      • 7.1 选择面板的关键考虑因素
      • 7.2 布局性能优化要点
    • 8. 参考资料

1. 概述

在WPF应用程序开发中,面板(Panel)控件是布局系统的核心组件,负责组织和排列子元素。WPF提供了多种内置面板,每种面板都有其独特的布局行为和性能特点。了解这些面板的特性以及布局系统的工作原理,对于构建高性能、响应迅速的用户界面至关重要。

本文将详细介绍WPF中各种面板的特性、性能比较以及布局系统的工作机制,帮助开发者在实际项目中选择最合适的布局容器。

2. WPF布局系统基础

WPF的布局系统是一个双阶段过程,由测量(Measure)和排列(Arrange)两个阶段组成。理解这个过程对于掌握面板特性非常重要。

2.1 布局过程概述

布局过程
测量阶段 Measure
排列阶段 Arrange
计算元素所需的大小
根据可用空间确定元素的最终位置和大小
调用MeasureOverride方法
调用ArrangeOverride方法

布局过程是一个递归操作,从根元素开始,由父元素向下递归调用子元素的Measure和Arrange方法:

  1. 测量阶段(Measure):父元素将可用空间传递给子元素,子元素计算并返回其期望的大小
  2. 排列阶段(Arrange):父元素根据子元素报告的期望大小和自身的布局逻辑,分配子元素的最终位置和大小

2.2 布局重新计算的触发条件

以下是导致WPF重新计算布局的常见情况:

  1. 属性变化:任何影响元素布局的依赖属性变化,如Width、Height、Margin等
  2. 子元素集合变化:添加或删除子元素
  3. 内容变化:元素内容的变化导致其期望尺寸改变
  4. 显示状态变化:元素的Visibility属性变化
  5. 布局转换:应用LayoutTransform或修改其数值
  6. 手动触发:显式调用InvalidateMeasure或InvalidateArrange方法

2.3 布局重新计算的核心方法

WPF提供了三个主要方法来触发布局重新计算:

// 使元素的测量结果无效,并请求新的测量过程
element.InvalidateMeasure();// 使元素的排列结果无效,并请求新的排列过程
element.InvalidateArrange();// 使元素的视觉外观无效,并请求重新渲染
element.InvalidateVisual();// 强制立即完成布局过程
element.UpdateLayout();

这些方法的区别在于:

  • InvalidateMeasure:标记测量结果无效,导致测量和排列阶段都会重新执行
  • InvalidateArrange:仅标记排列结果无效,只重新执行排列阶段
  • InvalidateVisual:标记视觉外观无效,只触发重新渲染,不影响布局
  • UpdateLayout:强制立即完成任何挂起的布局操作,而不是等待下一个布局循环

3. WPF内置面板类型及特性

WPF提供了多种内置面板,每种面板有其独特的布局行为和应用场景。以下是各类面板的特性比较:

3.1 面板类型概览

Panel
Canvas
StackPanel
WrapPanel
DockPanel
Grid
UniformGrid
VirtualizingPanel
VirtualizingStackPanel

3.2 Canvas面板

Canvas是最简单的面板,允许通过绝对坐标精确定位子元素。

特点

  • 使用附加属性Canvas.Left、Canvas.Top、Canvas.Right和Canvas.Bottom来定位子元素
  • 不会自动调整子元素的大小或位置
  • 子元素可以重叠
  • 性能优良,布局计算开销最小

示例代码

<Canvas Width="300" Height="200"><!-- 距离左上角(10,10)的位置 --><Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="Red"/><!-- 距离左上角(50,30)的位置,会与上面的矩形重叠 --><Ellipse Canvas.Left="50" Canvas.Top="30" Width="150" Height="80" Fill="Blue" Opacity="0.5"/>
</Canvas>

性能特点

  • 测量和排列阶段计算最简单,性能最好
  • 不需要复杂的布局计算,只需将子元素放置在指定位置
  • 不会因为一个子元素的变化而影响其他子元素
  • 适合大量元素的静态布局或需要精确控制位置的场景

3.3 StackPanel面板

StackPanel将子元素按行或列堆叠排列。

特点

  • 可以垂直或水平堆叠子元素
  • 子元素在堆叠方向上不受限制,可以根据内容自由扩展
  • 在非堆叠方向上,子元素被拉伸以填充面板的宽度或高度

示例代码

<!-- 垂直堆叠 -->
<StackPanel Orientation="Vertical" Margin="10"><Button Content="按钮1" Margin="5"/><Button Content="按钮2" Margin="5"/><Button Content="按钮3" Margin="5"/>
</StackPanel><!-- 水平堆叠 -->
<StackPanel Orientation="Horizontal" Margin="10"><Rectangle Width="50" Height="50" Fill="Red" Margin="5"/><Rectangle Width="50" Height="50" Fill="Green" Margin="5"/><Rectangle Width="50" Height="50" Fill="Blue" Margin="5"/>
</StackPanel>

性能特点

  • 布局计算相对简单,性能较好
  • 当子元素较多且全部可见时,性能会下降
  • 对堆叠方向的测量是无限的,这可能导致在ScrollViewer中表现不佳
  • 当内容变化时,可能导致其后的所有元素都需要重新排列

3.4 WrapPanel面板

WrapPanel类似于StackPanel,但会在到达边界时自动换行或换列。

特点

  • 在水平方向上,当元素到达面板边缘时会自动换行
  • 在垂直方向上,当元素到达面板底部时会自动换列
  • 适合动态数量的元素布局,如图库或工具栏

示例代码

<WrapPanel Width="300" Margin="10"><Button Content="按钮1" Width="100" Margin="5"/><Button Content="按钮2" Width="100" Margin="5"/><Button Content="按钮3" Width="100" Margin="5"/><Button Content="按钮4" Width="100" Margin="5"/><Button Content="按钮5" Width="100" Margin="5"/>
</WrapPanel>

性能特点

  • 布局计算比StackPanel稍复杂,但仍然高效
  • 对于大量动态变化的子元素,性能较好
  • 当内容变化时,可能导致多个元素需要重新排列
  • 适合需要自动流式布局的场景

3.5 DockPanel面板

DockPanel允许子元素停靠在面板的四边或填充剩余空间。

特点

  • 使用附加属性DockPanel.Dock指定停靠方向(Top、Left、Right、Bottom)
  • 最后一个子元素默认填充剩余空间,可通过LastChildFill属性控制

示例代码

<DockPanel LastChildFill="True" Margin="10"><Button DockPanel.Dock="Top" Content="顶部" Height="30"/><Button DockPanel.Dock="Bottom" Content="底部" Height="30"/><Button DockPanel.Dock="Left" Content="左侧" Width="50"/><Button DockPanel.Dock="Right" Content="右侧" Width="50"/><TextBlock Background="LightGray" Text="中间区域" TextAlignment="Center" VerticalAlignment="Center"/>
</DockPanel>

性能特点

  • 布局计算较为简单,性能表现良好
  • 子元素顺序影响最终布局效果
  • 当内容变化时,可能影响其他已停靠元素的大小
  • 适合创建经典的应用程序框架布局

3.6 Grid面板

Grid是最灵活的面板,允许创建行和列的表格结构。

特点

  • 可以精确定义行和列的大小
  • 支持自动大小、固定大小和比例大小(使用*)
  • 子元素可以跨越多个行和列
  • 对齐方式灵活,可以控制元素在单元格内的位置

示例代码

<Grid Margin="10"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="50"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="*"/><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Text="标题栏" Background="LightBlue" Padding="5"/><ListBox Grid.Row="1" Grid.Column="0" Margin="5"/><TextBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="5" AcceptsReturn="True"/><Button Grid.Row="2" Grid.Column="2" Content="确定" Margin="5" HorizontalAlignment="Right" Width="80"/>
</Grid>

性能特点

  • 布局计算较复杂,性能成本较高
  • 对于大型复杂网格,布局计算可能成为性能瓶颈
  • 当网格单元格大小变化时,可能触发大量重新布局
  • Grid优化了仅影响单行或单列的更改,减少不必要的重新布局
  • 适合复杂、精确的布局需求

3.7 UniformGrid面板

UniformGrid是一种特殊的Grid,所有单元格大小相同。

特点

  • 所有单元格具有相同的大小
  • 可以指定行数和列数
  • 无需显式定义行和列,简化代码
  • 元素按顺序填充,从左到右,从上到下

示例代码

<UniformGrid Rows="2" Columns="3" Margin="10"><Button Content="1" Margin="5"/><Button Content="2" Margin="5"/><Button Content="3" Margin="5"/><Button Content="4" Margin="5"/><Button Content="5" Margin="5"/><Button Content="6" Margin="5"/>
</UniformGrid>

性能特点

  • 布局计算比Grid简单,性能表现较好
  • 对于大量均匀分布的元素,性能优于Grid
  • 适合需要网格式布局但不需要精确控制单元格大小的场景

3.8 VirtualizingStackPanel

VirtualizingStackPanel是StackPanel的虚拟化版本,通常用于数据绑定的列表控件中。

特点

  • 只为可见区域内的子元素创建UI元素,提高性能
  • 当子元素滚出可见区域时会回收UI资源
  • 通常与ItemsControl(如ListBox、ListView)一起使用

示例代码

<ListBox Height="200" Width="300"><ListBox.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel VirtualizationMode="Recycling"/></ItemsPanelTemplate></ListBox.ItemsPanel><!-- 假设绑定到一个包含成百上千个项的集合 -->
</ListBox>

性能特点

  • 对于大型集合,性能远超非虚拟化面板
  • 仅为可见项创建和布局UI元素,大幅减少内存占用
  • 滚动性能优良,适合展示大量数据的场景
  • 虚拟化机制可能不适用于高度不一致或需要测量的复杂项模板

4. 面板性能对比与选择指南

4.1 性能特点对比表

下表汇总了各种面板在不同方面的性能特点:

面板类型布局复杂度子元素数量可扩展性动态变化性能内存占用适用场景
Canvas极高极高绘图应用、游戏、元素精确定位
StackPanel简单列表、工具栏、表单
WrapPanel动态内容、图片库、流式布局
DockPanel应用主框架、区域分割
Grid复杂表单、精确布局、响应式界面
UniformGrid等大小元素网格、简单表格
VirtualizingPanel极高极低大数据集显示、长列表

4.2 面板选择指南

选择合适的面板对于应用性能至关重要,以下是选择指南:

  1. 需要精确定位元素:使用Canvas
  2. 简单线性布局:使用StackPanel
  3. 流式布局:使用WrapPanel
  4. 区域分割:使用DockPanel
  5. 复杂精确布局:使用Grid
  6. 等大小单元格:使用UniformGrid
  7. 大数据集显示:使用VirtualizingStackPanel

4.3 约束方向与性能的关系

WPF面板根据其布局逻辑,在不同方向上应用不同的约束:

面板约束逻辑
按内容约束
强制约束
元素自由确定尺寸
元素必须遵守父元素限制

各面板约束方向:

面板类型X方向约束Y方向约束说明
Canvas按内容约束按内容约束子元素可任意确定自身尺寸
StackPanel (垂直)强制约束按内容约束宽度受限,高度自由
StackPanel (水平)按内容约束强制约束高度受限,宽度自由
WrapPanel按内容约束按内容约束子元素可自由确定尺寸,但会自动换行
DockPanel强制约束强制约束通常约束子元素尺寸
Grid强制约束强制约束严格控制子元素尺寸

了解这些约束有助于预测布局行为并改善性能。

5. 布局系统工作机制与性能优化

5.1 布局周期详解

WPF布局系统在UI线程上工作,遵循一定的优先级和周期:

属性变化或手动触发
加入布局队列
按优先级等待处理
测量阶段 Measure
排列阶段 Arrange
渲染 Render
等待下一个布局周期

布局队列由Dispatcher管理,按优先级处理:

  1. 常规UI操作(DispatcherPriority.Normal)
  2. 布局操作(DispatcherPriority.Loaded)
  3. 渲染操作(DispatcherPriority.Render)

这确保了UI操作完成后才进行布局计算,避免不必要的重复布局。

5.2 MeasureOverride和ArrangeOverride

自定义面板或控件时,通过重写这两个方法来实现自定义布局逻辑:

// 测量阶段 - 确定控件自身和子元素所需的大小
protected override Size MeasureOverride(Size availableSize)
{// 1. 遍历子元素,调用其Measure方法foreach (UIElement child in Children){child.Measure(availableSize);// 处理子元素的期望大小...}// 2. 根据子元素的测量结果计算自身所需的大小return new Size(calculatedWidth, calculatedHeight);
}// 排列阶段 - 根据最终分配的空间确定子元素的位置
protected override Size ArrangeOverride(Size finalSize)
{// 1. 遍历子元素,调用其Arrange方法foreach (UIElement child in Children){// 计算子元素的最终位置和大小Rect childRect = new Rect(x, y, width, height);child.Arrange(childRect);}// 2. 返回实际使用的大小return finalSize;
}

5.3 InvalidateMeasure与InvalidateArrange详解

这两个方法是布局系统的核心,了解其工作机理有助于性能优化:

InvalidateMeasure:

  • 在依赖属性系统中,带有FrameworkPropertyMetadataOptions.AffectsMeasure标志的属性变化时自动调用
  • 将元素及其受影响的父元素都标记为"需要测量"
  • 通常在元素的尺寸可能发生变化时使用

InvalidateArrange:

  • 在依赖属性系统中,带有FrameworkPropertyMetadataOptions.AffectsArrange标志的属性变化时自动调用
  • 将元素标记为"需要排列",但不一定触发新的测量
  • 通常在元素的位置可能发生变化但大小不变时使用

工作原理

  • 这些方法不会立即执行布局,而是将元素添加到布局队列
  • Dispatcher在处理完所有高优先级操作后,执行队列中的布局请求
  • 这种机制避免了因连续多次更改而导致的重复布局计算

示例:何时使用这些方法

// 自定义控件属性变化时
public double CustomPadding
{get { return (double)GetValue(CustomPaddingProperty); }set { SetValue(CustomPaddingProperty, value); }
}// 此属性变化会影响测量
public static readonly DependencyProperty CustomPaddingProperty =DependencyProperty.Register("CustomPadding", typeof(double), typeof(MyCustomControl),new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsMeasure));// 在代码中手动调用
private void UpdateControlContent()
{// 内容变化可能影响大小this.InvalidateMeasure();
}private void UpdateControlPosition()
{// 仅位置变化,大小不变this.InvalidateArrange();
}

5.4 布局性能优化实践

基于对布局系统的理解,以下是一些关键优化实践:

  1. 选择合适的面板

    • 使用最简单且满足需求的面板
    • 对于大数据集,优先考虑虚拟化面板
  2. 减少布局更新频率

    • 批处理UI更新,避免频繁触发布局
    • 考虑使用CompositionTarget.Rendering事件进行视觉更新
  3. 避免深层嵌套布局

    • 减少布局容器的嵌套层级
    • 考虑使用Grid来替代多层嵌套的面板
  4. 利用缓存机制

    • 对于复杂计算,缓存结果避免重复计算
    • 使用LayoutTransform代替频繁的布局更改
  5. 冻结不变对象

    • 冻结不会改变的Brush、Transform等对象
    • 共享这些冻结对象以减少内存使用
  6. 减少测量复杂度

    • 设置明确的Width/Height,避免Auto值导致的复杂计算
    • 设置CacheMode="BitmapCache"缓存复杂元素的视觉呈现

示例代码:性能优化实践

// 批处理更新,避免多次触发布局
private void UpdateMultipleControls()
{// 阻止布局更新this.layoutRoot.BeginInit();try{// 进行多项更新UpdateControl1();UpdateControl2();UpdateControl3();}finally{// 恢复布局更新,此时会一次性完成所有布局计算this.layoutRoot.EndInit();}
}// 使用缓存减少视觉树复杂度
<Border x:Name="complexVisual" CacheMode="BitmapCache"><!-- 复杂的视觉内容 -->
</Border>// 避免不必要的布局计算
private void AnimatePosition()
{// 使用RenderTransform而不是改变MarginTranslateTransform transform = new TranslateTransform();myElement.RenderTransform = transform;DoubleAnimation animation = new DoubleAnimation(0, 100, TimeSpan.FromSeconds(1));transform.BeginAnimation(TranslateTransform.XProperty, animation);
}

6. 实际应用场景分析

6.1 复杂表单布局

对于复杂表单,Grid通常是最佳选择,但需要注意性能:

<Grid><!-- 使用GridSplitter允许调整区域大小 --><Grid.ColumnDefinitions><ColumnDefinition Width="200" MinWidth="100"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><!-- 左侧导航 --><ListBox Grid.Column="0"/><!-- 分隔条 --><GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center"/><!-- 右侧内容 - 使用DockPanel进行进一步布局 --><DockPanel Grid.Column="2"><ToolBar DockPanel.Dock="Top"/><StatusBar DockPanel.Dock="Bottom"/><ScrollViewer><!-- 主内容区 --></ScrollViewer></DockPanel>
</Grid>

6.2 动态内容显示

对于动态变化的内容集合,如图片库或商品展示:

<ScrollViewer><ItemsControl Name="itemsDisplay"><ItemsControl.ItemsPanel><ItemsPanelTemplate><!-- 使用WrapPanel实现流式布局 --><WrapPanel Orientation="Horizontal"/></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><!-- 项目模板 --><Border Margin="5" Padding="5" BorderThickness="1"BorderBrush="Gray"><StackPanel><Image Source="{Binding ImagePath}" Width="100" Height="100"/><TextBlock Text="{Binding Title}" TextWrapping="Wrap" MaxWidth="100"/></StackPanel></Border></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>
</ScrollViewer>

6.3 大数据列表

对于包含大量数据的列表,虚拟化至关重要:

<ListView VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"VirtualizingPanel.CacheLengthUnit="Page"VirtualizingPanel.CacheLength="2"ScrollViewer.IsDeferredScrollingEnabled="True"><ListView.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel/></ItemsPanelTemplate></ListView.ItemsPanel><!-- 列表项定义 -->
</ListView>

6.4 绘图和图表应用

对于绘图应用,Canvas的精确定位能力非常重要:

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"><Canvas x:Name="drawingCanvas" Width="2000" Height="2000"><!-- 绘图元素在代码中动态添加 --></Canvas>
</ScrollViewer>
// 在代码中动态添加和定位元素
private void AddShape(Point position, Size size, Brush fill)
{Rectangle rect = new Rectangle{Width = size.Width,Height = size.Height,Fill = fill};Canvas.SetLeft(rect, position.X);Canvas.SetTop(rect, position.Y);drawingCanvas.Children.Add(rect);
}

7. 总结

WPF面板是布局系统的核心组件,每种面板都有其独特的布局行为和性能特点。合理选择和使用面板对于构建高性能、响应迅速的用户界面至关重要。

7.1 选择面板的关键考虑因素

  1. 布局需求:考虑UI元素的组织方式和排列逻辑
  2. 性能要求:考虑应用程序的性能目标和硬件限制
  3. 维护性:考虑代码的可读性和可维护性
  4. 可扩展性:考虑未来可能的变化和扩展需求

7.2 布局性能优化要点

  1. 选择最适合需求的面板类型
  2. 最小化布局容器的嵌套层级
  3. 避免不必要的布局更新
  4. 对大数据集使用虚拟化技术
  5. 使用转换代替直接修改位置和大小
  6. 合理设置缓存策略

通过深入理解WPF面板特性和布局系统工作机制,开发者可以构建出既美观又高效的用户界面,提供更好的用户体验。

8. 参考资料

  1. WPF布局系统官方文档
  2. 面板概述 - WPF .NET Framework
  3. 优化性能:布局和设计 - WPF .NET
  4. Deep Dive into WPF Layouting and Rendering

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

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

相关文章

【技术追踪】通过潜在扩散和先验知识增强时空疾病进展模型(MICCAI-2024)

向扩散模型中引入先验知识&#xff0c;实现疾病进展预测&#xff0c;扩散模型开始细节作业了~ 论文&#xff1a;Enhancing Spatiotemporal Disease Progression Models via Latent Diffusion and Prior Knowledge 代码&#xff1a;https://github.com/LemuelPuglisi/BrLP 0、摘…

[ linux-系统 ] 常见指令2

1. man 指令 语法&#xff1a;man [选项] 命令 功能&#xff1a;查看联机手册获取帮助。 选项说明-k根据关键字搜索联机帮助。num只在第num章节找。-a显示所有章节的内容。 man是 Unix 和类 Unix 系统中的一个命令&#xff0c;用于查看操作系统和软件的手册页面&#xff08;ma…

STL之stackqueue

stack的介绍&#xff08;可以想象成栈&#xff09; 1.stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作 2.stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特点类封装作为其…

【现代深度学习技术】现代循环神经网络06:编码器-解码器架构

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

宏电全新升级单北斗5G电力DTU,为每一公里电力线路注入可靠连接

在配网自动化改造与数字化转型的双重驱动下&#xff0c;宏电股份推出全新升级版H7710-DLWZ系列5G电力DTU&#xff0c;聚焦配网通信链路冗余、国产自主可控、复杂环境适应性三大核心需求&#xff0c;为配电自动化、台区智能运维、分布式能源接入等场景提供高可靠通信底座。 国产…

学习海康VisionMaster之间距检测

一&#xff1a;进一步学习了 今天学习下VisionMaster中的间距检测工具&#xff1a;主要类似于卡尺工具&#xff0c;测量物体的长度或者宽度或者间距 二&#xff1a;开始学习 1&#xff1a;什么是间距检测&#xff1f; 间距测量模块用于检测两特征边缘之间的间距&#xff0c;首…

蓝桥杯 18. 积木

积木 原题目链接 题目描述 小明用积木搭了一个城堡。为了方便&#xff0c;小明使用的是大小相同的正方体积木&#xff0c;并将其搭建在一个 n 行 m 列的方格图上。每个积木占据方格图中的一个小格子。 小明的城堡是立体的&#xff0c;可以将积木垒在其他积木上。当某个格子…

C++负载均衡远程调用学习之基础TCP服务

目录 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 3.LARS的reactor框架的组成部分 4.Lars_reactor的项目目录构建 5.Lars_tcp_server的基础服务开发 6.Lars_tcp_server的accept实现 7.LarsV0.1总结 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 # Lars系统开发 …

EasyExcel使用总结

EasyExcel 文章目录 EasyExcel1、导入1.1、基本方式导入1.导入依赖2. 加载源文件基本语法 3. 读取数据行4. 读取结果 1.2、模型映射导入1.定义实体映射类2. 操作读取基本语法 3. 读取数据行4. 读取结果 1.3、导入类型转换器语法 1.4、导入监听器基本语法&#xff1a; 1.5、多行…

【愚公系列】《Manus极简入门》022-艺术创作顾问:“艺术灵感使者”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

蓝桥杯15届国赛 最小字符串

问题描述 给定一个长度为 N 且只包含小写字母的字符串 S&#xff0c;和 M 个小写字母 c1,c2,...,cM​。现在你要把 M 个小写字母全部插入到字符串 S 中&#xff0c;每个小写字母都可以插入到任意位置。请问能得到的字典序最小的字符串是什么&#xff1f; 输入格式 第一行包含…

【东枫科技】代理英伟达产品:DPU

NVIDIA BlueField-3 DPU 400Gb/s 基础设施计算平台 NVIDIA BlueField -3 数据处理单元 (DPU) 是第三代基础设施计算平台&#xff0c;使企业能够构建从云端到核心数据中心再到边缘的软件定义、硬件加速的 IT 基础设施。借助 400Gb/s 以太网或 NDR 400Gb/s InfiniBand 网络连接…

依图科技C++后端开发面试题及参考答案

请介绍你所了解的分布式系统 分布式系统是由多个独立的计算节点通过网络连接组成的系统&#xff0c;这些节点共同协作以完成特定的任务。分布式系统的设计目标在于提升系统的性能、可扩展性、可靠性和容错性。 从性能方面来看&#xff0c;分布式系统能够把任务分配到多个节点…

Python cv2滤波与模糊处理:从原理到实战

在图像处理领域&#xff0c;滤波与模糊是预处理阶段的两大核心操作&#xff0c;既能消除噪声干扰&#xff0c;又能实现艺术化效果。本文将结合OpenCV的cv2库&#xff0c;系统讲解滤波与模糊的原理及Python实现&#xff0c;带你从理论到实战全面掌握这项技术。 一、滤波与模糊的…

在 Laravel 12 中实现 WebSocket 通信时进行身份验证

在 Laravel 12 中实现 WebSocket 通信时&#xff0c;若需在身份验证失败后主动断开客户端连接&#xff0c;需结合 频道认证机制 和 服务端主动断连操作。以下是具体实现步骤&#xff1a; 一、身份验证流程设计 WebSocket 连接的身份验证通常通过 私有频道&#xff08;Private …

FPGA----基于ZYNQ 7020实现petalinux并运行一个程序

引言&#xff1a;上一节我们讲到了使用Alinx 7020b自带的sd卡中的petalinux进行epics的编译&#xff0c;但此种方案个性化程度不足。如&#xff1a;我们项目需要FPGA侧的配合&#xff0c;那么我们需要重新编译petalinx。 注意&#xff1a;本文的知识点来自下面两篇文章&#x…

Spring Web MVC————入门(1)

今天开始正式带大家学习Spring部分的内容了&#xff0c;大家尝试去弄个专业版嗷&#xff0c;学习起来爽一点 在idea中下载这个插件就行了 我们之后开始创建Spring项目&#xff0c; 蓝色 部分自己起名&#xff0c;type选Maven&#xff0c;其他的默认就好了&#xff0c;之后nex…

Vue3 中用 canvas 封装抽奖转盘组件:设定中奖概率及奖项图标和名称

在 Web 应用开发中&#xff0c;抽奖功能是提升用户参与度的常用手段。使用 Vue3 结合 canvas 技术&#xff0c;我们可以轻松实现一个高度自定义的抽奖转盘组件&#xff0c;不仅能设定中奖概率&#xff0c;还能灵活配置奖项图标和名称。本文将详细介绍该组件的实现原理、步骤&am…

Linux 硬盘和光驱系统管理

一、硬盘与目录的容量 [rootwww ~]# df [-ahikHTm] [目录或档名] 选项与参数&#xff1a; -a &#xff1a;列出所有的档案系统&#xff0c;包括系统特有的 /proc 等档案系统&#xff1b; -k &#xff1a;以 KBytes 的容量显示各档案系统&#xff1b; -m &#xff1a;以 MByt…

2.Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用户&#xff1a;优先使用Caffeine&#xff0c;性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId&…