From 6494cf427b2ce8310ebf30065e9e19e21d802efe Mon Sep 17 00:00:00 2001 From: Brian Lagunas Date: Thu, 28 Feb 2019 09:22:11 -0700 Subject: [PATCH 1/2] added support to control DialogWindow from style --- Sandbox/Wpf/HelloWorld/HelloWorld/App.xaml.cs | 2 +- .../Dialogs/ConfirmationDialog.xaml | 9 +++++ .../Wpf/Prism.Wpf/Properties/AssemblyInfo.cs | 1 + .../Dialogs/DefaultDialogs/DialogWindow.xaml | 9 +++-- .../Services/Dialogs/DialogService.cs | 35 ++++++++++++++++--- .../Services/Dialogs/IDialogWindow.cs | 2 ++ 6 files changed, 50 insertions(+), 8 deletions(-) diff --git a/Sandbox/Wpf/HelloWorld/HelloWorld/App.xaml.cs b/Sandbox/Wpf/HelloWorld/HelloWorld/App.xaml.cs index 7170505bf..18bc41c6f 100644 --- a/Sandbox/Wpf/HelloWorld/HelloWorld/App.xaml.cs +++ b/Sandbox/Wpf/HelloWorld/HelloWorld/App.xaml.cs @@ -21,7 +21,7 @@ protected override void RegisterTypes(IContainerRegistry containerRegistry) containerRegistry.RegisterDialog(); //register a custom window host - containerRegistry.RegisterDialogWindow(); + //containerRegistry.RegisterDialogWindow(); } } } diff --git a/Sandbox/Wpf/HelloWorld/HelloWorld/Dialogs/ConfirmationDialog.xaml b/Sandbox/Wpf/HelloWorld/HelloWorld/Dialogs/ConfirmationDialog.xaml index 1cb54109e..2e2155317 100644 --- a/Sandbox/Wpf/HelloWorld/HelloWorld/Dialogs/ConfirmationDialog.xaml +++ b/Sandbox/Wpf/HelloWorld/HelloWorld/Dialogs/ConfirmationDialog.xaml @@ -4,6 +4,15 @@ xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True" Width="300" Height="150"> + + + + + diff --git a/Source/Wpf/Prism.Wpf/Properties/AssemblyInfo.cs b/Source/Wpf/Prism.Wpf/Properties/AssemblyInfo.cs index 7cce94ed4..27c1d142e 100644 --- a/Source/Wpf/Prism.Wpf/Properties/AssemblyInfo.cs +++ b/Source/Wpf/Prism.Wpf/Properties/AssemblyInfo.cs @@ -23,5 +23,6 @@ [assembly: XmlnsDefinition("http://prismlibrary.com/", "Prism.Mvvm")] [assembly: XmlnsDefinition("http://prismlibrary.com/", "Prism.Interactivity")] [assembly: XmlnsDefinition("http://prismlibrary.com/", "Prism.Interactivity.InteractionRequest")] +[assembly: XmlnsDefinition("http://prismlibrary.com/", "Prism.Services.Dialogs")] diff --git a/Source/Wpf/Prism.Wpf/Services/Dialogs/DefaultDialogs/DialogWindow.xaml b/Source/Wpf/Prism.Wpf/Services/Dialogs/DefaultDialogs/DialogWindow.xaml index 2f5d32b97..11c582e16 100644 --- a/Source/Wpf/Prism.Wpf/Services/Dialogs/DefaultDialogs/DialogWindow.xaml +++ b/Source/Wpf/Prism.Wpf/Services/Dialogs/DefaultDialogs/DialogWindow.xaml @@ -2,6 +2,11 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="{Binding Title}" Icon="{Binding IconSource}" - WindowStartupLocation="CenterOwner" SizeToContent="WidthAndHeight"> - + WindowStartupLocation="CenterOwner"> + + + + diff --git a/Source/Wpf/Prism.Wpf/Services/Dialogs/DialogService.cs b/Source/Wpf/Prism.Wpf/Services/Dialogs/DialogService.cs index 6c1df1a62..8d4121124 100644 --- a/Source/Wpf/Prism.Wpf/Services/Dialogs/DialogService.cs +++ b/Source/Wpf/Prism.Wpf/Services/Dialogs/DialogService.cs @@ -11,6 +11,19 @@ public class DialogService : IDialogService { private readonly IContainerExtension _containerExtension; + public static readonly DependencyProperty DialogWindowStyleProperty = + DependencyProperty.RegisterAttached("DialogWindowStyle", typeof(Style), typeof(DialogService), new PropertyMetadata(null)); + + public static Style GetDialogWindowStyle(DependencyObject obj) + { + return (Style)obj.GetValue(DialogWindowStyleProperty); + } + + public static void SetDialogWindowStyle(DependencyObject obj, Style value) + { + obj.SetValue(DialogWindowStyleProperty, value); + } + public DialogService(IContainerExtension containerExtension) { _containerExtension = containerExtension; @@ -31,8 +44,6 @@ void ShowDialogInternal(string name, IDialogParameters parameters, Action().FirstOrDefault(x => x.IsActive); if (isModal) dialogWindow.ShowDialog(); @@ -56,10 +67,9 @@ void ConfigureDialogWindowContent(string dialogName, IDialogWindow window, IDial if (viewModel == null) throw new NullReferenceException("A dialog's ViewModel must implement the IDialogAware interface"); - MvvmHelpers.ViewAndViewModelAction(viewModel, d => d.OnDialogOpened(parameters)); + ConfigureDialogWindowProperties(window, dialogContent, viewModel); - window.Content = dialogContent; - window.DataContext = viewModel; //we want the host window and the dialog to share the same data contex + MvvmHelpers.ViewAndViewModelAction(viewModel, d => d.OnDialogOpened(parameters)); } void ConfigureDialogWindowEvents(IDialogWindow dialogWindow, Action callback) @@ -106,5 +116,20 @@ void ConfigureDialogWindowEvents(IDialogWindow dialogWindow, Action().FirstOrDefault(x => x.IsActive); + + //TODO: is the a good way to control the WindowStartupPosition (not a dependency property and can't be set in a style) + } } } diff --git a/Source/Wpf/Prism.Wpf/Services/Dialogs/IDialogWindow.cs b/Source/Wpf/Prism.Wpf/Services/Dialogs/IDialogWindow.cs index d04b49a17..d7140118a 100644 --- a/Source/Wpf/Prism.Wpf/Services/Dialogs/IDialogWindow.cs +++ b/Source/Wpf/Prism.Wpf/Services/Dialogs/IDialogWindow.cs @@ -25,5 +25,7 @@ public interface IDialogWindow event CancelEventHandler Closing; IDialogResult Result { get; set; } + + Style Style { get; set; } } } From a6c8e8441585e268e72f6db78264b21b9325097b Mon Sep 17 00:00:00 2001 From: Brian Lagunas Date: Thu, 28 Feb 2019 09:42:25 -0700 Subject: [PATCH 2/2] added RegisterDialog method without VM requirement --- .../Wpf/Prism.Wpf/Ioc/IContainerRegistryExtensions.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/Wpf/Prism.Wpf/Ioc/IContainerRegistryExtensions.cs b/Source/Wpf/Prism.Wpf/Ioc/IContainerRegistryExtensions.cs index c6121caf4..843aa15c7 100644 --- a/Source/Wpf/Prism.Wpf/Ioc/IContainerRegistryExtensions.cs +++ b/Source/Wpf/Prism.Wpf/Ioc/IContainerRegistryExtensions.cs @@ -5,6 +5,17 @@ namespace Prism.Ioc { public static class IContainerRegistryExtensions { + /// + /// Registers an object to be used as a dialog in the IDialogService. + /// + /// The Type of object to register as the dialog + /// + /// The unique name to register with the dialog. + public static void RegisterDialog(this IContainerRegistry containerRegistry, string name = null) + { + containerRegistry.RegisterForNavigation(name); + } + /// /// Registers an object to be used as a dialog in the IDialogService. ///