增强原材料入场记录视图模型,新增 SuspendEmbeddedPrintPreviewAirspace 属性以处理 WebView2 的嵌入式打印预览遮挡问题。重构相关对话框调用逻辑,确保在弹窗期间正确管理预览状态。同时,优化原材料卡片生成确认窗口的预览逻辑,提升用户体验和界面响应性。

This commit is contained in:
geht
2026-05-15 15:46:25 +08:00
parent 0c5e29044a
commit 9201c7ca15
5 changed files with 172 additions and 46 deletions

View File

@@ -114,6 +114,46 @@ public class RawMaterialEntryEditDialogViewModel : BaseViewModel, IDialogResulta
public ObservableCollection<KeyValuePair<string, string>> IsSpecialAdoptionOptions { get; } = new();
public ObservableCollection<KeyValuePair<string, string>> StatusOptions { get; } = new();
public ObservableCollection<RawMaterialSplitDetailItem> SplitCodeDetails { get; } = new();
private bool _suspendEmbeddedPrintPreviewAirspace;
/// <summary>
/// WebView2 使用独立 HWNDAirspace会同窗体内浮在 WPF 元素之上,遮挡 HandyControl 内嵌 Dialog。
/// 原料入场独立页在弹窗期间通过绑定收起预览宿主;其它页面无 WebView2 时可忽略该属性。
/// </summary>
public bool SuspendEmbeddedPrintPreviewAirspace
{
get => _suspendEmbeddedPrintPreviewAirspace;
private set
{
if (!SetProperty(ref _suspendEmbeddedPrintPreviewAirspace, value))
{
return;
}
OnSuspendEmbeddedPrintPreviewAirspaceChanged();
}
}
/// <summary>子类在预览区可见性依赖此标志时,覆写以联动通知。</summary>
protected virtual void OnSuspendEmbeddedPrintPreviewAirspaceChanged()
{
}
/// <summary>在异步弹窗期间挂起右侧嵌入 WebView2避免遮挡模态内容。</summary>
protected async Task<TResult> SuspendEmbeddedPrintPreviewAirspaceWhileAsync<TResult>(Func<Task<TResult>> action)
{
SuspendEmbeddedPrintPreviewAirspace = true;
try
{
return await action();
}
finally
{
SuspendEmbeddedPrintPreviewAirspace = false;
}
}
public double SplitCodeTableHeight => CalculateSplitCodeTableHeight();
public string SplitTotalPortionsDisplay => JoinSplitValue(item => item.Portions?.ToString(CultureInfo.InvariantCulture), true);
public string SplitPortionWeightDisplay => JoinSplitValue(item => FormatNullableDecimal(item.PortionWeight), true);
@@ -439,13 +479,14 @@ public class RawMaterialEntryEditDialogViewModel : BaseViewModel, IDialogResulta
bool confirmed;
try
{
confirmed = await HandyControl.Controls.Dialog.Show<WeightRecordPickerDialogView>()
.Initialize<WeightRecordPickerDialogViewModel>(vm =>
{
pickerVm = vm;
vm.Initialize(Entry?.BillNo);
})
.GetResultAsync<bool>();
confirmed = await SuspendEmbeddedPrintPreviewAirspaceWhileAsync(() =>
HandyControl.Controls.Dialog.Show<WeightRecordPickerDialogView>()
.Initialize<WeightRecordPickerDialogViewModel>(vm =>
{
pickerVm = vm;
vm.Initialize(Entry?.BillNo);
})
.GetResultAsync<bool>());
}
catch
{
@@ -490,13 +531,14 @@ public class RawMaterialEntryEditDialogViewModel : BaseViewModel, IDialogResulta
bool confirmed;
try
{
confirmed = await HandyControl.Controls.Dialog.Show<WarehouseAreaPickerDialogView>()
.Initialize<WarehouseAreaPickerDialogViewModel>(vm =>
{
pickerVm = vm;
vm.Initialize(row.WarehouseLocation);
})
.GetResultAsync<bool>();
confirmed = await SuspendEmbeddedPrintPreviewAirspaceWhileAsync(() =>
HandyControl.Controls.Dialog.Show<WarehouseAreaPickerDialogView>()
.Initialize<WarehouseAreaPickerDialogViewModel>(vm =>
{
pickerVm = vm;
vm.Initialize(row.WarehouseLocation);
})
.GetResultAsync<bool>());
}
catch (Exception ex)
{
@@ -521,13 +563,14 @@ public class RawMaterialEntryEditDialogViewModel : BaseViewModel, IDialogResulta
bool confirmed;
try
{
confirmed = await HandyControl.Controls.Dialog.Show<RawMaterialEntryMaterialPickerDialogView>()
.Initialize<RawMaterialEntryMaterialPickerDialogViewModel>(vm =>
{
pickerVm = vm;
vm.Initialize(Entry?.MaterialCode, Entry?.MaterialName);
})
.GetResultAsync<bool>();
confirmed = await SuspendEmbeddedPrintPreviewAirspaceWhileAsync(() =>
HandyControl.Controls.Dialog.Show<RawMaterialEntryMaterialPickerDialogView>()
.Initialize<RawMaterialEntryMaterialPickerDialogViewModel>(vm =>
{
pickerVm = vm;
vm.Initialize(Entry?.MaterialCode, Entry?.MaterialName);
})
.GetResultAsync<bool>());
}
catch
{
@@ -582,9 +625,10 @@ public class RawMaterialEntryEditDialogViewModel : BaseViewModel, IDialogResulta
bool confirmed;
try
{
confirmed = await HandyControl.Controls.Dialog.Show<SupplierPickerDialogView>()
.Initialize<SupplierPickerDialogViewModel>(vm => pickerVm = vm)
.GetResultAsync<bool>();
confirmed = await SuspendEmbeddedPrintPreviewAirspaceWhileAsync(() =>
HandyControl.Controls.Dialog.Show<SupplierPickerDialogView>()
.Initialize<SupplierPickerDialogViewModel>(vm => pickerVm = vm)
.GetResultAsync<bool>());
}
catch { return; }