03-掘金版 · 接手别人写了一半的 WPF 项目,我第一件事不是看代码
- 目标平台:掘金(技术文 ≥1000 字,不留联系方式,结尾引导关注)
- 话题标签:.NET、C#、WPF、桌面开发、踩坑
- 配图建议:
- 首图:四步流程图(问清 → 构建 → 兜底 → 盘点)
- 中段:binding log 输出截图位
- 文末:交付状态表截图位
标题备选
- 接手别人写了一半的 WPF 项目,我第一件事不是看代码
- WPF 抢救实战:30 行代码,把所有静默失败变成日志
- 半成品 WPF 项目交接清单:构建、兜底、盘点、报价
一、先说结论
接手别人写了一半的 WPF 项目,第一件事不是读代码,是让错误开口说话:跑起来、把静默失败落成日志、产出一张交付状态表,然后才是续写还是重写的决策。WPF 数据绑定错误默认完全静默,这是半成品项目最大的雷。
二、静默失败:半成品 WPF 项目的头号风险
WPF 的绑定体系对错误非常宽容:属性名拼错、类型不匹配、DataContext 没设,程序不崩、界面照常渲染,只是值不出来。看这个例子:
<!-- CustmoerName 拼错了,默认一行日志都没有 -->
<TextBlock Text="{Binding CustmoerName}" />
前任开发者靠肌肉记忆绕开了这些坑,交接之后没人知道哪些「看着不对但其实能用」。结果就是:编译通过、演示正常、客户用两天开始陆续报「这里怎么是空的」。接手期最重要的产出不是「读懂了多少行代码」,而是一份可复现的错误清单。
三、四步接手流程
1. 问清五件事再碰电脑:.NET 版本与私有 NuGet 源;数据库位置与测试数据(绝不连生产库调试);硬件依赖(串口设备、加密狗、扫码枪);客户对「写了一半」的验收标准;原开发者能否付费咨询(三个问题的答案往往值回票价)。
2. 让工程能重新构建:缺包、缺资源、缺数据库脚本是常态。能编译 = 打通「改动 → 验证」通道。
3. 全局兜底 + 绑定日志:下面这段代码,接手第一天就加进 App.xaml.cs。
4. 产出交付状态表再报价:模块逐个标「能用 / 半成品 / 纯 UI / 缺失」,报价按「盘点固定价 + 修复按项 + 新功能按点」三段走。打包价在接手场景里必有一方吃亏。
四、核心代码:30 行兜底
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var logDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
Directory.CreateDirectory(logDir);
// 绑定错误默认静默,打开 Trace 监听
PresentationTraceSources.Refresh();
PresentationTraceSources.DataBindingSource.Switch = SourceLevels.Warning;
PresentationTraceSources.DataBindingSource.Listeners.Add(
new TextWriterTraceListener(Path.Combine(
logDir, "binding-" + DateTime.Now.ToString("yyyyMMdd") + ".log")));
// UI 线程异常:落盘 + 弹窗 + 不崩现场
DispatcherUnhandledException += (s, args) =>
{
File.AppendAllText(Path.Combine(logDir, "crash.log"),
DateTime.Now + " " + args.Exception);
MessageBox.Show("程序出现异常,日志已保存,请联系开发者。");
args.Handled = true;
};
// 非 UI 线程异常
AppDomain.CurrentDomain.UnhandledException += (s, args) =>
File.AppendAllText(Path.Combine(logDir, "crash.log"),
DateTime.Now + " [FATAL] " + args.ExceptionObject);
}
}
跑一天正常业务,logs/binding-*.log 里的每条警告都对应一个客户迟早会撞上的界面问题。这份日志就是修复 backlog,也是跟客户沟通「为什么要先填坑再加功能」的最好证据。
五、续写还是重写
三个判断标准:数据层是否干净(逻辑没散在存储过程里 → 可续写);绑定体系是否成体系(MVVM 成型 → 续写舒服);可见进度占比(七成能用 → 续写;只剩 UI 壳 → 重写反而便宜,但必须先跑旧系统对照功能清单,否则一定漏需求)。多数实际情况是「续写 + 局部重构」,不动正在跑的主流程。
六、延伸
接手桌面项目盘完需求,常见缺口是数据出内网(.NET WebAPI)、手机看报表(微信小程序 / APP)、现场扫码(小程序 + 桌面端联动)——同一个 .NET 技术栈辐射范围,抢救单经常变成长期合作。
觉得有用的话点个关注,后续会持续写 .NET 桌面端与跨端的实战内容;评论区交流,或站内私信。