BitWaferMap 2.0.0
FastWaferPanel - 高性能晶圆图控件
概述
FastWaferPanel 是一个高性能的 WPF 晶圆图(Wafer Map)自定义控件,专为大规模晶圆测试数据显示而设计。它支持快速渲染、交互式选择和实时数据更新,适用于半导体测试、良率分析等场景。
特性
🚀 高性能渲染
- 60 FPS 稳定帧率:使用定时器控制渲染频率,确保流畅的视觉体验
- 智能渲染请求:仅在有变化时请求重绘,避免不必要的性能消耗
- 视口裁剪:只渲染可见区域内的 Die,大幅提升大数据量下的性能
- 缓存机制:缓存格式化文本和画笔,减少重复创建开销
🎯 丰富的交互功能
- 多种选择模式:
- 单击选择单个 Die
- 框选矩形区域内的多个 Die
- Ctrl+单击进行多选
- 鼠标操作:
- 滚轮缩放(支持中心点缩放)
- 中键拖拽平移视图
- 右键打开上下文菜单
- 实时提示:
- 鼠标悬停显示 Die 详细信息
- 选中数量实时统计
🎨 灵活的显示控制
- 坐标系统:支持标准坐标系和数学坐标系切换
- 自定义尺寸:可独立设置 Die 的宽度和高度
- 动态文本显示:缩放级别足够时自动显示 Die 坐标和 BinCode
- 闪烁提示:支持指定 Die 的闪烁高亮
🔧 扩展性设计
- 接口分离:通过
IDieInfo接口支持自定义数据模型 - 事件系统:
DieClicked:单击事件SelectionChanged:选择变化事件HoverChanged:悬停变化事件RequestColorForSelected:请求设置颜色事件
- 数据绑定:支持与 MVVM 模式无缝集成
快速开始
安装
将 FastWaferPanel.cs 文件添加到您的 WPF 项目中,并确保引用必要的命名空间:
xml
<Window x:Class="YourNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BitWaferMap">
<Grid>
<local:FastWaferPanel x:Name="waferPanel"
Dies="{Binding Dies}"
DieWidth="15"
DieHeight="15"
UseMathCoordinate="False"/>
</Grid>
</Window>
基本使用
csharp
// 创建数据
var dies = new ObservableCollection<IDieInfo>();
for (int x = 0; x < 50; x++)
{
for (int y = 0; y < 50; y++)
{
dies.Add(new DieInfo
{
X = x,
Y = y,
BinCode = "PASS",
Brush = Brushes.LightGreen
});
}
}
// 绑定到控件
waferPanel.Dies = dies;
// 居中显示
waferPanel.CenterViewOnDies(dies);
// 适应窗口
waferPanel.FitToWindow(dies);
高级用法
1. 自定义数据模型
实现 IDieInfo 接口来创建自定义数据模型:
csharp
public class CustomDieInfo : IDieInfo
{
public int X { get; set; }
public int Y { get; set; }
public int Row { get; set; }
public int Col { get; set; }
public object? Tag { get; set; }
public Brush Brush { get; set; } = Brushes.LightGray;
public string BinCode { get; set; } = "N/A";
// 自定义属性
public double TestValue { get; set; }
public DateTime TestTime { get; set; }
}
2. 响应选择事件
csharp
waferPanel.SelectionChanged += (s, e) =>
{
var selected = e.SelectedDies;
statusBar.Text = $"已选择: {selected.Count} 个 Die";
foreach (var die in selected)
{
Console.WriteLine($"Die [{die.X},{die.Y}]: {die.BinCode}");
}
};
waferPanel.DieClicked += (s, die) =>
{
MessageBox.Show($"点击了 Die: ({die.X}, {die.Y})");
};
3. 动态更新数据
csharp
// 添加新 Die
if (waferPanel.Dies is ObservableCollection<IDieInfo> collection)
{
collection.Add(new DieInfo { X = 10, Y = 20, BinCode = "FAIL" });
}
// 更新颜色
waferPanel.ChangeDieColor(5, 5, Brushes.Red);
// 批量更新选中颜色
waferPanel.ApplyColorToSelected(Brushes.Gold);
4. 闪烁提示功能
csharp
// 开始闪烁指定位置的 Die
waferPanel.StartBlink(new[] { (5, 5), (6, 6), (7, 7) });
// 停止闪烁
waferPanel.StopBlink(new[] { (5, 5) });
// 停止所有闪烁
waferPanel.StopAllBlink();
配置选项
| 属性 | 类型 | 说明 |
|---|---|---|
Dies |
IEnumerable<IDieInfo> |
晶圆数据源 |
SelectedDies |
IEnumerable<IDieInfo> |
当前选中的 Die 集合 |
SelectedDie |
IDieInfo |
当前选中的单个 Die |
Mode |
WaferPanelMode |
操作模式(Normal/ExternalAdding/Selecting/Panning) |
DieWidth |
double |
Die 宽度(像素) |
DieHeight |
double |
Die 高度(像素) |
UseMathCoordinate |
bool |
是否使用数学坐标系(Y轴向上) |
Scale |
double |
缩放比例 |
Offset |
Point |
视图偏移量 |
IsTrack |
bool |
是否启用视图跟踪 |
性能优化建议
- 数据量优化:对于超过 10,000 个 Die 的数据,建议使用虚拟化或分页加载
- 渲染优化:当 Die 数量巨大时,可以设置
DieWidth/Height较小值 - 文本显示:只在缩放级别足够时显示文本,避免过多文本渲染
- 集合选择:优先使用
ObservableCollection以便自动响应集合变化
版本说明
Version 2.0.0 (2026.02.18)
✨ 初始版本发布
🎨 基础晶圆图渲染功能
🖱️ 鼠标交互(单击、框选、缩放、平移)
📊 60 FPS 流畅渲染
💡 悬停提示功能
⚡ 性能优化:视口裁剪、缓存机制
🎯 新增闪烁提示功能
🔧 添加数学坐标系支持
📝 优化文本渲染,支持动态字体大小
🚀 智能渲染请求系统
🎨 支持自定义 Die 颜色
📋 上下文菜单扩展
🔗 改进数据绑定支持
Demo 示例
示例 1:基础晶圆图
csharp
// 创建 100x100 的晶圆图
var dies = new ObservableCollection<IDieInfo>();
var random = new Random();
for (int x = 0; x < 100; x++)
{
for (int y = 0; y < 100; y++)
{
var value = random.NextDouble();
var binCode = value > 0.9 ? "FAIL" : "PASS";
var brush = value > 0.9 ? Brushes.Red : Brushes.LightGreen;
dies.Add(new DieInfo
{
X = x,
Y = y,
BinCode = binCode,
Brush = brush
});
}
}
waferPanel.Dies = dies;
示例 2:实时数据更新
csharp
// 模拟实时测试数据
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
timer.Tick += (s, e) =>
{
var random = new Random();
var x = random.Next(0, 100);
var y = random.Next(0, 100);
waferPanel.ChangeDieColor(x, y,
random.NextDouble() > 0.7 ? Brushes.Red : Brushes.Green);
};
timer.Start();
示例 3:良率分析
csharp
waferPanel.SelectionChanged += (s, e) =>
{
var selected = e.SelectedDies;
var failCount = selected.Count(d => d.BinCode == "FAIL");
analysisText.Text = $"选中区域: {selected.Count} 个 Die\n" +
$"不良数: {failCount}\n" +
$"良率: {(1 - (double)failCount/selected.Count):P2}";
};
示例 4:自定义上下文菜单
csharp
var contextMenu = new ContextMenu();
var menuAnalyze = new MenuItem { Header = "分析选中区域" };
menuAnalyze.Click += (s, e) => AnalyzeSelectedRegion();
var menuExport = new MenuItem { Header = "导出数据" };
menuExport.Click += (s, e) => ExportSelectedData();
contextMenu.Items.Add(menuAnalyze);
contextMenu.Items.Add(menuExport);
waferPanel.ContextMenu = contextMenu;
常见问题
Q: 如何处理大量数据(>100,000 Die)的渲染?
A: FastWaferPanel 已经实现了视口裁剪,只渲染可见区域。建议配合虚拟化技术使用,并适当降低 DieWidth/Height 值。
Q: 如何实现实时数据刷新?
A: 使用 ObservableCollection<IDieInfo> 作为数据源,当集合发生变化时会自动触发重绘。
Q: 支持触摸屏操作吗? A: 当前版本主要支持鼠标操作,触摸屏支持将在 1.4.0 版本中添加。
Q: 如何自定义 Die 的显示样式?
A: 通过实现 IDieInfo 接口,您可以完全控制每个 Die 的 Brush 属性来自定义颜色。
贡献指南
欢迎贡献代码、报告问题或提出新功能建议。请遵循以下步骤:
- Fork 项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件
联系方式
- 作者:[您的姓名]
- 邮箱:[您的邮箱]
- 项目地址:[GitHub 仓库地址]
FastWaferPanel - 为半导体测试行业提供高性能、易扩展的晶圆图显示解决方案
No packages depend on BitWaferMap.
.NET Framework 4.8
- No dependencies.