DialogsPage.xaml.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Avalonia.Controls;
  6. using Avalonia.Controls.Presenters;
  7. using Avalonia.Dialogs;
  8. using Avalonia.Layout;
  9. using Avalonia.Markup.Xaml;
  10. #pragma warning disable 4014
  11. namespace ControlCatalog.Pages
  12. {
  13. public class DialogsPage : UserControl
  14. {
  15. public DialogsPage()
  16. {
  17. this.InitializeComponent();
  18. var results = this.FindControl<ItemsPresenter>("PickerLastResults");
  19. var resultsVisible = this.FindControl<TextBlock>("PickerLastResultsVisible");
  20. string lastSelectedDirectory = null;
  21. List<FileDialogFilter>? GetFilters()
  22. {
  23. if (this.FindControl<CheckBox>("UseFilters").IsChecked != true)
  24. return null;
  25. return new List<FileDialogFilter>
  26. {
  27. new FileDialogFilter
  28. {
  29. Name = "Text files (.txt)", Extensions = new List<string> {"txt"}
  30. },
  31. new FileDialogFilter
  32. {
  33. Name = "All files",
  34. Extensions = new List<string> {"*"}
  35. }
  36. };
  37. }
  38. this.FindControl<Button>("OpenFile").Click += async delegate
  39. {
  40. var result = await new OpenFileDialog()
  41. {
  42. Title = "Open file",
  43. Filters = GetFilters(),
  44. Directory = lastSelectedDirectory,
  45. // Almost guaranteed to exist
  46. InitialFileName = Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName
  47. }.ShowAsync(GetWindow());
  48. results.Items = result;
  49. resultsVisible.IsVisible = result?.Any() == true;
  50. };
  51. this.FindControl<Button>("OpenMultipleFiles").Click += async delegate
  52. {
  53. var result = await new OpenFileDialog()
  54. {
  55. Title = "Open multiple files",
  56. Filters = GetFilters(),
  57. Directory = lastSelectedDirectory,
  58. AllowMultiple = true
  59. }.ShowAsync(GetWindow());
  60. results.Items = result;
  61. resultsVisible.IsVisible = result?.Any() == true;
  62. };
  63. this.FindControl<Button>("SaveFile").Click += async delegate
  64. {
  65. var result = await new SaveFileDialog()
  66. {
  67. Title = "Save file",
  68. Filters = GetFilters(),
  69. Directory = lastSelectedDirectory,
  70. InitialFileName = "test.txt"
  71. }.ShowAsync(GetWindow());
  72. results.Items = new[] { result };
  73. resultsVisible.IsVisible = result != null;
  74. };
  75. this.FindControl<Button>("SelectFolder").Click += async delegate
  76. {
  77. var result = await new OpenFolderDialog()
  78. {
  79. Title = "Select folder",
  80. Directory = lastSelectedDirectory,
  81. }.ShowAsync(GetWindow());
  82. lastSelectedDirectory = result;
  83. results.Items = new [] { result };
  84. resultsVisible.IsVisible = result != null;
  85. };
  86. this.FindControl<Button>("OpenBoth").Click += async delegate
  87. {
  88. var result = await new OpenFileDialog()
  89. {
  90. Title = "Select both",
  91. Directory = lastSelectedDirectory,
  92. AllowMultiple = true
  93. }.ShowManagedAsync(GetWindow(), new ManagedFileDialogOptions
  94. {
  95. AllowDirectorySelection = true
  96. });
  97. results.Items = result;
  98. resultsVisible.IsVisible = result?.Any() == true;
  99. };
  100. this.FindControl<Button>("DecoratedWindow").Click += delegate
  101. {
  102. new DecoratedWindow().Show();
  103. };
  104. this.FindControl<Button>("DecoratedWindowDialog").Click += delegate
  105. {
  106. new DecoratedWindow().ShowDialog(GetWindow());
  107. };
  108. this.FindControl<Button>("Dialog").Click += delegate
  109. {
  110. var window = CreateSampleWindow();
  111. window.Height = 200;
  112. window.ShowDialog(GetWindow());
  113. };
  114. this.FindControl<Button>("DialogNoTaskbar").Click += delegate
  115. {
  116. var window = CreateSampleWindow();
  117. window.Height = 200;
  118. window.ShowInTaskbar = false;
  119. window.ShowDialog(GetWindow());
  120. };
  121. this.FindControl<Button>("OwnedWindow").Click += delegate
  122. {
  123. var window = CreateSampleWindow();
  124. window.Show(GetWindow());
  125. };
  126. this.FindControl<Button>("OwnedWindowNoTaskbar").Click += delegate
  127. {
  128. var window = CreateSampleWindow();
  129. window.ShowInTaskbar = false;
  130. window.Show(GetWindow());
  131. };
  132. }
  133. private Window CreateSampleWindow()
  134. {
  135. Button button;
  136. var window = new Window
  137. {
  138. Height = 200,
  139. Width = 200,
  140. Content = new StackPanel
  141. {
  142. Spacing = 4,
  143. Children =
  144. {
  145. new TextBlock { Text = "Hello world!" },
  146. (button = new Button
  147. {
  148. HorizontalAlignment = HorizontalAlignment.Center,
  149. Content = "Click to close",
  150. IsDefault = true
  151. })
  152. }
  153. },
  154. WindowStartupLocation = WindowStartupLocation.CenterOwner
  155. };
  156. button.Click += (_, __) => window.Close();
  157. return window;
  158. }
  159. Window GetWindow() => (Window)this.VisualRoot;
  160. private void InitializeComponent()
  161. {
  162. AvaloniaXamlLoader.Load(this);
  163. }
  164. }
  165. }