You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
2.1 KiB
C#

using MaterialDesignThemes.Wpf;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace Txgy.EWS.Client.Common
{
/// <summary>
/// 对话主机服务(自定义)
/// </summary>
public class DialogHostService : DialogService, IDialogHostService
{
private readonly IContainerExtension containerExtension;
public DialogHostService(IContainerExtension containerExtension) : base(containerExtension)
{
this.containerExtension = containerExtension;
}
public async Task<IDialogResult> ShowDialog(string name, IDialogParameters parameters, string dialogHostName = "Root")
{
if (parameters == null)
parameters = new DialogParameters();
//从容器当中去除弹出窗口的实例
var content = containerExtension.Resolve<object>(name);
//验证实例的有效性
if (!(content is FrameworkElement dialogContent))
throw new NullReferenceException("A dialog's content must be a FrameworkElement");
if (dialogContent is FrameworkElement view && view.DataContext is null && ViewModelLocator.GetAutoWireViewModel(view) is null)
ViewModelLocator.SetAutoWireViewModel(view, true);
if (!(dialogContent.DataContext is IDialogHostAware viewModel))
throw new NullReferenceException("A dialog's ViewModel must implement the IDialogAware interface");
viewModel.DialogHostName = dialogHostName;
DialogOpenedEventHandler eventHandler = (sender, eventArgs) =>
{
if (viewModel is IDialogHostAware aware)
{
aware.OnDialogOpend(parameters);
}
eventArgs.Session.UpdateContent(content);
};
return (IDialogResult)await DialogHost.Show(dialogContent, viewModel.DialogHostName, eventHandler);
}
}
}