PDFToolsContent.xaml.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. using PDF_Office.CustomControl;
  2. using PDF_Office.Helper;
  3. using PDF_Office.Model.PDFTool;
  4. using PDF_Office.ViewModels.HomePanel;
  5. using PDFSettings;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows;
  13. using System.Windows.Controls;
  14. using System.Windows.Data;
  15. using System.Windows.Documents;
  16. using System.Windows.Input;
  17. using System.Windows.Media;
  18. using System.Windows.Media.Animation;
  19. using System.Windows.Media.Imaging;
  20. using System.Windows.Navigation;
  21. using System.Windows.Shapes;
  22. namespace PDF_Office.Views.HomePanel.PDFTools
  23. {
  24. /// <summary>
  25. /// ToolbarPage.xaml 的交互逻辑
  26. /// </summary>
  27. public partial class PDFToolsContent : UserControl
  28. {
  29. private ListItemQuickTool sourceListItem = null;
  30. private ListItemQuickTool targetListItem = null;
  31. private ListItemQuickTool quickSourceListItem = null;
  32. private List<ToolItem> quickTools = null;
  33. private List<ToolItem> allTools = null;
  34. private List<ToolItem> moreTools = null;
  35. PDFToolsHelper PDFtools;
  36. private string fileName = string.Empty;
  37. private BitmapSource bitmapSource = null;
  38. private bool isMoreCuts = false;
  39. private bool isMove = false;
  40. private Point wrpnlPoint;
  41. private Point mousePoint;
  42. public PDFToolsContent()
  43. {
  44. InitializeComponent();
  45. PDFtools = PDFToolsHelper.GetInstance();
  46. #region ListBox
  47. SetListBox();
  48. #endregion ListBox
  49. }
  50. /// <summary>
  51. /// 获取与窗口相对的鼠标位置。
  52. /// </summary>
  53. /// <param name="sender"></param>
  54. /// <param name="e"></param>
  55. private void OnRendering(object sender, EventArgs e)
  56. {
  57. mousePoint = Mouse.GetPosition(this);
  58. Console.WriteLine($"鼠标坐标:{mousePoint.X}:{mousePoint.Y}");
  59. }
  60. private void SetListBox()
  61. {
  62. quickTools = PDFtools.QuickTools;
  63. allTools = PDFtools.AllTools;
  64. moreTools = PDFtools.MoreTools;
  65. ListShortCuts.ItemsSource = quickTools;
  66. ListMoreCuts.ItemsSource = moreTools;
  67. }
  68. private void Page_Loaded(object sender, RoutedEventArgs e)
  69. {
  70. UpdateExptend();
  71. }
  72. private void ListBoxMoreCuts_PreviewMouseMove(object sender, MouseEventArgs e)
  73. {
  74. var pos = e.GetPosition(ListMoreCuts);
  75. if (e.LeftButton == MouseButtonState.Pressed)
  76. {
  77. ListMoreCuts.AllowDrop = true;
  78. HitTestResult result = VisualTreeHelper.HitTest(ListMoreCuts, pos);
  79. if (result == null)
  80. {
  81. sourceImage.Visibility = Visibility.Hidden;
  82. return;
  83. }
  84. sourceListItem = (ListItemQuickTool)CommonHelper.FindVisualParent<ListBoxItem>(result.VisualHit);
  85. if (sourceListItem == null || sourceListItem.Content != ListMoreCuts.SelectedItem)
  86. {
  87. return;
  88. }
  89. //获取控件相对于另一控件的坐标
  90. wrpnlPoint = sourceListItem.TranslatePoint(new Point(), this);
  91. System.Windows.DataObject dataObj = new System.Windows.DataObject(sourceListItem.Content as ToolItem);
  92. if (dataObj != null)
  93. {
  94. //控件截图
  95. IsMoreToolbars();
  96. if (string.IsNullOrEmpty(fileName))
  97. {
  98. sourceImage.Visibility = Visibility.Hidden;
  99. return;
  100. }
  101. //图片解码
  102. ImageDecoding();
  103. isMoreCuts = true;
  104. DragDrop.DoDragDrop(ListMoreCuts, dataObj, System.Windows.DragDropEffects.Move);
  105. }
  106. }
  107. else
  108. {
  109. moveImage.Visibility = Visibility.Hidden;
  110. sourceImage.Visibility = Visibility.Hidden;
  111. }
  112. }
  113. private void ImageDecoding()
  114. {
  115. Stream imageStreamSource = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
  116. PngBitmapDecoder decoder = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
  117. bitmapSource = decoder.Frames[0];
  118. }
  119. private void IsMoreToolbars()
  120. {
  121. var source = sourceListItem.Content as ToolItem;
  122. if (moreTools == null && moreTools.Count != 0) return;
  123. List<ToolItem> toolModule = moreTools.FindAll(item => item.Title == source.Title);
  124. if (toolModule.Count > 0)
  125. {
  126. // 判断文件夹是否存在,不存在则创建
  127. DirectoryInfo folder = new DirectoryInfo(System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Asource"));
  128. if (!folder.Exists)
  129. {
  130. folder.Create();
  131. }
  132. fileName = System.IO.Path.Combine(folder.FullName, $"{source.Title}.png");
  133. SaveToPng(sourceListItem, fileName);
  134. }
  135. }
  136. private void ListBoxShortCuts_Drop(object sender, DragEventArgs e)
  137. {
  138. var pos = e.GetPosition(ListShortCuts);
  139. var result = VisualTreeHelper.HitTest(ListShortCuts, pos);
  140. if (result == null)
  141. {
  142. WorkingWithAnimation(pos);
  143. return;
  144. }
  145. //查找目标数据
  146. targetListItem = (ListItemQuickTool)CommonHelper.FindVisualParent<ListBoxItem>(result.VisualHit);
  147. if (targetListItem == null)
  148. {
  149. WorkingWithAnimation(pos);
  150. return;
  151. }
  152. var targetAToolModule = targetListItem.Content as ToolItem;
  153. ToolItem target = quickTools.Find(c => c.Title == targetAToolModule.Title);
  154. //查找元数据
  155. var sourceAToolModule = e.Data.GetData(typeof(ToolItem)) as ToolItem;
  156. if (sourceAToolModule == null)
  157. {
  158. sourceImage.Visibility = Visibility.Hidden;
  159. // target.SetValue(AToolModule.IsFilePickedProperty, false);
  160. return;
  161. }
  162. if (ReferenceEquals(targetAToolModule, sourceAToolModule))
  163. {
  164. sourceImage.Visibility = Visibility.Hidden;
  165. // target.SetValue(AToolModule.IsFilePickedProperty, false);
  166. return;
  167. }
  168. if (targetAToolModule == null && sourceAToolModule == null)
  169. {
  170. sourceImage.Visibility = Visibility.Hidden;
  171. // target.SetValue(AToolModule.IsFilePickedProperty, false);
  172. return;
  173. }
  174. ModuleExchange(sourceAToolModule, targetAToolModule);
  175. }
  176. private void ModuleExchange(ToolItem sourceAToolModule, ToolItem targetAToolModule)
  177. {
  178. if (moreTools == null) return;
  179. ToolItem source = moreTools.Find(c => c.Title == sourceAToolModule.Title);
  180. int targetIndex = quickTools.FindIndex(item => item.Title == targetAToolModule.Title);
  181. if (targetIndex < 0) return;
  182. if (!isMoreCuts)
  183. {
  184. ListMoreCuts.AllowDrop = false;
  185. sourceImage.Visibility = Visibility.Hidden;
  186. source = quickTools.Find(c => c.Title == sourceAToolModule.Title);
  187. if (source == null) return;
  188. int sourceIndex = quickTools.FindIndex(item => item.Title == sourceAToolModule.Title);
  189. if (sourceIndex < 0) return;
  190. var temp = quickTools[sourceIndex];
  191. quickTools[sourceIndex] = quickTools[targetIndex];
  192. quickTools[targetIndex] = temp;
  193. ListShortCuts.Items.Refresh();
  194. ListBoxCutsWidthChanged(ListShortCuts);
  195. }
  196. else
  197. {
  198. if (target == null) return;
  199. if (source == null) return;
  200. moreTools.Remove(source);
  201. moreTools.Insert(0, target);
  202. quickTools.Remove(target);
  203. quickTools.Insert(targetIndex, source);
  204. ListMoreCuts.Items.Refresh();
  205. ListShortCuts.Items.Refresh();
  206. sourceImage.Visibility = Visibility.Hidden;
  207. targetListItem.IsOverModular = false;
  208. ListBoxCutsWidthChanged(ListShortCuts);
  209. ListBoxCutsWidthChanged(ListMoreCuts);
  210. }
  211. }
  212. private void WorkingWithAnimation(Point pos)
  213. {
  214. sourceImage.Visibility = Visibility.Hidden;
  215. if (!isMoreCuts || !isMove)
  216. {
  217. moveImage.Visibility = Visibility.Hidden;
  218. }
  219. else
  220. {
  221. if (sourceListItem == null) return;
  222. moveImage.Visibility = Visibility.Visible;
  223. Point point = sourceListItem.TransformToAncestor(this).Transform(new Point(0, 0));
  224. ImageMoveTo(new Point(pos.X - 80, pos.Y), new Point(wrpnlPoint.X + 40, wrpnlPoint.Y), moveImage, 200);
  225. }
  226. }
  227. /// <summary>
  228. /// 图片移动动画
  229. /// </summary>
  230. /// <param name="curPoint">初始位置</param>
  231. /// <param name="deskPoint">控件要移动到的位置</param>
  232. /// <param name="ell">你要移动的空间</param>
  233. /// <param name="space">设置移动的时间片(关系到控件移动的速度)</param>
  234. private void ImageMoveTo(Point curPoint, Point deskPoint, Image ell, double space)
  235. {
  236. Storyboard storyboard = new Storyboard(); //创建Storyboard对象
  237. double lxspeed = space, lyspeed = space; //设置X方向 / Y方向 移动时间片
  238. //创建X轴方向动画
  239. DoubleAnimation dox = new DoubleAnimation(
  240. curPoint.X,
  241. deskPoint.X,
  242. new Duration(TimeSpan.FromMilliseconds(lxspeed))
  243. );
  244. //创建Y轴方向动画
  245. DoubleAnimation doy = new DoubleAnimation(
  246. curPoint.Y,
  247. deskPoint.Y,
  248. new Duration(TimeSpan.FromMilliseconds(lyspeed))
  249. );
  250. Storyboard.SetTarget(dox, ell);
  251. Storyboard.SetTarget(doy, ell);
  252. Storyboard.SetTargetProperty(dox, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)"));
  253. Storyboard.SetTargetProperty(doy, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)"));
  254. storyboard.Children.Add(dox);
  255. storyboard.Children.Add(doy);
  256. storyboard.Completed += Storyboard_Completed;
  257. //动画播放
  258. storyboard.Begin();
  259. }
  260. private void Storyboard_Completed(object sender, EventArgs e)
  261. {
  262. moveImage.Visibility = Visibility.Hidden;
  263. }
  264. /// <summary>
  265. /// 控件截图
  266. /// </summary>
  267. /// <param name="visual">控件</param>
  268. /// <param name="fileName">文件路径 C:\Users\oyxh\AppData\Local\Temp\</param>
  269. private void SaveToPng(FrameworkElement visual, string fileName)
  270. {
  271. DrawingVisual drawingVisual = new DrawingVisual();
  272. using (DrawingContext context = drawingVisual.RenderOpen())
  273. {
  274. VisualBrush brush = new VisualBrush(sourceListItem) { Stretch = Stretch.None };
  275. context.DrawRectangle(brush, null, new Rect(0, 0, sourceListItem.ActualWidth, sourceListItem.ActualHeight));
  276. context.Close();
  277. }
  278. RenderTargetBitmap targetBitmap = new RenderTargetBitmap((int)sourceListItem.ActualWidth, (int)sourceListItem.ActualHeight, 96d, 96d, PixelFormats.Default);
  279. targetBitmap.Render(drawingVisual);
  280. FileStream stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
  281. PngBitmapEncoder encoder = new PngBitmapEncoder();
  282. encoder.Interlace = PngInterlaceOption.On;
  283. encoder.Frames.Add(BitmapFrame.Create(targetBitmap));
  284. encoder.Save(stream);
  285. stream.Close();
  286. }
  287. private ToolItem target;
  288. private void ListBoxShortCuts_DragOver(object sender, DragEventArgs e)
  289. {
  290. var pos = e.GetPosition(ListShortCuts);
  291. Console.WriteLine($"pos:{pos.X} {pos.Y} this.Grid.ActualHeight1 {this.Grid.ActualHeight}");
  292. if (pos.Y < 0)
  293. {
  294. isMove = false;
  295. sourceImage.Visibility = Visibility.Hidden;
  296. sourceListItem = null;
  297. return;
  298. }
  299. if (pos.Y >= this.Grid.ActualHeight - 50)
  300. {
  301. isMove = false;
  302. sourceImage.Visibility = Visibility.Hidden;
  303. sourceListItem = null;
  304. return;
  305. }
  306. if (pos.X < 10)
  307. {
  308. isMove = false;
  309. sourceListItem = null;
  310. sourceImage.Visibility = Visibility.Hidden;
  311. return;
  312. }
  313. if (pos.X >= this.Grid.ActualWidth - 10)
  314. {
  315. isMove = false;
  316. sourceListItem = null;
  317. sourceImage.Visibility = Visibility.Hidden;
  318. return;
  319. }
  320. if (!isMoreCuts)
  321. {
  322. var sourceAToolModule = e.Data.GetData(typeof(ToolItem)) as ToolItem;
  323. if (sourceAToolModule == null) return;
  324. int sourceIndex = quickTools.FindIndex(item => item.Title == sourceAToolModule.Title);
  325. //根据index找listbox对应的item
  326. sourceListItem = (ListItemQuickTool)(ListShortCuts.ItemContainerGenerator.ContainerFromIndex(sourceIndex) as FrameworkElement);
  327. if (sourceListItem == null)
  328. {
  329. return;
  330. }
  331. ListMoreCuts.AllowDrop = false;
  332. sourceImage.Visibility = Visibility.Hidden;
  333. }
  334. else
  335. {
  336. var sourceAToolModule = e.Data.GetData(typeof(ToolItem)) as ToolItem;
  337. if (sourceAToolModule == null) return;
  338. int sourceIndex = moreTools.FindIndex(item => item.Title == sourceAToolModule.Title);
  339. //根据index找listbox对应的item
  340. sourceListItem = (ListItemQuickTool)(ListMoreCuts.ItemContainerGenerator.ContainerFromIndex(sourceIndex) as FrameworkElement);
  341. if (sourceListItem == null)
  342. {
  343. return;
  344. }
  345. isMove = true;
  346. //图片绑定
  347. ImageBinding(pos);
  348. }
  349. var result = VisualTreeHelper.HitTest(ListShortCuts, pos);
  350. if (result == null)
  351. {
  352. return;
  353. }
  354. //查找目标数据
  355. targetListItem = (ListItemQuickTool)CommonHelper.FindVisualParent<ListBoxItem>(result.VisualHit);
  356. if (targetListItem == null)
  357. {
  358. //sourceImage.Visibility = Visibility.Hidden;
  359. return;
  360. }
  361. var targetAToolModule = targetListItem.Content as ToolItem;
  362. if (targetAToolModule == null) return;
  363. target = quickTools.Find(c => c.Title == targetAToolModule.Title);
  364. }
  365. /// <summary>
  366. ///图片绑定
  367. /// </summary>
  368. private void ImageBinding(System.Windows.Point pos)
  369. {
  370. sourceImage.Visibility = Visibility.Visible;
  371. sourceImage.Source = bitmapSource;
  372. sourceImage.Margin = new Thickness(pos.X - 80, pos.Y, 0, 0);
  373. moveImage.Source = sourceImage.Source;
  374. }
  375. private void ListBoxShortCuts_PreviewMouseMove(object sender, MouseEventArgs e)
  376. {
  377. if (e.LeftButton == MouseButtonState.Pressed)
  378. {
  379. ListMoreCuts.AllowDrop = false;
  380. var pos = e.GetPosition(ListShortCuts);
  381. HitTestResult result = VisualTreeHelper.HitTest(ListShortCuts, pos);
  382. if (result == null)
  383. {
  384. return;
  385. }
  386. quickSourceListItem = (ListItemQuickTool)CommonHelper.FindVisualParent<ListBoxItem>(result.VisualHit);
  387. if (quickSourceListItem == null || quickSourceListItem.Content != ListShortCuts.SelectedItem)
  388. {
  389. return;
  390. }
  391. System.Windows.DataObject dataObj = new System.Windows.DataObject(quickSourceListItem.Content as ToolItem);
  392. if (dataObj != null)
  393. {
  394. isMoreCuts = false;
  395. DragDrop.DoDragDrop(ListShortCuts, dataObj, System.Windows.DragDropEffects.Move);
  396. }
  397. }
  398. else
  399. {
  400. sourceImage.Visibility = Visibility.Hidden;
  401. //moveImage.Visibility = Visibility.Hidden;
  402. }
  403. }
  404. private void sourceImage_Drop(object sender, DragEventArgs e)
  405. {
  406. ListBoxShortCuts_Drop(sender, e);
  407. }
  408. private void sourceImage_PreviewMouseMove(object sender, MouseEventArgs e)
  409. {
  410. ListBoxMoreCuts_PreviewMouseMove(sender, e);
  411. }
  412. private void sourceImage_DragOver(object sender, DragEventArgs e)
  413. {
  414. ListBoxShortCuts_DragOver(sender, e);
  415. }
  416. private void Label_PreviewMouseMove(object sender, MouseEventArgs e)
  417. {
  418. ListBoxMoreCuts_PreviewMouseMove(sender, e);
  419. }
  420. private void ListBoxMoreCuts_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  421. {
  422. //获取当前控件元素相对鼠标点击的位置(只有点击在当前A控件,会触发事件并返回相对A控件的鼠标位置)。
  423. Point pp = Mouse.GetPosition(e.Source as FrameworkElement);//WPF方法
  424. sourceImage.Visibility = Visibility.Hidden;
  425. if (pp.X < 0 || pp.Y < 0)
  426. {
  427. moveImage.Visibility = Visibility.Hidden;
  428. }
  429. }
  430. private void ListBoxShortCuts_SizeChanged(object sender, SizeChangedEventArgs e)
  431. {
  432. ListBoxCutsWidthChanged(ListShortCuts);
  433. }
  434. private void ListBoxMoreCuts_SizeChanged(object sender, SizeChangedEventArgs e)
  435. {
  436. ListBoxCutsWidthChanged(ListMoreCuts);
  437. }
  438. private void ListBoxCutsWidthChanged(ListBoxEx list)
  439. {
  440. //3x + 4y = containerWidth;
  441. //3x = y;
  442. //x为间距,y为item;
  443. double containerWidth = list.ActualWidth - 20;
  444. int widthItem = (int)containerWidth / 5;
  445. double margin = widthItem / 3;
  446. int i = 0;
  447. foreach (var item in list.Items)
  448. {
  449. i++;
  450. var listBoxItem = list.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
  451. if (listBoxItem != null)
  452. {
  453. if (i % 4 != 0)
  454. {
  455. listBoxItem.Margin = new Thickness(0, 0, margin, 0);
  456. }
  457. else
  458. {
  459. listBoxItem.Margin = new Thickness(0, 0, 0, 0);
  460. }
  461. listBoxItem.Width = widthItem;
  462. }
  463. }
  464. }
  465. private void BtnTools_Click(object sender, RoutedEventArgs e)
  466. {
  467. }
  468. private void BtnExptend_Click(object sender, RoutedEventArgs e)
  469. {
  470. UpdateExptend();
  471. }
  472. private void UpdateExptend()
  473. {
  474. foreach (var item in allTools)
  475. {
  476. item.IsShowConciseContent = !(bool)BtnExptend.IsChecked;
  477. }
  478. foreach (var item in quickTools)
  479. {
  480. item.IsShowConciseContent = !(bool)BtnExptend.IsChecked;
  481. }
  482. }
  483. //自适应流式布局,以防改需求备用
  484. //private void ListBoxMoreCutsWidthChanged()
  485. //{
  486. // double containerWidth = ListBoxShortCuts.ActualWidth;
  487. // int Rowcount = (int)containerWidth / 240;
  488. // double EndRow = containerWidth % 240.0;
  489. // Rowcount = EndRow >= 140 ? ++Rowcount : Rowcount;
  490. // int i = 0;
  491. // foreach (var item in ListBoxMoreCuts.Items)
  492. // {
  493. // i++;
  494. // var listBoxItem = ListBoxMoreCuts.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
  495. // if (listBoxItem != null)
  496. // {
  497. // if (i % Rowcount != 0)
  498. // {
  499. // listBoxItem.Margin = new Thickness(0, 0, 100, 0);
  500. // }
  501. // else
  502. // {
  503. // listBoxItem.Margin = new Thickness(0, 0, 0, 0);
  504. // }
  505. // }
  506. // }
  507. //}
  508. ///// <summary>
  509. ///// 扩展收缩UI
  510. ///// </summary>
  511. ///// <param name="IsShowConciseContent">是否收缩</param>
  512. //private void ShowToolsUI(ListBoxEx list,bool IsShowConciseContent)
  513. //{
  514. // foreach (var item in list.Items)
  515. // {
  516. // var listBoxItem = list.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
  517. // if (listBoxItem != null)
  518. // {
  519. // var viewItem = listBoxItem.ContentTemplate;
  520. // var myContentPresenter = CommonHelper.FindVisualChild<ContentPresenter>(listBoxItem);
  521. // var obj = viewItem.FindName("data", myContentPresenter);
  522. // var checkNum = obj as PDFToolItem;
  523. // if (checkNum != null)
  524. // {
  525. // checkNum.IsShowConciseContent = IsShowConciseContent;
  526. // }
  527. // }
  528. // }
  529. //}
  530. }
  531. }