编制日期:2026-06-17 · 里程碑:M4 · 对应需求 4/5/6/6.1/11(兼顾 12)· 决策 D6 · 风险 R6 父需求:
../00-需求总览.md§3(需求 4/5/6/11)、§5(🔶D6)、§6(R6) · 方案权威:../需求文档/07-UI改造方案.md改造对象工程:ivf_tl_operate_2.0/ivf_tl_Operate/(前台 UI,合并后主进程)
把 operate 端从「写死 1824×2736 竖屏 + Release 无缩放 + 原生 TextBox 唤起系统软键盘」改造为:
osk.exe,并屏蔽系统软键盘(TabTip/osk);只改布局/呈现/输入层,不改业务逻辑与数据绑定。 所有 ViewModel、ExHouse*/ExDish* 绑定、ClickHouseEvent、菜单 Click 事件、密码校验语义(MiMa())保持不变。
| 关注点 | 现状(核对到的精确位置) | M4 处理 |
|---|---|---|
| 主窗口 | MainWindow.xaml:1-16:Height="2736" Width="1824",WindowState=Maximized;MainWindow.xaml.cs:32-41 仅 #if DEBUG 包 Viewbox,Release 无缩放 |
M4-01:Release 也包 Viewbox(分辨率无关) |
| 主页根 | MainPageView.xaml:10 Height="2736" Width="1824";:11-17 四行 250/250/*/324 写死像素 |
M4-01:去写死宽高 + 行高改星号比例 |
| 舱室控件 | CustomHouseInfo.xaml.cs:17(class,5 处引用);.xaml:10 Canvas Height="955" Width="360";圆几何在 .cs:24-34(16等分/半径115/小圆21/偏移90°) |
M4-03:保留圆形几何,外壳改自适应;缓冲瓶不走此控件 |
| 10 舱布局 | MainPageView.xaml:95-150 Grid 13 列(4 舱列星号 + 分隔线 1px),5行×2列;缓冲瓶(11号)走 ExHouse11 顶部状态条(:34-40) |
M4-05:弹性填满零滚动;缓冲瓶维持顶部呈现 |
| 底部导航 | MainPageView.xaml:153-170:ButtonTopImage 写死 Height="324" Width="456" |
M4-01/02:去写死、热区达标 |
| 密码输入 | SettingPageView.xaml.cs:106-110 MiMa(PasswordBox) 校验 tl13579;7 处入口(:167/190/213/237/256/291/323) |
M4-04:绑内置密码键盘,校验语义不动 |
| 软键盘 | LoginWindow.xaml.cs:30,116-133:TouchUp 调 Process.Start("osk.exe");LoginWindow.xaml 4 个 TextBox/1 个 PasswordBox |
M4-04:替换为内置键盘 + 屏蔽 osk/TabTip |
| 全局资源 | App.xaml:8-587:ResourceDictionary + 合并 WpfControlLibrary 多个字典;含 ScrollBar/ComboBox 样式 |
M4-02/04:新增触控样式、键盘资源挂这里 |
现状布局方式 = 写死像素 + 绝对定位(MainWindow/各 UserControl 固定 1824×2736,Canvas 绝对坐标,字号/行高大量绝对值),Release 无任何缩放——换分辨率必然错位。这是 R6 工作量的根源。
ivf_tl_Operate)· MVVM(ViewModel 不动)Viewbox(等比) + Grid(星号/比例) + 弹性容器;去 Canvas 绝对坐标 / 去写死 Width/HeightUserControl(数字键盘 + 全键盘/密码键盘)+ Popup 弹出 + 附加属性绑定;不引第三方MinWidth/MinHeight ≥48px、Stylus.IsFlicksEnabled、ScrollViewer.PanningModeClickHouseEvent/菜单 Click 事件签名。圆形培养皿+16well+圆心舱号为强约束(需求 6.1),几何与语义不可改。Chinese.xaml/English.xaml,App.xaml:27-28)不在 M4 改,仅保证布局改造后 DynamicResource 文案绑定不破。每步产出登记到统一清单(建议沿用 M1/M3 的 V-xxx 编号,本计划用 V-M4-xx)。所有需运行/真机/Surface 的项标注 [M7],自适应基准相关项标注 [D6]。
| 任务 | 主题 | 需求 | 步骤数 |
|---|---|---|---|
| M4-01 | 自适应竖屏框架(去写死像素 + Viewbox + 弹性容器) | 4 | 5 |
| M4-02 | 触控优先兼容鼠标(热区/手势/输入友好) | 5/6 | 4 |
| M4-03 | 主页圆形造型(培养皿+16well+圆心舱号 / 缓冲瓶单列) | 6.1 | 4 |
| M4-04 | 内置数字/密码键盘 + 屏蔽系统软键盘 | 11 | 5 |
| M4-05 | 主页零滚动(一屏排布、无滚动条) | 6 | 3 |
共 5 子任务 / 21 步骤。建议执行序:M4-01 → M4-05 → M4-03 → M4-02 → M4-04(先立框架与主页骨架,再做圆形与触控细化,最后做键盘)。各步彼此低耦合,可分人并行 M4-04 与 M4-02/03。
目标:根布局改为分辨率无关;去写死像素;窗口/主页根容器自适应竖屏。不写死任何像素基准,最终分辨率基准登记 [D6][M7]。
ivf_tl_operate_2.0/ivf_tl_Operate/MainWindow.xaml:11、MainWindow.xaml.cs:32-42.xaml:11 删除 Height="2736" Width="1824"(保留 WindowState="Maximized" WindowStyle="None",让窗口随屏幕铺满)。.xaml.cs:32-41 把 #if DEBUG / #endif 去掉,使 Viewbox 缩放在 Release 也生效:MainGrid → Viewbox{Stretch=Uniform} → Content。保留 Stretch=Uniform(等比,竖屏不变形)。Maximized 决定,不再硬编码。Stretch=Fill 或切真弹性(关联 D6)。ivf_tl_operate_2.0/ivf_tl_Operate/View/MainPageView.xaml:10-17:10 删除 Height="2736" Width="1824",改由父级 Viewbox/容器拉伸;保留 d:DesignHeight/d:DesignWidth(设计期预览用,加 mc:Ignorable)即可。:11-17 四行 250/250/*/324 → 星号比例(如 Auto(顶栏按内容) / Auto(运行时间条) / *(舱区占满) / Auto(底部导航)),固定区用 Auto+内部 MinHeight,舱区用 * 吃掉剩余 → 零滚动地基。* 自动填满是主页零滚动的结构前提。Auto+MinHeight 而非绝对高。MinHeight≥触控基准。MainPageView.xaml:20-92ColumnDefinition Width="350" 等绝对列宽改为 Auto/* 组合;图标 Width/Height="39"、字号 FontSize="36/42" 等绝对值保留数值但置于 Viewbox 等比缩放下(D6 未定前不逐字号改相对单位,避免过度返工);运行时间栏(:66-92)三等分 * 已是弹性,保留。Auto/* 让左侧缓冲瓶状态块按内容、右侧报警块靠右。StatusControl(:62) 点击区在 M4-02 确认热区。ivf_tl_operate_2.0/ivf_tl_Operate/Resources/AdaptiveStyles.xaml(资源字典),在 App.xaml:8-29 MergedDictionaries 末尾追加一条引用。*/Auto 用法注释、触控基准尺寸 Double 资源(如 TouchMinSize=48,供 M4-02 引用)、Viewbox 包裹约定。不含业务样式。StaticResource 缺失(编译期,M7 跑通时确认)。View/ 下 13 个 xaml(AboutView/AddDishWindowView/AlarmPageView/AutoFocusSettingView/BufferDebugView/CCDSettingView/ChartPageView/DetailPageView/DishRecordView/HouseSettingPageView/PhotoPageView/SettingPageView/HouseDebugPageView)。目标:热区/组件 ≥48px、间距合理;触控点击/滚动顺畅且不破坏鼠标(远程/触屏故障兜底)。
Resources/AdaptiveStyles.xaml(M4-01-4 新建);引用方 MainPageView.xaml:160-169(底部 ButtonTopImage)。MinWidth/MinHeight(引用 TouchMinSize,建议 ≥48 设计单位,经 Viewbox 等比后实际更大);底部导航 ButtonTopImage 的写死 Height="324" Width="456" 改为 MinHeight/弹性宽(4 列 * 已等分,去固定宽即可)。*、高随 MinHeight。MainWindow.xaml.cs:156-175(DisableWPFTabletSupport 现被注释,:30 调用注释);App.xaml 全局 ScrollViewer 样式(:240-270)。DisableWPFTabletSupport 处于不启用(启用会吞触控/手写,与触控优先冲突);舱室与列表区设 ScrollViewer.PanningMode="VerticalFirst"、Stylus.IsFlicksEnabled="False"(已在 ComboBoxStyle1:550 用过该模式,沿用);保证现有 MouseDown/Click(如 CustomHouseInfo.Canvas_MouseDown、_canvas_MouseUp)与 TouchUp 并存——WPF 默认触控会 promote 成 Mouse 事件,无需双写,仅确认未调用会禁用 promotion 的 API。App.xaml ComboBox 样式 :539-583 已有触控 item 高 66);登记为规约项。ComboBoxItem 高(:566 Height="66")维持触控友好;新增/复用输入框 MinHeight 触控基准;「能选则选」原则下的点选组件(受精类型/语言/是否等,需求 11)改造登记,实际替换在 M4-04 之后逐项。Button/ButtonTopImage/ComboBox/可点 Canvas/图标按钮列出当前尺寸与是否达标),M7 真机逐项核。目标:每个培养舱保持「大圆=培养皿 / 圆周 16 小圆=well / 圆心=舱号」;缓冲瓶(11号)单独呈现。几何与业务语义不可改。
ivf_tl_operate_2.0/ivf_tl_Operate/CustomUserControls/CustomHouseInfo.xaml:10、.xaml.cs:24-43.cs:24-34(ellipseCount=16/samllRadius=21/bigRadius=115/angleOffset=90/angle=360/16)与 InitUserControl(:63-91) 的极坐标摆放保持原样——这是需求 6.1 强约束的圆形+16well 实现。.xaml:10 Canvas Height="955" Width="360" 维持(控件内部用固定画布坐标系,整体由父 Viewbox 等比缩放即自适应;不在控件内拆绝对坐标,避免破坏圆几何)。Canvas_MouseDown/_canvas_MouseUp(.cs:114-118,223-226) 点击进详情保持;整圆即热区,天然达标。CustomHouseInfo.xaml:27-41_canvasOpen 开舱态 :27-34 显舱号、_canvas 关舱态 :36-41 显大舱号+外环 _ellis)随等比缩放后舱号仍居中;舱号字号 FontSize="80"(:38) 保留(随 Viewbox)。不改 HouseDoorStateConvert 绑定逻辑。CustomHouseInfo.xaml.cs:148-221(SetDish/SetEmbryoState)、InitUserControl:87-89(空 well 白底)。:89 Colors.White);07 §4 要求「蓝=当前 well / 浅蓝=已放胚胎 / 白=空」。现状用图片(yuan.png/yz.png 等)表达胚胎态。色彩语义是否需补"当前 well 蓝/已放浅蓝"两态登记待确认(可能属业务呈现增强,超出"只改布局"边界)。MainPageView.xaml:20-41(顶栏左侧 ExHouse11 压力块)。CustomHouseInfo(无相机/不对焦/无 16well,07 §4),现状已在顶栏用 ExHouse11.PressureString/pressureDesc 单独显示——沿用此呈现,仅随 M4-01-3 顶栏弹性化;按 07 §3「缓冲瓶并入顶部状态条」补齐温度/补气显示(如缺)登记。目标:自绘内置数字键盘 + 密码键盘,点输入框弹出;屏蔽 osk/TabTip;绑定到调试页密码、参数数字输入框。校验语义不改。
ivf_tl_operate_2.0/ivf_tl_Operate/CustomUserControls/SoftKeyboard.xaml(.cs)(与现有 CustomHouseInfo 同目录,沿用 CustomUserControls 命名空间)。UserControl:数字键盘(0-9/退格/清除/确定,按键 MinHeight/MinWidth≥触控基准)+ 全键盘/密码键盘(字母+数字,供登录账号/密码)。键入通过事件/回调写回目标输入框(不直接依赖具体页面)。Grid 星号布局,随 Viewbox 等比;按键不写死像素。TouchMinSize)。SoftKeyboard 配套;可在 MainWindow.xaml:12-15(MainGrid 已有 _mask 遮罩 :14)复用遮罩层承载键盘 Popup。Popup 或顶层覆盖层),复用现有 _mask(MainWindow.xaml.cs:141-153 Mark())做背景压暗。ivf_tl_operate_2.0/ivf_tl_Operate/Windows/LoginWindow.xaml.cs:30,116-133(现 Process.Start("osk.exe"))。TextBox_TouchUp/PasswordBox_TouchUp 里启动 osk.exe 的逻辑(:121-123,131-133)与 KeyProcess 字段(:30),改为弹 M4-04-1 内置键盘;并在程序层禁用 TabTip(需求 11「禁 TabTip」——具体禁用方式注册表/服务/InputPane 抑制属真机环境项,登记 [M7])。SettingPageView.xaml(7 个 *_PasswordBox)+ SettingPageView.xaml.cs:106-110,167-323(MiMa() 及 7 处校验入口);登录 LoginWindow.xaml:64-73(PasswordBox)。PasswordBox 接到内置密码键盘(点击弹出、键入写回 PasswordBox.Password);MiMa() 校验逻辑与 tl13579 比对完全不动,仅改输入来源。CCDSettingView/AutoFocusSettingView/HouseSettingPageView/HouseDebugPageView/BufferDebugView 等含数字 TextBox 的页);登记逐页清单。目标:主页所有功能分区一屏内排布、无滚动条;沿用现有功能分区与业务绑定,桌面竖屏排版。
MainPageView.xaml:11-17(根 Grid,承接 M4-01-2)。Auto) + 运行时间条(Auto) + 舱区(*) + 底部导航(Auto),舱区 * 吃掉全部剩余高度,使整页恰好一屏、无垂直溢出;主页根不挂任何 ScrollViewer。* 自适应剩余空间。MainPageView.xaml:95-150(10 舱 Grid,13 列 / 4 行)。* + 分隔线 1px 维持;行 */1px 维持;确认 5行×2列(实为 2 内容行+分隔)的 CustomHouseInfo 随列宽/行高 * 弹性缩放(控件本身 M4-03 已等比);去除可能导致 overflow 的固定尺寸。*,舱控件等比。PanningMode)。| 编号 | 关联任务 | 标签 | 验证内容 |
|---|---|---|---|
| V-M4-01 | M4-01-1 | [D6][M7] | 主窗口各分辨率等比铺满、无变形 |
| V-M4-02 | M4-01-2 | [D6][M7] | 三段式比例合理、舱区占满 |
| V-M4-03 | M4-01-3 | [D6][M7] | 顶栏最窄分辨率不挤压/不截断 |
| V-M4-04 | M4-01-4 | [M7] | 自适应资源字典合并、无缺失引用 |
| V-M4-05 | M4-01-5 | [D6][M7] | 13 子页布局合理 + 整页滚动策略 |
| V-M4-06 | M4-02-1 | [M7] | 底部导航/主按钮热区达标 |
| V-M4-07 | M4-02-2 | [M7] | 触控滑动 + 鼠标点击/滚动并存 |
| V-M4-08 | M4-02-3 | [M7] | 下拉/选择组件触控可用 |
| V-M4-09 | M4-02-4 | [M7] | 全可交互元素热区走查 |
| V-M4-10 | M4-03-1 | [D6][M7] | 圆形不变形、16well 不错位 |
| V-M4-11 | M4-03-2 | [M7] | 开/关舱两态圆心舱号居中 |
| V-M4-12 | M4-03-3 | [M7] | well 三态色彩语义(含"当前 well"待确认) |
| V-M4-13 | M4-03-4 | [M7] | 缓冲瓶顶部单独呈现、不占圆形区 |
| V-M4-14 | M4-04-1 | [M7] | 内置键盘可点、热区达标 |
| V-M4-15 | M4-04-2 | [M7] | 键盘稳定弹/收、不挡输入框 |
| V-M4-16 | M4-04-3 | [M7] | 屏蔽 osk/TabTip、只弹内置键盘 |
| V-M4-17 | M4-04-4 | [M7] | 调试/登录密码走内置密码键盘、校验不变 |
| V-M4-18 | M4-04-5 | [M7] | 参数数字框走数字键盘 + 越界拦截 |
| V-M4-19 | M4-05-1 | [D6][M7] | 主页无滚动条、无裁切 |
| V-M4-20 | M4-05-2 | [D6][M7] | 10 舱弹性填满、不溢出 |
| V-M4-21 | M4-05-3 | [D6][M7] | 主页零滚动 + 其他页滚动策略 |
[D6] 项总说明:所有 [D6] 项的最终判定(Viewbox 等比是否足够、是否需切真弹性布局、设计基准分辨率取值)依赖 Surface 真机分辨率。M4 阶段交付"分辨率无关"实现即视为完成,[D6] 校准随 M7 真机一并定。