瀏覽代碼

修日志8GB根因A:ChangeLanguage误删AdaptiveStyles致软键盘MinHeight=UnsetValue洪流

根因:App.xaml 把 AdaptiveStyles.xaml(全局TouchMinSize)加成最后一个 MergedDictionary,
ChangeLanguage 启动时盲删"最后一个"实删了它→TouchMinSize 丢失→SoftKeyboard 键盘按键
隐式样式 MinHeight={StaticResource TouchMinSize} 解析成 UnsetValue→键盘在树里每帧抛→单日8GB。
探针确诊57个元素全是SoftKeyboard的Button、MainWindow树0命中;Release命中/Debug提前return不复现。
a4f3a14 的 Popup 修复只换洪流宿主未修根因。

修复(根因+键盘兜底):
- App.xaml.cs ChangeLanguage:改按引用删语言字典(新增_currentLangRd)+首次按Source含
  /Language/匹配,绝不碰AdaptiveStyles(顺带修好Release下被静默禁用的M4-02触控基准)。
- SoftKeyboard.xaml:UserControl.Resources 内置 TouchMinSize=48 兜底 + xmlns:sys,防御纵深。

验证:模拟Release场景(人造DEBUG语言路径)重启→键盘正常弹出、A_locator未生成、日志MinHeight=0;
dotnet build 0 error CS。B节流保留作安全网。诊断探针/临时旁路已全撤。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 4 天之前
父節點
當前提交
28a3de4e12

+ 25 - 4
ivf_tl_operate_2.0/ivf_tl_Operate/App.xaml.cs

@@ -19,6 +19,9 @@ namespace ivf_tl_Operate
     public partial class App : Application
     {
         private static Mutex instance;
+        // 当前生效的语言资源字典(运行时由 ChangeLanguage 维护)。用于按引用精确移除旧语言字典,
+        // 避免历史 bug:盲删最后一个 MergedDictionary 误删 AdaptiveStyles(TouchMinSize)。
+        private ResourceDictionary _currentLangRd;
         public App()
         {
             Log4netHelper.WriteLog("App构造函数运行");
@@ -247,12 +250,30 @@ namespace ivf_tl_Operate
                 }
                 if (langRd != null)
                 {
-                    int count = Application.Current.Resources.MergedDictionaries.Count;
-                    if (count >= 1)
+                    var mds = Application.Current.Resources.MergedDictionaries;
+                    // 【8GB 洪流根因修复】原逻辑 RemoveAt(Count-1) 盲删"最后一个"合并字典。
+                    // 但 App.xaml 里最后一个是 AdaptiveStyles.xaml(全局 TouchMinSize 所在,M4-01-4 加在语言字典之后),
+                    // 故启动时本方法实删的是 AdaptiveStyles 而非旧语言字典 → 全局 TouchMinSize 丢失 →
+                    // SoftKeyboard 按键隐式样式 MinHeight={StaticResource TouchMinSize} 解析成 UnsetValue → 每帧抛 → 单日 8GB。
+                    // 改为:按引用移除"上一次语言字典";首次按 Source 含 /Language/ 匹配移除 App.xaml 预置语言字典,绝不碰 AdaptiveStyles。
+                    if (_currentLangRd != null)
                     {
-                        Application.Current.Resources.MergedDictionaries.RemoveAt(count - 1);
+                        mds.Remove(_currentLangRd);
                     }
-                    Application.Current.Resources.MergedDictionaries.Add(langRd);
+                    else
+                    {
+                        for (int i = mds.Count - 1; i >= 0; i--)
+                        {
+                            string src = mds[i].Source?.OriginalString ?? string.Empty;
+                            if (src.IndexOf("/Language/", StringComparison.OrdinalIgnoreCase) >= 0)
+                            {
+                                mds.RemoveAt(i);
+                                break;
+                            }
+                        }
+                    }
+                    mds.Add(langRd);
+                    _currentLangRd = langRd;
                 }
                 else
                 {

+ 5 - 0
ivf_tl_operate_2.0/ivf_tl_Operate/CustomUserControls/SoftKeyboard.xaml

@@ -4,6 +4,7 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:local="clr-namespace:ivf_tl_Operate.CustomUserControls"
+             xmlns:sys="clr-namespace:System;assembly=mscorlib"
              mc:Ignorable="d"
              d:DesignWidth="760" d:DesignHeight="560">
     <!--
@@ -18,6 +19,10 @@
       布局全用 Grid/UniformGrid 星号,不写死像素,随顶层 Viewbox(Uniform) 等比缩放(M4-01-1)。
     -->
     <UserControl.Resources>
+        <!-- 兜底:键盘自带 TouchMinSize(=全局同值 48),作为本控件内的就近资源。
+             即便全局 AdaptiveStyles 字典被增删/重排导致全局 TouchMinSize 缺失,
+             下方按键样式的 {StaticResource TouchMinSize} 仍解析到此本地值,绝不再 UnsetValue → 杜绝 MinHeight 洪流复发。-->
+        <sys:Double x:Key="TouchMinSize">48</sys:Double>
         <!--
           键盘按键隐式样式:统一触控基准、字号、间距与按下反馈,作用域仅本控件内的标准 Button
           (动态注入的全键盘按键同样命中)。MinHeight/MinWidth 引用全局 TouchMinSize(=48)(M4-01-4)。

+ 16 - 0
项目文档/进度/交接卡.md

@@ -644,3 +644,19 @@
 - **编译核实**:`dotnet build operate` **0 个 error CS**(B 代码编译通过);出现 26 个 MSB3021/3027=**operate.exe(PID 3432,11:37 启动)正在运行锁住输出 DLL**,非代码错。codegraph sync done。
 - **部署/验证(待用户)**:① log4net `[assembly:XmlConfigurator(Watch=true)]` 开了热监听→**C 配置替换 operate 输出目录的 log4net.config 即热生效、无需重启**(可立即封顶文件);② **B 在 DLL 里→必须关 operate→重新编译→重启** 才生效;③ 重启后顺带可运行期定位 A(那个 MinHeight=UnsetValue 控件)。
 - **下一步**:用户关闭并重启 operate(部署 B+C);重启时运行期定位根因 A。本次 B+C 源码+文档待提交 push。
+
+## 2026-06-21 · ★★日志 8GB 根因 A 彻底定位并修复(根因+键盘兜底,运行期验证通过)★★
+- **承接**:上轮已查 8GB=WPF 布局异常 `MinHeight=UnsetValue` 逐帧刷屏(B 节流+C 滚动已部署)。本轮**定位真凶 A 并修复**。
+- **定位手段(系统化调试,先用已有证据再加探针)**:
+  · 读 8GB 完整堆栈:throw 在 `FrameworkElement.MinMax..ctor→get_MinHeight`(读 MinHeight 时有效值=UnsetValue),**全框架帧、无自定义帧** → 坏值来自 Style/Binding/资源,非自定义代码。文件最前一条=`00:00:00,001`,证明洪流跨午夜自前一天持续刷、是**一旦启动就自维持的循环**。
+  · 当前 Debug 版**复现不出**(主页/操作/软键盘都不抛)→ 加一次性可视树探针(App.xaml.cs 临时,遍历 PresentationSource 含 Popup,逐元素 try{fe.MinHeight} 捕获抛异常者+值来源+祖先链,写 `C:\TLData\A_locator.log`)。
+  · 关键变量:`ChangeLanguage`(App_Startup 调)**DEBUG 路径** `C:\PersonalSpace\...\SurfaceLan` 本机不存在→提前 return 不删字典→Debug 不复现;**RELEASE 路径**(部署 Resources\Language)存在→执行 RemoveAt。**人为造 DEBUG 路径**复现 Release 行为后,探针**精确命中 57 个元素全是 SoftKeyboard 的 Button、值来源全=Style、全 UnsetValue,MainWindow 树 0 命中**。
+- **根因 A(确诊)**:`App.xaml` 把 `AdaptiveStyles.xaml`(全局 `TouchMinSize` 所在)加成**最后一个** MergedDictionary(line 30,M4 加在语言字典 line 27 之后)→ `ChangeLanguage` 盲删"最后一个字典"本想换语言字典、**实删 AdaptiveStyles** → `TouchMinSize` 全局丢失 → `SoftKeyboard.xaml` 键盘按键隐式样式 `MinHeight={StaticResource TouchMinSize}` 解析成 **UnsetValue** → 键盘在树里时每帧抛 → 自维持洪流(旧键盘机制注入 Viewbox 内 MainGrid,堆栈根=MainWindow Viewbox 吻合)。a4f3a14 的 Popup 修复只换了洪流宿主、**没修根因**;只因 8GB 那个 Release 实例 11:52 被杀、之后都跑 Debug(提前 return 保住字典)才"看似好了"。
+- **修复(根因+兜底,用户拍板)**:
+  · ① `App.xaml.cs ChangeLanguage`:不再 `RemoveAt(Count-1)` 盲删;改为**按引用移除上一次语言字典**(新增字段 `_currentLangRd`),**首次按 `Source` 含 `/Language/` 匹配移除** App.xaml 预置语言字典,**绝不碰 AdaptiveStyles**。→ TouchMinSize 永远在;**顺带修好被静默禁用的 M4-02 触控基准**(隐式 MinHeight=48 在 Release 一直没生效)。
+  · ② `SoftKeyboard.xaml`:UserControl.Resources 内置 `<sys:Double x:Key="TouchMinSize">48`(就近兜底)+ 加 `xmlns:sys`。即便将来全局字典再被增删,键盘按键 MinHeight 仍解析到本地 48,**杜绝洪流复发**(防御纵深)。
+- **验证(运行期,Release 场景模拟)**:保留人造 DEBUG 语言路径(=模拟 Release 删字典)重编译重启→**软键盘正常弹出**(对比修复前因 UnsetValue 弹不出)、`A_locator.log` 未生成、近窗口期所有日志 **MinHeight 计数=0**。改后 `dotnet build operate` 0 error CS。
+- **清理**:探针(App.xaml.cs ProbeMinHeightCulprit/ProbeWalk+触发调用)、临时旁路(MainWindow.xaml.cs TEMP-ALOCATOR)、人造 DEBUG 路径 `C:\PersonalSpace` **全部撤除**;`git diff` 仅余 App.xaml.cs(+29)/SoftKeyboard.xaml(+5)两处目标修复,零诊断残留。codegraph sync done。**B 节流保留**(防任何未来布局异常再洪流的安全网)。
+- **⚠ 行为变化(留意/真机视觉复验)**:根因修复后 **Release 版 M4-02 触控基准隐式样式(Button/TextBox/ListBoxItem/RadioButton/CheckBox/TextBox/PasswordBox 的 MinHeight/MinWidth=48 + Padding)会重新生效**(此前在 Release 被 ChangeLanguage 静默删掉)。Debug 一直是生效的(提前 return),G2 视觉也在 Debug 验的,故 Release 现与 Debug/已测一致;仍登记真机视觉复验。
+- **旁路发现(另立,未修)**:M8 操作日志没入库——查清=**aivfo-oplog 微服务没起**(本机零 java 进程),Kafka(108 服务器)消息无人消费写 `log.operation_log`;埋点代码无问题,属运行期"待起 Kafka+oplog 端到端抽查"。用户:Kafka 在 108、oplog 在本机,暂不便测,**以后再弄**。
+- **下一步**:① 最终干净重编译(需关 operate 解锁 DLL)产出无诊断 exe;② commit+push 本修复+文档;③ 8GB 旧文件 `20260621.htm` 可手动删/归档(已冻结)。后续:G2 真机视觉(含触控基准复活复验)/G1-1 借用真机/oplog 端到端。

+ 11 - 11
项目文档/进度/进度状态.yaml

@@ -1,18 +1,18 @@
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
-更新时间: 2026-06-21 日志8GB根因=WPF MinHeight=UnsetValue布局异常逐帧刷屏;B(处理器节流)+C(滚动配置)已改编译过,待重启operate部署
+更新时间: 2026-06-21 日志8GB根因A已确诊并修复(ChangeLanguage误删AdaptiveStyles→TouchMinSize丢失→软键盘按键MinHeight=UnsetValue洪流);根因+键盘兜底已改+运行期验证通过,待最终干净重编译+提交
 当前任务: >
-  【★日志 8GB 根因已查清+B/C 两层修复(编译过,待部署)★】真凶=WPF 布局异常 `MinHeight=UnsetValue` 逐帧刷屏
-  (8GB 样本 420/420 同一异常、每条带 Viewbox.MeasureOverride 堆栈、~2MB/s;6-19 才 4626B=回归),非滚动配置。
-  · 已改 C(滚动):两份源 log4net.config(ivf_tl_Services + control/ivf_tl_Services=写 ivf_tl_Control_logs 那份)
-    RollingStyle Date→Composite + MaxFileSize 10240→10MB,XML 校验过。
-  · 已改 B(节流):operate App.xaml.cs 加 ShouldLogThrottled,UI 异常处理器同签名 10s 只记一条。dotnet build operate
-    0 个 error CS(26 个 MSB3021/3027=operate.exe PID3432 运行中锁 DLL,非代码错)。codegraph sync done
-  · A(根因 UI bug)静态查不到:operate XAML/code-behind 无问题 MinHeight,嫌疑=二进制库 WpfControlLibrary 模板,
-    ★需运行期定位(挂异常抓 target,启 operate GUI/UAC,用户在场)★
-  下一步:★用户关 operate→重新编译→重启★ 部署 B+C(log4net Watch=true,C 配置替换输出目录文件可热生效免重启;
-    B 在 DLL 必须重启);重启时运行期定位根因 A。本次 B+C 源码+文档已提交待 push
+  【★日志 8GB 根因 A 已确诊+修复+验证通过★】真凶=ChangeLanguage(App启动)盲删"最后一个MergedDictionary"
+  实删了 AdaptiveStyles.xaml(TouchMinSize 所在)→ SoftKeyboard 键盘按键隐式样式 MinHeight={StaticResource TouchMinSize}
+  解析成 UnsetValue → 键盘在树里每帧抛(探针确诊:57个元素全是SoftKeyboard的Button,MainWindow树0命中)。
+  · 修复(已改+验证):①App.xaml.cs ChangeLanguage 改按引用删语言字典(新增_currentLangRd)+首次按Source含/Language/匹配,绝不碰AdaptiveStyles
+    (顺带修好Release下被静默禁用的M4-02触控基准);②SoftKeyboard.xaml内置TouchMinSize=48兜底+xmlns:sys。
+  · 验证:模拟Release场景(人造DEBUG语言路径)重启→键盘正常弹出、A_locator未生成、日志MinHeight计数=0。dotnet build 0 error CS
+  · 清理:探针/临时旁路/人造路径全撤,git diff仅App.xaml.cs+SoftKeyboard.xaml两处目标修复。B节流保留。
+  下一步:★关 operate→最终干净重编译(出无诊断exe)→commit+push★;旧8GB文件20260621.htm可删/归档
+  ⚠行为变化:Release版M4-02触控隐式样式(MinHeight=48等)随修复复活,真机视觉登记复验(Debug一直生效,与已测一致)。
+  旁路(未修,以后弄):M8操作日志没入库=aivfo-oplog微服务没起(本机零java进程),非埋点代码问题
   续接读:《工作计划表》+《当前开发计划》+ 本文件 + 交接卡末尾。
 说明: >
   M0-M5 全部【可写源码】已完成,C#合并端 0 error + M2-02 单测 15/15。工具链就位(JDK11.0.25 + Maven3.9.9