增加了初始弹窗,但是没有成功
更改了CAN和LIN协调 更改了配置程序的名称顺序
This commit is contained in:
108
CapMachine.Wpf/Services/DialogHostService.cs
Normal file
108
CapMachine.Wpf/Services/DialogHostService.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
using MaterialDesignThemes.Wpf;
|
||||
using Prism.Common;
|
||||
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 CapMachine.Wpf.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 对话主机服务
|
||||
/// </summary>
|
||||
public class DialogHostService : DialogService, IHostDialogService
|
||||
{
|
||||
private readonly IContainerExtension _containerExtension;
|
||||
|
||||
public DialogHostService(IContainerExtension containerExtension) : base(containerExtension)
|
||||
{
|
||||
_containerExtension = containerExtension;
|
||||
}
|
||||
|
||||
public IDialogResult ShowWindow(string name)
|
||||
{
|
||||
IDialogResult dialogResult = new DialogResult(ButtonResult.None);
|
||||
|
||||
var content = _containerExtension.Resolve<object>(name);
|
||||
|
||||
if (!(content is Window dialogContent))
|
||||
throw new NullReferenceException("A dialog's content must be a Window");
|
||||
|
||||
if (dialogContent is Window view && view.DataContext is null && ViewModelLocator.GetAutoWireViewModel(view) is null)
|
||||
ViewModelLocator.SetAutoWireViewModel(view, true);
|
||||
|
||||
if (!(dialogContent.DataContext is IDialogAware viewModel))
|
||||
throw new NullReferenceException("A dialog's ViewModel must implement the IDialogAware interface");
|
||||
|
||||
if (dialogContent is IDialogWindow dialogWindow)
|
||||
{
|
||||
ConfigureDialogWindowEvents(dialogWindow, result => { dialogResult = result; });
|
||||
}
|
||||
|
||||
MvvmHelpers.ViewAndViewModelAction<IDialogAware>(viewModel, d => d.OnDialogOpened(null));
|
||||
dialogContent.ShowDialog();
|
||||
return dialogResult;
|
||||
}
|
||||
|
||||
public async Task<IDialogResult> ShowDialogAsync(string name, IDialogParameters parameters = null, string IdentifierName = "Root")
|
||||
{
|
||||
var dialogContent = GetDialogContent(name, IdentifierName);
|
||||
|
||||
if (!(dialogContent.DataContext is IHostDialogAware viewModel))
|
||||
throw new NullReferenceException("A dialog's ViewModel must implement the IDialogHostAware interface");
|
||||
|
||||
var eventHandler = GetDialogOpenedEventHandler(viewModel, parameters);
|
||||
|
||||
var dialogResult = await DialogHost.Show(dialogContent, IdentifierName, eventHandler);
|
||||
|
||||
if (dialogResult == null)
|
||||
return new DialogResult(ButtonResult.Cancel);
|
||||
|
||||
return (IDialogResult)dialogResult;
|
||||
}
|
||||
|
||||
private FrameworkElement GetDialogContent(string name, string IdentifierName = "Root")
|
||||
{
|
||||
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 IHostDialogAware viewModel))
|
||||
throw new NullReferenceException("A dialog's ViewModel must implement the IDialogHostAware interface");
|
||||
|
||||
viewModel.IdentifierName = IdentifierName;
|
||||
|
||||
return dialogContent;
|
||||
}
|
||||
|
||||
private DialogOpenedEventHandler GetDialogOpenedEventHandler(IHostDialogAware viewModel,
|
||||
IDialogParameters parameters)
|
||||
{
|
||||
if (parameters == null) parameters = new DialogParameters();
|
||||
|
||||
DialogOpenedEventHandler eventHandler =
|
||||
(sender, eventArgs) =>
|
||||
{
|
||||
var _content = eventArgs.Session.Content;
|
||||
if (viewModel is IHostDialogAware aware)
|
||||
aware.OnDialogOpened(parameters);
|
||||
eventArgs.Session.UpdateContent(_content);
|
||||
};
|
||||
|
||||
return eventHandler;
|
||||
}
|
||||
|
||||
public void Close(string IdentifierName, DialogResult dialogResult)
|
||||
{
|
||||
DialogHost.Close(IdentifierName, dialogResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user