From c5a0264095d98632ac926b9162f153dbb912cdd7 Mon Sep 17 00:00:00 2001
From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Date: Fri, 20 Dec 2024 01:25:02 +0100
Subject: [PATCH] Feature: Log export exception, re-design about page (#2958)
---
.../Resources/Strings.Designer.cs | 72 +++++++
.../Resources/Strings.resx | 24 +++
.../ViewModels/ARPTableViewModel.cs | 6 +-
.../ViewModels/AboutViewModel.cs | 20 +-
.../ViewModels/BitCalculatorViewModel.cs | 3 +-
.../ViewModels/ConnectionsViewModel.cs | 6 +-
.../ViewModels/DNSLookupViewModel.cs | 9 +-
.../ViewModels/DiscoveryProtocolViewModel.cs | 9 +-
.../ViewModels/IPGeolocationViewModel.cs | 2 +
.../ViewModels/IPScannerViewModel.cs | 10 +-
.../ViewModels/ListenersViewModel.cs | 6 +-
.../ViewModels/LookupOUILookupViewModel.cs | 6 +-
.../ViewModels/LookupPortViewModel.cs | 6 +-
.../ViewModels/NetworkInterfaceViewModel.cs | 6 +-
.../ViewModels/PingMonitorViewModel.cs | 4 +
.../ViewModels/PortScannerViewModel.cs | 6 +-
.../ViewModels/SNMPViewModel.cs | 6 +-
.../ViewModels/SNTPLookupViewModel.cs | 6 +-
.../SubnetCalculatorSubnettingViewModel.cs | 6 +-
.../ViewModels/TracerouteViewModel.cs | 3 +-
.../ViewModels/WhoisViewModel.cs | 8 +-
.../ViewModels/WiFiConnectViewModel.cs | 8 +-
.../ViewModels/WiFiViewModel.cs | 7 +-
Source/NETworkManager/Views/AboutView.xaml | 202 ++++++++++--------
.../Views/IPScannerView.xaml.cs | 2 +-
25 files changed, 313 insertions(+), 130 deletions(-)
diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs
index 41ccf305b9..0f995a8ebc 100644
--- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs
+++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs
@@ -3005,6 +3005,15 @@ public static string DomainName {
}
}
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Donate ähnelt.
+ ///
+ public static string Donate {
+ get {
+ return ResourceManager.GetString("Donate", resourceCulture);
+ }
+ }
+
///
/// Sucht eine lokalisierte Zeichenfolge, die Don't fragment ähnelt.
///
@@ -8296,6 +8305,15 @@ public static string Repeat {
}
}
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die ähnelt.
+ ///
+ public static string ReportAnIssueOrCreateAFeatureRequest {
+ get {
+ return ResourceManager.GetString("ReportAnIssueOrCreateAFeatureRequest", resourceCulture);
+ }
+ }
+
///
/// Sucht eine lokalisierte Zeichenfolge, die Report on GitHub ähnelt.
///
@@ -9524,6 +9542,15 @@ public static string SSID {
}
}
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die ähnelt.
+ ///
+ public static string StarForkTheProjectOnGitHub {
+ get {
+ return ResourceManager.GetString("StarForkTheProjectOnGitHub", resourceCulture);
+ }
+ }
+
///
/// Sucht eine lokalisierte Zeichenfolge, die Start minimized in tray ähnelt.
///
@@ -10235,6 +10262,33 @@ public static string ToolTip_ContactOrContactMeViaX {
}
}
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die ähnelt.
+ ///
+ public static string ToolTip_GithubDocumentationUrl {
+ get {
+ return ResourceManager.GetString("ToolTip_GithubDocumentationUrl", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die ähnelt.
+ ///
+ public static string ToolTip_GithubNewIssueUrl {
+ get {
+ return ResourceManager.GetString("ToolTip_GithubNewIssueUrl", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die ähnelt.
+ ///
+ public static string ToolTip_GitHubProjectUrl {
+ get {
+ return ResourceManager.GetString("ToolTip_GitHubProjectUrl", resourceCulture);
+ }
+ }
+
///
/// Sucht eine lokalisierte Zeichenfolge, die Help translate the project on Transifex. ähnelt.
///
@@ -10289,6 +10343,24 @@ public static string ToolTip_SupportThisProjectWithADonation {
}
}
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die ähnelt.
+ ///
+ public static string ToolTip_TransifexProjectUrl {
+ get {
+ return ResourceManager.GetString("ToolTip_TransifexProjectUrl", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die ähnelt.
+ ///
+ public static string ToolTip_TwitterContactUrl {
+ get {
+ return ResourceManager.GetString("ToolTip_TwitterContactUrl", resourceCulture);
+ }
+ }
+
///
/// Sucht eine lokalisierte Zeichenfolge, die Total bytes received ähnelt.
///
diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx
index 57b8cf9000..a27f42d61b 100644
--- a/Source/NETworkManager.Localization/Resources/Strings.resx
+++ b/Source/NETworkManager.Localization/Resources/Strings.resx
@@ -3852,4 +3852,28 @@ Right-click for more options.
Open documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Donate
+
\ No newline at end of file
diff --git a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs b/Source/NETworkManager/ViewModels/ARPTableViewModel.cs
index b5db34ef9b..2d1d5f103d 100644
--- a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs
+++ b/Source/NETworkManager/ViewModels/ARPTableViewModel.cs
@@ -9,6 +9,7 @@
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization.Resources;
@@ -69,7 +70,8 @@ public ARPTableViewModel(IDialogCoordinator instance)
#endregion
#region Variables
-
+ private static readonly ILog Log = LogManager.GetLogger(typeof(ARPTableViewModel));
+
private readonly IDialogCoordinator _dialogCoordinator;
private readonly bool _isLoading;
@@ -390,6 +392,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/AboutViewModel.cs b/Source/NETworkManager/ViewModels/AboutViewModel.cs
index 7329ac72c9..c4b1913122 100644
--- a/Source/NETworkManager/ViewModels/AboutViewModel.cs
+++ b/Source/NETworkManager/ViewModels/AboutViewModel.cs
@@ -1,14 +1,15 @@
-using System;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.Windows.Data;
-using System.Windows.Input;
-using NETworkManager.Documentation;
+using NETworkManager.Documentation;
using NETworkManager.Localization.Resources;
using NETworkManager.Properties;
using NETworkManager.Settings;
using NETworkManager.Update;
using NETworkManager.Utilities;
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Input;
namespace NETworkManager.ViewModels;
@@ -33,13 +34,16 @@ public AboutViewModel()
#region Methods
- private void CheckForUpdates()
+ private async Task CheckForUpdatesAsync()
{
IsUpdateAvailable = false;
ShowUpdaterMessage = false;
IsUpdateCheckRunning = true;
+ // Show a loading animation for the user
+ await Task.Delay(1000);
+
var updater = new Updater();
updater.UpdateAvailable += Updater_UpdateAvailable;
@@ -208,7 +212,7 @@ public ResourceInfo SelectedResourceInfo
private void CheckForUpdatesAction()
{
- CheckForUpdates();
+ CheckForUpdatesAsync();
}
public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction);
diff --git a/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs b/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs
index f3cf909cfd..ce1c4a70be 100644
--- a/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs
+++ b/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs
@@ -21,7 +21,6 @@ namespace NETworkManager.ViewModels;
public class BitCalculatorViewModel : ViewModelBase
{
#region Variables
-
private readonly IDialogCoordinator _dialogCoordinator;
private static readonly ILog Log = LogManager.GetLogger(typeof(BitCalculatorViewModel));
@@ -185,6 +184,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs b/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs
index deebef2d2c..0cf04f7284 100644
--- a/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs
+++ b/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs
@@ -9,6 +9,7 @@
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization;
@@ -93,7 +94,8 @@ private async void AutoRefreshTimer_Tick(object sender, EventArgs e)
#endregion
#region Variables
-
+ private static readonly ILog Log = LogManager.GetLogger(typeof(ConnectionsViewModel));
+
private readonly IDialogCoordinator _dialogCoordinator;
private readonly bool _isLoading;
@@ -307,6 +309,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs
index b45aedaa2d..eb50d42ee1 100644
--- a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs
+++ b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs
@@ -10,6 +10,7 @@
using System.Windows.Input;
using System.Windows.Threading;
using DnsClient;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Controls;
@@ -25,6 +26,7 @@ namespace NETworkManager.ViewModels;
public class DNSLookupViewModel : ViewModelBase
{
#region Variables
+ private static readonly ILog Log = LogManager.GetLogger(typeof(DNSLookupViewModel));
private readonly IDialogCoordinator _dialogCoordinator;
@@ -387,6 +389,8 @@ private async Task Export()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
@@ -398,10 +402,9 @@ await _dialogCoordinator.ShowMessageAsync(window, Strings.Error,
SettingsManager.Current.DNSLookup_ExportFileType = instance.FileType;
SettingsManager.Current.DNSLookup_ExportFilePath = instance.FilePath;
}, _ => { _dialogCoordinator.HideMetroDialogAsync(window, customDialog); },
- new[]
- {
+ [
ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json
- }, true,
+ ], true,
SettingsManager.Current.DNSLookup_ExportFileType, SettingsManager.Current.DNSLookup_ExportFilePath);
customDialog.Content = new ExportDialog
diff --git a/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs b/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs
index a4533adf3d..0eb4699fd0 100644
--- a/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs
+++ b/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs
@@ -6,6 +6,7 @@
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
+using log4net;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization.Resources;
using NETworkManager.Models.Export;
@@ -19,6 +20,7 @@ namespace NETworkManager.ViewModels;
public class DiscoveryProtocolViewModel : ViewModelBase
{
#region Variables
+ private static readonly ILog Log = LogManager.GetLogger(typeof(DiscoveryProtocolViewModel));
private readonly IDialogCoordinator _dialogCoordinator;
@@ -281,6 +283,8 @@ private async Task CaptureAction()
}
catch (Exception ex)
{
+ Log.Error("Error while trying to capture", ex);
+
await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message,
MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog);
}
@@ -306,6 +310,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
@@ -316,7 +322,8 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error,
SettingsManager.Current.DiscoveryProtocol_ExportFileType = instance.FileType;
SettingsManager.Current.DiscoveryProtocol_ExportFilePath = instance.FilePath;
- }, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, [
+ }, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); },
+ [
ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json
], false, SettingsManager.Current.DiscoveryProtocol_ExportFileType,
SettingsManager.Current.DiscoveryProtocol_ExportFilePath);
diff --git a/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs b/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs
index 2ebaa4a145..98e64c12a4 100644
--- a/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs
+++ b/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs
@@ -253,6 +253,8 @@ private async Task Export()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs
index 2a2c06773d..aad0130127 100644
--- a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs
+++ b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs
@@ -13,6 +13,7 @@
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Controls;
@@ -32,11 +33,12 @@ namespace NETworkManager.ViewModels;
public class IPScannerViewModel : ViewModelBase, IProfileManagerMinimal
{
#region Variables
-
+ private static readonly ILog Log = LogManager.GetLogger(typeof(IPScannerViewModel));
+
private readonly IDialogCoordinator _dialogCoordinator;
private CancellationTokenSource _cancellationTokenSource;
-
+
private readonly Guid _tabId;
private bool _firstLoad = true;
private bool _closed;
@@ -510,6 +512,8 @@ private async Task CustomCommand(object guid)
}
catch (Exception ex)
{
+ Log.Error("Error trying to run custom command", ex);
+
await _dialogCoordinator.ShowMessageAsync(this,
Strings.ResourceManager.GetString("Error",
LocalizationManager.GetInstance().Culture), ex.Message, MessageDialogStyle.Affirmative,
@@ -555,6 +559,8 @@ private Task Export()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/ListenersViewModel.cs b/Source/NETworkManager/ViewModels/ListenersViewModel.cs
index c03a3c3514..bddde6c2b3 100644
--- a/Source/NETworkManager/ViewModels/ListenersViewModel.cs
+++ b/Source/NETworkManager/ViewModels/ListenersViewModel.cs
@@ -9,6 +9,7 @@
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization.Resources;
@@ -84,7 +85,8 @@ private async void AutoRefreshTimer_Tick(object sender, EventArgs e)
#endregion
#region Variables
-
+ private static readonly ILog Log = LogManager.GetLogger(typeof(ListenersViewModel));
+
private readonly IDialogCoordinator _dialogCoordinator;
private readonly bool _isLoading;
@@ -298,6 +300,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs b/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs
index 7ea567decb..23989159fb 100644
--- a/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs
+++ b/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs
@@ -9,6 +9,7 @@
using System.Windows;
using System.Windows.Data;
using System.Windows.Input;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization.Resources;
@@ -58,7 +59,8 @@ private void AddSearchToHistory(string macAddressOrVendor)
#endregion
#region Variables
-
+ private static readonly ILog Log = LogManager.GetLogger(typeof(LookupOUILookupViewModel));
+
private readonly IDialogCoordinator _dialogCoordinator;
private string _search;
@@ -250,6 +252,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs
index af84380b53..cf23746d11 100644
--- a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs
+++ b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs
@@ -9,6 +9,7 @@
using System.Windows;
using System.Windows.Data;
using System.Windows.Input;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization.Resources;
@@ -54,7 +55,8 @@ private void AddSearchToHistory(string portOrService)
#endregion
#region Variables
-
+ private static readonly ILog Log = LogManager.GetLogger(typeof(LookupPortLookupViewModel));
+
private readonly IDialogCoordinator _dialogCoordinator;
private string _search;
@@ -312,6 +314,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs
index 8508269b81..9fce4e1e3e 100644
--- a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs
+++ b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs
@@ -13,6 +13,7 @@
using LiveCharts;
using LiveCharts.Configurations;
using LiveCharts.Wpf;
+using log4net;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization.Resources;
@@ -31,7 +32,8 @@ namespace NETworkManager.ViewModels;
public class NetworkInterfaceViewModel : ViewModelBase, IProfileManager
{
#region Variables
-
+ private static readonly ILog Log = LogManager.GetLogger(typeof(NetworkInterfaceViewModel));
+
private readonly IDialogCoordinator _dialogCoordinator;
private readonly DispatcherTimer _searchDispatcherTimer = new();
private BandwidthMeter _bandwidthMeter;
@@ -692,6 +694,8 @@ private async Task ExportAction()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs
index 321859625e..42769ef9c3 100644
--- a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs
+++ b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs
@@ -11,6 +11,7 @@
using LiveCharts;
using LiveCharts.Configurations;
using LiveCharts.Wpf;
+using log4net;
using MahApps.Metro.Controls.Dialogs;
using NETworkManager.Localization.Resources;
using NETworkManager.Models.Export;
@@ -48,6 +49,7 @@ public PingMonitorViewModel(IDialogCoordinator instance, Guid hostId, Action
+ var connectViewModel = new WiFiConnectViewModel(async instance =>
{
// Connect Open/PSK/EAP
await _dialogCoordinator.HideMetroDialogAsync(this, customDialog);
@@ -900,7 +899,7 @@ private async void Connect()
customDialog.Content = new WiFiConnectDialog
{
- DataContext = exportViewModel
+ DataContext = connectViewModel
};
await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog);
@@ -947,6 +946,8 @@ private async Task Export()
}
catch (Exception ex)
{
+ Log.Error("Error while exporting data as " + instance.FileType, ex);
+
var settings = AppearanceManager.MetroDialog;
settings.AffirmativeButtonText = Strings.OK;
diff --git a/Source/NETworkManager/Views/AboutView.xaml b/Source/NETworkManager/Views/AboutView.xaml
index 31ef11ad08..4fc5fad006 100644
--- a/Source/NETworkManager/Views/AboutView.xaml
+++ b/Source/NETworkManager/Views/AboutView.xaml
@@ -26,24 +26,23 @@
-
-
-
+
-
+
+
-
-
-
+
+
+
+ VerticalAlignment="Center" Margin="0,0,0,10" />
@@ -63,12 +62,77 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-