fix(legacy): defer WinForms module showing for WPF host
This commit is contained in:
@@ -40,6 +40,18 @@ namespace Lskj.Main.Model
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class Manager
|
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>
|
||||||
/// 主程序
|
/// 主程序
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -287,6 +299,29 @@ namespace Lskj.Main.Model
|
|||||||
/// <param name="
|
/// <param name="
|
||||||
/// Params">The URL parameters.</param>
|
/// Params">The URL parameters.</param>
|
||||||
public static void OpenModule(string menuId, string menuName, string dllName, string modelFlag, string urlParams)
|
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;
|
string openingModuleKey = null;
|
||||||
bool ownsOpeningGate = false;
|
bool ownsOpeningGate = false;
|
||||||
@@ -440,7 +475,7 @@ namespace Lskj.Main.Model
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 打开module程序
|
// 打开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)
|
private static string BuildBsMenuUrl(string dllName, string dllCoid)
|
||||||
{
|
{
|
||||||
return string.Format(
|
return string.Format(
|
||||||
@@ -518,6 +589,14 @@ namespace Lskj.Main.Model
|
|||||||
/// <param name="module">The module.</param>
|
/// <param name="module">The module.</param>
|
||||||
/// <param name="args">The arguments.</param>
|
/// <param name="args">The arguments.</param>
|
||||||
public static void AddModuleToTab(DllModule module, string[] args)
|
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;
|
string guid = null;
|
||||||
XtraTabPage tp = null;
|
XtraTabPage tp = null;
|
||||||
@@ -641,7 +720,11 @@ namespace Lskj.Main.Model
|
|||||||
form.TopLevel = isQuickLoad;
|
form.TopLevel = isQuickLoad;
|
||||||
//form.Location = new Point(0, 0);
|
//form.Location = new Point(0, 0);
|
||||||
form.Dock = DockStyle.Fill;//客户需要缩放
|
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.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
|
||||||
//form.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - MinusTheHeight;
|
//form.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - MinusTheHeight;
|
||||||
form.FormBorderStyle = FormBorderStyle.None;
|
form.FormBorderStyle = FormBorderStyle.None;
|
||||||
@@ -666,7 +749,10 @@ namespace Lskj.Main.Model
|
|||||||
//module.Tag = "1";
|
//module.Tag = "1";
|
||||||
module.Tag = guid;
|
module.Tag = guid;
|
||||||
module.ModuleForm = form;
|
module.ModuleForm = form;
|
||||||
form.Show();
|
if (openMode != ModuleOpenMode.DeferredForWpf)
|
||||||
|
{
|
||||||
|
form.Show();
|
||||||
|
}
|
||||||
if (args != null && !string.IsNullOrEmpty(args[4] + ""))
|
if (args != null && !string.IsNullOrEmpty(args[4] + ""))
|
||||||
{
|
{
|
||||||
//2026-08-08 pz说把SearchCondFormModuleCode判断去掉,不要这个功能
|
//2026-08-08 pz说把SearchCondFormModuleCode判断去掉,不要这个功能
|
||||||
@@ -689,8 +775,17 @@ namespace Lskj.Main.Model
|
|||||||
}
|
}
|
||||||
|
|
||||||
ERPInfo.Instance.AddModulePage(tp);
|
ERPInfo.Instance.AddModulePage(tp);
|
||||||
ERPInfo.Instance.SelectModulePage(tp);
|
if (openMode == ModuleOpenMode.DeferredForWpf)
|
||||||
ModuleForms.Add(guid, module);
|
{
|
||||||
|
// 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);
|
//LastModuleForm.Add(module);
|
||||||
//Lskj.Main.Model.AutoSizeChange.ControllInitializeSize(form);//调整控件大小
|
//Lskj.Main.Model.AutoSizeChange.ControllInitializeSize(form);//调整控件大小
|
||||||
|
|||||||
Reference in New Issue
Block a user