home, subscriptions, authentication no internet connection errors added, twitch login button bug fixed, cancel all button added

This commit is contained in:
2024-03-10 00:35:11 +01:00
Unverified
parent 66e6ed3b4e
commit d73ce6a05b
12 changed files with 230 additions and 83 deletions

View File

@@ -117,10 +117,10 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="AuthenticationButtonSignIn.Value" xml:space="preserve"> <data name="AuthenticationButtonSignIn.Text" xml:space="preserve">
<value>Sign in</value> <value>Sign in</value>
</data> </data>
<data name="AuthenticationButtonSignOut.Value" xml:space="preserve"> <data name="AuthenticationButtonSignOut.Text" xml:space="preserve">
<value>Sign out</value> <value>Sign out</value>
</data> </data>
<data name="AuthenticationDescriptionLoading.Value" xml:space="preserve"> <data name="AuthenticationDescriptionLoading.Value" xml:space="preserve">
@@ -135,9 +135,18 @@
<data name="TwitchAuthenticationDescriptionAuthenticationInvalid" xml:space="preserve"> <data name="TwitchAuthenticationDescriptionAuthenticationInvalid" xml:space="preserve">
<value>Token expired or is invalid. Please log in again</value> <value>Token expired or is invalid. Please log in again</value>
</data> </data>
<data name="TwitchAuthenticationDescriptionCannotValidate" xml:space="preserve">
<value>Cannot validate token. Check your internet connection and try again later.</value>
</data>
<data name="TwitchAuthenticationDescriptionNotAuthenticated" xml:space="preserve"> <data name="TwitchAuthenticationDescriptionNotAuthenticated" xml:space="preserve">
<value>You are not authenticated. Please sign in</value> <value>You are not authenticated. Please sign in</value>
</data> </data>
<data name="TwitchAuthenticationDescriptionNotAuthenticatedNoInternetConnection" xml:space="preserve">
<value>You are not authenticated and there is no internet connection. Check your internet connection and try again later.</value>
</data>
<data name="TwitchAuthenticationDialogMessage" xml:space="preserve">
<value>An unknown error occured during Twitch login</value>
</data>
<data name="TwitchAuthenticationDialogTitle" xml:space="preserve"> <data name="TwitchAuthenticationDialogTitle" xml:space="preserve">
<value>Twitch authentication error</value> <value>Twitch authentication error</value>
</data> </data>

View File

@@ -120,6 +120,15 @@
<data name="ErrorInfoBar.Title" xml:space="preserve"> <data name="ErrorInfoBar.Title" xml:space="preserve">
<value>Error</value> <value>Error</value>
</data> </data>
<data name="ErrorInfoBarNoInternetConnection" xml:space="preserve">
<value>No internet connection</value>
</data>
<data name="OptionBarCancelAll.Label" xml:space="preserve">
<value>Cancel all</value>
</data>
<data name="OptionBarCancelAll.Width" xml:space="preserve">
<value>80</value>
</data>
<data name="OptionBarDownloadAll.Label" xml:space="preserve"> <data name="OptionBarDownloadAll.Label" xml:space="preserve">
<value>Download all</value> <value>Download all</value>
</data> </data>

View File

@@ -123,6 +123,9 @@
<data name="EmptyUrl" xml:space="preserve"> <data name="EmptyUrl" xml:space="preserve">
<value>Invalid url. Url cannot be empty.</value> <value>Invalid url. Url cannot be empty.</value>
</data> </data>
<data name="SearchTimeout" xml:space="preserve">
<value>Search timeout. Check your internet connection.</value>
</data>
<data name="SourceNotSupported" xml:space="preserve"> <data name="SourceNotSupported" xml:space="preserve">
<value>Invalid url. Url does not match any of supported source.</value> <value>Invalid url. Url does not match any of supported source.</value>
</data> </data>

View File

@@ -126,6 +126,9 @@
<data name="Header.Text" xml:space="preserve"> <data name="Header.Text" xml:space="preserve">
<value>Subscriptions</value> <value>Subscriptions</value>
</data> </data>
<data name="NoInternetConnectionError" xml:space="preserve">
<value>No internet connection</value>
</data>
<data name="PlaylistSearchButton.Content" xml:space="preserve"> <data name="PlaylistSearchButton.Content" xml:space="preserve">
<value>Add</value> <value>Add</value>
</data> </data>

View File

@@ -1,8 +1,10 @@
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.WinUI.Helpers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -44,10 +46,13 @@ namespace VDownload.Core.ViewModels.Authentication
#region PROPERTIES #region PROPERTIES
[ObservableProperty] [ObservableProperty]
private AuthenticationButton _twitchButtonState = AuthenticationButton.Loading; protected AuthenticationButton _twitchButtonState = AuthenticationButton.Loading;
[ObservableProperty] [ObservableProperty]
private string _twitchDescription; protected bool _twitchButtonEnable = true;
[ObservableProperty]
protected string _twitchDescription;
#endregion #endregion
@@ -107,7 +112,9 @@ namespace VDownload.Core.ViewModels.Authentication
} }
else else
{ {
await _dialogsService.ShowOk(_stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDialogTitle"), "An unknown error occured"); // TODO : Change to string resource string title = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDialogTitle");
string message = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDialogMessage");
await _dialogsService.ShowOk(title, message);
} }
} }
await TwitchAuthenticationRefresh(); await TwitchAuthenticationRefresh();
@@ -122,17 +129,38 @@ namespace VDownload.Core.ViewModels.Authentication
private async Task TwitchAuthenticationRefresh() private async Task TwitchAuthenticationRefresh()
{ {
TwitchButtonState = AuthenticationButton.Loading; TwitchButtonState = AuthenticationButton.Loading;
TwitchButtonEnable = true;
byte[]? token = await _twitchAuthenticationService.GetToken(); byte[]? token = await _twitchAuthenticationService.GetToken();
if (token is null) if (token is null)
{ {
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionNotAuthenticated"); if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{
TwitchButtonEnable = false;
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionNotAuthenticatedNoInternetConnection");
}
else
{
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionNotAuthenticated");
}
TwitchButtonState = AuthenticationButton.SignIn; TwitchButtonState = AuthenticationButton.SignIn;
} }
else else
{ {
TwitchValidationResult validationResult = await _twitchAuthenticationService.ValidateToken(token); TwitchValidationResult validationResult;
try
{
validationResult = await _twitchAuthenticationService.ValidateToken(token);
}
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
{
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionCannotValidate");
TwitchButtonState = AuthenticationButton.SignIn;
TwitchButtonEnable = false;
return;
}
if (validationResult.Success) if (validationResult.Success)
{ {
TwitchDescription = string.Format(_stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionAuthenticated"), validationResult.TokenData.Login, validationResult.TokenData.ExpirationDate); TwitchDescription = string.Format(_stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionAuthenticated"), validationResult.TokenData.Login, validationResult.TokenData.ExpirationDate);

View File

@@ -4,6 +4,7 @@ using CommunityToolkit.WinUI.Helpers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Tasks; using VDownload.Core.Tasks;
@@ -163,46 +164,57 @@ namespace VDownload.Core.ViewModels.Home
[RelayCommand] [RelayCommand]
public async Task LoadFromSubscription() public async Task LoadFromSubscription()
{ {
MainContent = _downloadsView; SearchButtonClicked();
OptionBarLoading = false;
OptionBarMessage = null;
if (OptionBarLoadSubscriptionButtonChecked) if (OptionBarLoadSubscriptionButtonChecked)
{ {
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{
ShowError(ErrorNoInternetConnection());
OptionBarLoadSubscriptionButtonChecked = false;
return;
}
OptionBarContent = OptionBarContentType.None; OptionBarContent = OptionBarContentType.None;
OptionBarVideoSearchButtonChecked = false; OptionBarVideoSearchButtonChecked = false;
OptionBarPlaylistSearchButtonChecked = false; OptionBarPlaylistSearchButtonChecked = false;
OptionBarSearchNotPending = false; StartSearch();
OptionBarLoading = true;
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading");
SubscriptionsVideoList subList = new SubscriptionsVideoList { Name = _stringResourcesService.CommonResources.Get("SubscriptionVideoListName") }; SubscriptionsVideoList subList = new SubscriptionsVideoList { Name = _stringResourcesService.CommonResources.Get("SubscriptionVideoListName") };
List<Task> tasks = new List<Task>(); List<Task> tasks = new List<Task>();
foreach (Subscription sub in _subscriptionsDataService.Data.ToArray()) try
{ {
tasks.Add(Task.Run(async () => foreach (Subscription sub in _subscriptionsDataService.Data.ToArray())
{ {
Playlist playlist; tasks.Add(Task.Run(async () =>
try
{ {
playlist = await _searchService.SearchPlaylist(sub.Url.OriginalString, 0); Playlist playlist;
} try
catch (MediaSearchException) {
{ playlist = await _searchService.SearchPlaylist(sub.Url.OriginalString, 0);
return; }
} catch (MediaSearchException)
{
return;
}
IEnumerable<Video> newIds = playlist.Where(x => !sub.VideoIds.Contains(x.Id)); IEnumerable<Video> newIds = playlist.Where(x => !sub.VideoIds.Contains(x.Id));
subList.AddRange(newIds); subList.AddRange(newIds);
foreach (Video video in newIds) foreach (Video video in newIds)
{ {
sub.VideoIds.Add(video.Id); sub.VideoIds.Add(video.Id);
} }
})); }));
}
await Task.WhenAll(tasks);
await _subscriptionsDataService.Save();
}
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
{
ShowError(ErrorSearchTimeout());
return;
} }
await Task.WhenAll(tasks);
await _subscriptionsDataService.Save();
if (subList.Count > 0) if (subList.Count > 0)
{ {
@@ -224,10 +236,7 @@ namespace VDownload.Core.ViewModels.Home
[RelayCommand] [RelayCommand]
public void VideoSearchShow() public void VideoSearchShow()
{ {
OptionBarSearchNotPending = true; SearchButtonClicked();
OptionBarLoading = false;
OptionBarMessage = null;
MainContent = _downloadsView;
if (OptionBarContent != OptionBarContentType.VideoSearch) if (OptionBarContent != OptionBarContentType.VideoSearch)
{ {
@@ -244,10 +253,7 @@ namespace VDownload.Core.ViewModels.Home
[RelayCommand] [RelayCommand]
public void PlaylistSearchShow() public void PlaylistSearchShow()
{ {
OptionBarSearchNotPending = true; SearchButtonClicked();
OptionBarLoading = false;
OptionBarMessage = null;
MainContent = _downloadsView;
if (OptionBarContent != OptionBarContentType.PlaylistSearch) if (OptionBarContent != OptionBarContentType.PlaylistSearch)
{ {
@@ -264,9 +270,13 @@ namespace VDownload.Core.ViewModels.Home
[RelayCommand] [RelayCommand]
public async Task VideoSearchStart() public async Task VideoSearchStart()
{ {
OptionBarSearchNotPending = false; if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
OptionBarLoading = true; {
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading"); ShowError(ErrorNoInternetConnection());
return;
}
StartSearch();
Video video; Video video;
try try
@@ -275,10 +285,12 @@ namespace VDownload.Core.ViewModels.Home
} }
catch (MediaSearchException ex) catch (MediaSearchException ex)
{ {
OptionBarError = _stringResourcesService.SearchResources.Get(ex.StringCode); ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode));
OptionBarSearchNotPending = true; return;
OptionBarLoading = false; }
OptionBarMessage = null; catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
{
ShowError(ErrorSearchTimeout());
return; return;
} }
@@ -294,9 +306,13 @@ namespace VDownload.Core.ViewModels.Home
[RelayCommand] [RelayCommand]
public async Task PlaylistSearchStart() public async Task PlaylistSearchStart()
{ {
OptionBarSearchNotPending = false; if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
OptionBarLoading = true; {
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading"); ShowError(ErrorNoInternetConnection());
return;
}
StartSearch();
Playlist playlist; Playlist playlist;
try try
@@ -305,10 +321,12 @@ namespace VDownload.Core.ViewModels.Home
} }
catch (MediaSearchException ex) catch (MediaSearchException ex)
{ {
OptionBarError = _stringResourcesService.SearchResources.Get(ex.StringCode); ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode));
OptionBarSearchNotPending = true; return;
OptionBarLoading = false; }
OptionBarMessage = null; catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
{
ShowError(ErrorSearchTimeout());
return; return;
} }
@@ -324,6 +342,12 @@ namespace VDownload.Core.ViewModels.Home
[RelayCommand] [RelayCommand]
public async Task Download() public async Task Download()
{ {
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{
ShowError(ErrorNoInternetConnection());
return;
}
if (_downloadTaskManager.Tasks.Count > 0 && NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection) if (_downloadTaskManager.Tasks.Count > 0 && NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection)
{ {
string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle");
@@ -341,6 +365,17 @@ namespace VDownload.Core.ViewModels.Home
} }
} }
[RelayCommand]
public async Task Cancel()
{
List<Task> tasks = new List<Task>();
foreach (DownloadTask task in _downloadTaskManager.Tasks)
{
tasks.Add(task.Cancel());
}
await Task.WhenAll(tasks);
}
[RelayCommand] [RelayCommand]
public void CloseError() public void CloseError()
{ {
@@ -354,7 +389,34 @@ namespace VDownload.Core.ViewModels.Home
#region PRIVATE METHODS #region PRIVATE METHODS
private async void BackToDownload_EventHandler(object sender, EventArgs e) => await Navigation(); protected void ShowError(string message)
{
OptionBarError = message;
OptionBarSearchNotPending = true;
OptionBarLoading = false;
OptionBarMessage = null;
}
protected void SearchButtonClicked()
{
OptionBarSearchNotPending = true;
OptionBarLoading = false;
OptionBarMessage = null;
MainContent = _downloadsView;
}
protected void StartSearch()
{
OptionBarSearchNotPending = false;
OptionBarLoading = true;
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading");
}
protected async void BackToDownload_EventHandler(object sender, EventArgs e) => await Navigation();
protected string ErrorNoInternetConnection() => _stringResourcesService.HomeViewResources.Get("ErrorInfoBarNoInternetConnection");
protected string ErrorSearchTimeout() => _stringResourcesService.SearchResources.Get("SearchTimeout");
#endregion #endregion
} }

View File

@@ -1,10 +1,12 @@
using ABI.System; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.WinUI.Helpers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.ViewModels.Subscriptions.Helpers; using VDownload.Core.ViewModels.Subscriptions.Helpers;
@@ -92,6 +94,12 @@ namespace VDownload.Core.ViewModels.Subscriptions
[RelayCommand] [RelayCommand]
public async Task Add() public async Task Add()
{ {
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{
ShowError(_stringResourcesService.SubscriptionsViewResources.Get("NoInternetConnectionError"));
return;
}
Loading = true; Loading = true;
Playlist playlist; Playlist playlist;
@@ -101,16 +109,18 @@ namespace VDownload.Core.ViewModels.Subscriptions
} }
catch (MediaSearchException ex) catch (MediaSearchException ex)
{ {
Error = _stringResourcesService.SearchResources.Get(ex.StringCode); ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode));
Loading = false; return;
}
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
{
ShowError(_stringResourcesService.SearchResources.Get("SearchTimeout"));
return; return;
} }
if (_subscriptionsDataService.Data.Any(x => x.Source == playlist.Source && x.Name == playlist.Name)) if (_subscriptionsDataService.Data.Any(x => x.Source == playlist.Source && x.Name == playlist.Name))
{ {
Error = _stringResourcesService.SubscriptionsViewResources.Get("DuplicateError"); ShowError(_stringResourcesService.SubscriptionsViewResources.Get("DuplicateError"));
Loading = false;
return; return;
} }
@@ -136,6 +146,18 @@ namespace VDownload.Core.ViewModels.Subscriptions
IsErrorOpened = true; IsErrorOpened = true;
} }
#endregion #endregion
#region PRIVATE METHODS
protected void ShowError(string message)
{
Error = message;
Loading = false;
}
#endregion
} }
} }

View File

@@ -33,27 +33,24 @@
<ctc:SettingsCard Header="Twitch"> <ctc:SettingsCard Header="Twitch">
<i:Interaction.Behaviors> <i:Interaction.Behaviors>
<ic:DataTriggerBehavior Binding="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}" <ic:DataTriggerBehavior Binding="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}"
ComparisonCondition="NotEqual" ComparisonCondition="NotEqual"
Value="Loading"> Value="Loading">
<ic:ChangePropertyAction PropertyName="Description" <ic:ChangePropertyAction PropertyName="Description"
Value="{Binding TwitchDescription}"/> Value="{Binding TwitchDescription}"/>
<ic:ChangePropertyAction PropertyName="Content"> <ic:ChangePropertyAction PropertyName="Content">
<ic:ChangePropertyAction.Value> <ic:ChangePropertyAction.Value>
<Button Command="{Binding TwitchAuthenticationCommand}"> <Button Command="{Binding TwitchAuthenticationCommand}"
<i:Interaction.Behaviors> IsEnabled="{Binding TwitchButtonEnable}">
<ic:DataTriggerBehavior Binding="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}" <Button.Content>
ComparisonCondition="Equal" <ctuc:SwitchPresenter Value="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}">
Value="SignIn"> <ctuc:Case Value="SignIn">
<ic:ChangePropertyAction x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignIn" <TextBlock x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignIn"/>
PropertyName="Content"/> </ctuc:Case>
</ic:DataTriggerBehavior> <ctuc:Case Value="SignOut">
<ic:DataTriggerBehavior Binding="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}" <TextBlock x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignOut"/>
ComparisonCondition="Equal" </ctuc:Case>
Value="SignOut"> </ctuc:SwitchPresenter>
<ic:ChangePropertyAction x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignOut" </Button.Content>
PropertyName="Content"/>
</ic:DataTriggerBehavior>
</i:Interaction.Behaviors>
</Button> </Button>
</ic:ChangePropertyAction.Value> </ic:ChangePropertyAction.Value>
</ic:ChangePropertyAction> </ic:ChangePropertyAction>

View File

@@ -134,6 +134,9 @@
IsChecked="{Binding OptionBarPlaylistSearchButtonChecked, Mode=TwoWay}" IsChecked="{Binding OptionBarPlaylistSearchButtonChecked, Mode=TwoWay}"
Command="{Binding PlaylistSearchShowCommand}"/> Command="{Binding PlaylistSearchShowCommand}"/>
<AppBarSeparator/> <AppBarSeparator/>
<AppBarButton x:Uid="/VDownload.Core.Strings/HomeViewResources/OptionBarCancelAll"
Icon="Cancel"
Command="{Binding CancelCommand}"/>
<AppBarButton x:Uid="/VDownload.Core.Strings/HomeViewResources/OptionBarDownloadAll" <AppBarButton x:Uid="/VDownload.Core.Strings/HomeViewResources/OptionBarDownloadAll"
Icon="Download" Icon="Download"
Command="{Binding DownloadCommand}"/> Command="{Binding DownloadCommand}"/>

View File

@@ -107,7 +107,7 @@
<ctuc:Case Value="True"> <ctuc:Case Value="True">
<InfoBar x:Uid="/VDownload.Core.Strings/SubscriptionsViewResources/ErrorInfoBar" <InfoBar x:Uid="/VDownload.Core.Strings/SubscriptionsViewResources/ErrorInfoBar"
Severity="Error" Severity="Error"
IsOpen="{Binding OptionBarIsErrorOpened, Mode=TwoWay}" IsOpen="{Binding IsErrorOpened, Mode=TwoWay}"
Message="{Binding Error}" Message="{Binding Error}"
CloseButtonCommand="{Binding CloseErrorCommand}"/> CloseButtonCommand="{Binding CloseErrorCommand}"/>
</ctuc:Case> </ctuc:Case>

View File

@@ -7,6 +7,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" mc:Ignorable="d"
Closed="Window_Closed"> Closed="Window_Closed"
Activated="Window_Activated">
<WebView2 x:Name="WebView" NavigationCompleted="WebView_NavigationCompleted"/> <WebView2 x:Name="WebView" NavigationCompleted="WebView_NavigationCompleted"/>
</Window> </Window>

View File

@@ -1,3 +1,5 @@
using Microsoft.UI;
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Controls.Primitives;
@@ -84,6 +86,14 @@ namespace VDownload.Services.UI.WebView
_isOpened = false; _isOpened = false;
} }
private void Window_Activated(object sender, WindowActivatedEventArgs args)
{
IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(this);
WindowId windowId = Win32Interop.GetWindowIdFromWindow(windowHandle);
AppWindow appWindow = AppWindow.GetFromWindowId(windowId);
appWindow.SetIcon(@"Assets\Logo\Logo.ico");
}
#endregion #endregion
} }
} }