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.pswp.cn/web/78676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78676.shtml
英文地址,請注明出處:http://en.pswp.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&…