Fix WebView2 taking up tons of memory, use single WebView window - still needs refactoring

This commit is contained in:
trawzified
2024-01-12 20:57:58 +01:00
parent fc26f55226
commit 91ddb39344
7 changed files with 28 additions and 8 deletions

View File

@ -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<SystemParametersConstructor>();
services.AddSingleton<LauncherUpdater>();
services.AddSingleton<ResourceMonitor>();
services.AddSingleton<WebView2>();
services.AddTransient<CompilerVM>();
services.AddTransient<InstallerVM>();

View File

@ -66,7 +66,7 @@ public class LoversLabLoginManager : ViewModel, ILoginFor<LoversLabDownloader>
private void StartLogin()
{
var view = new BrowserWindow();
var view = new BrowserWindow(_serviceProvider);
view.Closed += (sender, args) => { RefreshTokenState(); };
var provider = _serviceProvider.GetRequiredService<LoversLabLoginHandler>();
view.DataContext = provider;

View File

@ -62,7 +62,7 @@ public class NexusLoginManager : ViewModel, ILoginFor<NexusDownloader>
private void StartLogin()
{
var view = new BrowserWindow();
var view = new BrowserWindow(_serviceProvider);
view.Closed += (sender, args) => { RefreshTokenState(); };
var provider = _serviceProvider.GetRequiredService<NexusLoginHandler>();
view.DataContext = provider;

View File

@ -66,7 +66,7 @@ public class VectorPlexusLoginManager : ViewModel, ILoginFor<LoversLabDownloader
private void StartLogin()
{
var view = new BrowserWindow();
var view = new BrowserWindow(_serviceProvider);
view.Closed += (sender, args) => { RefreshTokenState(); };
var provider = _serviceProvider.GetRequiredService<VectorPlexusLoginHandler>();
view.DataContext = provider;

View File

@ -25,7 +25,7 @@ public class NexusLogin
public async Task<int> Run(CancellationToken token)
{
var tcs = new TaskCompletionSource<int>();
var view = new BrowserWindow();
var view = new BrowserWindow(_services);
view.Closed += (sender, args) => { tcs.TrySetResult(0); };
var provider = _services.GetRequiredService<NexusLoginHandler>();
view.DataContext = provider;

View File

@ -23,7 +23,7 @@
WindowTitleBrush="{StaticResource MahApps.Brushes.Accent}"
ContentRendered="BrowserWindow_OnActivated"
mc:Ignorable="d">
<Grid Background="#121212" MouseDown="UIElement_OnMouseDown">
<Grid x:Name="MainGrid" Background="#121212" MouseDown="UIElement_OnMouseDown">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
@ -47,7 +47,7 @@
</Button>
<TextBox Grid.Row="2" Grid.Column="3" Margin="4" VerticalContentAlignment="Center" Name="AddressBar" IsEnabled="False"></TextBox>
<wpf:WebView2 Grid.Row="3" Grid.ColumnSpan="3" Name="Browser"></wpf:WebView2>
<!--<wpf:WebView2 Grid.Row="3" Grid.ColumnSpan="3" Name="Browser"></wpf:WebView2>-->
</Grid>
</mahapps:MetroWindow>

View File

@ -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<WebView2>();
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;
}));
}
}