// 旧版双 TabControl 布局的兼容层。
// 旧项目主窗口结构:tabControl1(顶部 项目/报价/设置) + tabControl2(左 项目/报价/选型) + tabControl3(右 元件库/用户库/...)。
// 新项目改为停靠面板后,旧逻辑里的 tabControl2/tabPageN 引用通过本文件映射到停靠窗口。
using System;
using WeifenLuo.WinFormsUI.Docking;
namespace 成套报价软件
{
public partial class MainForm
{
private 旧选项卡兼容 _tabControl2兼容;
/// 旧 tabControl2 → 停靠面板当前活动文档。
internal 旧选项卡兼容 tabControl2 {
get {
if (_tabControl2兼容 == null) {
_tabControl2兼容 = new 旧选项卡兼容(delegate { return this.dockSurface1.ActiveContent as DockContent; });
}
return _tabControl2兼容;
}
}
// ---- 旧页签名 → 新控件别名(旧代码 this.tabPageN 继续可用)----
/// 旧左侧"项目"页 → 停靠窗口"项目"。
public DockContent tabPage3 { get { return this.w1; } }
/// 旧左侧"报价"页 → 停靠窗口"报价"。
public DockContent tabPage4 { get { return this.w2; } }
/// 旧左侧"选型"页 → 停靠窗口"选型"。
public DockContent tabPage10 { get { return this.w3; } }
/// 旧右侧"元件库"页 → 停靠窗口"元件库"。
public DockContent tabPage5 { get { return this.w4; } }
/// 旧右侧"用户库"页 → 停靠窗口"用户库"。
public DockContent tabPage6 { get { return this.w5; } }
/// 旧右侧"柜体库"页 → 停靠窗口"柜体库"。
public DockContent tabPage11 { get { return this.w6; } }
/// 旧右侧"母排"页 → 停靠窗口"母排"。
public DockContent tabPage12 { get { return this.w7; } }
/// 旧右侧"方案"页 → 停靠窗口"方案"。
public DockContent tabPage13 { get { return this.w8; } }
/// 旧右侧"箱体计算"页 → 停靠窗口"箱体计算"。
public DockContent tabPage14 { get { return this.w9; } }
}
///
/// 旧 TabControl 的兼容壳:
/// SelectedTab → 停靠面板当前活动停靠窗口(读),激活该窗口(写);
/// SelectedIndexChanged → 由 dockSurface1.ActiveContentChanged 触发(见 MainForm.DockSurface1ActiveContentChanged)。
///
internal class 旧选项卡兼容
{
private readonly Func _active;
private DockContent _lastSeen;
public 旧选项卡兼容(Func active)
{
_active = active;
}
/// 当前活动停靠窗口;无活动文档时为 null。赋值 = 激活对应停靠窗口。
public DockContent SelectedTab {
get { return _active(); }
set {
var d = value;
if (d != null) { d.Show(); d.Activate(); }
}
}
/// 本次事件触发之前的活动停靠窗口(识别"从哪页切过来";null=未知/首次触发)。
public DockContent PreviousSelectedTab { get; private set; }
/// 最近一次真实活动的停靠窗口(不会被单元格编辑导致的 null 闪断清空)。
public DockContent 最后活动窗口 { get { return _lastSeen; } }
public event EventHandler SelectedIndexChanged;
internal void RaiseSelectedIndexChanged()
{
// ★ 停靠版关键防护:点击单元格时焦点进入编辑控件,ActiveContent 会
// 瞬时闪断成 null 再跳回原窗口。这不是页签切换,必须忽略——
// 否则会触发全量保存+重算,表格刷新导致选中乱跑、刚插入的行被冲掉。
var cur = _active();
if (cur == null) return; // 焦点瞬时离开停靠面板(单元格编辑/浮动工具窗)
if (cur == _lastSeen) return; // 活动窗口没有真正变化
// 先记录切换来源再广播,供订阅方判断"从哪页切到哪页"
PreviousSelectedTab = _lastSeen;
_lastSeen = cur;
var h = SelectedIndexChanged;
if (h != null) { h(this, EventArgs.Empty); }
}
}
}