From 91ddb3934468d75245b9f0821b822da9a002547b Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Fri, 12 Jan 2024 20:57:58 +0100 Subject: [PATCH] Fix WebView2 taking up tons of memory, use single WebView window - still needs refactoring --- Wabbajack.App.Wpf/App.xaml.cs | 2 ++ .../LoginManagers/LoversLabLoginManager.cs | 2 +- .../LoginManagers/NexusLoginManager.cs | 2 +- .../LoginManagers/VectorPlexusLoginManager.cs | 2 +- Wabbajack.App.Wpf/Verbs/NexusLogin.cs | 2 +- Wabbajack.App.Wpf/Views/BrowserWindow.xaml | 4 ++-- Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs | 22 +++++++++++++++++-- 7 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index dc9d2cd0..1ad25eee 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -8,6 +8,7 @@ using System.Windows.Threading; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Web.WebView2.Wpf; using NLog.Extensions.Logging; using NLog.Targets; using Orc.FileAssociation; @@ -164,6 +165,7 @@ namespace Wabbajack services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs index 985fec98..8e982af7 100644 --- a/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs @@ -66,7 +66,7 @@ public class LoversLabLoginManager : ViewModel, ILoginFor private void StartLogin() { - var view = new BrowserWindow(); + var view = new BrowserWindow(_serviceProvider); view.Closed += (sender, args) => { RefreshTokenState(); }; var provider = _serviceProvider.GetRequiredService(); view.DataContext = provider; diff --git a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs index a7115a76..440b60fe 100644 --- a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs @@ -62,7 +62,7 @@ public class NexusLoginManager : ViewModel, ILoginFor private void StartLogin() { - var view = new BrowserWindow(); + var view = new BrowserWindow(_serviceProvider); view.Closed += (sender, args) => { RefreshTokenState(); }; var provider = _serviceProvider.GetRequiredService(); view.DataContext = provider; diff --git a/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs index 9e8f691d..62a13e26 100644 --- a/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs @@ -66,7 +66,7 @@ public class VectorPlexusLoginManager : ViewModel, ILoginFor { RefreshTokenState(); }; var provider = _serviceProvider.GetRequiredService(); view.DataContext = provider; diff --git a/Wabbajack.App.Wpf/Verbs/NexusLogin.cs b/Wabbajack.App.Wpf/Verbs/NexusLogin.cs index b4140cec..b91148fe 100644 --- a/Wabbajack.App.Wpf/Verbs/NexusLogin.cs +++ b/Wabbajack.App.Wpf/Verbs/NexusLogin.cs @@ -25,7 +25,7 @@ public class NexusLogin public async Task Run(CancellationToken token) { var tcs = new TaskCompletionSource(); - var view = new BrowserWindow(); + var view = new BrowserWindow(_services); view.Closed += (sender, args) => { tcs.TrySetResult(0); }; var provider = _services.GetRequiredService(); view.DataContext = provider; diff --git a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml index 62a13a0f..3fb470a2 100644 --- a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml +++ b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml @@ -23,7 +23,7 @@ WindowTitleBrush="{StaticResource MahApps.Brushes.Accent}" ContentRendered="BrowserWindow_OnActivated" mc:Ignorable="d"> - + @@ -47,7 +47,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs index 175de016..a77c5b78 100644 --- a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs @@ -1,11 +1,15 @@ using System; +using System.Reactive.Concurrency; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows; +using System.Windows.Controls; using System.Windows.Input; using MahApps.Metro.Controls; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Web.WebView2.Wpf; using ReactiveUI; using Wabbajack.Common; @@ -14,12 +18,27 @@ namespace Wabbajack; public partial class BrowserWindow : MetroWindow { private readonly CompositeDisposable _disposable; + private readonly IServiceProvider _serviceProvider; + public WebView2 Browser { get; set; } - public BrowserWindow() + public BrowserWindow(IServiceProvider serviceProvider) { InitializeComponent(); + _disposable = new CompositeDisposable(); + _serviceProvider = serviceProvider; + Browser = _serviceProvider.GetRequiredService(); + RxApp.MainThreadScheduler.Schedule(() => + { + if(Browser.Parent != null) + { + ((Panel)Browser.Parent).Children.Remove(Browser); + } + MainGrid.Children.Add(Browser); + Grid.SetRow(Browser, 3); + Grid.SetColumnSpan(Browser, 3); + }); } private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e) @@ -58,7 +77,6 @@ public partial class BrowserWindow : MetroWindow .ContinueWith(_ => Dispatcher.Invoke(() => { Close(); - Browser = null; })); } } \ No newline at end of file