Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
e4384cb
Bundles!!
d2dyno1 Jan 7, 2021
fb486b8
Added "Add Bundle" UI
d2dyno1 Jan 7, 2021
ed8a3e7
Fix Build error
d2dyno1 Jan 7, 2021
427524c
Added no bundle contents text info
d2dyno1 Jan 7, 2021
b09f99e
Added setting for disabling/enabling Bundles
d2dyno1 Jan 7, 2021
f27923b
Added option to remove, rename existing bundles
d2dyno1 Jan 7, 2021
4379c51
Added the option to remove items from Bundles
d2dyno1 Jan 7, 2021
8fb14ee
Removed selection animations and fixed item click flyout
d2dyno1 Jan 7, 2021
fb40017
Added folder icons
d2dyno1 Jan 7, 2021
a6bb3bf
Added Icon + Minor Changes
d2dyno1 Jan 7, 2021
2cf82c9
File Icons are now properly displayed
d2dyno1 Jan 7, 2021
deadac7
Folder Icons are now properly shown
d2dyno1 Jan 7, 2021
1062cd3
Added keyboard events to rename textbox + applied design suggestion
d2dyno1 Jan 7, 2021
0a7b862
Show file names with extension
d2dyno1 Jan 7, 2021
4d2be66
Update empty Bundle info text
d2dyno1 Jan 7, 2021
6f3697e
CodeFactor
d2dyno1 Jan 7, 2021
17e0831
Display current bundle name in textbox when renaming
d2dyno1 Jan 7, 2021
7659c6d
Centered Items
d2dyno1 Jan 7, 2021
6e81af8
Bigger font for bundle options
d2dyno1 Jan 7, 2021
3c18e0a
Made item spacing bigger
d2dyno1 Jan 7, 2021
d47561a
Fine-tuned alignment
d2dyno1 Jan 8, 2021
6a382b3
Fixed item text wrapping
d2dyno1 Jan 8, 2021
ea3e538
Added the option to open folders in new tab
d2dyno1 Jan 8, 2021
456797d
Added the option to open item's location
d2dyno1 Jan 8, 2021
602da73
Redesigned the "No Bundles" text
d2dyno1 Jan 8, 2021
7b24753
Simple button
d2dyno1 Jan 8, 2021
bbcac55
View is now properly updated when removing bundles/items
d2dyno1 Jan 8, 2021
2236afb
No Items in Bundle is now properly hidden and shown
d2dyno1 Jan 8, 2021
de6c8f6
Big "Add Bundle" button is now properly shown
d2dyno1 Jan 8, 2021
fea3c73
Quick Fix lol
d2dyno1 Jan 8, 2021
334ab67
Drag and drop now covers entire Bundle area
d2dyno1 Jan 8, 2021
afaee72
Fixed widget width
yaira2 Jan 8, 2021
75bf3d3
Fixed item width
yaira2 Jan 8, 2021
7dafd67
Replace RelayParameterizedCommand with RelayCommand<>
d2dyno1 Jan 8, 2021
8e90512
Merge branch 'master' of https://github.com/d2dyno1/Files
d2dyno1 Jan 8, 2021
b2fa0ca
Updated margin
yaira2 Jan 8, 2021
c40940b
Fix build error
d2dyno1 Jan 8, 2021
9c24f5a
Merge branch 'master' of https://github.com/d2dyno1/Files
d2dyno1 Jan 8, 2021
9adb31d
Added text wrapping
yaira2 Jan 8, 2021
dc114a6
Update IDisposable
d2dyno1 Jan 8, 2021
ac72d01
Fixed corner radius
yaira2 Jan 8, 2021
425554e
Merge branch 'master' of https://github.com/d2dyno1/Files
d2dyno1 Jan 8, 2021
8688da8
Merge branch 'master' of https://github.com/d2dyno1/Files
d2dyno1 Jan 8, 2021
ad4455c
Updated description to be more precise
d2dyno1 Jan 8, 2021
bb8dceb
Added e.Handled = true
d2dyno1 Jan 8, 2021
10d8d4d
Fix codestyle oof
d2dyno1 Jan 9, 2021
e4be9a1
Removed items move to home page restriction
d2dyno1 Jan 9, 2021
a2fb2ca
Quick fixes and improvements
d2dyno1 Jan 9, 2021
90c364a
Removed duplicate code
d2dyno1 Jan 9, 2021
32e5904
Added shortcut item check but no implementation
d2dyno1 Jan 9, 2021
d7f0626
Implemented OpenPath() isShortcutItem
d2dyno1 Jan 9, 2021
9cd3d48
Filled arguments for shortcutItem
d2dyno1 Jan 9, 2021
152b8f1
:tada: Replaced OpenSelectedItems with OpenSelectedItems2
d2dyno1 Jan 9, 2021
5675539
Simplified code
d2dyno1 Jan 9, 2021
8c6f90b
Removed try-catch
d2dyno1 Jan 9, 2021
5fe1519
Fix bug with opening hidden dirs
d2dyno1 Jan 9, 2021
87f459a
Added some safety checks
d2dyno1 Jan 9, 2021
1a06546
no _
d2dyno1 Jan 9, 2021
3d3b1fb
Improved xaml
yaira2 Jan 10, 2021
f96ae73
Removed OpenSelectedItems, and replaced it with OpenSelectedItems2
d2dyno1 Jan 10, 2021
6b06170
Merge branch 'master' of https://github.com/d2dyno1/Files
d2dyno1 Jan 10, 2021
44b54c1
Added some checks + changed indentation to spaces
d2dyno1 Jan 10, 2021
d3999c9
Fixed item overflow
d2dyno1 Jan 10, 2021
005e329
Changed Bundle Height to 256
d2dyno1 Jan 10, 2021
d4e0b18
Remove sVariables
d2dyno1 Jan 10, 2021
969318a
Codestyle fixes
d2dyno1 Jan 10, 2021
ca88006
mru -> mostRecentlyUsed
d2dyno1 Jan 10, 2021
bb4271c
codestyle
d2dyno1 Jan 10, 2021
0de9251
Decoupled JsonSettingsViewModel
d2dyno1 Jan 10, 2021
9b87571
Renamed JsonSettings -> WidgetsSettings
d2dyno1 Jan 10, 2021
84761f9
Marked BaseJsonSettingsViewModel as abstract
d2dyno1 Jan 10, 2021
d04dcf1
Added brackets :)
d2dyno1 Jan 10, 2021
2fbc12c
Removed Highlight effect from grids
d2dyno1 Jan 15, 2021
5ca9ca0
Merge branch 'master' into master
d2dyno1 Jan 15, 2021
b51097f
Consistent Bundle uppercase names
d2dyno1 Jan 15, 2021
9cf6247
Increase spacing
d2dyno1 Jan 17, 2021
d8418bf
Prep for Bundles exporting/importing
d2dyno1 Jan 19, 2021
88c2082
Prep for DynamicDialog
d2dyno1 Jan 19, 2021
1629c20
Improvements to DynamicDialog
d2dyno1 Jan 19, 2021
4f3cee5
Added the option to import/export bundles
d2dyno1 Jan 19, 2021
efc07a9
Minor improvements
d2dyno1 Jan 19, 2021
dd7ffc7
Merge branch 'main' into master
d2dyno1 Jan 19, 2021
b996c5a
Replaced export/import DynamicDialog to FilePicker
d2dyno1 Jan 19, 2021
16f1c9f
Merge branch 'master' of https://github.com/d2dyno1/Files
d2dyno1 Jan 19, 2021
6e13c5c
DynamicDialog and overall code improvements
d2dyno1 Jan 19, 2021
7542751
Added KeyDown event to DynamicDialog
d2dyno1 Jan 19, 2021
3fcfb41
Show dialog while renaming a Bundle
d2dyno1 Jan 19, 2021
674d3ed
Removed unnecesary code
d2dyno1 Jan 19, 2021
7196b07
Added translation resource strings
d2dyno1 Jan 19, 2021
c291f82
Fixed menu placement
yaira2 Jan 19, 2021
1ee23b9
Added rounded corners to dialog buttons
d2dyno1 Jan 19, 2021
1ea018b
Merge branch 'master' of https://github.com/d2dyno1/Files
d2dyno1 Jan 19, 2021
26951fc
Fix character cutting and improved design consistency
d2dyno1 Jan 19, 2021
4df8f23
Fixed translation error
d2dyno1 Jan 19, 2021
dfb7545
Update Files/Views/SettingsPages/Widgets.xaml
yaira2 Jan 20, 2021
6b95cd6
Updated strings
yaira2 Jan 20, 2021
bcc7d63
Updated strings
yaira2 Jan 20, 2021
7ef9518
Removed old string
yaira2 Jan 20, 2021
83adf70
Code Improvements
d2dyno1 Jan 20, 2021
a2c169a
Some refactor
tsvietOK Jan 20, 2021
be7c8fd
Fixed import crash, removed unnecesary code
d2dyno1 Jan 21, 2021
2414a67
Use FileSavePicker
d2dyno1 Jan 21, 2021
44076a9
Added DynamicDialog default implementation
d2dyno1 Jan 21, 2021
c3aa798
Applied reveal effect to Bundles Options button
d2dyno1 Jan 21, 2021
d74593f
Shortcut items don't get added
d2dyno1 Jan 21, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
237 changes: 120 additions & 117 deletions Files.Launcher/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -406,145 +406,148 @@ bool filterMenuItemsImpl(string menuItem)

private static async Task ParseFileOperationAsync(AppServiceRequestReceivedEventArgs args)
{
var fileOp = (string)args.Request.Message["fileop"];

switch (fileOp)
if (args.Request.Message.ContainsKey("fileop"))
{
case "Clipboard":
await Win32API.StartSTATask(() =>
{
System.Windows.Forms.Clipboard.Clear();
var fileToCopy = (string)args.Request.Message["filepath"];
var operation = (DataPackageOperation)(int)args.Request.Message["operation"];
var fileList = new System.Collections.Specialized.StringCollection();
fileList.AddRange(fileToCopy.Split('|'));
if (operation == DataPackageOperation.Copy)
string fileOp = (string)args.Request.Message["fileop"];

switch (fileOp)
{
case "Clipboard":
await Win32API.StartSTATask(() =>
{
System.Windows.Forms.Clipboard.SetFileDropList(fileList);
}
else if (operation == DataPackageOperation.Move)
System.Windows.Forms.Clipboard.Clear();
var fileToCopy = (string)args.Request.Message["filepath"];
var operation = (DataPackageOperation)(int)args.Request.Message["operation"];
var fileList = new System.Collections.Specialized.StringCollection();
fileList.AddRange(fileToCopy.Split('|'));
if (operation == DataPackageOperation.Copy)
{
System.Windows.Forms.Clipboard.SetFileDropList(fileList);
}
else if (operation == DataPackageOperation.Move)
{
byte[] moveEffect = new byte[] { 2, 0, 0, 0 };
MemoryStream dropEffect = new MemoryStream();
dropEffect.Write(moveEffect, 0, moveEffect.Length);
var data = new System.Windows.Forms.DataObject();
data.SetFileDropList(fileList);
data.SetData("Preferred DropEffect", dropEffect);
System.Windows.Forms.Clipboard.SetDataObject(data, true);
}
return true;
});
break;

case "DragDrop":
cancellation.Cancel();
cancellation.Dispose();
cancellation = new CancellationTokenSource();
var dropPath = (string)args.Request.Message["droppath"];
var dropText = (string)args.Request.Message["droptext"];
var drops = Win32API.StartSTATask<List<string>>(() =>
{
byte[] moveEffect = new byte[] { 2, 0, 0, 0 };
MemoryStream dropEffect = new MemoryStream();
dropEffect.Write(moveEffect, 0, moveEffect.Length);
var data = new System.Windows.Forms.DataObject();
data.SetFileDropList(fileList);
data.SetData("Preferred DropEffect", dropEffect);
System.Windows.Forms.Clipboard.SetDataObject(data, true);
}
return true;
});
break;

case "DragDrop":
cancellation.Cancel();
cancellation.Dispose();
cancellation = new CancellationTokenSource();
var dropPath = (string)args.Request.Message["droppath"];
var dropText = (string)args.Request.Message["droptext"];
var drops = Win32API.StartSTATask<List<string>>(() =>
{
var form = new DragDropForm(dropPath, dropText, cancellation.Token);
System.Windows.Forms.Application.Run(form);
return form.DropTargets;
});
break;
var form = new DragDropForm(dropPath, dropText, cancellation.Token);
System.Windows.Forms.Application.Run(form);
return form.DropTargets;
});
break;

case "DeleteItem":
var fileToDeletePath = (string)args.Request.Message["filepath"];
var permanently = (bool)args.Request.Message["permanently"];
using (var op = new ShellFileOperations())
{
op.Options = ShellFileOperations.OperationFlags.NoUI;
if (!permanently)
case "DeleteItem":
var fileToDeletePath = (string)args.Request.Message["filepath"];
var permanently = (bool)args.Request.Message["permanently"];
using (var op = new ShellFileOperations())
{
op.Options |= ShellFileOperations.OperationFlags.AllowUndo;
}
using var shi = new ShellItem(fileToDeletePath);
op.QueueDeleteOperation(shi);
var deleteTcs = new TaskCompletionSource<bool>();
op.PostDeleteItem += (s, e) => deleteTcs.TrySetResult(e.Result.Succeeded);
op.PerformOperations();
var result = await deleteTcs.Task;
await args.Request.SendResponseAsync(new ValueSet() {
op.Options = ShellFileOperations.OperationFlags.NoUI;
if (!permanently)
{
op.Options |= ShellFileOperations.OperationFlags.AllowUndo;
}
using var shi = new ShellItem(fileToDeletePath);
op.QueueDeleteOperation(shi);
var deleteTcs = new TaskCompletionSource<bool>();
op.PostDeleteItem += (s, e) => deleteTcs.TrySetResult(e.Result.Succeeded);
op.PerformOperations();
var result = await deleteTcs.Task;
await args.Request.SendResponseAsync(new ValueSet() {
{ "Success", result } });
}
break;
}
break;

case "ParseLink":
var linkPath = (string)args.Request.Message["filepath"];
try
{
if (linkPath.EndsWith(".lnk"))
case "ParseLink":
var linkPath = (string)args.Request.Message["filepath"];
try
{
using var link = new ShellLink(linkPath, LinkResolution.NoUIWithMsgPump, null, TimeSpan.FromMilliseconds(100));
await args.Request.SendResponseAsync(new ValueSet()
if (linkPath.EndsWith(".lnk"))
{
{ "TargetPath", link.TargetPath },
{ "Arguments", link.Arguments },
{ "WorkingDirectory", link.WorkingDirectory },
{ "RunAsAdmin", link.RunAsAdministrator },
{ "IsFolder", !string.IsNullOrEmpty(link.TargetPath) && link.Target.IsFolder }
});
using var link = new ShellLink(linkPath, LinkResolution.NoUIWithMsgPump, null, TimeSpan.FromMilliseconds(100));
await args.Request.SendResponseAsync(new ValueSet()
{
{ "TargetPath", link.TargetPath },
{ "Arguments", link.Arguments },
{ "WorkingDirectory", link.WorkingDirectory },
{ "RunAsAdmin", link.RunAsAdministrator },
{ "IsFolder", !string.IsNullOrEmpty(link.TargetPath) && link.Target.IsFolder }
});
}
else if (linkPath.EndsWith(".url"))
{
var linkUrl = await Win32API.StartSTATask(() =>
{
var ipf = new Url.IUniformResourceLocator();
(ipf as System.Runtime.InteropServices.ComTypes.IPersistFile).Load(linkPath, 0);
ipf.GetUrl(out var retVal);
return retVal;
});
await args.Request.SendResponseAsync(new ValueSet()
{
{ "TargetPath", linkUrl },
{ "Arguments", null },
{ "WorkingDirectory", null },
{ "RunAsAdmin", false },
{ "IsFolder", false }
});
}
}
else if (linkPath.EndsWith(".url"))
catch (Exception ex)
{
var linkUrl = await Win32API.StartSTATask(() =>
{
var ipf = new Url.IUniformResourceLocator();
(ipf as System.Runtime.InteropServices.ComTypes.IPersistFile).Load(linkPath, 0);
ipf.GetUrl(out var retVal);
return retVal;
});
// Could not parse shortcut
Logger.Warn(ex, ex.Message);
await args.Request.SendResponseAsync(new ValueSet()
{
{ "TargetPath", linkUrl },
{ "TargetPath", null },
{ "Arguments", null },
{ "WorkingDirectory", null },
{ "RunAsAdmin", false },
{ "IsFolder", false }
});
}
}
catch (Exception ex)
{
// Could not parse shortcut
Logger.Warn(ex, ex.Message);
await args.Request.SendResponseAsync(new ValueSet()
{
{ "TargetPath", null },
{ "Arguments", null },
{ "WorkingDirectory", null },
{ "RunAsAdmin", false },
{ "IsFolder", false }
});
}
break;
break;

case "CreateLink":
case "UpdateLink":
var linkSavePath = (string)args.Request.Message["filepath"];
var targetPath = (string)args.Request.Message["targetpath"];
if (linkSavePath.EndsWith(".lnk"))
{
var arguments = (string)args.Request.Message["arguments"];
var workingDirectory = (string)args.Request.Message["workingdir"];
var runAsAdmin = (bool)args.Request.Message["runasadmin"];
using var newLink = new ShellLink(targetPath, arguments, workingDirectory);
newLink.RunAsAdministrator = runAsAdmin;
newLink.SaveAs(linkSavePath); // Overwrite if exists
}
else if (linkSavePath.EndsWith(".url"))
{
await Win32API.StartSTATask(() =>
case "CreateLink":
case "UpdateLink":
var linkSavePath = (string)args.Request.Message["filepath"];
var targetPath = (string)args.Request.Message["targetpath"];
if (linkSavePath.EndsWith(".lnk"))
{
var arguments = (string)args.Request.Message["arguments"];
var workingDirectory = (string)args.Request.Message["workingdir"];
var runAsAdmin = (bool)args.Request.Message["runasadmin"];
using var newLink = new ShellLink(targetPath, arguments, workingDirectory);
newLink.RunAsAdministrator = runAsAdmin;
newLink.SaveAs(linkSavePath); // Overwrite if exists
}
else if (linkSavePath.EndsWith(".url"))
{
var ipf = new Url.IUniformResourceLocator();
ipf.SetUrl(targetPath, Url.IURL_SETURL_FLAGS.IURL_SETURL_FL_GUESS_PROTOCOL);
(ipf as System.Runtime.InteropServices.ComTypes.IPersistFile).Save(linkSavePath, false); // Overwrite if exists
await Win32API.StartSTATask(() =>
{
var ipf = new Url.IUniformResourceLocator();
ipf.SetUrl(targetPath, Url.IURL_SETURL_FLAGS.IURL_SETURL_FL_GUESS_PROTOCOL);
(ipf as System.Runtime.InteropServices.ComTypes.IPersistFile).Save(linkSavePath, false); // Overwrite if exists
return true;
});
}
break;
});
}
break;
}
}
}

Expand Down
4 changes: 3 additions & 1 deletion Files/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Files.Filesystem;
using Files.Filesystem.FilesystemHistory;
using Files.Helpers;
using Files.SettingsInterfaces;
using Files.UserControls.MultitaskingControl;
using Files.ViewModels;
using Files.Views;
Expand All @@ -12,7 +13,6 @@
using Microsoft.Toolkit.Uwp.Extensions;
using Microsoft.Toolkit.Uwp.Helpers;
using Microsoft.Toolkit.Uwp.Notifications;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using System;
Expand Down Expand Up @@ -44,6 +44,8 @@ sealed partial class App : Application
public static SemaphoreSlim SemaphoreSlim = new SemaphoreSlim(1, 1);
public static StorageHistoryWrapper HistoryWrapper = new StorageHistoryWrapper();

public static IBundlesSettings BundlesSettings = new BundlesSettingsViewModel();

public static SettingsViewModel AppSettings { get; set; }
public static InteractionViewModel InteractionViewModel { get; set; }
public static JumpListManager JumpList { get; } = new JumpListManager();
Expand Down
13 changes: 13 additions & 0 deletions Files/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,23 @@ public static class GenericFileBrowser
}
}

public static class Widgets
{
public static class Bundles
{
public const int MaxAmountOfItemsPerBundle = 8;
}
}

public static class LocalSettings
{
public const string DateTimeFormat = "datetimeformat";

public const string Theme = "theme";

public const string SettingsFolderName = "settings";

public const string BundlesSettingsFileName = "bundles.json";
}
}
}
19 changes: 19 additions & 0 deletions Files/Converters/VisiblityInvertConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Data;

namespace Files.Converters
{
public class VisiblityInvertConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return (Visibility)value == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
}
61 changes: 61 additions & 0 deletions Files/Dialogs/DynamicDialog.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<ContentDialog
x:Class="Files.Dialogs.DynamicDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:icore="using:Microsoft.Xaml.Interactions.Core"
xmlns:i="using:Microsoft.Xaml.Interactivity"
mc:Ignorable="d"
Title="{Binding TitleText, Mode=OneWay}"
DefaultButton="Primary"
CornerRadius="4"
PrimaryButtonText="{Binding PrimaryButtonText, Mode=OneWay}"
SecondaryButtonText="{Binding SecondaryButtonText, Mode=OneWay}"
CloseButtonText="{Binding CloseButtonText, Mode=OneWay}"
PrimaryButtonStyle="{StaticResource AccentButtonStyle}"
SecondaryButtonStyle="{StaticResource DefaultButtonStyle}"
CloseButtonStyle="{StaticResource DefaultButtonStyle}">

<i:Interaction.Behaviors>
<!-- No need to specify CommandParameter - `e` is passed by default -->
<icore:EventTriggerBehavior EventName="PrimaryButtonClick">
<icore:InvokeCommandAction Command="{Binding PrimaryButtonCommand, Mode=OneWay}" />
</icore:EventTriggerBehavior>
<!-- No need to specify CommandParameter - `e` is passed by default -->
<icore:EventTriggerBehavior EventName="SecondaryButtonClick">
<icore:InvokeCommandAction Command="{Binding SecondaryButtonCommand, Mode=OneWay}" />
</icore:EventTriggerBehavior>
<!-- No need to specify CommandParameter - `e` is passed by default -->
<icore:EventTriggerBehavior EventName="CloseButtonClick">
<icore:InvokeCommandAction Command="{Binding CloseButtonCommand, Mode=OneWay}" />
</icore:EventTriggerBehavior>
<!-- No need to specify CommandParameter - `e` is passed by default -->
<icore:EventTriggerBehavior EventName="KeyDown">
<icore:InvokeCommandAction Command="{Binding DynamicKeyDownCommand, Mode=OneWay}" />
</icore:EventTriggerBehavior>
</i:Interaction.Behaviors>

<Grid RowSpacing="25">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>

<!-- Subtitle -->
<TextBlock
Text="{Binding SubtitleText, Mode=OneWay}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Grid.Row="0" />

<!-- The dynamic content control -->
<ContentControl
Content="{Binding DisplayControl, Mode=OneWay}"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
VerticalContentAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Grid.Row="1" />
</Grid>
</ContentDialog>
Loading