Browse Source

Reinstated DialogsPage.

pull/9677/head
Steven Kirk 4 years ago
parent
commit
84abb69b61
  1. 2
      samples/ControlCatalog/Pages/DialogsPage.xaml
  2. 590
      samples/ControlCatalog/Pages/DialogsPage.xaml.cs

2
samples/ControlCatalog/Pages/DialogsPage.xaml

@ -46,7 +46,7 @@
Classes="h2"
IsVisible="False"
Text="Last picker results:" />
<ItemsPresenter x:Name="PickerLastResults" />
<ItemsControl x:Name="PickerLastResults" />
<TextBox Name="BookmarkContainer" Watermark="Bookmark" />
<TextBox Name="OpenedFileContent"

590
samples/ControlCatalog/Pages/DialogsPage.xaml.cs

@ -24,301 +24,301 @@ namespace ControlCatalog.Pages
{
this.InitializeComponent();
//// var results = this.Get<ItemsPresenter>("PickerLastResults");
//// var resultsVisible = this.Get<TextBlock>("PickerLastResultsVisible");
//// var bookmarkContainer = this.Get<TextBox>("BookmarkContainer");
//// var openedFileContent = this.Get<TextBox>("OpenedFileContent");
//// var openMultiple = this.Get<CheckBox>("OpenMultiple");
//// IStorageFolder? lastSelectedDirectory = null;
//// List<FileDialogFilter> GetFilters()
//// {
//// if (this.Get<CheckBox>("UseFilters").IsChecked != true)
//// return new List<FileDialogFilter>();
//// return new List<FileDialogFilter>
//// {
//// new FileDialogFilter
//// {
//// Name = "Text files (.txt)", Extensions = new List<string> {"txt"}
//// },
//// new FileDialogFilter
//// {
//// Name = "All files",
//// Extensions = new List<string> {"*"}
//// }
//// };
//// }
//// List<FilePickerFileType>? GetFileTypes()
//// {
//// if (this.Get<CheckBox>("UseFilters").IsChecked != true)
//// return null;
//// return new List<FilePickerFileType>
//// {
//// FilePickerFileTypes.All,
//// FilePickerFileTypes.TextPlain
//// };
//// }
//// this.Get<Button>("OpenFile").Click += async delegate
//// {
//// // Almost guaranteed to exist
//// var uri = Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName;
//// var initialFileName = uri == null ? null : System.IO.Path.GetFileName(uri);
//// var initialDirectory = uri == null ? null : System.IO.Path.GetDirectoryName(uri);
//// var result = await new OpenFileDialog()
//// {
//// Title = "Open file",
//// Filters = GetFilters(),
//// Directory = initialDirectory,
//// InitialFileName = initialFileName
//// }.ShowAsync(GetWindow());
//// results.Items = result;
//// resultsVisible.IsVisible = result?.Any() == true;
//// };
//// this.Get<Button>("OpenMultipleFiles").Click += async delegate
//// {
//// var result = await new OpenFileDialog()
//// {
//// Title = "Open multiple files",
//// Filters = GetFilters(),
//// Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null,
//// AllowMultiple = true
//// }.ShowAsync(GetWindow());
//// results.Items = result;
//// resultsVisible.IsVisible = result?.Any() == true;
//// };
//// this.Get<Button>("SaveFile").Click += async delegate
//// {
//// var filters = GetFilters();
//// var result = await new SaveFileDialog()
//// {
//// Title = "Save file",
//// Filters = filters,
//// Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null,
//// DefaultExtension = filters?.Any() == true ? "txt" : null,
//// InitialFileName = "test.txt"
//// }.ShowAsync(GetWindow());
//// results.Items = new[] { result };
//// resultsVisible.IsVisible = result != null;
//// };
//// this.Get<Button>("SelectFolder").Click += async delegate
//// {
//// var result = await new OpenFolderDialog()
//// {
//// Title = "Select folder",
//// Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null
//// }.ShowAsync(GetWindow());
//// if (string.IsNullOrEmpty(result))
//// {
//// resultsVisible.IsVisible = false;
//// }
//// else
//// {
//// lastSelectedDirectory = new BclStorageFolder(new System.IO.DirectoryInfo(result));
//// results.Items = new[] { result };
//// resultsVisible.IsVisible = true;
//// }
//// };
//// this.Get<Button>("OpenBoth").Click += async delegate
//// {
//// var result = await new OpenFileDialog()
//// {
//// Title = "Select both",
//// Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null,
//// AllowMultiple = true
//// }.ShowManagedAsync(GetWindow(), new ManagedFileDialogOptions
//// {
//// AllowDirectorySelection = true
//// });
//// results.Items = result;
//// resultsVisible.IsVisible = result?.Any() == true;
//// };
//// this.Get<Button>("DecoratedWindow").Click += delegate
//// {
//// new DecoratedWindow().Show();
//// };
//// this.Get<Button>("DecoratedWindowDialog").Click += delegate
//// {
//// _ = new DecoratedWindow().ShowDialog(GetWindow());
//// };
//// this.Get<Button>("Dialog").Click += delegate
//// {
//// var window = CreateSampleWindow();
//// window.Height = 200;
//// _ = window.ShowDialog(GetWindow());
//// };
//// this.Get<Button>("DialogNoTaskbar").Click += delegate
//// {
//// var window = CreateSampleWindow();
//// window.Height = 200;
//// window.ShowInTaskbar = false;
//// _ = window.ShowDialog(GetWindow());
//// };
//// this.Get<Button>("OwnedWindow").Click += delegate
//// {
//// var window = CreateSampleWindow();
//// window.Show(GetWindow());
//// };
//// this.Get<Button>("OwnedWindowNoTaskbar").Click += delegate
//// {
//// var window = CreateSampleWindow();
//// window.ShowInTaskbar = false;
//// window.Show(GetWindow());
//// };
//// this.Get<Button>("OpenFilePicker").Click += async delegate
//// {
//// var result = await GetStorageProvider().OpenFilePickerAsync(new FilePickerOpenOptions()
//// {
//// Title = "Open file",
//// FileTypeFilter = GetFileTypes(),
//// SuggestedStartLocation = lastSelectedDirectory,
//// AllowMultiple = openMultiple.IsChecked == true
//// });
//// await SetPickerResult(result);
//// };
//// this.Get<Button>("SaveFilePicker").Click += async delegate
//// {
//// var fileTypes = GetFileTypes();
//// var file = await GetStorageProvider().SaveFilePickerAsync(new FilePickerSaveOptions()
//// {
//// Title = "Save file",
//// FileTypeChoices = fileTypes,
//// SuggestedStartLocation = lastSelectedDirectory,
//// SuggestedFileName = "FileName",
//// DefaultExtension = fileTypes?.Any() == true ? "txt" : null,
//// ShowOverwritePrompt = false
//// });
//// if (file is not null && file.CanOpenWrite)
//// {
//// // Sync disposal of StreamWriter is not supported on WASM
////#if NET6_0_OR_GREATER
//// await using var stream = await file.OpenWriteAsync();
//// await using var reader = new System.IO.StreamWriter(stream);
////#else
//// using var stream = await file.OpenWriteAsync();
//// using var reader = new System.IO.StreamWriter(stream);
////#endif
//// await reader.WriteLineAsync(openedFileContent.Text);
//// lastSelectedDirectory = await file.GetParentAsync();
//// }
//// await SetPickerResult(file is null ? null : new [] {file});
//// };
//// this.Get<Button>("OpenFolderPicker").Click += async delegate
//// {
//// var folders = await GetStorageProvider().OpenFolderPickerAsync(new FolderPickerOpenOptions()
//// {
//// Title = "Folder file",
//// SuggestedStartLocation = lastSelectedDirectory,
//// AllowMultiple = openMultiple.IsChecked == true
//// });
//// await SetPickerResult(folders);
//// lastSelectedDirectory = folders.FirstOrDefault();
//// };
//// this.Get<Button>("OpenFileFromBookmark").Click += async delegate
//// {
//// var file = bookmarkContainer.Text is not null
//// ? await GetStorageProvider().OpenFileBookmarkAsync(bookmarkContainer.Text)
//// : null;
//// await SetPickerResult(file is null ? null : new[] { file });
//// };
//// this.Get<Button>("OpenFolderFromBookmark").Click += async delegate
//// {
//// var folder = bookmarkContainer.Text is not null
//// ? await GetStorageProvider().OpenFolderBookmarkAsync(bookmarkContainer.Text)
//// : null;
//// await SetPickerResult(folder is null ? null : new[] { folder });
//// lastSelectedDirectory = folder;
//// };
//// async Task SetPickerResult(IReadOnlyCollection<IStorageItem>? items)
//// {
//// items ??= Array.Empty<IStorageItem>();
//// bookmarkContainer.Text = items.FirstOrDefault(f => f.CanBookmark) is { } f ? await f.SaveBookmarkAsync() : "Can't bookmark";
//// var mappedResults = new List<string>();
//// if (items.FirstOrDefault() is IStorageItem item)
//// {
//// var resultText = item is IStorageFile ? "File:" : "Folder:";
//// resultText += Environment.NewLine;
//// var props = await item.GetBasicPropertiesAsync();
//// resultText += @$"Size: {props.Size}
////DateCreated: {props.DateCreated}
////DateModified: {props.DateModified}
////CanBookmark: {item.CanBookmark}
////";
//// if (item is IStorageFile file)
//// {
//// resultText += @$"
////CanOpenRead: {file.CanOpenRead}
////CanOpenWrite: {file.CanOpenWrite}
////Content:
////";
//// if (file.CanOpenRead)
//// {
////#if NET6_0_OR_GREATER
//// await using var stream = await file.OpenReadAsync();
////#else
//// using var stream = await file.OpenReadAsync();
////#endif
//// using var reader = new System.IO.StreamReader(stream);
//// // 4GB file test, shouldn't load more than 10000 chars into a memory.
//// const int length = 10000;
//// var buffer = ArrayPool<char>.Shared.Rent(length);
//// try
//// {
//// var charsRead = await reader.ReadAsync(buffer, 0, length);
//// resultText += new string(buffer, 0, charsRead);
//// }
//// finally
//// {
//// ArrayPool<char>.Shared.Return(buffer);
//// }
//// }
//// }
//// openedFileContent.Text = resultText;
//// lastSelectedDirectory = await item.GetParentAsync();
//// if (lastSelectedDirectory is not null)
//// {
//// mappedResults.Add(FullPathOrName(lastSelectedDirectory));
//// }
//// foreach (var selectedItem in items)
//// {
//// mappedResults.Add("+> " + FullPathOrName(selectedItem));
//// if (selectedItem is IStorageFolder folder)
//// {
//// foreach (var innerItems in await folder.GetItemsAsync())
//// {
//// mappedResults.Add("++> " + FullPathOrName(innerItems));
//// }
//// }
//// }
//// }
//// results.Items = mappedResults;
//// resultsVisible.IsVisible = mappedResults.Any();
//// }
var results = this.Get<ItemsControl>("PickerLastResults");
var resultsVisible = this.Get<TextBlock>("PickerLastResultsVisible");
var bookmarkContainer = this.Get<TextBox>("BookmarkContainer");
var openedFileContent = this.Get<TextBox>("OpenedFileContent");
var openMultiple = this.Get<CheckBox>("OpenMultiple");
IStorageFolder? lastSelectedDirectory = null;
List<FileDialogFilter> GetFilters()
{
if (this.Get<CheckBox>("UseFilters").IsChecked != true)
return new List<FileDialogFilter>();
return new List<FileDialogFilter>
{
new FileDialogFilter
{
Name = "Text files (.txt)", Extensions = new List<string> {"txt"}
},
new FileDialogFilter
{
Name = "All files",
Extensions = new List<string> {"*"}
}
};
}
List<FilePickerFileType>? GetFileTypes()
{
if (this.Get<CheckBox>("UseFilters").IsChecked != true)
return null;
return new List<FilePickerFileType>
{
FilePickerFileTypes.All,
FilePickerFileTypes.TextPlain
};
}
this.Get<Button>("OpenFile").Click += async delegate
{
// Almost guaranteed to exist
var uri = Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName;
var initialFileName = uri == null ? null : System.IO.Path.GetFileName(uri);
var initialDirectory = uri == null ? null : System.IO.Path.GetDirectoryName(uri);
var result = await new OpenFileDialog()
{
Title = "Open file",
Filters = GetFilters(),
Directory = initialDirectory,
InitialFileName = initialFileName
}.ShowAsync(GetWindow());
results.Items = result;
resultsVisible.IsVisible = result?.Any() == true;
};
this.Get<Button>("OpenMultipleFiles").Click += async delegate
{
var result = await new OpenFileDialog()
{
Title = "Open multiple files",
Filters = GetFilters(),
Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null,
AllowMultiple = true
}.ShowAsync(GetWindow());
results.Items = result;
resultsVisible.IsVisible = result?.Any() == true;
};
this.Get<Button>("SaveFile").Click += async delegate
{
var filters = GetFilters();
var result = await new SaveFileDialog()
{
Title = "Save file",
Filters = filters,
Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null,
DefaultExtension = filters?.Any() == true ? "txt" : null,
InitialFileName = "test.txt"
}.ShowAsync(GetWindow());
results.Items = new[] { result };
resultsVisible.IsVisible = result != null;
};
this.Get<Button>("SelectFolder").Click += async delegate
{
var result = await new OpenFolderDialog()
{
Title = "Select folder",
Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null
}.ShowAsync(GetWindow());
if (string.IsNullOrEmpty(result))
{
resultsVisible.IsVisible = false;
}
else
{
lastSelectedDirectory = new BclStorageFolder(new System.IO.DirectoryInfo(result));
results.Items = new[] { result };
resultsVisible.IsVisible = true;
}
};
this.Get<Button>("OpenBoth").Click += async delegate
{
var result = await new OpenFileDialog()
{
Title = "Select both",
Directory = lastSelectedDirectory?.TryGetUri(out var path) == true ? path.LocalPath : null,
AllowMultiple = true
}.ShowManagedAsync(GetWindow(), new ManagedFileDialogOptions
{
AllowDirectorySelection = true
});
results.Items = result;
resultsVisible.IsVisible = result?.Any() == true;
};
this.Get<Button>("DecoratedWindow").Click += delegate
{
new DecoratedWindow().Show();
};
this.Get<Button>("DecoratedWindowDialog").Click += delegate
{
_ = new DecoratedWindow().ShowDialog(GetWindow());
};
this.Get<Button>("Dialog").Click += delegate
{
var window = CreateSampleWindow();
window.Height = 200;
_ = window.ShowDialog(GetWindow());
};
this.Get<Button>("DialogNoTaskbar").Click += delegate
{
var window = CreateSampleWindow();
window.Height = 200;
window.ShowInTaskbar = false;
_ = window.ShowDialog(GetWindow());
};
this.Get<Button>("OwnedWindow").Click += delegate
{
var window = CreateSampleWindow();
window.Show(GetWindow());
};
this.Get<Button>("OwnedWindowNoTaskbar").Click += delegate
{
var window = CreateSampleWindow();
window.ShowInTaskbar = false;
window.Show(GetWindow());
};
this.Get<Button>("OpenFilePicker").Click += async delegate
{
var result = await GetStorageProvider().OpenFilePickerAsync(new FilePickerOpenOptions()
{
Title = "Open file",
FileTypeFilter = GetFileTypes(),
SuggestedStartLocation = lastSelectedDirectory,
AllowMultiple = openMultiple.IsChecked == true
});
await SetPickerResult(result);
};
this.Get<Button>("SaveFilePicker").Click += async delegate
{
var fileTypes = GetFileTypes();
var file = await GetStorageProvider().SaveFilePickerAsync(new FilePickerSaveOptions()
{
Title = "Save file",
FileTypeChoices = fileTypes,
SuggestedStartLocation = lastSelectedDirectory,
SuggestedFileName = "FileName",
DefaultExtension = fileTypes?.Any() == true ? "txt" : null,
ShowOverwritePrompt = false
});
if (file is not null && file.CanOpenWrite)
{
// Sync disposal of StreamWriter is not supported on WASM
#if NET6_0_OR_GREATER
await using var stream = await file.OpenWriteAsync();
await using var reader = new System.IO.StreamWriter(stream);
#else
using var stream = await file.OpenWriteAsync();
using var reader = new System.IO.StreamWriter(stream);
#endif
await reader.WriteLineAsync(openedFileContent.Text);
lastSelectedDirectory = await file.GetParentAsync();
}
await SetPickerResult(file is null ? null : new[] { file });
};
this.Get<Button>("OpenFolderPicker").Click += async delegate
{
var folders = await GetStorageProvider().OpenFolderPickerAsync(new FolderPickerOpenOptions()
{
Title = "Folder file",
SuggestedStartLocation = lastSelectedDirectory,
AllowMultiple = openMultiple.IsChecked == true
});
await SetPickerResult(folders);
lastSelectedDirectory = folders.FirstOrDefault();
};
this.Get<Button>("OpenFileFromBookmark").Click += async delegate
{
var file = bookmarkContainer.Text is not null
? await GetStorageProvider().OpenFileBookmarkAsync(bookmarkContainer.Text)
: null;
await SetPickerResult(file is null ? null : new[] { file });
};
this.Get<Button>("OpenFolderFromBookmark").Click += async delegate
{
var folder = bookmarkContainer.Text is not null
? await GetStorageProvider().OpenFolderBookmarkAsync(bookmarkContainer.Text)
: null;
await SetPickerResult(folder is null ? null : new[] { folder });
lastSelectedDirectory = folder;
};
async Task SetPickerResult(IReadOnlyCollection<IStorageItem>? items)
{
items ??= Array.Empty<IStorageItem>();
bookmarkContainer.Text = items.FirstOrDefault(f => f.CanBookmark) is { } f ? await f.SaveBookmarkAsync() : "Can't bookmark";
var mappedResults = new List<string>();
if (items.FirstOrDefault() is IStorageItem item)
{
var resultText = item is IStorageFile ? "File:" : "Folder:";
resultText += Environment.NewLine;
var props = await item.GetBasicPropertiesAsync();
resultText += @$"Size: {props.Size}
DateCreated: {props.DateCreated}
DateModified: {props.DateModified}
CanBookmark: {item.CanBookmark}
";
if (item is IStorageFile file)
{
resultText += @$"
CanOpenRead: {file.CanOpenRead}
CanOpenWrite: {file.CanOpenWrite}
Content:
";
if (file.CanOpenRead)
{
#if NET6_0_OR_GREATER
await using var stream = await file.OpenReadAsync();
#else
using var stream = await file.OpenReadAsync();
#endif
using var reader = new System.IO.StreamReader(stream);
// 4GB file test, shouldn't load more than 10000 chars into a memory.
const int length = 10000;
var buffer = ArrayPool<char>.Shared.Rent(length);
try
{
var charsRead = await reader.ReadAsync(buffer, 0, length);
resultText += new string(buffer, 0, charsRead);
}
finally
{
ArrayPool<char>.Shared.Return(buffer);
}
}
}
openedFileContent.Text = resultText;
lastSelectedDirectory = await item.GetParentAsync();
if (lastSelectedDirectory is not null)
{
mappedResults.Add(FullPathOrName(lastSelectedDirectory));
}
foreach (var selectedItem in items)
{
mappedResults.Add("+> " + FullPathOrName(selectedItem));
if (selectedItem is IStorageFolder folder)
{
foreach (var innerItems in await folder.GetItemsAsync())
{
mappedResults.Add("++> " + FullPathOrName(innerItems));
}
}
}
}
results.Items = mappedResults;
resultsVisible.IsVisible = mappedResults.Any();
}
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)

Loading…
Cancel
Save