增强原材料入场记录视图模型,新增 SuspendEmbeddedPrintPreviewAirspace 属性以处理 WebView2 的嵌入式打印预览遮挡问题。重构相关对话框调用逻辑,确保在弹窗期间正确管理预览状态。同时,优化原材料卡片生成确认窗口的预览逻辑,提升用户体验和界面响应性。
This commit is contained in:
@@ -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 使用独立 HWND(Airspace),会同窗体内浮在 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; }
|
||||
|
||||
|
||||
@@ -170,9 +170,18 @@ public class RawMaterialEntryOperationViewModel : RawMaterialEntryEditDialogView
|
||||
{
|
||||
if (!SetProperty(ref _isPrintPreviewExpanded, value)) return;
|
||||
if (value) _lastPreviewSnapshot = string.Empty;
|
||||
RaisePropertyChanged(nameof(IsPrintPreviewWebAreaVisible));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>右侧下方预览区是否显示 WebView2 宿主(HandyControl 内嵌弹窗期间因 Airspace 临时隐藏)。</summary>
|
||||
public bool IsPrintPreviewWebAreaVisible => !SuspendEmbeddedPrintPreviewAirspace && IsPrintPreviewExpanded;
|
||||
|
||||
protected override void OnSuspendEmbeddedPrintPreviewAirspaceChanged()
|
||||
{
|
||||
RaisePropertyChanged(nameof(IsPrintPreviewWebAreaVisible));
|
||||
}
|
||||
|
||||
private string _printPreviewStatus = string.Empty;
|
||||
/// <summary>预览区状态提示(如离线、加载中、错误摘要)。</summary>
|
||||
public string PrintPreviewStatus
|
||||
@@ -744,7 +753,9 @@ public class RawMaterialEntryOperationViewModel : RawMaterialEntryEditDialogView
|
||||
Owner = Application.Current.MainWindow,
|
||||
WindowStartupLocation = WindowStartupLocation.CenterOwner
|
||||
};
|
||||
var confirmed = confirmWindow.ShowDialog() == true;
|
||||
// WebView2 Airspace:模态子窗体仍可能与本窗体内 HWND 叠层异常,弹窗期间收起嵌入预览
|
||||
var confirmed = await SuspendEmbeddedPrintPreviewAirspaceWhileAsync(() =>
|
||||
Task.FromResult(confirmWindow.ShowDialog() == true));
|
||||
if (!confirmed) return;
|
||||
var selectedPrinterName = confirmWindow.SelectedPrinterName;
|
||||
if (string.IsNullOrWhiteSpace(selectedPrinterName))
|
||||
|
||||
Reference in New Issue
Block a user