94 lines
4.0 KiB
C#
94 lines
4.0 KiB
C#
// 旧版双 TabControl 布局的兼容层。
|
||
// 旧项目主窗口结构:tabControl1(顶部 项目/报价/设置) + tabControl2(左 项目/报价/选型) + tabControl3(右 元件库/用户库/...)。
|
||
// 新项目改为停靠面板后,旧逻辑里的 tabControl2/tabPageN 引用通过本文件映射到停靠窗口。
|
||
using System;
|
||
using WeifenLuo.WinFormsUI.Docking;
|
||
|
||
namespace 成套报价软件
|
||
{
|
||
public partial class MainForm
|
||
{
|
||
private 旧选项卡兼容 _tabControl2兼容;
|
||
|
||
/// <summary>旧 tabControl2 → 停靠面板当前活动文档。</summary>
|
||
internal 旧选项卡兼容 tabControl2 {
|
||
get {
|
||
if (_tabControl2兼容 == null) {
|
||
_tabControl2兼容 = new 旧选项卡兼容(delegate { return this.dockSurface1.ActiveContent as DockContent; });
|
||
}
|
||
return _tabControl2兼容;
|
||
}
|
||
}
|
||
|
||
// ---- 旧页签名 → 新控件别名(旧代码 this.tabPageN 继续可用)----
|
||
|
||
/// <summary>旧左侧"项目"页 → 停靠窗口"项目"。</summary>
|
||
public DockContent tabPage3 { get { return this.w1; } }
|
||
/// <summary>旧左侧"报价"页 → 停靠窗口"报价"。</summary>
|
||
public DockContent tabPage4 { get { return this.w2; } }
|
||
/// <summary>旧左侧"选型"页 → 停靠窗口"选型"。</summary>
|
||
public DockContent tabPage10 { get { return this.w3; } }
|
||
/// <summary>旧右侧"元件库"页 → 停靠窗口"元件库"。</summary>
|
||
public DockContent tabPage5 { get { return this.w4; } }
|
||
/// <summary>旧右侧"用户库"页 → 停靠窗口"用户库"。</summary>
|
||
public DockContent tabPage6 { get { return this.w5; } }
|
||
/// <summary>旧右侧"柜体库"页 → 停靠窗口"柜体库"。</summary>
|
||
public DockContent tabPage11 { get { return this.w6; } }
|
||
/// <summary>旧右侧"母排"页 → 停靠窗口"母排"。</summary>
|
||
public DockContent tabPage12 { get { return this.w7; } }
|
||
/// <summary>旧右侧"方案"页 → 停靠窗口"方案"。</summary>
|
||
public DockContent tabPage13 { get { return this.w8; } }
|
||
/// <summary>旧右侧"箱体计算"页 → 停靠窗口"箱体计算"。</summary>
|
||
public DockContent tabPage14 { get { return this.w9; } }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 旧 TabControl 的兼容壳:
|
||
/// SelectedTab → 停靠面板当前活动停靠窗口(读),激活该窗口(写);
|
||
/// SelectedIndexChanged → 由 dockSurface1.ActiveContentChanged 触发(见 MainForm.DockSurface1ActiveContentChanged)。
|
||
/// </summary>
|
||
internal class 旧选项卡兼容
|
||
{
|
||
private readonly Func<DockContent> _active;
|
||
private DockContent _lastSeen;
|
||
|
||
public 旧选项卡兼容(Func<DockContent> active)
|
||
{
|
||
_active = active;
|
||
}
|
||
|
||
/// <summary>当前活动停靠窗口;无活动文档时为 null。赋值 = 激活对应停靠窗口。</summary>
|
||
public DockContent SelectedTab {
|
||
get { return _active(); }
|
||
set {
|
||
var d = value;
|
||
if (d != null) { d.Show(); d.Activate(); }
|
||
}
|
||
}
|
||
|
||
/// <summary>本次事件触发之前的活动停靠窗口(识别"从哪页切过来";null=未知/首次触发)。</summary>
|
||
public DockContent PreviousSelectedTab { get; private set; }
|
||
|
||
/// <summary>最近一次真实活动的停靠窗口(不会被单元格编辑导致的 null 闪断清空)。</summary>
|
||
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); }
|
||
}
|
||
}
|
||
}
|