fix(legacy): defer WinForms module showing for WPF host

This commit is contained in:
SugarChes
2026-09-01 15:43:24 +08:00
parent 0058939a8a
commit 5eb0077221
+100 -5
View File
@@ -40,6 +40,18 @@ namespace Lskj.Main.Model
/// </summary>
public sealed class Manager
{
/// <summary>
/// Controls when a managed WinForms module is shown. The classic
/// shell keeps the original immediate behavior; the WPF compatibility
/// host can create the page first, attach it to WindowsFormsHost, and
/// show the form after the native host is ready.
/// </summary>
public enum ModuleOpenMode
{
Immediate,
DeferredForWpf
}
/// <summary>
/// 主程序
/// </summary>
@@ -287,6 +299,29 @@ namespace Lskj.Main.Model
/// <param name="
/// Params">The URL parameters.</param>
public static void OpenModule(string menuId, string menuName, string dllName, string modelFlag, string urlParams)
{
OpenModule(
menuId,
menuName,
dllName,
modelFlag,
urlParams,
ModuleOpenMode.Immediate);
}
/// <summary>
/// Opens a managed WinForms module with an explicit show policy.
/// DeferredForWpf creates and registers the native page without
/// running Form.Show; the WPF compatibility layer must later call
/// ShowDeferredModule after attaching the page to its host.
/// </summary>
public static void OpenModule(
string menuId,
string menuName,
string dllName,
string modelFlag,
string urlParams,
ModuleOpenMode openMode)
{
string openingModuleKey = null;
bool ownsOpeningGate = false;
@@ -440,7 +475,7 @@ namespace Lskj.Main.Model
else
{
// 打开module程序
AddModuleToTab(module, args);
AddModuleToTab(module, args, openMode);
}
}
}
@@ -459,6 +494,42 @@ namespace Lskj.Main.Model
}
/// <summary>
/// Shows a module that was opened with DeferredForWpf. The page and
/// form must already have been registered by AddModuleToTab; this
/// method only owns the activation step and then selects the page.
/// </summary>
public static bool ShowDeferredModule(string moduleId)
{
if (string.IsNullOrWhiteSpace(moduleId))
return false;
DllModule module;
if (!ModuleForms.TryGetValue(moduleId, out module) || module == null)
return false;
Form form = module.ModuleForm as Form;
if (form == null || form.IsDisposed)
return false;
if (!form.Visible)
form.Show();
if (form.IsDisposed)
return false;
XtraTabPage page = ERPInfo.Instance.ModulePages.FirstOrDefault(
item => item != null &&
string.Equals(
Convert.ToString(item.Tag),
moduleId,
StringComparison.OrdinalIgnoreCase));
if (page != null)
ERPInfo.Instance.SelectModulePage(page);
return true;
}
private static string BuildBsMenuUrl(string dllName, string dllCoid)
{
return string.Format(
@@ -518,6 +589,14 @@ namespace Lskj.Main.Model
/// <param name="module">The module.</param>
/// <param name="args">The arguments.</param>
public static void AddModuleToTab(DllModule module, string[] args)
{
AddModuleToTab(module, args, ModuleOpenMode.Immediate);
}
private static void AddModuleToTab(
DllModule module,
string[] args,
ModuleOpenMode openMode)
{
string guid = null;
XtraTabPage tp = null;
@@ -641,7 +720,11 @@ namespace Lskj.Main.Model
form.TopLevel = isQuickLoad;
//form.Location = new Point(0, 0);
form.Dock = DockStyle.Fill;//客户需要缩放
form.AutoSize = true;
// A WPF WindowsFormsHost supplies the size. Letting the
// native Form participate in content-driven AutoSize causes
// a measure/reparent cycle to collapse split containers while
// the host is still being attached.
form.AutoSize = openMode != ModuleOpenMode.DeferredForWpf;
//form.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
//form.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - MinusTheHeight;
form.FormBorderStyle = FormBorderStyle.None;
@@ -666,7 +749,10 @@ namespace Lskj.Main.Model
//module.Tag = "1";
module.Tag = guid;
module.ModuleForm = form;
form.Show();
if (openMode != ModuleOpenMode.DeferredForWpf)
{
form.Show();
}
if (args != null && !string.IsNullOrEmpty(args[4] + ""))
{
//2026-08-08 pz说把SearchCondFormModuleCode判断去掉,不要这个功能
@@ -689,8 +775,17 @@ namespace Lskj.Main.Model
}
ERPInfo.Instance.AddModulePage(tp);
ERPInfo.Instance.SelectModulePage(tp);
ModuleForms.Add(guid, module);
if (openMode == ModuleOpenMode.DeferredForWpf)
{
// Register before returning so a WPF dispatcher callback
// can activate the form after the Host has been attached.
ModuleForms.Add(guid, module);
}
else
{
ERPInfo.Instance.SelectModulePage(tp);
ModuleForms.Add(guid, module);
}
//LastModuleForm.Add(module);
//Lskj.Main.Model.AutoSizeChange.ControllInitializeSize(form);//调整控件大小