using PDF_Office.CustomControl; using PDF_Office.Helper; using PDF_Office.Model.PDFTool; using PDF_Office.ViewModels.HomePanel; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace PDF_Office.Views.HomePanel.PDFTools { /// /// ToolbarPage.xaml 的交互逻辑 /// public partial class PDFToolsContent : UserControl { private ListItemQuickTool sourceListItem = null; private ListItemQuickTool targetListItem = null; private ListItemQuickTool quickSourceListItem = null; private List quickTools = null; private List allTools = null; private List moreTools = null; private string fileName = string.Empty; private BitmapSource bitmapSource = null; private bool isMoreCuts = false; private bool isMove = false; private Point wrpnlPoint; private Point mousePoint; public PDFToolsContent() { InitializeComponent(); quickTools = new List(); allTools = new List(); #region ListBox SetListBox(); #endregion ListBox } /// /// 获取与窗口相对的鼠标位置。 /// /// /// private void OnRendering(object sender, EventArgs e) { mousePoint = Mouse.GetPosition(this); Console.WriteLine($"鼠标坐标:{mousePoint.X}:{mousePoint.Y}"); } private void SetListBox() { string path = @"pack://application:,,,/Resources/PromotionIcon/Windows.png"; List all = new List() { "PDF转Word", "PDF转Excel", "PDF转PPT", "转档PDF", "OCR", "拆分", "提取","合并","压缩","图片转PDF","安全", "水印", "页眉页脚","贝茨Bates码","批量处理","打印", "背景","插入","文件对比"}; for (int i = 0; i < all.Count; i++) { ToolItem aToolModule = new ToolItem(); aToolModule.Id = i + 1; aToolModule.Name = all[i]; aToolModule.Image = path; allTools.Add(aToolModule); } //取前10个,如果List里面数据少于5个,则返回所有的 quickTools = allTools.Take(8).ToList(); ListShortCuts.ItemsSource = quickTools; //对比两个集合,取差值 moreTools = allTools.Except(quickTools).ToList(); ListMoreCuts.ItemsSource = moreTools; } private void Page_Loaded(object sender, RoutedEventArgs e) { } private void ListBoxMoreCuts_PreviewMouseMove(object sender, MouseEventArgs e) { var pos = e.GetPosition(ListMoreCuts); if (e.LeftButton == MouseButtonState.Pressed) { ListMoreCuts.AllowDrop = true; HitTestResult result = VisualTreeHelper.HitTest(ListMoreCuts, pos); if (result == null) { sourceImage.Visibility = Visibility.Hidden; return; } sourceListItem = (ListItemQuickTool)CommonHelper.FindVisualParent(result.VisualHit); if (sourceListItem == null || sourceListItem.Content != ListMoreCuts.SelectedItem) { return; } //获取控件相对于另一控件的坐标 wrpnlPoint = sourceListItem.TranslatePoint(new Point(), this); System.Windows.DataObject dataObj = new System.Windows.DataObject(sourceListItem.Content as ToolItem); if (dataObj != null) { //控件截图 IsMoreToolbars(); if (string.IsNullOrEmpty(fileName)) { sourceImage.Visibility = Visibility.Hidden; return; } //图片解码 ImageDecoding(); isMoreCuts = true; DragDrop.DoDragDrop(ListMoreCuts, dataObj, System.Windows.DragDropEffects.Move); } } else { moveImage.Visibility = Visibility.Hidden; sourceImage.Visibility = Visibility.Hidden; } } private void ImageDecoding() { Stream imageStreamSource = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); PngBitmapDecoder decoder = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); bitmapSource = decoder.Frames[0]; } private void IsMoreToolbars() { var source = sourceListItem.Content as ToolItem; if (moreTools == null && moreTools.Count != 0) return; List toolModule = moreTools.FindAll(item => item.Name == source.Name); if (toolModule.Count > 0) { // 判断文件夹是否存在,不存在则创建 DirectoryInfo folder = new DirectoryInfo(System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Asource")); if (!folder.Exists) { folder.Create(); } fileName = System.IO.Path.Combine(folder.FullName, $"{source.Name}.png"); SaveToPng(sourceListItem, fileName); } } private void ListBoxShortCuts_Drop(object sender, DragEventArgs e) { var pos = e.GetPosition(ListShortCuts); var result = VisualTreeHelper.HitTest(ListShortCuts, pos); if (result == null) { WorkingWithAnimation(pos); return; } //查找目标数据 targetListItem = (ListItemQuickTool)CommonHelper.FindVisualParent(result.VisualHit); if (targetListItem == null) { WorkingWithAnimation(pos); return; } var targetAToolModule = targetListItem.Content as ToolItem; ToolItem target = quickTools.Find(c => c.Name == targetAToolModule.Name); //查找元数据 var sourceAToolModule = e.Data.GetData(typeof(ToolItem)) as ToolItem; if (sourceAToolModule == null) { sourceImage.Visibility = Visibility.Hidden; // target.SetValue(AToolModule.IsFilePickedProperty, false); return; } if (ReferenceEquals(targetAToolModule, sourceAToolModule)) { sourceImage.Visibility = Visibility.Hidden; // target.SetValue(AToolModule.IsFilePickedProperty, false); return; } if (targetAToolModule == null && sourceAToolModule == null) { sourceImage.Visibility = Visibility.Hidden; // target.SetValue(AToolModule.IsFilePickedProperty, false); return; } ModuleExchange(sourceAToolModule, targetAToolModule); } private void ModuleExchange(ToolItem sourceAToolModule, ToolItem targetAToolModule) { if (moreTools == null) return; ToolItem source = moreTools.Find(c => c.Name == sourceAToolModule.Name); int targetIndex = quickTools.FindIndex(item => item.Name == targetAToolModule.Name); if (targetIndex < 0) return; if (!isMoreCuts) { ListMoreCuts.AllowDrop = false; sourceImage.Visibility = Visibility.Hidden; source = quickTools.Find(c => c.Name == sourceAToolModule.Name); if (source == null) return; int sourceIndex = quickTools.FindIndex(item => item.Name == sourceAToolModule.Name); if (sourceIndex < 0) return; var temp = quickTools[sourceIndex]; quickTools[sourceIndex] = quickTools[targetIndex]; quickTools[targetIndex] = temp; ListShortCuts.Items.Refresh(); ListBoxCutsWidthChanged(ListShortCuts); } else { if (target == null) return; if (source == null) return; moreTools.Remove(source); moreTools.Insert(0, target); quickTools.Remove(target); quickTools.Insert(targetIndex, source); ListMoreCuts.Items.Refresh(); ListShortCuts.Items.Refresh(); sourceImage.Visibility = Visibility.Hidden; targetListItem.IsOverModular = false; ListBoxCutsWidthChanged(ListShortCuts); ListBoxCutsWidthChanged(ListMoreCuts); } } private void WorkingWithAnimation(Point pos) { sourceImage.Visibility = Visibility.Hidden; if (!isMoreCuts || !isMove) { moveImage.Visibility = Visibility.Hidden; } else { if (sourceListItem == null) return; moveImage.Visibility = Visibility.Visible; Point point = sourceListItem.TransformToAncestor(this).Transform(new Point(0, 0)); ImageMoveTo(new Point(pos.X - 80, pos.Y), new Point(wrpnlPoint.X + 40, wrpnlPoint.Y), moveImage, 200); } } /// /// 图片移动动画 /// /// 初始位置 /// 控件要移动到的位置 /// 你要移动的空间 /// 设置移动的时间片(关系到控件移动的速度) private void ImageMoveTo(Point curPoint, Point deskPoint, Image ell, double space) { Storyboard storyboard = new Storyboard(); //创建Storyboard对象 double lxspeed = space, lyspeed = space; //设置X方向 / Y方向 移动时间片 //创建X轴方向动画 DoubleAnimation dox = new DoubleAnimation( curPoint.X, deskPoint.X, new Duration(TimeSpan.FromMilliseconds(lxspeed)) ); //创建Y轴方向动画 DoubleAnimation doy = new DoubleAnimation( curPoint.Y, deskPoint.Y, new Duration(TimeSpan.FromMilliseconds(lyspeed)) ); Storyboard.SetTarget(dox, ell); Storyboard.SetTarget(doy, ell); Storyboard.SetTargetProperty(dox, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)")); Storyboard.SetTargetProperty(doy, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)")); storyboard.Children.Add(dox); storyboard.Children.Add(doy); storyboard.Completed += Storyboard_Completed; //动画播放 storyboard.Begin(); } private void Storyboard_Completed(object sender, EventArgs e) { moveImage.Visibility = Visibility.Hidden; } /// /// 控件截图 /// /// 控件 /// 文件路径 C:\Users\oyxh\AppData\Local\Temp\ private void SaveToPng(FrameworkElement visual, string fileName) { DrawingVisual drawingVisual = new DrawingVisual(); using (DrawingContext context = drawingVisual.RenderOpen()) { VisualBrush brush = new VisualBrush(sourceListItem) { Stretch = Stretch.None }; context.DrawRectangle(brush, null, new Rect(0, 0, sourceListItem.ActualWidth, sourceListItem.ActualHeight)); context.Close(); } RenderTargetBitmap targetBitmap = new RenderTargetBitmap((int)sourceListItem.ActualWidth, (int)sourceListItem.ActualHeight, 96d, 96d, PixelFormats.Default); targetBitmap.Render(drawingVisual); FileStream stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Interlace = PngInterlaceOption.On; encoder.Frames.Add(BitmapFrame.Create(targetBitmap)); encoder.Save(stream); stream.Close(); } private ToolItem target; private void ListBoxShortCuts_DragOver(object sender, DragEventArgs e) { var pos = e.GetPosition(ListShortCuts); Console.WriteLine($"pos:{pos.X} {pos.Y} this.Grid.ActualHeight1 {this.Grid.ActualHeight}"); if (pos.Y < 0) { isMove = false; sourceImage.Visibility = Visibility.Hidden; sourceListItem = null; return; } if (pos.Y >= this.Grid.ActualHeight - 50) { isMove = false; sourceImage.Visibility = Visibility.Hidden; sourceListItem = null; return; } if (pos.X < 10) { isMove = false; sourceListItem = null; sourceImage.Visibility = Visibility.Hidden; return; } if (pos.X >= this.Grid.ActualWidth - 10) { isMove = false; sourceListItem = null; sourceImage.Visibility = Visibility.Hidden; return; } if (!isMoreCuts) { var sourceAToolModule = e.Data.GetData(typeof(ToolItem)) as ToolItem; if (sourceAToolModule == null) return; int sourceIndex = quickTools.FindIndex(item => item.Name == sourceAToolModule.Name); //根据index找listbox对应的item sourceListItem = (ListItemQuickTool)(ListShortCuts.ItemContainerGenerator.ContainerFromIndex(sourceIndex) as FrameworkElement); if (sourceListItem == null) { return; } ListMoreCuts.AllowDrop = false; sourceImage.Visibility = Visibility.Hidden; } else { var sourceAToolModule = e.Data.GetData(typeof(ToolItem)) as ToolItem; if (sourceAToolModule == null) return; int sourceIndex = moreTools.FindIndex(item => item.Name == sourceAToolModule.Name); //根据index找listbox对应的item sourceListItem = (ListItemQuickTool)(ListMoreCuts.ItemContainerGenerator.ContainerFromIndex(sourceIndex) as FrameworkElement); if (sourceListItem == null) { return; } isMove = true; //图片绑定 ImageBinding(pos); } var result = VisualTreeHelper.HitTest(ListShortCuts, pos); if (result == null) { return; } //查找目标数据 targetListItem = (ListItemQuickTool)CommonHelper.FindVisualParent(result.VisualHit); if (targetListItem == null) { //sourceImage.Visibility = Visibility.Hidden; return; } var targetAToolModule = targetListItem.Content as ToolItem; if (targetAToolModule == null) return; target = quickTools.Find(c => c.Name == targetAToolModule.Name); } /// ///图片绑定 /// private void ImageBinding(System.Windows.Point pos) { sourceImage.Visibility = Visibility.Visible; sourceImage.Source = bitmapSource; sourceImage.Margin = new Thickness(pos.X - 80, pos.Y, 0, 0); moveImage.Source = sourceImage.Source; } private void ListBoxShortCuts_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { ListMoreCuts.AllowDrop = false; var pos = e.GetPosition(ListShortCuts); HitTestResult result = VisualTreeHelper.HitTest(ListShortCuts, pos); if (result == null) { return; } quickSourceListItem = (ListItemQuickTool)CommonHelper.FindVisualParent(result.VisualHit); if (quickSourceListItem == null || quickSourceListItem.Content != ListShortCuts.SelectedItem) { return; } System.Windows.DataObject dataObj = new System.Windows.DataObject(quickSourceListItem.Content as ToolItem); if (dataObj != null) { isMoreCuts = false; DragDrop.DoDragDrop(ListShortCuts, dataObj, System.Windows.DragDropEffects.Move); } } else { sourceImage.Visibility = Visibility.Hidden; //moveImage.Visibility = Visibility.Hidden; } } private void sourceImage_Drop(object sender, DragEventArgs e) { ListBoxShortCuts_Drop(sender, e); } private void sourceImage_PreviewMouseMove(object sender, MouseEventArgs e) { ListBoxMoreCuts_PreviewMouseMove(sender, e); } private void sourceImage_DragOver(object sender, DragEventArgs e) { ListBoxShortCuts_DragOver(sender, e); } private void Label_PreviewMouseMove(object sender, MouseEventArgs e) { ListBoxMoreCuts_PreviewMouseMove(sender, e); } private void ListBoxMoreCuts_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { //获取当前控件元素相对鼠标点击的位置(只有点击在当前A控件,会触发事件并返回相对A控件的鼠标位置)。 Point pp = Mouse.GetPosition(e.Source as FrameworkElement);//WPF方法 sourceImage.Visibility = Visibility.Hidden; if (pp.X < 0 || pp.Y < 0) { moveImage.Visibility = Visibility.Hidden; } } /// /// 扩展收缩UI /// /// 是否收缩 private void ShowToolsUI(ListBoxEx list,bool IsShowConciseContent) { foreach (var item in list.Items) { var listBoxItem = list.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem; if (listBoxItem != null) { var viewItem = listBoxItem.ContentTemplate; var myContentPresenter = CommonHelper.FindVisualChild(listBoxItem); var obj = viewItem.FindName("data", myContentPresenter); var checkNum = obj as PDFToolItem; if (checkNum != null) { checkNum.IsShowConciseContent = IsShowConciseContent; } } } } private void ListBoxShortCuts_SizeChanged(object sender, SizeChangedEventArgs e) { ListBoxCutsWidthChanged(ListShortCuts); } private void ListBoxMoreCuts_SizeChanged(object sender, SizeChangedEventArgs e) { ListBoxCutsWidthChanged(ListMoreCuts); } private void ListBoxCutsWidthChanged(ListBoxEx list) { //3x + 4y = containerWidth; //3x = y; //x为间距,y为item; double containerWidth = list.ActualWidth - 20; int widthItem = (int)containerWidth / 5; double margin = widthItem / 3; int i = 0; foreach (var item in list.Items) { i++; var listBoxItem = list.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem; if (listBoxItem != null) { if (i % 4 != 0) { listBoxItem.Margin = new Thickness(0, 0, margin, 0); } else { listBoxItem.Margin = new Thickness(0, 0, 0, 0); } listBoxItem.Width = widthItem; } } } private void BtnTools_Click(object sender, RoutedEventArgs e) { } bool isExtend = false; private void BtnMore_Click(object sender, RoutedEventArgs e) { if(isExtend) { isExtend = false; ShowToolsUI(ListShortCuts, false); ShowToolsUI(ListMoreCuts, false); } else { isExtend = true; ShowToolsUI(ListShortCuts, true); ShowToolsUI(ListMoreCuts, true); } } //自适应流式布局,以防改需求备用 //private void ListBoxMoreCutsWidthChanged() //{ // double containerWidth = ListBoxShortCuts.ActualWidth; // int Rowcount = (int)containerWidth / 240; // double EndRow = containerWidth % 240.0; // Rowcount = EndRow >= 140 ? ++Rowcount : Rowcount; // int i = 0; // foreach (var item in ListBoxMoreCuts.Items) // { // i++; // var listBoxItem = ListBoxMoreCuts.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem; // if (listBoxItem != null) // { // if (i % Rowcount != 0) // { // listBoxItem.Margin = new Thickness(0, 0, 100, 0); // } // else // { // listBoxItem.Margin = new Thickness(0, 0, 0, 0); // } // } // } //} } }