home, subscriptions, authentication no internet connection errors added, twitch login button bug fixed, cancel all button added
This commit is contained in:
@@ -117,10 +117,10 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="AuthenticationButtonSignIn.Value" xml:space="preserve">
|
||||
<data name="AuthenticationButtonSignIn.Text" xml:space="preserve">
|
||||
<value>Sign in</value>
|
||||
</data>
|
||||
<data name="AuthenticationButtonSignOut.Value" xml:space="preserve">
|
||||
<data name="AuthenticationButtonSignOut.Text" xml:space="preserve">
|
||||
<value>Sign out</value>
|
||||
</data>
|
||||
<data name="AuthenticationDescriptionLoading.Value" xml:space="preserve">
|
||||
@@ -135,9 +135,18 @@
|
||||
<data name="TwitchAuthenticationDescriptionAuthenticationInvalid" xml:space="preserve">
|
||||
<value>Token expired or is invalid. Please log in again</value>
|
||||
</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">
|
||||
<value>You are not authenticated. Please sign in</value>
|
||||
</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">
|
||||
<value>Twitch authentication error</value>
|
||||
</data>
|
||||
|
||||
@@ -120,6 +120,15 @@
|
||||
<data name="ErrorInfoBar.Title" xml:space="preserve">
|
||||
<value>Error</value>
|
||||
</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">
|
||||
<value>Download all</value>
|
||||
</data>
|
||||
|
||||
@@ -123,6 +123,9 @@
|
||||
<data name="EmptyUrl" xml:space="preserve">
|
||||
<value>Invalid url. Url cannot be empty.</value>
|
||||
</data>
|
||||
<data name="SearchTimeout" xml:space="preserve">
|
||||
<value>Search timeout. Check your internet connection.</value>
|
||||
</data>
|
||||
<data name="SourceNotSupported" xml:space="preserve">
|
||||
<value>Invalid url. Url does not match any of supported source.</value>
|
||||
</data>
|
||||
|
||||
@@ -126,6 +126,9 @@
|
||||
<data name="Header.Text" xml:space="preserve">
|
||||
<value>Subscriptions</value>
|
||||
</data>
|
||||
<data name="NoInternetConnectionError" xml:space="preserve">
|
||||
<value>No internet connection</value>
|
||||
</data>
|
||||
<data name="PlaylistSearchButton.Content" xml:space="preserve">
|
||||
<value>Add</value>
|
||||
</data>
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using CommunityToolkit.WinUI.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
@@ -44,10 +46,13 @@ namespace VDownload.Core.ViewModels.Authentication
|
||||
#region PROPERTIES
|
||||
|
||||
[ObservableProperty]
|
||||
private AuthenticationButton _twitchButtonState = AuthenticationButton.Loading;
|
||||
protected AuthenticationButton _twitchButtonState = AuthenticationButton.Loading;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _twitchDescription;
|
||||
protected bool _twitchButtonEnable = true;
|
||||
|
||||
[ObservableProperty]
|
||||
protected string _twitchDescription;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -107,7 +112,9 @@ namespace VDownload.Core.ViewModels.Authentication
|
||||
}
|
||||
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();
|
||||
@@ -122,17 +129,38 @@ namespace VDownload.Core.ViewModels.Authentication
|
||||
private async Task TwitchAuthenticationRefresh()
|
||||
{
|
||||
TwitchButtonState = AuthenticationButton.Loading;
|
||||
TwitchButtonEnable = true;
|
||||
|
||||
byte[]? token = await _twitchAuthenticationService.GetToken();
|
||||
|
||||
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;
|
||||
}
|
||||
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)
|
||||
{
|
||||
TwitchDescription = string.Format(_stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionAuthenticated"), validationResult.TokenData.Login, validationResult.TokenData.ExpirationDate);
|
||||
|
||||
@@ -4,6 +4,7 @@ using CommunityToolkit.WinUI.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VDownload.Core.Tasks;
|
||||
@@ -163,46 +164,57 @@ namespace VDownload.Core.ViewModels.Home
|
||||
[RelayCommand]
|
||||
public async Task LoadFromSubscription()
|
||||
{
|
||||
MainContent = _downloadsView;
|
||||
OptionBarLoading = false;
|
||||
OptionBarMessage = null;
|
||||
SearchButtonClicked();
|
||||
|
||||
if (OptionBarLoadSubscriptionButtonChecked)
|
||||
{
|
||||
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
|
||||
{
|
||||
ShowError(ErrorNoInternetConnection());
|
||||
OptionBarLoadSubscriptionButtonChecked = false;
|
||||
return;
|
||||
}
|
||||
|
||||
OptionBarContent = OptionBarContentType.None;
|
||||
OptionBarVideoSearchButtonChecked = false;
|
||||
OptionBarPlaylistSearchButtonChecked = false;
|
||||
|
||||
OptionBarSearchNotPending = false;
|
||||
OptionBarLoading = true;
|
||||
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading");
|
||||
StartSearch();
|
||||
|
||||
SubscriptionsVideoList subList = new SubscriptionsVideoList { Name = _stringResourcesService.CommonResources.Get("SubscriptionVideoListName") };
|
||||
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;
|
||||
try
|
||||
tasks.Add(Task.Run(async () =>
|
||||
{
|
||||
playlist = await _searchService.SearchPlaylist(sub.Url.OriginalString, 0);
|
||||
}
|
||||
catch (MediaSearchException)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Playlist playlist;
|
||||
try
|
||||
{
|
||||
playlist = await _searchService.SearchPlaylist(sub.Url.OriginalString, 0);
|
||||
}
|
||||
catch (MediaSearchException)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
IEnumerable<Video> newIds = playlist.Where(x => !sub.VideoIds.Contains(x.Id));
|
||||
subList.AddRange(newIds);
|
||||
foreach (Video video in newIds)
|
||||
{
|
||||
sub.VideoIds.Add(video.Id);
|
||||
}
|
||||
}));
|
||||
IEnumerable<Video> newIds = playlist.Where(x => !sub.VideoIds.Contains(x.Id));
|
||||
subList.AddRange(newIds);
|
||||
foreach (Video video in newIds)
|
||||
{
|
||||
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)
|
||||
{
|
||||
@@ -224,10 +236,7 @@ namespace VDownload.Core.ViewModels.Home
|
||||
[RelayCommand]
|
||||
public void VideoSearchShow()
|
||||
{
|
||||
OptionBarSearchNotPending = true;
|
||||
OptionBarLoading = false;
|
||||
OptionBarMessage = null;
|
||||
MainContent = _downloadsView;
|
||||
SearchButtonClicked();
|
||||
|
||||
if (OptionBarContent != OptionBarContentType.VideoSearch)
|
||||
{
|
||||
@@ -244,10 +253,7 @@ namespace VDownload.Core.ViewModels.Home
|
||||
[RelayCommand]
|
||||
public void PlaylistSearchShow()
|
||||
{
|
||||
OptionBarSearchNotPending = true;
|
||||
OptionBarLoading = false;
|
||||
OptionBarMessage = null;
|
||||
MainContent = _downloadsView;
|
||||
SearchButtonClicked();
|
||||
|
||||
if (OptionBarContent != OptionBarContentType.PlaylistSearch)
|
||||
{
|
||||
@@ -264,9 +270,13 @@ namespace VDownload.Core.ViewModels.Home
|
||||
[RelayCommand]
|
||||
public async Task VideoSearchStart()
|
||||
{
|
||||
OptionBarSearchNotPending = false;
|
||||
OptionBarLoading = true;
|
||||
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading");
|
||||
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
|
||||
{
|
||||
ShowError(ErrorNoInternetConnection());
|
||||
return;
|
||||
}
|
||||
|
||||
StartSearch();
|
||||
|
||||
Video video;
|
||||
try
|
||||
@@ -275,10 +285,12 @@ namespace VDownload.Core.ViewModels.Home
|
||||
}
|
||||
catch (MediaSearchException ex)
|
||||
{
|
||||
OptionBarError = _stringResourcesService.SearchResources.Get(ex.StringCode);
|
||||
OptionBarSearchNotPending = true;
|
||||
OptionBarLoading = false;
|
||||
OptionBarMessage = null;
|
||||
ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode));
|
||||
return;
|
||||
}
|
||||
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
|
||||
{
|
||||
ShowError(ErrorSearchTimeout());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -294,9 +306,13 @@ namespace VDownload.Core.ViewModels.Home
|
||||
[RelayCommand]
|
||||
public async Task PlaylistSearchStart()
|
||||
{
|
||||
OptionBarSearchNotPending = false;
|
||||
OptionBarLoading = true;
|
||||
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading");
|
||||
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
|
||||
{
|
||||
ShowError(ErrorNoInternetConnection());
|
||||
return;
|
||||
}
|
||||
|
||||
StartSearch();
|
||||
|
||||
Playlist playlist;
|
||||
try
|
||||
@@ -305,10 +321,12 @@ namespace VDownload.Core.ViewModels.Home
|
||||
}
|
||||
catch (MediaSearchException ex)
|
||||
{
|
||||
OptionBarError = _stringResourcesService.SearchResources.Get(ex.StringCode);
|
||||
OptionBarSearchNotPending = true;
|
||||
OptionBarLoading = false;
|
||||
OptionBarMessage = null;
|
||||
ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode));
|
||||
return;
|
||||
}
|
||||
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
|
||||
{
|
||||
ShowError(ErrorSearchTimeout());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -324,6 +342,12 @@ namespace VDownload.Core.ViewModels.Home
|
||||
[RelayCommand]
|
||||
public async Task Download()
|
||||
{
|
||||
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
|
||||
{
|
||||
ShowError(ErrorNoInternetConnection());
|
||||
return;
|
||||
}
|
||||
|
||||
if (_downloadTaskManager.Tasks.Count > 0 && NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection)
|
||||
{
|
||||
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]
|
||||
public void CloseError()
|
||||
{
|
||||
@@ -354,7 +389,34 @@ namespace VDownload.Core.ViewModels.Home
|
||||
|
||||
#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
|
||||
}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
using ABI.System;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using CommunityToolkit.WinUI.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VDownload.Core.ViewModels.Subscriptions.Helpers;
|
||||
@@ -92,6 +94,12 @@ namespace VDownload.Core.ViewModels.Subscriptions
|
||||
[RelayCommand]
|
||||
public async Task Add()
|
||||
{
|
||||
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
|
||||
{
|
||||
ShowError(_stringResourcesService.SubscriptionsViewResources.Get("NoInternetConnectionError"));
|
||||
return;
|
||||
}
|
||||
|
||||
Loading = true;
|
||||
|
||||
Playlist playlist;
|
||||
@@ -101,16 +109,18 @@ namespace VDownload.Core.ViewModels.Subscriptions
|
||||
}
|
||||
catch (MediaSearchException ex)
|
||||
{
|
||||
Error = _stringResourcesService.SearchResources.Get(ex.StringCode);
|
||||
Loading = false;
|
||||
ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode));
|
||||
return;
|
||||
}
|
||||
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
|
||||
{
|
||||
ShowError(_stringResourcesService.SearchResources.Get("SearchTimeout"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (_subscriptionsDataService.Data.Any(x => x.Source == playlist.Source && x.Name == playlist.Name))
|
||||
{
|
||||
Error = _stringResourcesService.SubscriptionsViewResources.Get("DuplicateError");
|
||||
Loading = false;
|
||||
ShowError(_stringResourcesService.SubscriptionsViewResources.Get("DuplicateError"));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -136,6 +146,18 @@ namespace VDownload.Core.ViewModels.Subscriptions
|
||||
IsErrorOpened = true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region PRIVATE METHODS
|
||||
|
||||
protected void ShowError(string message)
|
||||
{
|
||||
Error = message;
|
||||
Loading = false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,27 +33,24 @@
|
||||
<ctc:SettingsCard Header="Twitch">
|
||||
<i:Interaction.Behaviors>
|
||||
<ic:DataTriggerBehavior Binding="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}"
|
||||
ComparisonCondition="NotEqual"
|
||||
Value="Loading">
|
||||
ComparisonCondition="NotEqual"
|
||||
Value="Loading">
|
||||
<ic:ChangePropertyAction PropertyName="Description"
|
||||
Value="{Binding TwitchDescription}"/>
|
||||
Value="{Binding TwitchDescription}"/>
|
||||
<ic:ChangePropertyAction PropertyName="Content">
|
||||
<ic:ChangePropertyAction.Value>
|
||||
<Button Command="{Binding TwitchAuthenticationCommand}">
|
||||
<i:Interaction.Behaviors>
|
||||
<ic:DataTriggerBehavior Binding="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}"
|
||||
ComparisonCondition="Equal"
|
||||
Value="SignIn">
|
||||
<ic:ChangePropertyAction x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignIn"
|
||||
PropertyName="Content"/>
|
||||
</ic:DataTriggerBehavior>
|
||||
<ic:DataTriggerBehavior Binding="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}"
|
||||
ComparisonCondition="Equal"
|
||||
Value="SignOut">
|
||||
<ic:ChangePropertyAction x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignOut"
|
||||
PropertyName="Content"/>
|
||||
</ic:DataTriggerBehavior>
|
||||
</i:Interaction.Behaviors>
|
||||
<Button Command="{Binding TwitchAuthenticationCommand}"
|
||||
IsEnabled="{Binding TwitchButtonEnable}">
|
||||
<Button.Content>
|
||||
<ctuc:SwitchPresenter Value="{Binding TwitchButtonState, Converter={StaticResource ObjectToStringConverter}}">
|
||||
<ctuc:Case Value="SignIn">
|
||||
<TextBlock x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignIn"/>
|
||||
</ctuc:Case>
|
||||
<ctuc:Case Value="SignOut">
|
||||
<TextBlock x:Uid="/VDownload.Core.Strings/AuthenticationViewResources/AuthenticationButtonSignOut"/>
|
||||
</ctuc:Case>
|
||||
</ctuc:SwitchPresenter>
|
||||
</Button.Content>
|
||||
</Button>
|
||||
</ic:ChangePropertyAction.Value>
|
||||
</ic:ChangePropertyAction>
|
||||
|
||||
@@ -134,6 +134,9 @@
|
||||
IsChecked="{Binding OptionBarPlaylistSearchButtonChecked, Mode=TwoWay}"
|
||||
Command="{Binding PlaylistSearchShowCommand}"/>
|
||||
<AppBarSeparator/>
|
||||
<AppBarButton x:Uid="/VDownload.Core.Strings/HomeViewResources/OptionBarCancelAll"
|
||||
Icon="Cancel"
|
||||
Command="{Binding CancelCommand}"/>
|
||||
<AppBarButton x:Uid="/VDownload.Core.Strings/HomeViewResources/OptionBarDownloadAll"
|
||||
Icon="Download"
|
||||
Command="{Binding DownloadCommand}"/>
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
<ctuc:Case Value="True">
|
||||
<InfoBar x:Uid="/VDownload.Core.Strings/SubscriptionsViewResources/ErrorInfoBar"
|
||||
Severity="Error"
|
||||
IsOpen="{Binding OptionBarIsErrorOpened, Mode=TwoWay}"
|
||||
IsOpen="{Binding IsErrorOpened, Mode=TwoWay}"
|
||||
Message="{Binding Error}"
|
||||
CloseButtonCommand="{Binding CloseErrorCommand}"/>
|
||||
</ctuc:Case>
|
||||
|
||||
Reference in New Issue
Block a user