✨ feat: 初始化 PCB 检测 WPF 应用程序

* 创建 AxiOmron.PcbCheck 项目主框架及解决方案
* 添加 Dashboard 和系统设置页面
* 实现 Modbus TCP PLC、扫码枪、SFTP 查询等核心服务
* 集成 Andon 报警、工作流托管服务与日志配置
* 补充项目文档和 UI 设计规范
This commit is contained in:
2026-04-17 10:43:51 +08:00
parent 660ee99442
commit 49f113dcf3
46 changed files with 8042 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace AxiOmron.PcbCheck.Converters;
/// <summary>
/// 将布尔值转换为 <see cref="Visibility"/>,支持通过 ConverterParameter 反转判定。
/// </summary>
/// <remarks>
/// 当 ConverterParameter 为 "Invert"、"Inverse" 或 "!" 时,布尔值的真假意义取反。
/// </remarks>
public sealed class BooleanToVisibilityConverter : IValueConverter
{
/// <summary>
/// 将布尔值转换为可见性。
/// </summary>
/// <param name="value">源布尔值。</param>
/// <param name="targetType">目标类型。</param>
/// <param name="parameter">若为 "Invert"/"!" 则反转判定。</param>
/// <param name="culture">当前区域信息。</param>
/// <returns><see cref="Visibility.Visible"/> 或 <see cref="Visibility.Collapsed"/>。</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is bool b && b;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// 将可见性反向转换为布尔值。
/// </summary>
/// <param name="value">目标可见性。</param>
/// <param name="targetType">目标类型。</param>
/// <param name="parameter">若为 "Invert"/"!" 则反转判定。</param>
/// <param name="culture">当前区域信息。</param>
/// <returns>布尔值。</returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is Visibility v && v == Visibility.Visible;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag;
}
/// <summary>
/// 判断参数是否要求反转判定。
/// </summary>
/// <param name="parameter">参数值。</param>
/// <returns>是否反转。</returns>
private static bool IsInvert(object? parameter)
{
if (parameter is null)
{
return false;
}
string token = parameter.ToString() ?? string.Empty;
return token.Equals("Invert", StringComparison.OrdinalIgnoreCase)
|| token.Equals("Inverse", StringComparison.OrdinalIgnoreCase)
|| token.Equals("!", StringComparison.Ordinal);
}
}