MainContentViewModel.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using ComPDFKitViewer.PdfViewer;
  2. using Microsoft.Win32;
  3. using PDF_Office.CustomControl;
  4. using PDF_Office.EventAggregators;
  5. using PDF_Office.Views;
  6. using Prism.Commands;
  7. using Prism.Events;
  8. using Prism.Ioc;
  9. using Prism.Mvvm;
  10. using Prism.Regions;
  11. using Prism.Services.Dialogs;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Diagnostics;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using System.Windows;
  19. using System.Windows.Controls;
  20. using PDF_Office.Model;
  21. namespace PDF_Office.ViewModels
  22. {
  23. public class MainContentViewModel : BindableBase, INavigationAware
  24. {
  25. private string fileName = "Home";
  26. public string FileName
  27. {
  28. get { return fileName; }
  29. set { SetProperty(ref fileName, value); }
  30. }
  31. private string filePath;
  32. public string FilePath
  33. {
  34. get { return filePath; }
  35. set
  36. {
  37. SetProperty(ref filePath, value);
  38. if (!string.IsNullOrEmpty(filePath))
  39. {
  40. FileName = System.IO.Path.GetFileName(filePath);
  41. }
  42. }
  43. }
  44. private Visibility fileChanged;
  45. public Visibility FileChanged
  46. {
  47. get { return fileChanged; }
  48. set { SetProperty(ref fileChanged, value); }
  49. }
  50. private Visibility isLoading = Visibility.Collapsed;
  51. public Visibility IsLoading
  52. {
  53. get { return isLoading; }
  54. set
  55. {
  56. SetProperty(ref isLoading, value);
  57. }
  58. }
  59. public CPDFViewer PDFViewer { get; set; }
  60. public DelegateCommand<object> CloseTab { get; set; }
  61. public DelegateCommand<object> Loaded { get; set; }
  62. private string regionName;
  63. public string MainContentRegionName
  64. {
  65. get { return regionName; }
  66. set { SetProperty(ref regionName, value); }
  67. }
  68. public IRegionManager toolregion;
  69. public IEventAggregator eventer;
  70. public IContainerProvider container;
  71. public IDialogService dialogs;
  72. public MainContentViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, IContainerProvider containerProvider,IDialogService dialogService)
  73. {
  74. toolregion = regionManager;
  75. eventer = eventAggregator;
  76. container = containerProvider;
  77. dialogs = dialogService;
  78. CloseTab = new DelegateCommand<object>(CloseTabItem);
  79. MainContentRegionName = Guid.NewGuid().ToString();
  80. System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
  81. {
  82. NavigationParameters parameters = new NavigationParameters
  83. {
  84. {
  85. "MainViewModel", this
  86. }
  87. };
  88. if (toolregion.Regions.ContainsRegionWithName(MainContentRegionName))
  89. toolregion.RequestNavigate(MainContentRegionName, "HomeContent", parameters);
  90. }));
  91. }
  92. private void CloseTabItem(object item)
  93. {
  94. App.mainWindowViewModel?.CloseTabItem(item);
  95. App.OpenedFileList.Remove(FilePath);
  96. }
  97. public void OpenFile(string filePath)
  98. {
  99. var result = LoadFileFormPath(filePath);
  100. if (!result)
  101. {
  102. IsLoading = Visibility.Collapsed;
  103. return;
  104. }
  105. FilePath = filePath;
  106. NavigationParameters parameters = new NavigationParameters {
  107. { ParameterNames.MainViewModel, this },
  108. { ParameterNames.PDFViewer,PDFViewer}
  109. };
  110. System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
  111. {
  112. if (toolregion.Regions.ContainsRegionWithName(MainContentRegionName))
  113. toolregion.RequestNavigate(MainContentRegionName, "ViewContent", parameters);
  114. }));
  115. }
  116. /// <summary>
  117. /// 从文件路径创建PDFViewer对象,已包含文档解密逻辑
  118. /// </summary>
  119. /// <param name="path"></param>
  120. /// <returns></returns>
  121. private bool LoadFileFormPath(string path)
  122. {
  123. PDFViewer = new CPDFViewer();
  124. PDFViewer.InitDocument(path);
  125. if (PDFViewer.Document == null)
  126. {
  127. //MessageBoxEx.Show(App.MainPageLoader.GetString("Main_OpenFileFailedWarning"));
  128. return false;
  129. }
  130. else
  131. {
  132. if (PDFViewer.Document.IsLocked)
  133. {
  134. DialogParameters value = new DialogParameters();
  135. value.Add(ParameterNames.PDFDocument,PDFViewer.Document);
  136. dialogs.ShowDialog(DialogNames.VerifyPassWordDialog,value,e=> {
  137. if(e.Result== ButtonResult.OK)
  138. {
  139. if(e.Parameters.ContainsKey(ParameterNames.PassWord)&&e.Parameters.GetValue<string>(ParameterNames.PassWord) !=null)
  140. {
  141. PDFViewer.Tag = e.Parameters.GetValue<string>(ParameterNames.PassWord).ToString();
  142. }
  143. }
  144. });
  145. if (PDFViewer.Document.IsLocked)
  146. {
  147. //未成功解密文档时,释放Document对象,返回
  148. PDFViewer.Document.Release();
  149. return false;
  150. }
  151. }
  152. }
  153. PDFViewer.Load();
  154. if (App.mainWindowViewModel != null)
  155. {
  156. App.mainWindowViewModel.CurrentPDFViewer = PDFViewer;
  157. }
  158. App.OpenedFileList.Add(path);
  159. return true;
  160. }
  161. public void OnNavigatedTo(NavigationContext navigationContext)
  162. {
  163. if (navigationContext.Parameters.Count <= 0)
  164. return;
  165. var filepath = navigationContext.Parameters[ParameterNames.FilePath];
  166. if (filepath != null)
  167. {
  168. OpenFile(filepath.ToString());
  169. }
  170. }
  171. public bool IsNavigationTarget(NavigationContext navigationContext)
  172. {
  173. return false;
  174. }
  175. public void OnNavigatedFrom(NavigationContext navigationContext)
  176. {
  177. }
  178. }
  179. }