From 83d975897a95b182d1077b10a9e683782fa2a042 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 13 Dec 2025 23:21:06 +0100 Subject: [PATCH 01/31] Chore: Migrate dialogs... --- .../Controls/PowerShellControl.xaml | 3 +- .../Controls/PowerShellControl.xaml.cs | 17 +-------- Source/NETworkManager/DialogHelper.cs | 30 ++++++++-------- Source/NETworkManager/NETworkManager.csproj | 2 +- Source/NETworkManager/ProfileDialogManager.cs | 4 +-- .../ViewModels/DNSLookupSettingsViewModel.cs | 2 +- .../ViewModels/HostsFileEditorViewModel.cs | 36 +++---------------- .../ViewModels/IPScannerSettingsViewModel.cs | 2 +- ...del.cs => MessageConfirmationViewModel.cs} | 34 +++++++++--------- ...essageViewModel.cs => MessageViewModel.cs} | 28 +++++++-------- .../PortScannerSettingsViewModel.cs | 2 +- .../ViewModels/SNMPSettingsViewModel.cs | 2 +- .../ViewModels/SNTPLookupSettingsViewModel.cs | 2 +- .../ViewModels/SettingsProfilesViewModel.cs | 16 ++++----- .../ViewModels/SettingsSettingsViewModel.cs | 2 +- .../ViewModels/WebConsoleSettingsViewModel.cs | 2 +- ...ildWindow.xaml => MessageChildWindow.xaml} | 10 +++--- ...dow.xaml.cs => MessageChildWindow.xaml.cs} | 6 ++-- ...ml => MessageConfirmationChildWindow.xaml} | 8 ++--- ...=> MessageConfirmationChildWindow.xaml.cs} | 6 ++-- 20 files changed, 86 insertions(+), 128 deletions(-) rename Source/NETworkManager/ViewModels/{OKCancelMessageViewModel.cs => MessageConfirmationViewModel.cs} (64%) rename Source/NETworkManager/ViewModels/{OKMessageViewModel.cs => MessageViewModel.cs} (59%) rename Source/NETworkManager/Views/{OKMessageChildWindow.xaml => MessageChildWindow.xaml} (90%) rename Source/NETworkManager/Views/{OKMessageChildWindow.xaml.cs => MessageChildWindow.xaml.cs} (75%) rename Source/NETworkManager/Views/{OKCancelMessageChildWindow.xaml => MessageConfirmationChildWindow.xaml} (92%) rename Source/NETworkManager/Views/{OKCancelMessageChildWindow.xaml.cs => MessageConfirmationChildWindow.xaml.cs} (71%) diff --git a/Source/NETworkManager/Controls/PowerShellControl.xaml b/Source/NETworkManager/Controls/PowerShellControl.xaml index b9fc10e9c1..051baa2312 100644 --- a/Source/NETworkManager/Controls/PowerShellControl.xaml +++ b/Source/NETworkManager/Controls/PowerShellControl.xaml @@ -8,8 +8,7 @@ xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:local="clr-namespace:NETworkManager.Controls" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" - xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - mah:DialogParticipation.Register="{Binding}" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:PowerShellControl}"> diff --git a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs index d8dbd968b0..163415cc8e 100644 --- a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs +++ b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PowerShell; using NETworkManager.Settings; @@ -29,8 +28,6 @@ private void WindowGrid_SizeChanged(object sender, SizeChangedEventArgs e) private bool _initialized; private bool _closed; - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private readonly PowerShellSessionInfo _sessionInfo; @@ -76,8 +73,6 @@ public PowerShellControl(Guid tabId, PowerShellSessionInfo sessionInfo) InitializeComponent(); DataContext = this; - _dialogCoordinator = DialogCoordinator.Instance; - ConfigurationManager.Current.PowerShellTabCount++; _tabId = tabId; @@ -196,17 +191,7 @@ private async Task Connect() catch (Exception ex) { if (!_closed) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - ConfigurationManager.OnDialogOpen(); - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - ex.Message, MessageDialogStyle.Affirmative, settings); - - ConfigurationManager.OnDialogClose(); - } + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } IsConnecting = false; diff --git a/Source/NETworkManager/DialogHelper.cs b/Source/NETworkManager/DialogHelper.cs index 818dd8ab76..fd84171c06 100644 --- a/Source/NETworkManager/DialogHelper.cs +++ b/Source/NETworkManager/DialogHelper.cs @@ -24,19 +24,19 @@ public static class DialogHelper /// The title text displayed in the message dialog window. Cannot be null. /// The main message content shown in the dialog. Cannot be null. /// The icon to display in the dialog, indicating the message type. Defaults to Info if not specified. - /// The text to display on the OK button. If null, a default value is used. + /// The text to display on the confirm button. If null, a default value is used. /// A task that completes when the user closes the message dialog. - public static Task ShowOKMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string buttonOKText = null) - { - buttonOKText ??= Strings.OK; + public static Task ShowMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null) + { + confirmButtonText ??= Strings.OK; - var childWindow = new OKMessageChildWindow(); + var childWindow = new MessageChildWindow(); - var childWindowViewModel = new OKMessageViewModel(_ => + var childWindowViewModel = new MessageViewModel(_ => { childWindow.IsOpen = false; ConfigurationManager.Current.IsChildWindowOpen = false; - }, message, icon, buttonOKText); + }, message, icon, confirmButtonText); childWindow.Title = title; @@ -58,20 +58,20 @@ public static Task ShowOKMessageAsync(Window parentWindow, string title, string /// The title text displayed in the dialog window. /// The message content shown to the user in the dialog. /// The icon displayed in the dialog to indicate the message type. Defaults to Info. - /// The text label for the OK button. If null, a default value is used. - /// The text label for the Cancel button. If null, a default value is used. + /// The text label for the confirm button. If null, a default value is used. + /// The text label for the cancel button. If null, a default value is used. /// A task that represents the asynchronous operation. The task result is if the user /// clicks OK; otherwise, . - public static async Task ShowOKCancelMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string buttonOKText = null, string buttonCancelText = null) + public static async Task ShowConfirmationMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null, string cancelButtonText = null) { - buttonOKText ??= Strings.OK; - buttonCancelText ??= Strings.Cancel; + confirmButtonText ??= Strings.OK; + cancelButtonText ??= Strings.Cancel; var result = false; - var childWindow = new OKCancelMessageChildWindow(); + var childWindow = new MessageConfirmationChildWindow(); - var childWindowViewModel = new OKCancelMessageViewModel(_ => + var childWindowViewModel = new MessageConfirmationViewModel(_ => { childWindow.IsOpen = false; ConfigurationManager.Current.IsChildWindowOpen = false; @@ -83,7 +83,7 @@ public static async Task ShowOKCancelMessageAsync(Window parentWindow, str childWindow.IsOpen = false; ConfigurationManager.Current.IsChildWindowOpen = false; }, - message, icon, buttonOKText, buttonCancelText); + message, icon, confirmButtonText, cancelButtonText); childWindow.Title = title; childWindow.DataContext = childWindowViewModel; diff --git a/Source/NETworkManager/NETworkManager.csproj b/Source/NETworkManager/NETworkManager.csproj index 11a8d3dd31..91b3d08b42 100644 --- a/Source/NETworkManager/NETworkManager.csproj +++ b/Source/NETworkManager/NETworkManager.csproj @@ -141,7 +141,7 @@ Wpf Designer - + MSBuild:Compile Wpf Designer diff --git a/Source/NETworkManager/ProfileDialogManager.cs b/Source/NETworkManager/ProfileDialogManager.cs index 2018416487..5f6d9c83f9 100644 --- a/Source/NETworkManager/ProfileDialogManager.cs +++ b/Source/NETworkManager/ProfileDialogManager.cs @@ -553,7 +553,7 @@ public static async Task ShowDeleteProfileDialog(Window parentWindow, IProfileMa viewModel.OnProfileManagerDialogOpen(); - var result = await DialogHelper.ShowOKCancelMessageAsync(parentWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(parentWindow, profiles.Count == 1 ? Strings.DeleteProfile : Strings.DeleteProfiles, profiles.Count == 1 ? Strings.DeleteProfileMessage : Strings.DeleteProfilesMessage, ChildWindowIcon.Info, @@ -639,7 +639,7 @@ public static async Task ShowDeleteGroupDialog(Window parentWindow, IProfileMana { viewModel.OnProfileManagerDialogOpen(); - var result = await DialogHelper.ShowOKCancelMessageAsync(parentWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(parentWindow, Strings.DeleteGroup, Strings.DeleteGroupMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs index be62bedbcf..ac53662876 100644 --- a/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs @@ -481,7 +481,7 @@ public async Task EditDNSServer() /// private async Task DeleteDNSServer() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteDNSServer, Strings.DeleteDNSServerMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs index 08f77b591b..4ca900e478 100644 --- a/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs +++ b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs @@ -505,7 +505,7 @@ private async Task DeleteEntryAction() { IsModifying = true; - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteEntry, string.Format(Strings.DeleteHostsFileEntryMessage, SelectedResult.IPAddress, SelectedResult.Hostname, string.IsNullOrEmpty(SelectedResult.Comment) ? "" : $"# {SelectedResult.Comment}"), @@ -557,21 +557,8 @@ private async Task ShowErrorMessageAsync(HostsFileEntryModifyResult result) _ => Strings.UnkownError }; - var childWindow = new OKMessageChildWindow(); - - var childWindowViewModel = new OKMessageViewModel(_ => - { - childWindow.IsOpen = false; - ConfigurationManager.Current.IsChildWindowOpen = false; - }, message, ChildWindowIcon.Error, Strings.OK); - - childWindow.Title = Strings.Error; - - childWindow.DataContext = childWindowViewModel; - - ConfigurationManager.Current.IsChildWindowOpen = true; - - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, message, + ChildWindowIcon.Error); } /// @@ -590,21 +577,8 @@ private async Task RestartAsAdminAction() } catch (Exception ex) { - var childWindow = new OKMessageChildWindow(); - - var childWindowViewModel = new OKMessageViewModel(_ => - { - childWindow.IsOpen = false; - ConfigurationManager.Current.IsChildWindowOpen = false; - }, ex.Message, ChildWindowIcon.Error, Strings.OK); - - childWindow.Title = Strings.Error; - - childWindow.DataContext = childWindowViewModel; - - ConfigurationManager.Current.IsChildWindowOpen = true; - - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); } } diff --git a/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs index b60ed88f02..a7260445b2 100644 --- a/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs @@ -515,7 +515,7 @@ public async void EditCustomCommand() /// private async Task DeleteCustomCommand() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteCustomCommand, Strings.DeleteCustomCommandMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/OKCancelMessageViewModel.cs b/Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs similarity index 64% rename from Source/NETworkManager/ViewModels/OKCancelMessageViewModel.cs rename to Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs index ba61091858..3472366e86 100644 --- a/Source/NETworkManager/ViewModels/OKCancelMessageViewModel.cs +++ b/Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs @@ -7,33 +7,33 @@ namespace NETworkManager.ViewModels; /// /// Represents the ViewModel for a message dialog with OK and Cancel options. /// -public class OKCancelMessageViewModel : ViewModelBase +public class MessageConfirmationViewModel : ViewModelBase { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// The action to execute when the OK button is clicked. + /// The action to execute when the confirm button is clicked. /// The action to execute when the Cancel button is clicked. /// The message to display. /// The icon to display in the message window. - /// The text for the OK button. - /// The text for the Cancel button. - public OKCancelMessageViewModel(Action okCommand, - Action cancelHandler, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string okButtonText = null, string cancelButtonText = null) + /// The text for the confirm button. + /// The text for the cancel button. + public MessageConfirmationViewModel(Action confirmCommand, + Action cancelHandler, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null, string cancelButtonText = null) { - OKCommand = new RelayCommand(_ => okCommand(this)); + ConfirmCommand = new RelayCommand(_ => confirmCommand(this)); CancelCommand = new RelayCommand(_ => cancelHandler(this)); Message = message; - OKButtonText = okButtonText ?? Localization.Resources.Strings.OK; + ConfirmButtonText = confirmButtonText ?? Localization.Resources.Strings.OK; CancelButtonText = cancelButtonText ?? Localization.Resources.Strings.Cancel; } /// /// Gets the command for the OK button. /// - public ICommand OKCommand { get; } + public ICommand ConfirmCommand { get; } /// /// Gets the command for the Cancel button. @@ -58,20 +58,20 @@ private init } } - private readonly string _okButtonText; + private readonly string _confirmButtonText; /// - /// Gets the text for the OK button. + /// Gets the text for the confirm button. /// - public string OKButtonText + public string ConfirmButtonText { - get => _okButtonText; + get => _confirmButtonText; private init { - if (value == _okButtonText) + if (value == _confirmButtonText) return; - _okButtonText = value; + _confirmButtonText = value; OnPropertyChanged(); } } @@ -79,7 +79,7 @@ private init private readonly string _cancelButtonText; /// - /// Gets the text for the Cancel button. + /// Gets the text for the cancel button. /// public string CancelButtonText { diff --git a/Source/NETworkManager/ViewModels/OKMessageViewModel.cs b/Source/NETworkManager/ViewModels/MessageViewModel.cs similarity index 59% rename from Source/NETworkManager/ViewModels/OKMessageViewModel.cs rename to Source/NETworkManager/ViewModels/MessageViewModel.cs index 690e177d58..1dc4a20c16 100644 --- a/Source/NETworkManager/ViewModels/OKMessageViewModel.cs +++ b/Source/NETworkManager/ViewModels/MessageViewModel.cs @@ -7,29 +7,29 @@ namespace NETworkManager.ViewModels; /// /// Represents the ViewModel for a message dialog with an OK option. /// -public class OKMessageViewModel : ViewModelBase +public class MessageViewModel : ViewModelBase { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// The action to execute when the OK button is clicked. + /// The action to execute when the confirm button is clicked. /// The message to display. /// The icon to display in the message window. - /// The text for the OK button. - public OKMessageViewModel(Action okCommand, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string okButtonText = null) + /// The text for the OK button. + public MessageViewModel(Action confirmCommand, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null) { - OKCommand = new RelayCommand(_ => okCommand(this)); + ConfirmCommand = new RelayCommand(_ => confirmCommand(this)); Message = message; - OKButtonText = okButtonText ?? Localization.Resources.Strings.OK; + ConfirmButtonText = confirmButtonText ?? Localization.Resources.Strings.OK; Icon = icon; } /// /// Gets the command for the OK button. /// - public ICommand OKCommand { get; } + public ICommand ConfirmCommand { get; } private readonly string _message; @@ -49,20 +49,20 @@ private init } } - private readonly string _okButtonText; + private readonly string _confirmButtonText; /// - /// Gets the text for the OK button. + /// Gets the text for the confirm button. /// - public string OKButtonText + public string ConfirmButtonText { - get => _okButtonText; + get => _confirmButtonText; private init { - if (value == _okButtonText) + if (value == _confirmButtonText) return; - _okButtonText = value; + _confirmButtonText = value; OnPropertyChanged(); } } diff --git a/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs index 8869701c0e..6826bcd317 100644 --- a/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs @@ -265,7 +265,7 @@ public async Task EditPortProfile() private async Task DeletePortProfile() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeletePortProfile, Strings.DeletePortProfileMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs index 70b7c4d1f1..9e487e3332 100644 --- a/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs @@ -203,7 +203,7 @@ public async Task EditOIDProfile() private async Task DeleteOIDProfile() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteOIDProfile, Strings.DeleteOIDProfileMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs index 70eae4e110..af73a4cc10 100644 --- a/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs @@ -194,7 +194,7 @@ public async Task EditServer() private async Task DeleteServer() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteSNTPServer, Strings.DeleteSNTPServerMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs index f6bd5260f7..66a1793179 100644 --- a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs @@ -141,7 +141,7 @@ private async Task AddProfileFileAction() .FirstOrDefault(p => p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase)); // Ask the user if they want to enable encryption for the new profile file - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.EnableEncryptionQuestion, Strings.EnableEncryptionForProfileFileMessage); @@ -197,7 +197,7 @@ private bool DeleteProfileFile_CanExecute(object obj) private async Task DeleteProfileFileAction() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteProfileFile, string.Format(Strings.DeleteProfileFileXMessage, SelectedProfileFile.Name), ChildWindowIcon.Info, @@ -217,7 +217,7 @@ private async Task DeleteProfileFileAction() private async Task EnableEncryptionAction() { // Show encryption disclaimer - if (!await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + if (!await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.Disclaimer, Strings.ProfileEncryptionDisclaimer)) return; @@ -237,7 +237,7 @@ private async Task EnableEncryptionAction() } catch (Exception ex) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.EncryptionError, $"{Strings.EncryptionErrorMessage}\n\n{ex.Message}", ChildWindowIcon.Error).ConfigureAwait(false); @@ -283,14 +283,14 @@ private async Task ChangeMasterPasswordAction() } catch (CryptographicException) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.WrongPassword, Strings.WrongPasswordDecryptionFailedMessage, ChildWindowIcon.Error).ConfigureAwait(false); } catch (Exception ex) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.DecryptionError, $"{Strings.DecryptionErrorMessage}\n\n{ex.Message}", ChildWindowIcon.Error).ConfigureAwait(false); @@ -336,14 +336,14 @@ private async Task DisableEncryptionAction() } catch (CryptographicException) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.WrongPassword, Strings.WrongPasswordDecryptionFailedMessage, ChildWindowIcon.Error).ConfigureAwait(false); } catch (Exception ex) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.DecryptionError, $"{Strings.DecryptionErrorMessage}\n\n{ex.Message}", ChildWindowIcon.Error).ConfigureAwait(false); diff --git a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs index d004a0d3bb..399ffb1e02 100644 --- a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs @@ -68,7 +68,7 @@ private void ResetSettingsAction() private async Task ResetSettings() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.ResetSettingsQuestion, Strings.SettingsAreResetAndApplicationWillBeRestartedMessage, ChildWindowIcon.Question, diff --git a/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs b/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs index fcde9483e5..b5f3b9230b 100644 --- a/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs @@ -108,7 +108,7 @@ private void DeleteBrowsingDataAction() private async Task DeleteBrowsingData() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteBrowsingData, Strings.DeleteBrowsingDataMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/Views/OKMessageChildWindow.xaml b/Source/NETworkManager/Views/MessageChildWindow.xaml similarity index 90% rename from Source/NETworkManager/Views/OKMessageChildWindow.xaml rename to Source/NETworkManager/Views/MessageChildWindow.xaml index 97df645cb8..eece13622d 100644 --- a/Source/NETworkManager/Views/OKMessageChildWindow.xaml +++ b/Source/NETworkManager/Views/MessageChildWindow.xaml @@ -1,4 +1,4 @@ - + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:MessageViewModel}"> @@ -40,8 +40,8 @@ - /// The dialog coordinator instance. - public DiscoveryProtocolViewModel(IDialogCoordinator instance) + public DiscoveryProtocolViewModel() { _isLoading = true; - _dialogCoordinator = instance; - _discoveryProtocolCapture.PackageReceived += DiscoveryProtocol_PackageReceived; _discoveryProtocolCapture.ErrorReceived += DiscoveryProtocol_ErrorReceived; _discoveryProtocolCapture.WarningReceived += DiscoveryProtocol_WarningReceived; @@ -351,8 +343,7 @@ private async Task RestartAsAdminAction() } catch (Exception ex) { - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } } @@ -392,8 +383,7 @@ private async Task CaptureAction() { Log.Error("Error while trying to capture", ex); - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } } @@ -423,12 +413,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.DiscoveryProtocol_ExportFileType = instance.FileType; @@ -449,7 +436,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/ListenersViewModel.cs b/Source/NETworkManager/ViewModels/ListenersViewModel.cs index 4b36a757dc..6207a4cdc7 100644 --- a/Source/NETworkManager/ViewModels/ListenersViewModel.cs +++ b/Source/NETworkManager/ViewModels/ListenersViewModel.cs @@ -19,7 +19,6 @@ using System.Windows.Data; using System.Windows.Input; using System.Windows.Threading; -using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace NETworkManager.ViewModels; diff --git a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs index da14625460..d698445701 100644 --- a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs +++ b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs @@ -20,7 +20,6 @@ using System.Windows; using System.Windows.Data; using System.Windows.Input; -using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace NETworkManager.ViewModels; diff --git a/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs index 51f89c20cd..ee1d3a6deb 100644 --- a/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PowerShell; using NETworkManager.Settings; @@ -17,9 +16,6 @@ namespace NETworkManager.ViewModels; public class PowerShellSettingsViewModel : ViewModelBase { #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; - private readonly bool _isLoading; private string _applicationFilePath; @@ -130,12 +126,10 @@ public bool IsConfigured #region Contructor, load settings - public PowerShellSettingsViewModel(IDialogCoordinator instance) + public PowerShellSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadSettings(); _isLoading = false; diff --git a/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs b/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs index 26f939c0c5..ed303a2115 100644 --- a/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs @@ -1,6 +1,5 @@ using Dragablz; using log4net; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -33,8 +32,6 @@ public class PuTTYHostViewModel : ViewModelBase, IProfileManager private static readonly ILog Log = LogManager.GetLogger(typeof(PuTTYHostViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new(); private bool _searchDisabled; @@ -313,12 +310,10 @@ public bool ProfileContextMenuIsOpen #region Constructor, load settings - public PuTTYHostViewModel(IDialogCoordinator instance) + public PuTTYHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Check if PuTTY executable is configured CheckExecutable(); diff --git a/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs index 7ba289d951..78ced6a3e9 100644 --- a/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PuTTY; using NETworkManager.Settings; @@ -18,9 +17,6 @@ namespace NETworkManager.ViewModels; public class PuTTYSettingsViewModel : ViewModelBase { #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; - public bool IsPortable => ConfigurationManager.Current.IsPortable; public string PortableLogPath => PuTTY.PortableLogPath; @@ -393,12 +389,10 @@ public int RloginPort #region Contructor, load settings - public PuTTYSettingsViewModel(IDialogCoordinator instance) + public PuTTYSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadSettings(); _isLoading = false; diff --git a/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs index af73a4cc10..ad986c0490 100644 --- a/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs @@ -1,5 +1,4 @@ -using MahApps.Metro.Controls.Dialogs; -using MahApps.Metro.SimpleChildWindow; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Network; using NETworkManager.Settings; @@ -24,8 +23,6 @@ public class SNTPLookupSettingsViewModel : ViewModelBase private readonly ServerConnectionInfo _profileDialogDefaultValues = new("time.example.com", 123, TransportProtocol.Tcp); - private readonly IDialogCoordinator _dialogCoordinator; - private readonly ICollectionView _sntpServers; public ICollectionView SNTPServers @@ -81,12 +78,10 @@ public int Timeout #region Constructor, load settings - public SNTPLookupSettingsViewModel(IDialogCoordinator instance) + public SNTPLookupSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - SNTPServers = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNTPLookup_SNTPServers); SNTPServers.SortDescriptions.Add(new SortDescription(nameof(ServerConnectionInfoProfile.Name), ListSortDirection.Ascending)); diff --git a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs index 66a1793179..e4fd415d94 100644 --- a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs @@ -1,5 +1,4 @@ -using MahApps.Metro.Controls.Dialogs; -using MahApps.Metro.SimpleChildWindow; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Profiles; using NETworkManager.Settings; @@ -21,8 +20,6 @@ public class SettingsProfilesViewModel : ViewModelBase { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - public Action CloseAction { get; set; } private string _location; @@ -74,10 +71,8 @@ public ProfileFileInfo SelectedProfileFile #region Constructor, LoadSettings - public SettingsProfilesViewModel(IDialogCoordinator instance) + public SettingsProfilesViewModel() { - _dialogCoordinator = instance; - ProfileFiles = new CollectionViewSource { Source = ProfileManager.ProfileFiles }.View; ProfileFiles.SortDescriptions.Add( new SortDescription(nameof(ProfileFileInfo.Name), ListSortDirection.Ascending)); diff --git a/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs b/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs index 40296f2522..c8fc74b7cb 100644 --- a/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using Microsoft.Web.WebView2.Core; using NETworkManager.Controls; @@ -29,8 +28,6 @@ public class WebConsoleHostViewModel : ViewModelBase, IProfileManager { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new(); private bool _searchDisabled; @@ -283,12 +280,10 @@ public GridLength ProfileWidth #region Constructor, load settings - public WebConsoleHostViewModel(IDialogCoordinator instance) + public WebConsoleHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - try { CoreWebView2Environment.GetAvailableBrowserVersionString(); diff --git a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml index 71176a7957..47de679080 100644 --- a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml +++ b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml @@ -6,11 +6,9 @@ xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:networkManager="clr-namespace:NETworkManager" xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" - xmlns:dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - dialog:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:DiscoveryProtocolViewModel}"> diff --git a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs index 24c5136e58..35281a5be2 100644 --- a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs +++ b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs @@ -1,11 +1,10 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; +using NETworkManager.ViewModels; namespace NETworkManager.Views; public partial class DiscoveryProtocolView { - private readonly DiscoveryProtocolViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly DiscoveryProtocolViewModel _viewModel = new(); public DiscoveryProtocolView() { diff --git a/Source/NETworkManager/Views/PowerShellSettingsView.xaml b/Source/NETworkManager/Views/PowerShellSettingsView.xaml index dd2f731d3e..14409048e9 100644 --- a/Source/NETworkManager/Views/PowerShellSettingsView.xaml +++ b/Source/NETworkManager/Views/PowerShellSettingsView.xaml @@ -5,10 +5,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" - dialogs:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PowerShellSettingsViewModel}"> diff --git a/Source/NETworkManager/Views/PowerShellSettingsView.xaml.cs b/Source/NETworkManager/Views/PowerShellSettingsView.xaml.cs index 9e3676d30e..9686cc9fb0 100644 --- a/Source/NETworkManager/Views/PowerShellSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/PowerShellSettingsView.xaml.cs @@ -1,12 +1,11 @@ using System.Windows; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; namespace NETworkManager.Views; public partial class PowerShellSettingsView { - private readonly PowerShellSettingsViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly PowerShellSettingsViewModel _viewModel = new(); public PowerShellSettingsView() { diff --git a/Source/NETworkManager/Views/PuTTYHostView.xaml b/Source/NETworkManager/Views/PuTTYHostView.xaml index 4e8ec3cad9..9daad3aaf7 100644 --- a/Source/NETworkManager/Views/PuTTYHostView.xaml +++ b/Source/NETworkManager/Views/PuTTYHostView.xaml @@ -8,7 +8,6 @@ xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:internalControls="clr-namespace:NETworkManager.Controls" @@ -18,7 +17,6 @@ xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" xmlns:networkManager="clr-namespace:NETworkManager" - dialogs:DialogParticipation.Register="{Binding}" Loaded="UserControl_Loaded" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PuTTYHostViewModel}"> diff --git a/Source/NETworkManager/Views/PuTTYHostView.xaml.cs b/Source/NETworkManager/Views/PuTTYHostView.xaml.cs index 431d40ce23..e9a52605f4 100644 --- a/Source/NETworkManager/Views/PuTTYHostView.xaml.cs +++ b/Source/NETworkManager/Views/PuTTYHostView.xaml.cs @@ -3,14 +3,13 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; namespace NETworkManager.Views; public partial class PuTTYHostView { - private readonly PuTTYHostViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly PuTTYHostViewModel _viewModel = new(); private bool _loaded; diff --git a/Source/NETworkManager/Views/PuTTYSettingsView.xaml b/Source/NETworkManager/Views/PuTTYSettingsView.xaml index 4d5f6a0d9a..d1aeb07729 100644 --- a/Source/NETworkManager/Views/PuTTYSettingsView.xaml +++ b/Source/NETworkManager/Views/PuTTYSettingsView.xaml @@ -5,11 +5,9 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" - dialogs:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PuTTYSettingsViewModel}"> diff --git a/Source/NETworkManager/Views/PuTTYSettingsView.xaml.cs b/Source/NETworkManager/Views/PuTTYSettingsView.xaml.cs index c429dd4209..ad6dc23cb5 100644 --- a/Source/NETworkManager/Views/PuTTYSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/PuTTYSettingsView.xaml.cs @@ -1,5 +1,4 @@ using System.Windows; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; namespace NETworkManager.Views; @@ -9,7 +8,7 @@ public partial class PuTTYSettingsView /// /// Variable to hold an instance of the view model. /// - private readonly PuTTYSettingsViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly PuTTYSettingsViewModel _viewModel = new(); /// /// Create a new instance of . diff --git a/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml index ec0c9389a4..7f2dc82fa6 100644 --- a/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml +++ b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml @@ -9,8 +9,6 @@ xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" - dialogs:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:SNTPLookupSettingsViewModel}"> diff --git a/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml.cs b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml.cs index 4edf479b8e..003d8f0f30 100644 --- a/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml.cs @@ -1,14 +1,13 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; namespace NETworkManager.Views; public partial class SNTPLookupSettingsView { - private readonly SNTPLookupSettingsViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly SNTPLookupSettingsViewModel _viewModel = new(); public SNTPLookupSettingsView() { diff --git a/Source/NETworkManager/Views/SettingsProfilesView.xaml b/Source/NETworkManager/Views/SettingsProfilesView.xaml index 5112afb2c9..d73f2640c8 100644 --- a/Source/NETworkManager/Views/SettingsProfilesView.xaml +++ b/Source/NETworkManager/Views/SettingsProfilesView.xaml @@ -6,11 +6,9 @@ xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" - dialogs:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:SettingsProfilesViewModel}" Loaded="UserControl_Loaded"> diff --git a/Source/NETworkManager/Views/SettingsProfilesView.xaml.cs b/Source/NETworkManager/Views/SettingsProfilesView.xaml.cs index 78a40ba4dc..b64f47e93a 100644 --- a/Source/NETworkManager/Views/SettingsProfilesView.xaml.cs +++ b/Source/NETworkManager/Views/SettingsProfilesView.xaml.cs @@ -1,14 +1,13 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; namespace NETworkManager.Views; public partial class SettingsProfilesView { - private readonly SettingsProfilesViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly SettingsProfilesViewModel _viewModel = new(); public SettingsProfilesView() { diff --git a/Source/NETworkManager/Views/WebConsoleHostView.xaml b/Source/NETworkManager/Views/WebConsoleHostView.xaml index 244fa8c195..61bf2d1beb 100644 --- a/Source/NETworkManager/Views/WebConsoleHostView.xaml +++ b/Source/NETworkManager/Views/WebConsoleHostView.xaml @@ -8,7 +8,6 @@ xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" @@ -18,7 +17,6 @@ xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" xmlns:networkManager="clr-namespace:NETworkManager" - dialogs:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:WebConsoleHostViewModel}"> diff --git a/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs b/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs index 49487fa1c6..3922ccc634 100644 --- a/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs +++ b/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs @@ -8,7 +8,7 @@ namespace NETworkManager.Views; public partial class WebConsoleHostView { - private readonly WebConsoleHostViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly WebConsoleHostViewModel _viewModel = new(); public WebConsoleHostView() { From 1223b55794bbecfa2c68aa5003ad68e45374eaf4 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Dec 2025 00:54:11 +0100 Subject: [PATCH 06/31] Feature: More dialogs --- .../NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs | 7 +------ Source/NETworkManager/Views/TigerVNCSettingsView.xaml | 2 -- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs b/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs index 79824a9039..b2592bcc9b 100644 --- a/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Settings; using NETworkManager.Utilities; @@ -15,8 +14,6 @@ public class TigerVNCSettingsViewModel : ViewModelBase { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly bool _isLoading; private string _applicationFilePath; @@ -76,12 +73,10 @@ public int Port #region Contructor, load settings - public TigerVNCSettingsViewModel(IDialogCoordinator instance) + public TigerVNCSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadSettings(); _isLoading = false; diff --git a/Source/NETworkManager/Views/TigerVNCSettingsView.xaml b/Source/NETworkManager/Views/TigerVNCSettingsView.xaml index 4875d57ee5..f2e7adce35 100644 --- a/Source/NETworkManager/Views/TigerVNCSettingsView.xaml +++ b/Source/NETworkManager/Views/TigerVNCSettingsView.xaml @@ -5,10 +5,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" - dialogs:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:TigerVNCSettingsViewModel}"> From 597d999b83f7a00c6bb0f4b41b1012bf2d26be07 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Dec 2025 01:01:25 +0100 Subject: [PATCH 07/31] Chore: migrate more dialogs --- .../NETworkManager/ViewModels/PingMonitorHostViewModel.cs | 7 +------ Source/NETworkManager/Views/PingMonitorHostView.xaml | 2 -- Source/NETworkManager/Views/PingMonitorHostView.xaml.cs | 5 ++--- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs index 81366c456a..12918d0ba7 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs @@ -1,5 +1,4 @@ using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; @@ -30,7 +29,6 @@ public class PingMonitorHostViewModel : ViewModelBase, IProfileManager { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; private CancellationTokenSource _cancellationTokenSource; private readonly DispatcherTimer _searchDispatcherTimer = new(); @@ -407,13 +405,10 @@ public GridLength ProfileWidth /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public PingMonitorHostViewModel(IDialogCoordinator instance) + public PingMonitorHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Host history HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PingMonitor_HostHistory); diff --git a/Source/NETworkManager/Views/PingMonitorHostView.xaml b/Source/NETworkManager/Views/PingMonitorHostView.xaml index 7b0ad58c30..d8faf328a4 100644 --- a/Source/NETworkManager/Views/PingMonitorHostView.xaml +++ b/Source/NETworkManager/Views/PingMonitorHostView.xaml @@ -12,12 +12,10 @@ xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" xmlns:utilities="clr-namespace:NETworkManager.Utilities;assembly=NETworkManager.Utilities" xmlns:networkManager="clr-namespace:NETworkManager" - dialogs:DialogParticipation.Register="{Binding}" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PingMonitorHostViewModel}"> diff --git a/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs b/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs index ccaafacaa0..580c829800 100644 --- a/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs +++ b/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs @@ -1,5 +1,4 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; +using NETworkManager.ViewModels; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -8,7 +7,7 @@ namespace NETworkManager.Views; public partial class PingMonitorHostView { - private readonly PingMonitorHostViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly PingMonitorHostViewModel _viewModel = new(); public PingMonitorHostView() { From f5353b56d94ee87e502deeaf421ba38d96054ced Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Dec 2025 01:01:30 +0100 Subject: [PATCH 08/31] Update PowerShellControl.xaml.cs --- Source/NETworkManager/Controls/PowerShellControl.xaml.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs index 163415cc8e..cc387150dc 100644 --- a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs +++ b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs @@ -191,6 +191,7 @@ private async Task Connect() catch (Exception ex) { if (!_closed) + // ToDo: target the correct window await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } From 375337457e8e69aae65bb4a8ad11b6deb85cf08a Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Dec 2025 01:04:08 +0100 Subject: [PATCH 09/31] Dotnet format --- Source/NETworkManager/DialogHelper.cs | 2 +- Source/NETworkManager/ViewModels/ARPTableViewModel.cs | 2 +- Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs | 2 +- Source/NETworkManager/ViewModels/PingMonitorViewModel.cs | 2 +- Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs | 2 +- .../ViewModels/SubnetCalculatorSubnettingViewModel.cs | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/NETworkManager/DialogHelper.cs b/Source/NETworkManager/DialogHelper.cs index fd84171c06..a5882b633a 100644 --- a/Source/NETworkManager/DialogHelper.cs +++ b/Source/NETworkManager/DialogHelper.cs @@ -27,7 +27,7 @@ public static class DialogHelper /// The text to display on the confirm button. If null, a default value is used. /// A task that completes when the user closes the message dialog. public static Task ShowMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null) - { + { confirmButtonText ??= Strings.OK; var childWindow = new MessageChildWindow(); diff --git a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs b/Source/NETworkManager/ViewModels/ARPTableViewModel.cs index 793a83cf7e..02cfbb3be2 100644 --- a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs +++ b/Source/NETworkManager/ViewModels/ARPTableViewModel.cs @@ -517,7 +517,7 @@ private Task ExportAction() ConfigurationManager.Current.IsChildWindowOpen = false; try - { + { ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? Results diff --git a/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs index d47c2e9855..59940d9f29 100644 --- a/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs +++ b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs @@ -220,7 +220,7 @@ private set public HostsFileEditorViewModel() { _isLoading = true; - + // Result view + search ResultsView = CollectionViewSource.GetDefaultView(Results); ResultsView.Filter = o => diff --git a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs index 470ab08d13..db205fd8b3 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs @@ -501,7 +501,7 @@ public Task Export() catch (Exception ex) { Log.Error("Error while exporting data as " + instance.FileType, ex); - + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, ChildWindowIcon.Error); diff --git a/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs index f2fbea3bf1..9736e4b1ae 100644 --- a/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs @@ -148,7 +148,7 @@ private set public SNTPLookupViewModel(Guid tabId) { _isLoading = true; - + ConfigurationManager.Current.SNTPLookupTabCount++; _tabId = tabId; diff --git a/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs b/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs index b9c8810d3a..b1845036f0 100644 --- a/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs +++ b/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs @@ -248,8 +248,8 @@ private async Task Calculate() var baseCidr = ipNetwork.AddressFamily == AddressFamily.InterNetwork ? 32 : 128; if (65535 < Math.Pow(2, baseCidr - ipNetwork.Cidr) / Math.Pow(2, baseCidr - newCidr)) - { - if(!await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.AreYouSure, Strings.TheProcessCanTakeUpSomeTimeAndResources)) + { + if (!await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.AreYouSure, Strings.TheProcessCanTakeUpSomeTimeAndResources)) { IsRunning = false; From 627cc0b874cf76b3577ceb559006fb481780428b Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Dec 2025 20:31:42 +0100 Subject: [PATCH 10/31] Update TigerVNCSettingsView.xaml.cs --- Source/NETworkManager/Views/TigerVNCSettingsView.xaml.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/NETworkManager/Views/TigerVNCSettingsView.xaml.cs b/Source/NETworkManager/Views/TigerVNCSettingsView.xaml.cs index db88dc1b6b..6c4bcf237a 100644 --- a/Source/NETworkManager/Views/TigerVNCSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/TigerVNCSettingsView.xaml.cs @@ -1,12 +1,11 @@ using System.Windows; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; namespace NETworkManager.Views; public partial class TigerVNCSettingsView { - private readonly TigerVNCSettingsViewModel _viewModel = new(DialogCoordinator.Instance); + private readonly TigerVNCSettingsViewModel _viewModel = new(); public TigerVNCSettingsView() { From 61f9636202745dcbebc3a56f7d1daa715cbe65e1 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Dec 2025 22:12:21 +0100 Subject: [PATCH 11/31] Feature: Migrate more dialogs --- .../VisualTreeHelper.cs | 19 ++++++++++++++++++- .../Controls/PowerShellControl.xaml.cs | 4 ++-- .../NETworkManager/Controls/PuTTYControl.xaml | 1 - .../Controls/PuTTYControl.xaml.cs | 18 ++---------------- .../Controls/TigerVNCControl.xaml | 1 - .../Controls/TigerVNCControl.xaml.cs | 17 ++--------------- .../Controls/WebConsoleControl.xaml | 1 - 7 files changed, 24 insertions(+), 37 deletions(-) diff --git a/Source/NETworkManager.Utilities/VisualTreeHelper.cs b/Source/NETworkManager.Utilities/VisualTreeHelper.cs index 8592fa5756..86d560131d 100644 --- a/Source/NETworkManager.Utilities/VisualTreeHelper.cs +++ b/Source/NETworkManager.Utilities/VisualTreeHelper.cs @@ -3,8 +3,25 @@ namespace NETworkManager.Utilities; +/// +/// Provides helper methods for traversing and querying the visual tree of WPF elements. +/// +/// The VisualTreeHelper class contains static methods that facilitate searching for and enumerating +/// visual child elements within a WPF application's visual tree. These methods are useful for scenarios where you need +/// to locate elements of a specific type or perform operations on all descendants of a visual element. public class VisualTreeHelper { + /// + /// Enumerates all descendant visual children of a specified type from the visual tree starting at the given + /// dependency object. + /// + /// This method performs a recursive depth-first traversal of the visual tree. It yields each + /// descendant of the specified type, including those nested at any depth. The enumeration is deferred and elements + /// are returned as they are discovered. + /// The type of visual child to search for. Must derive from DependencyObject. + /// The root of the visual tree to search. Cannot be null. + /// An enumerable collection of all descendant elements of type T found in the visual tree. The collection is empty + /// if no matching elements are found. public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject { if (depObj == null) @@ -19,4 +36,4 @@ public static IEnumerable FindVisualChildren(DependencyObject depObj) wher foreach (var childOfChild in FindVisualChildren(child)) yield return childOfChild; } } -} \ No newline at end of file +} diff --git a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs index cc387150dc..420654fc22 100644 --- a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs +++ b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs @@ -191,8 +191,8 @@ private async Task Connect() catch (Exception ex) { if (!_closed) - // ToDo: target the correct window - await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); + // Use built-in message box because we have visual issues in the dragablz window + MessageBox.Show(ex.Message, Strings.Error, MessageBoxButton.OK, MessageBoxImage.Error); } IsConnecting = false; diff --git a/Source/NETworkManager/Controls/PuTTYControl.xaml b/Source/NETworkManager/Controls/PuTTYControl.xaml index 227a61868f..d431ec8685 100644 --- a/Source/NETworkManager/Controls/PuTTYControl.xaml +++ b/Source/NETworkManager/Controls/PuTTYControl.xaml @@ -9,7 +9,6 @@ xmlns:local="clr-namespace:NETworkManager.Controls" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - mah:DialogParticipation.Register="{Binding}" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:PuTTYControl}"> diff --git a/Source/NETworkManager/Controls/PuTTYControl.xaml.cs b/Source/NETworkManager/Controls/PuTTYControl.xaml.cs index fdc8ef9f3a..8d7c623af2 100644 --- a/Source/NETworkManager/Controls/PuTTYControl.xaml.cs +++ b/Source/NETworkManager/Controls/PuTTYControl.xaml.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PuTTY; using NETworkManager.Settings; @@ -30,8 +29,6 @@ private void WindowGrid_SizeChanged(object sender, SizeChangedEventArgs e) private bool _initialized; private bool _closed; - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private readonly PuTTYSessionInfo _sessionInfo; @@ -77,8 +74,6 @@ public PuTTYControl(Guid tabId, PuTTYSessionInfo sessionInfo) InitializeComponent(); DataContext = this; - _dialogCoordinator = DialogCoordinator.Instance; - ConfigurationManager.Current.PuTTYTabCount++; _tabId = tabId; @@ -213,17 +208,8 @@ private async Task Connect() catch (Exception ex) { if (!_closed) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - ConfigurationManager.OnDialogOpen(); - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - ex.Message, MessageDialogStyle.Affirmative, settings); - - ConfigurationManager.OnDialogClose(); - } + // Use built-in message box because we have visual issues in the dragablz window + MessageBox.Show(ex.Message, Strings.Error, MessageBoxButton.OK, MessageBoxImage.Error); } IsConnecting = false; diff --git a/Source/NETworkManager/Controls/TigerVNCControl.xaml b/Source/NETworkManager/Controls/TigerVNCControl.xaml index a20f0c5a3e..eaa52952ef 100644 --- a/Source/NETworkManager/Controls/TigerVNCControl.xaml +++ b/Source/NETworkManager/Controls/TigerVNCControl.xaml @@ -9,7 +9,6 @@ xmlns:local="clr-namespace:NETworkManager.Controls" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - mah:DialogParticipation.Register="{Binding}" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:TigerVNCControl}"> diff --git a/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs b/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs index 55f8fb1e04..b4f6f4bf89 100644 --- a/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs +++ b/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.TigerVNC; using NETworkManager.Settings; @@ -29,8 +28,6 @@ private void TigerVNCGrid_SizeChanged(object sender, SizeChangedEventArgs e) private bool _initialized; private bool _closed; - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private readonly TigerVNCSessionInfo _sessionInfo; @@ -76,8 +73,6 @@ public TigerVNCControl(Guid tabId, TigerVNCSessionInfo sessionInfo) InitializeComponent(); DataContext = this; - _dialogCoordinator = DialogCoordinator.Instance; - ConfigurationManager.Current.TigerVNCTabCount++; _tabId = tabId; @@ -209,16 +204,8 @@ private async Task Connect() catch (Exception ex) { if (!_closed) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - ConfigurationManager.OnDialogOpen(); - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - ex.Message, MessageDialogStyle.Affirmative, settings); - - ConfigurationManager.OnDialogClose(); - } + // Use built-in message box because we have visual issues in the dragablz window + MessageBox.Show(ex.Message, Strings.Error, MessageBoxButton.OK, MessageBoxImage.Error); } IsConnecting = false; diff --git a/Source/NETworkManager/Controls/WebConsoleControl.xaml b/Source/NETworkManager/Controls/WebConsoleControl.xaml index 9ac5538813..92b8056c28 100644 --- a/Source/NETworkManager/Controls/WebConsoleControl.xaml +++ b/Source/NETworkManager/Controls/WebConsoleControl.xaml @@ -10,7 +10,6 @@ xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" xmlns:webview="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf" - mah:DialogParticipation.Register="{Binding}" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:WebConsoleControl}"> From 5a48bb68118b85e19cb0a30930486e239e44bb75 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Dec 2025 22:28:14 +0100 Subject: [PATCH 12/31] Feature: Migrate dialog --- .../ViewModels/WiFiViewModel.cs | 197 +++++++++--------- ...ialog.xaml => WiFiConnectChildWindow.xaml} | 78 +++---- .../Views/WiFiConnectChildWindow.xaml.cs | 24 +++ .../Views/WiFiConnectDialog.xaml.cs | 34 --- Source/NETworkManager/Views/WiFiView.xaml | 2 - Source/NETworkManager/Views/WiFiView.xaml.cs | 5 +- 6 files changed, 166 insertions(+), 174 deletions(-) rename Source/NETworkManager/Views/{WiFiConnectDialog.xaml => WiFiConnectChildWindow.xaml} (81%) create mode 100644 Source/NETworkManager/Views/WiFiConnectChildWindow.xaml.cs delete mode 100644 Source/NETworkManager/Views/WiFiConnectDialog.xaml.cs diff --git a/Source/NETworkManager/ViewModels/WiFiViewModel.cs b/Source/NETworkManager/ViewModels/WiFiViewModel.cs index 6efdbb9b02..2db041ae12 100644 --- a/Source/NETworkManager/ViewModels/WiFiViewModel.cs +++ b/Source/NETworkManager/ViewModels/WiFiViewModel.cs @@ -31,9 +31,6 @@ namespace NETworkManager.ViewModels; public class WiFiViewModel : ViewModelBase { #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; - private static readonly ILog Log = LogManager.GetLogger(typeof(WiFiViewModel)); private readonly bool _isLoading; @@ -440,12 +437,10 @@ private set #region Constructor, load settings - public WiFiViewModel(IDialogCoordinator instance) + public WiFiViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Check if Microsoft.Windows.SDK.Contracts is available SdkContractAvailable = ApiInformation.IsTypePresent("Windows.Devices.WiFi.WiFiAdapter"); @@ -792,124 +787,128 @@ private LineSeries GetSeriesCollection(WiFiNetworkInfo network) }; } - private async void Connect() + private Task Connect() { var selectedAdapter = SelectedAdapter; var selectedNetwork = SelectedNetwork; var connectMode = WiFi.GetConnectMode(selectedNetwork.AvailableNetwork); - var customDialog = new CustomDialog + var childWindow = new WiFiConnectChildWindow(); + + var childWindowViewModel = new WiFiConnectViewModel(async instance => { - Title = selectedNetwork.IsHidden - ? Strings.HiddenNetwork - : string.Format(Strings.ConnectToXXX, selectedNetwork.AvailableNetwork.Ssid) - }; + // Connect Open/PSK/EAP + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; + + // Show status message + IsConnecting = true; + ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); + IsConnectionStatusMessageDisplayed = true; + + // Connect to the network + var reconnectionKind = instance.ConnectAutomatically + ? WiFiReconnectionKind.Automatic + : WiFiReconnectionKind.Manual; + + PasswordCredential credential = new(); - var connectViewModel = new WiFiConnectViewModel(async instance => + switch (instance.ConnectMode) { - // Connect Open/PSK/EAP - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + case WiFiConnectMode.Psk: + credential.Password = SecureStringHelper.ConvertToString(instance.PreSharedKey); + break; + case WiFiConnectMode.Eap: + credential.UserName = instance.Username; - var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; + if (!string.IsNullOrEmpty(instance.Domain)) + credential.Resource = instance.Domain; - // Show status message - IsConnecting = true; - ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); - IsConnectionStatusMessageDisplayed = true; + credential.Password = SecureStringHelper.ConvertToString(instance.Password); + break; + } - // Connect to the network - var reconnectionKind = instance.ConnectAutomatically - ? WiFiReconnectionKind.Automatic - : WiFiReconnectionKind.Manual; + WiFiConnectionStatus connectionResult; - PasswordCredential credential = new(); + if (selectedNetwork.IsHidden) + connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, + instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential, instance.Ssid); + else + connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, + instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential); - switch (instance.ConnectMode) - { - case WiFiConnectMode.Psk: - credential.Password = SecureStringHelper.ConvertToString(instance.PreSharedKey); - break; - case WiFiConnectMode.Eap: - credential.UserName = instance.Username; + // Done connecting + IsConnecting = false; - if (!string.IsNullOrEmpty(instance.Domain)) - credential.Resource = instance.Domain; + // Get result + ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success + ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) + : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, + ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); - credential.Password = SecureStringHelper.ConvertToString(instance.Password); - break; - } + // Hide message automatically + _hideConnectionStatusMessageTimer.Start(); + + // Update the Wi-Fi networks. + // Wait because an error may occur if a refresh is done directly after connecting. + await ScanAsync(SelectedAdapter, true, 5000); + }, async instance => + { + // Connect WPS + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - WiFiConnectionStatus connectionResult; + var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; - if (selectedNetwork.IsHidden) - connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, - instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential, instance.Ssid); - else - connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, - instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential); + // Show status message + IsConnecting = true; + ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); + IsConnectionStatusMessageDisplayed = true; - // Done connecting - IsConnecting = false; + // Connect to the network + var reconnectionKind = instance.ConnectAutomatically + ? WiFiReconnectionKind.Automatic + : WiFiReconnectionKind.Manual; - // Get result - ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success - ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) - : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, - ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); + var connectionResult = await WiFi.ConnectWpsAsync( + instance.Options.AdapterInfo.WiFiAdapter, instance.Options.NetworkInfo.AvailableNetwork, + reconnectionKind); - // Hide message automatically - _hideConnectionStatusMessageTimer.Start(); + // Done connecting + IsConnecting = false; - // Update the Wi-Fi networks. - // Wait because an error may occur if a refresh is done directly after connecting. - await ScanAsync(SelectedAdapter, true, 5000); - }, async instance => - { - // Connect WPS - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; - - // Show status message - IsConnecting = true; - ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); - IsConnectionStatusMessageDisplayed = true; - - // Connect to the network - var reconnectionKind = instance.ConnectAutomatically - ? WiFiReconnectionKind.Automatic - : WiFiReconnectionKind.Manual; - - var connectionResult = await WiFi.ConnectWpsAsync( - instance.Options.AdapterInfo.WiFiAdapter, instance.Options.NetworkInfo.AvailableNetwork, - reconnectionKind); - - // Done connecting - IsConnecting = false; - - // Get result - ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success - ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) - : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, - ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); - - // Hide message automatically - _hideConnectionStatusMessageTimer.Start(); - - // Update the Wi-Fi networks. - // Wait because an error may occur if a refresh is done directly after connecting. - await ScanAsync(SelectedAdapter, true, 5000); - }, - _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, (selectedAdapter, selectedNetwork), + // Get result + ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success + ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) + : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, + ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); + + // Hide message automatically + _hideConnectionStatusMessageTimer.Start(); + + // Update the Wi-Fi networks. + // Wait because an error may occur if a refresh is done directly after connecting. + await ScanAsync(SelectedAdapter, true, 5000); + }, + _ => { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, (selectedAdapter, selectedNetwork), connectMode); - customDialog.Content = new WiFiConnectDialog - { - DataContext = connectViewModel - }; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + childWindow.Title = selectedNetwork.IsHidden + ? Strings.HiddenNetwork + : string.Format(Strings.ConnectToXXX, selectedNetwork.AvailableNetwork.Ssid); + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private async void Disconnect() diff --git a/Source/NETworkManager/Views/WiFiConnectDialog.xaml b/Source/NETworkManager/Views/WiFiConnectChildWindow.xaml similarity index 81% rename from Source/NETworkManager/Views/WiFiConnectDialog.xaml rename to Source/NETworkManager/Views/WiFiConnectChildWindow.xaml index 44132360dc..89c541fee7 100644 --- a/Source/NETworkManager/Views/WiFiConnectDialog.xaml +++ b/Source/NETworkManager/Views/WiFiConnectChildWindow.xaml @@ -1,4 +1,4 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + Loaded="ChildWindow_OnLoaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:WiFiConnectViewModel}"> + - - + + @@ -25,8 +29,8 @@ + Visibility="{Binding IsSsidRequired, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}" + Margin="0,0,0,10"> @@ -89,7 +93,7 @@ + Mode="{Binding Data.Mode, Source={StaticResource BindingProxy}}" /> @@ -101,7 +105,7 @@ public class PortProfilesViewModel : ViewModelBase { - private string _search; - - private IList _selectedPortProfiles = new ArrayList(); + #region Constructor /// /// Initializes a new instance of the class. @@ -47,8 +46,16 @@ public PortProfilesViewModel(Action okCommand, Action -1 || info.Ports.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; }; + + SelectedPortProfiles = new ArrayList { + PortProfiles.Cast().FirstOrDefault() + }; } + #endregion + + #region Variables + /// /// Gets the command to confirm the selection. /// @@ -59,6 +66,11 @@ public PortProfilesViewModel(Action okCommand, Action public ICommand CancelCommand { get; } + /// + /// Backing field for the Search property. + /// + private string _search; + /// /// Gets or sets the search text to filter the port profiles. /// @@ -74,6 +86,10 @@ public string Search PortProfiles.Refresh(); + SelectedPortProfiles = new ArrayList { + PortProfiles.Cast().FirstOrDefault() + }; + OnPropertyChanged(); } } @@ -83,6 +99,11 @@ public string Search /// public ICollectionView PortProfiles { get; } + /// + /// Backing field for the SelectedPortProfiles property. + /// + private IList _selectedPortProfiles = new ArrayList(); + /// /// Gets or sets the list of selected port profiles. /// @@ -98,13 +119,16 @@ public IList SelectedPortProfiles OnPropertyChanged(); } } + #endregion + #region Methods /// /// Gets the selected port profiles as a typed collection. /// /// A collection of selected . public IEnumerable GetSelectedPortProfiles() { - return new List(SelectedPortProfiles.Cast()); + return [.. SelectedPortProfiles.Cast()]; } + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs index a35c347078..0143f57e31 100644 --- a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -33,8 +32,6 @@ public class PortScannerViewModel : ViewModelBase #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(PortScannerViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private CancellationTokenSource _cancellationTokenSource; private readonly Guid _tabId; @@ -279,14 +276,11 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. /// The unique identifier for the tab. /// The initial host to scan. /// The initial ports to scan. - public PortScannerViewModel(IDialogCoordinator instance, Guid tabId, string host, string port) + public PortScannerViewModel(Guid tabId, string host, string port) { - _dialogCoordinator = instance; - ConfigurationManager.Current.PortScannerTabCount++; _tabId = tabId; @@ -385,24 +379,27 @@ private async Task OpenPortProfileSelection() { var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - var customDialog = new CustomDialog - { - Title = Strings.SelectPortProfile - }; + var childWindow = new PortProfilesChildWindow(window); - var viewModel = new PortProfilesViewModel(async instance => + var childWindowViewModel = new PortProfilesViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(window, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; Ports = string.Join("; ", instance.GetSelectedPortProfiles().Select(x => x.Ports)); - }, async _ => { await _dialogCoordinator.HideMetroDialogAsync(window, customDialog); }); - - customDialog.Content = new PortProfilesDialog + }, async _ => { - DataContext = viewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.SelectPortProfile; + + childWindow.DataContext = childWindowViewModel; - await _dialogCoordinator.ShowMetroDialogAsync(window, customDialog); + ConfigurationManager.Current.IsChildWindowOpen = true; + + await window.ShowChildWindowAsync(childWindow); } private async Task Start() @@ -498,12 +495,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - await DialogHelper.ShowMessageAsync(window, Strings.Error, Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, ChildWindowIcon.Error); + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.PortScanner_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs index 9736e4b1ae..dd0b8de56c 100644 --- a/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs @@ -251,12 +251,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - await DialogHelper.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, ChildWindowIcon.Error); + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.SNTPLookup_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/Views/PortProfilesDialog.xaml b/Source/NETworkManager/Views/PortProfilesChildWindow.xaml similarity index 71% rename from Source/NETworkManager/Views/PortProfilesDialog.xaml rename to Source/NETworkManager/Views/PortProfilesChildWindow.xaml index c456bc5efe..f65ca77a6e 100644 --- a/Source/NETworkManager/Views/PortProfilesDialog.xaml +++ b/Source/NETworkManager/Views/PortProfilesChildWindow.xaml @@ -1,4 +1,4 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + Loaded="ChildWindow_OnLoaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PortProfilesViewModel}"> + @@ -23,17 +27,17 @@ Style="{StaticResource ResourceKey=SearchTextBox}" /> + ItemsSource="{Binding Path=PortProfiles}" + SelectedItemsList="{Binding Path=SelectedPortProfiles, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> + Binding="{Binding Path=(network:PortProfileInfo.Name)}" + SortMemberPath="Name" + Width="1*" /> + Binding="{Binding Path=(network:PortProfileInfo.Ports)}" + SortMemberPath="Ports" + Width="2*" /> @@ -46,8 +50,10 @@ - -