160 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			160 lines
		
	
	
		
			5.4 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.Interop;
							 | 
						|||
| 
								 | 
							
								using System.Windows.Threading;
							 | 
						|||
| 
								 | 
							
								using System.Windows;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.util
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    internal class MaterialDialogService : DialogService
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private readonly IContainerExtension _containerExtension;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public MaterialDialogService(IContainerExtension containerExtension) : base(containerExtension)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            _containerExtension = containerExtension;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void ShowDialogHost(string name, IDialogParameters parameters, Action<IDialogResult> callback) =>
							 | 
						|||
| 
								 | 
							
								            ShowDialogHost(name, null, parameters, callback);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void ShowDialogHost(string name, string dialogHostName, IDialogParameters parameters, Action<IDialogResult> callback)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            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");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            AutowireViewModel(dialogContent);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (!(dialogContent.DataContext is IDialogAware dialogAware))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                throw new ArgumentException("A dialog's ViewModel must implement IDialogAware interface");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var openedEventHandler = new DialogOpenedEventHandler((sender, args) =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                dialogAware.OnDialogOpened(parameters);
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            var closedEventHandler = new DialogClosedEventHandler((sender, args) =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                dialogAware.OnDialogClosed();
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            dialogAware.RequestClose += res =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (DialogHost.IsDialogOpen(dialogHostName))
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    callback(res);
							 | 
						|||
| 
								 | 
							
								                    DialogHost.Close(dialogHostName);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var dispatcherFrame = new DispatcherFrame();
							 | 
						|||
| 
								 | 
							
								            if (dialogHostName == null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _ = DialogHost.Show(dialogContent, openedEventHandler, null, closedEventHandler)
							 | 
						|||
| 
								 | 
							
								                    .ContinueWith(_ => dispatcherFrame.Continue = false); ;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _ = DialogHost.Show(dialogContent, dialogHostName, openedEventHandler, null, closedEventHandler)
							 | 
						|||
| 
								 | 
							
								                    .ContinueWith(_ => dispatcherFrame.Continue = false);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // tell users we're going modal
							 | 
						|||
| 
								 | 
							
								                ComponentDispatcher.PushModal();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                Dispatcher.PushFrame(dispatcherFrame);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            finally
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // tell users we're going non-modal
							 | 
						|||
| 
								 | 
							
								                ComponentDispatcher.PopModal();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            dialogAware.RequestClose -= callback;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static void AutowireViewModel(object viewOrViewModel)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (viewOrViewModel is FrameworkElement view && view.DataContext is null && ViewModelLocator.GetAutoWireViewModel(view) is null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                ViewModelLocator.SetAutoWireViewModel(view, true);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void ShowDialogHost(string name, IDialogParameters parameters, string dialogHostName)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var content = _containerExtension.Resolve<object>(name);
							 | 
						|||
| 
								 | 
							
								            if (!(content is FrameworkElement dialogContent))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                throw new NullReferenceException("A dialog's content must be a FrameworkElement");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            AutowireViewModel(dialogContent);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (!(dialogContent.DataContext is IDialogAware dialogAware))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                throw new ArgumentException("A dialog's ViewModel must implement IDialogAware interface");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var openedEventHandler = new DialogOpenedEventHandler((sender, args) =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                dialogAware.OnDialogOpened(parameters);
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            var closedEventHandler = new DialogClosedEventHandler((sender, args) =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                dialogAware.OnDialogClosed();
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            dialogAware.RequestClose += res =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (DialogHost.IsDialogOpen(dialogHostName))
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    DialogHost.Close(dialogHostName);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var dispatcherFrame = new DispatcherFrame();
							 | 
						|||
| 
								 | 
							
								            if (dialogHostName == null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _ = DialogHost.Show(dialogContent, openedEventHandler, null, closedEventHandler)
							 | 
						|||
| 
								 | 
							
								                    .ContinueWith(_ => dispatcherFrame.Continue = false); ;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _ = DialogHost.Show(dialogContent, dialogHostName, openedEventHandler, null, closedEventHandler)
							 | 
						|||
| 
								 | 
							
								                    .ContinueWith(_ => dispatcherFrame.Continue = false);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // tell users we're going modal
							 | 
						|||
| 
								 | 
							
								                ComponentDispatcher.PushModal();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                Dispatcher.PushFrame(dispatcherFrame);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            finally
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // tell users we're going non-modal
							 | 
						|||
| 
								 | 
							
								                ComponentDispatcher.PopModal();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |