Explorar el Código

G2-1 首页舱室加皿弹窗自适应:套 Viewbox + 按工作区等比缩放

AddDishWindowView 是独立 Window(ShowDialog),根写死 Height=2500 Width=1422
且无 Viewbox→2500px 超出屏幕,窗口偏上、下半部(底部启动/保存按钮)被裁。
修复(同 G2-2 思路,不动内部 Canvas 绝对坐标):XAML 根 Grid 套 Viewbox{Uniform}
+设计基准 1422×2500;code-behind 加 ApplyResponsiveSize() 按 SystemParameters
.WorkArea*0.96 等比算窗口尺寸(只缩不放),新建/编辑两个构造均调用。
CenterOwner 居中→整窗等比缩进屏幕、完整可见、不溢出不变形。
用户在场实机验证通过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie hace 5 días
padre
commit
b5c4e3f946

+ 4 - 1
ivf_tl_operate_2.0/ivf_tl_Operate/View/AddDishWindowView.xaml

@@ -12,7 +12,9 @@
         ShowInTaskbar="False"
         AllowsTransparency="True"
         Title="Window" Height="2500" Width="1422">
-    <Grid Background="Transparent">
+    <!-- G2-1:外层 Viewbox(Uniform) 把设计基准 1422×2500 等比缩放进窗口客户区;窗口尺寸由 code-behind 按屏幕工作区算,避免写死像素超出屏幕被裁。内部 Canvas 绝对坐标原样跟随缩放,不改。 -->
+    <Viewbox Stretch="Uniform">
+    <Grid Width="1422" Height="2500" Background="Transparent">
         <Grid.RowDefinitions>
             <RowDefinition Height="134"/>
             <RowDefinition Height="*"/>
@@ -186,4 +188,5 @@
         </Border>
         <Grid x:Name="_mask" Grid.Row="0" Grid.RowSpan="2" Opacity="0.8" Background="Black" Visibility="Hidden" />
     </Grid>
+    </Viewbox>
 </Window>

+ 21 - 0
ivf_tl_operate_2.0/ivf_tl_Operate/View/AddDishWindowView.xaml.cs

@@ -55,6 +55,7 @@ namespace ivf_tl_Operate.View
         {
             InitializeComponent();
             this.Owner = AppData.Instance.MainWindow;
+            ApplyResponsiveSize(); // G2-1:按屏幕工作区等比缩放窗口,避免写死 1422×2500 超出屏幕被裁
             this.isBalacne = isBalacne;
             this.balanceId = balanceId;
             this.TextBlock_HouseSn.Text = housesn.ToString();
@@ -85,6 +86,25 @@ namespace ivf_tl_Operate.View
             Closed += (a, b) => AppData.Instance.MainWindow.Activate();
         }
 
+        /// <summary>
+        /// G2-1:按屏幕工作区把设计基准 1422×2500 等比缩放为窗口实际尺寸(只缩不放),
+        /// 配合 XAML 外层 Viewbox(Uniform),使弹窗在任意分辨率/竖屏下完整可见、居中、不溢出、不变形。
+        /// </summary>
+        private void ApplyResponsiveSize()
+        {
+            try
+            {
+                const double designW = 1422.0, designH = 2500.0;
+                var wa = System.Windows.SystemParameters.WorkArea; // 去掉任务栏的可用区
+                double margin = 0.96;                               // 四周留一点边距
+                double scale = System.Math.Min(wa.Width * margin / designW, wa.Height * margin / designH);
+                if (scale > 1.0) scale = 1.0;                       // 设计稿够大时不放大
+                this.Width = designW * scale;
+                this.Height = designH * scale;
+            }
+            catch { /* 兜底:保留 XAML 默认尺寸 */ }
+        }
+
         /// <summary>
         /// 修改患者
         /// </summary>
@@ -94,6 +114,7 @@ namespace ivf_tl_Operate.View
         {
             InitializeComponent();
             this.Owner = AppData.Instance.MainWindow;
+            ApplyResponsiveSize(); // G2-1:按屏幕工作区等比缩放窗口,避免写死 1422×2500 超出屏幕被裁
             ExDish = exDish;
             this.TextBlock_HouseSn.Text = ExDish.houseSn.ToString();
             //this.numbertext.Text = $"编辑患者信息";

+ 1 - 1
项目文档/开发计划/2026-06-20-当前开发计划.md

@@ -52,7 +52,7 @@
 
 **涉及文件**:operate 首页舱室弹框视图、M4 清单 13 子页(去写死 2736×1824 像素 + Viewbox/弹性)、TabTip 屏蔽处、well 状态色彩样式。
 
-- [ ] **G2-1** `[纯代码][P1]` 首页舱室弹框位置/大小修复。
+- [x] **G2-1** `[纯代码][P1]` 首页舱室弹框位置/大小修复。 ✅2026-06-20 **实机验证通过**:定位=首页点空舱室弹 `AddDishWindowView`(独立 Window,ShowDialog)。问题=根写死 `Height=2500 Width=1422` 无 Viewbox→超屏被裁(用户实测窗口偏上、下半部含底部按钮被裁)。修复(同 G2-2 思路不动内部 Canvas):XAML 根 Grid 套 `Viewbox{Uniform}`+设计基准 1422×2500;code-behind `ApplyResponsiveSize()` 按 `SystemParameters.WorkArea*0.96` 等比算窗口尺寸(只缩不放),两构造(新建/编辑患者)都调。编译 0err,用户在场实机=完整显示/底部按钮可见/居中不变形。
 - [x] **G2-2** `[纯代码][P1]` M4 13 子页自适应(按 M4-01-5 清单:去写死像素 + Viewbox/弹性 + 零滚动,子页根无 2736×1824)。 ✅2026-06-20 **根层完成·真机视觉待验**:关键约束=内容外层只有 MainWindow 一个 `Viewbox{Uniform}`、以无约束测量子页自然尺寸再缩放,含 `*` 星号行的页靠根 Height=2736 撑开,直接删根尺寸会塌缩。方案=**设计基准下沉一处**:`MainWindow.xaml` 的 `MainGrid` 加 `Width=1824 Height=2736`(唯一固定基准,D6 真机校准只调这一处,同时修好样板 MainPageView);11 全屏子页根 `Height="2736" Width="1824"`→`d:DesignHeight/d:DesignWidth`(About/Alarm/AutoFocus/Buffer/Chart/Detail/DishRecord/HouseSetting/Photo/Setting/HouseDebug)。**本轮只动根尺寸**;内层 Canvas 绝对定位/内层 Width=1824(Setting 多 Grid、Photo WrapPanel 等)=深层 R6「去 Canvas 绝对坐标」留后续真机轮。CCDSettingView 已达标不改;AddDishWindowView 是 Window 弹窗归 G2-1。★grep 根运行时尺寸清零 + dotnet build operate 0 error + codegraph sync done。7 个星号页+主页真机视觉(满屏不溢出/不塌缩/不变形)= G2 门控待用户★。
 - [ ] **G2-3** `[纯代码][P2]` TabTip 程序级屏蔽实现。
 - [ ] **G2-4** `[纯代码][P2]` well 三态色彩。

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

@@ -591,3 +591,13 @@
 - **验证闭环**:①0×0 解决 ②高度够 ③居中、底行完整、输入写回正常。`dotnet build operate` 0 error(每轮改后重编译+重启验)。
 - **经验**:Viewbox 内固定尺寸容器中动态浮层→必用顶层 Popup;全屏覆盖型 Popup 里的内容**居中**比**贴边**稳,贴底/贴边易被屏幕物理边界裁切(尤其 DPI/窗口尺寸与屏幕不完全一致时)。
 - 下一步:git 提交本修复(SoftKeyboardHost.cs + 本轮文档 + 此前累计未提交改动);然后按工作计划继续。
+
+## 2026-06-20 · ★G2-1 首页舱室加皿弹窗自适应修复·实机验证通过(用户在场)★
+- **任务**:G2-1 首页舱室弹框位置/大小修复。定位=首页点空舱室走 `MainPageView.CustomHouseInfo_ClickHouseEvent`→`new AddDishWindowView(...).ShowDialog()`(有皿则进 DetailPageView 整页,非弹框)。
+- **问题(实机确认)**:AddDishWindowView 是独立 `<Window>`(WindowStyle=None/AllowsTransparency/CenterOwner),根**写死 Height=2500 Width=1422**,内部整片 Canvas 绝对定位;独立窗口**不套主程序 Viewbox**,2500px 物理像素直出超出屏幕→用户实测"窗口偏上、下半被裁",底部启动平衡皿/启动培养皿/保存按钮(Grid.Row=4)看不到。
+- **修复(同 G2-2 思路,不动内部 Canvas 绝对坐标)**:
+  · XAML:根 `<Grid>` 套进 `<Viewbox Stretch="Uniform">`,并给该 Grid 显式设计基准 `Width=1422 Height=2500`(原靠 Window 尺寸撑开,现 Window 尺寸要变故必须显式给 Viewbox 测量基准)。Window 的 Height/Width 保留(被 code-behind 覆盖)。
+  · code-behind:新增 `ApplyResponsiveSize()`——`scale=min(WorkArea.W*0.96/1422, WorkArea.H*0.96/2500)`(只缩不放,留边距),设 `this.Width/Height=design*scale`;**两个构造函数(新建患者/编辑患者)均在 InitializeComponent+Owner 后调用**。CenterOwner 居中→整窗等比缩进屏幕工作区、完整可见、不溢出、不变形(Uniform 保正圆/比例)。
+- **验证**:`dotnet build operate` 0 error;用户在场实机=窗口完整显示、底部按钮可见、居中不变形→**通过**(重启 PID 7052 验)。
+- **同类问题归纳**:operate 里"独立 Window 弹窗写死大像素无 Viewbox"是一类通病(与软键盘贴底被裁、子页写死 2736 同源)。本次修了加皿窗;其它 Window 弹窗(GetDateWindow/MessageWindow/LoginWindow 等)如真机发现超屏,可套用同一 ApplyResponsiveSize+Viewbox 模式。
+- 本次未 git commit(待与文档一并)。下一步:提交;然后按计划继续(纯代码 G2-3 TabTip/G2-4 well三态;或用户在场做实机门控 G1-1/G4-3/G5)。

+ 1 - 1
项目文档/进度/工作计划表.md

@@ -103,7 +103,7 @@
 | M4-01 | 自适应竖屏框架 + 触控 + 圆形 + 键盘 + 主页零滚动 | 🔶 | M1-01 | 框架/主页/键盘/双语落地 | 07;M4子计划;主窗/主页/新页已改 | ✔ |
 | M4-子页 | 13 子页自适应(去写死像素 + Viewbox) | 🔶 | M4-01 | 各子页各分辨率布局正常 | **G2-2 ✅2026-06-20 根层完成**:宿主 MainGrid 下沉 1824×2736 基准 + 11 页根 Height/Width→d:Design*;编译0err;7 星号页真机视觉待验。内层 Canvas 绝对定位留深层轮。**回归修复2026-06-20 ✅实机验证通过**:MainGrid 固定+Viewbox 后软键盘 0×0,SoftKeyboardHost 改顶层 Popup 托管(脱离 Viewbox)+键盘屏幕居中(贴底会被屏幕裁掉"确定"行),用户在场三轮验通过 | ✔ |
 | M4-TabTip | TabTip(系统触摸键盘)程序级屏蔽 | ❌ | M4-01 | TabTip 不弹 | 审计 D2/B4:仅停 osk + IME 禁用,TabTip 未屏蔽 | ✔ |
-| M4-弹框 | 首页舱室弹框 / 标定弹窗 位置/大小修复 | 🔶 | M4-01 | 弹框位置正确居中 | 真机视觉待修 | ✔ |
+| M4-弹框 | 首页舱室弹框 / 标定弹窗 位置/大小修复 | 🔶 | M4-01 | 弹框位置正确居中 | **G2-1 加皿弹窗 ✅2026-06-20 实机验证通过**:AddDishWindowView 写死 2500×1422 超屏被裁→套 Viewbox{Uniform}+ApplyResponsiveSize 按工作区等比缩放居中。标定弹窗等其它 Window 弹窗如真机超屏可套同模式 | ✔ |
 
 **M4 总评**:🔶 框架部分落地;子页自适应/TabTip 欠账,弹框位置待修。
 

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

@@ -1,16 +1,16 @@
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
-更新时间: 2026-06-20 G2 软键盘 Viewbox 适配回归修复【实机验证通过】,待 git 提交
+更新时间: 2026-06-20 G2-1 首页加皿弹窗自适应【实机验证通过】,待 git 提交
 当前任务: >
-  【★G2 软键盘修复·实机验证通过★】根因=G2-2 给 MainGrid 加固定 1824×2736 套进 Viewbox 后,原"动态加键盘到
-  root Panel"方案失效→键盘 0×0 不可见(即"舱室调试输密码小键盘"问题)
-  · 最终修复 SoftKeyboardHost.cs(KeyboardOverlay.Show/Dispose+_popup 字段):键盘+透明背景捕获层放进顶层 Popup
-    (脱离 Viewbox 独立布局根);键盘 VerticalAlignment=Center 屏幕居中(贴底会被屏幕底裁掉"确定"行,居中绝不裁);
-    尺寸按窗口 ActualWidth/Height 动态算(Password≤960×860 / Number≤640×680)
-  · ★实机三轮验:①弹出 0×0 已解决 ②高度够、底行"确定"完整 ③居中显示正常。dotnet build operate 0 error。★
-  下一步:git 提交本修复(含累计未提交改动+本次文档);然后按工作计划挑下一项。
-  纯代码候选:G2-1 首页弹框 / G2-3 TabTip 系统键盘屏蔽 / G2-4 well 三态(需求未定先定义) / G1-2 ComBin 去重。
+  【★G2-1 首页舱室加皿弹窗位置/大小修复·实机验证通过★】问题=AddDishWindowView 是独立 Window(ShowDialog),
+  根写死 Height=2500 Width=1422 且无 Viewbox 缩放,2500px 高超出屏幕→窗口偏上、下半(底部启动/保存按钮)被裁
+  · 修复(同 G2-2 思路,不碰内部 Canvas 绝对坐标):XAML 根 Grid 套进 Viewbox{Uniform}+给设计基准 Width=1422
+    Height=2500;code-behind 加 ApplyResponsiveSize()(按 SystemParameters.WorkArea*0.96 等比算窗口实际尺寸,只缩不放),
+    两个构造(新建/编辑患者)都调。CenterOwner 居中→整窗等比缩进屏幕、完整可见、不变形
+  · ★dotnet build operate 0 error;用户在场实机验:窗口完整显示、底部按钮可见、居中不变形 通过。★本次未提交。
+  下一步:git 提交本修复(AddDishWindowView.xaml/.cs+文档);然后按工作计划挑下一项。
+  纯代码候选:G2-3 TabTip 系统键盘屏蔽 / G2-4 well 三态(需求未定先定义) / G1-2 ComBin 去重。
   实机门控候选(用户在场可做):G1-1 串口 T1.4 / G4-3 SQLite 列迁移 / G5 业务回归。
   续接读:《工作计划表》+《当前开发计划》+ 本文件 + 交接卡末尾。
 说明: >