PDFToolsContent.xaml.cs 22 KB

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