Files
lserp_cs_6.0/插件库/Lskj.Main/Control/MainPanelControlEx2.cs
T
2026-08-28 23:32:47 +08:00

106 lines
5.5 KiB
C#

using System;
using System.ComponentModel;
using System.Windows.Forms;
using DevExpress.XtraTab;
using Lskj.Business;
using Lskj.Model;
namespace Lskj.Main.Control
{
/// <summary>新版 WPF 主界面的 WinForms 过渡版。</summary>
public partial class MainPanelControlEx2 : UserControl
{
private ToolStripMenuItem _selectedTopMenu;
private bool _styleUpdatePending;
private bool _shortcutRedrawSuppressed;
private string _styledSubSysId;
private string _styledSubSysName;
public MainPanelControlEx2()
{
InitializeComponent();
// 运行时必须等旧控件 OnLoad 完成后再改菜单布局;否则旧逻辑会按
// 构造阶段的默认宽度计算“更多”,导致一级目录全部被收进去。
// 设计器不会触发业务 OnLoad,因此仅在设计时直接套用预览样式。
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
ApplyWpfShellStyle();
}
public float DpiX { get { return _legacyPanel.DpiX; } set { _legacyPanel.DpiX = value; } }
public float DpiY { get { return _legacyPanel.DpiY; } set { _legacyPanel.DpiY = value; } }
public int plTopHeight { get { return _legacyPanel.plTopHeight; } }
public FormWindowState State { get { return _legacyPanel.State; } set { _legacyPanel.State = value; } }
public XtraTabControl TabMain { get { return _legacyPanel.TabMain; } }
public Panel MainPanel { get { return _legacyPanel.MainPanel; } }
public AwaitScreenControl AwaitControl { get { return _legacyPanel.AwaitControl; } }
public PictureBox pic_search { get { return _legacyPanel.pic_search; } }
public event EventHandler OnMaxButtonCallBack { add { _legacyPanel.OnMaxButtonCallBack += value; } remove { _legacyPanel.OnMaxButtonCallBack -= value; } }
public event EventHandler OnMinButtonCallBack { add { _legacyPanel.OnMinButtonCallBack += value; } remove { _legacyPanel.OnMinButtonCallBack -= value; } }
public event EventHandler OnCloseButtonCallBack { add { _legacyPanel.OnCloseButtonCallBack += value; } remove { _legacyPanel.OnCloseButtonCallBack -= value; } }
public event EventHandler OnTopPanelMouseDoubleClickCallBack { add { _legacyPanel.OnTopPanelMouseDoubleClickCallBack += value; } remove { _legacyPanel.OnTopPanelMouseDoubleClickCallBack -= value; } }
public event MouseEventHandler OnTopMouseDownCallback { add { _legacyPanel.OnTopMouseDownCallback += value; } remove { _legacyPanel.OnTopMouseDownCallback -= value; } }
public event MouseEventHandler OnTopMouseUpCallBack { add { _legacyPanel.OnTopMouseUpCallBack += value; } remove { _legacyPanel.OnTopMouseUpCallBack -= value; } }
public event MouseEventHandler OnTopMouseMoveCallBack { add { _legacyPanel.OnTopMouseMoveCallBack += value; } remove { _legacyPanel.OnTopMouseMoveCallBack -= value; } }
/// <summary>保持旧 FrmMain 的 OnLoad 调用契约,在菜单绑定完成后应用新版样式。</summary>
public void OnLoad()
{
_legacyPanel.OnLoad();
ApplyWpfShellStyle();
}
private void TopMenuItem_Click(object sender, EventArgs e)
{
SelectTopMenu(sender as ToolStripMenuItem);
ResetBrandArea();
// 切换一级目录时旧逻辑会重建左侧菜单,下一帧重新套用新版布局。
if (IsNavigationChangedSinceLastStyle())
RequestApplyWpfShellStyle();
}
private static bool IsGroupedSidebarMode()
{
// 设计器预览不能访问数据库;预览时直接采用新版分组侧栏样式。
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
return true;
// 与旧主界面使用同一份系统参数,避免新版界面出现目录不一致。
return "1".Equals((SystemInfo.Instance.MainLeftShowMode ?? string.Empty).Trim());
}
private bool IsNavigationChangedSinceLastStyle()
{
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) return false;
string id = (ERPInfo.Instance.SubSysId ?? string.Empty).Trim();
string name = (ERPInfo.Instance.SubSysName ?? string.Empty).Trim();
return !string.Equals(id, _styledSubSysId, StringComparison.OrdinalIgnoreCase)
|| !string.Equals(name, _styledSubSysName, StringComparison.OrdinalIgnoreCase);
}
private void RememberStyledNavigation()
{
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) return;
_styledSubSysId = (ERPInfo.Instance.SubSysId ?? string.Empty).Trim();
_styledSubSysName = (ERPInfo.Instance.SubSysName ?? string.Empty).Trim();
}
/// <summary>
/// 合并同一消息循环内由顶部菜单点击、下拉框关闭等事件发起的重复重绘。
/// 旧版切换目录本身已经重建快捷通道,重复套用样式会造成右侧闪烁。
/// </summary>
private void RequestApplyWpfShellStyle()
{
if (!IsHandleCreated || _styleUpdatePending) return;
_styleUpdatePending = true;
BeginInvoke((MethodInvoker)(() =>
{
_styleUpdatePending = false;
if (!IsDisposed)
{
ApplyWpfShellStyle();
if (_shortcutRedrawSuppressed) SetShortcutRedraw(true);
}
}));
}
}
}