DirectorySelector.xaml.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. using System.Collections.ObjectModel;
  2. using System.IO;
  3. using System.Management;
  4. using System.Windows.Media;
  5. namespace HistoryView.Controls.FileSelector;
  6. public partial class DirectorySelector : UserControl
  7. {
  8. public DirectorySelector()
  9. {
  10. InitializeComponent();
  11. GetPaths();
  12. }
  13. private void GetPaths()
  14. {
  15. //string rootPath = System.AppDomain.CurrentDomain.BaseDirectory;
  16. //DirectoryInfo root = new DirectoryInfo(rootPath);
  17. //FileInfo[] files = root.GetFiles();
  18. //DirectoryInfo[] dics = root.GetDirectories();
  19. //BaseDisk = [];
  20. //BaseDisk.AddRange(dics);
  21. BaseFolder = [];
  22. string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
  23. DriveInfo[] drives = DriveInfo.GetDrives();
  24. FileDisplay d = new()
  25. {
  26. Name = "Desktop",
  27. Path = desktopPath,
  28. ImageSource = App.Current.Resources["Icon_Desktop"],
  29. Type = DisType.Folder
  30. };
  31. BaseFolder.Add(d);
  32. foreach (DriveInfo basePath in drives)
  33. {
  34. FileDisplay display = new()
  35. {
  36. Name = basePath.Name,
  37. Path = basePath.Name,
  38. ImageSource = App.Current.Resources["Icon_Folder"],
  39. Type = DisType.Folder
  40. };
  41. BaseFolder.Add(display);
  42. }
  43. }
  44. public string Extension
  45. {
  46. get { return (string)GetValue(ExtensionProperty); }
  47. set { SetValue(ExtensionProperty, value); }
  48. }
  49. public static readonly DependencyProperty ExtensionProperty =
  50. DependencyProperty.Register("Extension", typeof(string), typeof(DirectorySelector), new PropertyMetadata(default));
  51. public ICommand Confirm
  52. {
  53. get { return (ICommand)GetValue(ConfirmProperty); }
  54. set { SetValue(ConfirmProperty, value); }
  55. }
  56. public static readonly DependencyProperty ConfirmProperty =
  57. DependencyProperty.Register("Confirm", typeof(ICommand), typeof(DirectorySelector), new PropertyMetadata(default));
  58. public ICommand Cancel
  59. {
  60. get { return (ICommand)GetValue(CancelProperty); }
  61. set { SetValue(CancelProperty, value); }
  62. }
  63. public static readonly DependencyProperty CancelProperty =
  64. DependencyProperty.Register("Cancel", typeof(ICommand), typeof(DirectorySelector), new PropertyMetadata(default));
  65. public ObservableCollection<FileDisplay> BaseFolder
  66. {
  67. get { return (ObservableCollection<FileDisplay>)GetValue(BaseFolderProperty); }
  68. set { SetValue(BaseFolderProperty, value); }
  69. }
  70. // Using a DependencyProperty as the backing store for BaseFolder. This enables animation, styling, binding, etc...
  71. public static readonly DependencyProperty BaseFolderProperty =
  72. DependencyProperty.Register("BaseFolder", typeof(ObservableCollection<FileDisplay>), typeof(DirectorySelector), new PropertyMetadata(default));
  73. public ObservableCollection<DirectoryInfo> History
  74. {
  75. get { return (ObservableCollection<DirectoryInfo>)GetValue(HistoryProperty); }
  76. set { SetValue(HistoryProperty, value); }
  77. }
  78. // Using a DependencyProperty as the backing store for History. This enables animation, styling, binding, etc...
  79. public static readonly DependencyProperty HistoryProperty =
  80. DependencyProperty.Register("History", typeof(ObservableCollection<DirectoryInfo>), typeof(DirectorySelector), new PropertyMetadata(default));
  81. public ObservableCollection<FileDisplay> Displays
  82. {
  83. get { return (ObservableCollection<FileDisplay>)GetValue(DisplaysProperty); }
  84. set { SetValue(DisplaysProperty, value); }
  85. }
  86. // Using a DependencyProperty as the backing store for Displays. This enables animation, styling, binding, etc...
  87. public static readonly DependencyProperty DisplaysProperty =
  88. DependencyProperty.Register("Displays", typeof(ObservableCollection<FileDisplay>), typeof(DirectorySelector), new PropertyMetadata(default));
  89. public ObservableDictionary<int, FileDisplay> Parents
  90. {
  91. get { return (ObservableDictionary<int, FileDisplay>)GetValue(ParentsProperty); }
  92. set { SetValue(ParentsProperty, value); }
  93. }
  94. // Using a DependencyProperty as the backing store for Parents. This enables animation, styling, binding, etc...
  95. public static readonly DependencyProperty ParentsProperty =
  96. DependencyProperty.Register("Parents", typeof(ObservableDictionary<int, FileDisplay>), typeof(DirectorySelector), new PropertyMetadata(default));
  97. public FileInfo SelectedFile
  98. {
  99. get { return (FileInfo)GetValue(SelectedFileProperty); }
  100. set { SetValue(SelectedFileProperty, value); }
  101. }
  102. public static readonly DependencyProperty SelectedFileProperty =
  103. DependencyProperty.Register("SelectedFile", typeof(FileInfo), typeof(DirectorySelector), new PropertyMetadata(default));
  104. private string _current = "";
  105. private static void GetFullPath(DirectoryInfo dir, ref List<FileDisplay> paths)
  106. {
  107. paths ??= [];
  108. FileDisplay display = new()
  109. {
  110. Name = dir.Name,
  111. Path = dir.FullName,
  112. ImageSource = App.Current.Resources["Icon_Folder"],
  113. Type = DisType.Folder
  114. };
  115. paths.Add(display);
  116. if (dir.Parent is not null)
  117. GetFullPath(dir.Parent, ref paths);
  118. }
  119. private void Button_Click(object sender, RoutedEventArgs e)
  120. {
  121. var t = (Button)e.Source;
  122. FileDisplay d = (FileDisplay)t.CommandParameter;
  123. if (string.IsNullOrEmpty(d.Path))
  124. return;
  125. if (d.Type == DisType.File)
  126. {
  127. SelectedFile = new(d.Path);
  128. return;
  129. }
  130. DirectoryInfo dir = new(d.Path);
  131. List<FileDisplay> s = [];
  132. GetFullPath(dir, ref s);
  133. Parents ??= [];
  134. Parents.Clear();
  135. for (int i = s.Count - 1; i >= 0; i--)
  136. {
  137. Parents[i] = s[i];
  138. }
  139. Displays ??= [];
  140. Displays.Clear();
  141. _current = d.Path;
  142. FileInfo[] files = dir.GetFiles();
  143. DirectoryInfo[] dics = dir.GetDirectories();
  144. foreach (DirectoryInfo item in dics)
  145. {
  146. if (item.Attributes.HasFlag(FileAttributes.Hidden))
  147. continue;
  148. if (item.Name.StartsWith('.'))
  149. continue;
  150. FileDisplay display = new()
  151. {
  152. Name = item.Name,
  153. Path = item.FullName,
  154. ImageSource = App.Current.Resources["Icon_Folder"],
  155. Type = DisType.Folder
  156. };
  157. Displays.Add(display);
  158. }
  159. foreach (var item in files)
  160. {
  161. if (item.Attributes.HasFlag(FileAttributes.Hidden))
  162. continue;
  163. if (this.Extension is not null && item.Extension != this.Extension)
  164. continue;
  165. FileDisplay display = new()
  166. {
  167. Name = item.Name.Remove(item.Name.LastIndexOf(item.Extension), item.Extension.Length),
  168. Path = item.FullName,
  169. ImageSource = App.Current.Resources["Icon_File"],
  170. FileType = item.Extension,
  171. Type = DisType.File
  172. };
  173. Displays.Add(display);
  174. }
  175. }
  176. private void Button_Click_1(object sender, RoutedEventArgs e)
  177. {
  178. if (string.IsNullOrEmpty(_current))
  179. return;
  180. Displays ??= [];
  181. Displays.Clear();
  182. Parents ??= [];
  183. Parents.Clear();
  184. DirectoryInfo? temp = new DirectoryInfo(_current).Parent;
  185. if (temp is null)
  186. {
  187. DriveInfo[] drives = DriveInfo.GetDrives();
  188. foreach (DriveInfo basePath in drives)
  189. {
  190. FileDisplay display = new()
  191. {
  192. Name = basePath.Name,
  193. Path = basePath.Name,
  194. ImageSource = App.Current.Resources["Icon_Folder"],
  195. Type = DisType.Folder
  196. };
  197. Displays.Add(display);
  198. }
  199. return;
  200. }
  201. List<FileDisplay> s = [];
  202. GetFullPath(temp, ref s);
  203. for (int i = s.Count - 1; i >= 0; i--)
  204. {
  205. Parents[i] = s[i];
  206. }
  207. _current = temp.FullName;
  208. FileInfo[] files = new DirectoryInfo(_current).GetFiles();
  209. DirectoryInfo[] dics = new DirectoryInfo(_current).GetDirectories();
  210. foreach (DirectoryInfo item in dics)
  211. {
  212. if (item.Attributes.HasFlag(FileAttributes.Hidden))
  213. continue;
  214. if (item.Name.StartsWith('.'))
  215. continue;
  216. if (!string.IsNullOrEmpty(this.Extension) && this.Extension != item.Extension)
  217. continue;
  218. FileDisplay display = new()
  219. {
  220. Name = item.Name,
  221. Path = item.FullName,
  222. ImageSource = App.Current.Resources["Icon_Folder"],
  223. Type = DisType.Folder
  224. };
  225. Displays.Add(display);
  226. }
  227. foreach (var item in files)
  228. {
  229. if (item.Attributes.HasFlag(FileAttributes.Hidden))
  230. continue;
  231. if (!string.IsNullOrEmpty(this.Extension) && this.Extension != item.Extension)
  232. continue;
  233. FileDisplay display = new()
  234. {
  235. Name = item.Name.Replace(item.Extension, ""),
  236. Path = item.FullName,
  237. ImageSource = App.Current.Resources["Icon_File"],
  238. FileType = item.Extension,
  239. Type = DisType.File
  240. };
  241. Displays.Add(display);
  242. }
  243. }
  244. }