Browse Source

页面编辑-替换bug修复、复制粘贴 选中 测试

OYXH\oyxh 1 year ago
parent
commit
06644bcb09

+ 7 - 0
PDF Office/EventAggregators/PageEditSelectedItemEvent.cs

@@ -22,5 +22,12 @@ namespace PDF_Master.EventAggregators
         /// 选中项index
         /// </summary>
         public int SelectedItemIndex { get; set; }
+
+        /// <summary>
+        /// 需要选中的页面范围
+        /// </summary>
+        public List<int> PageRange { get; set; }
+
+        public bool IsSingle { get; set; }
     }
 }

+ 57 - 26
PDF Office/ViewModels/PageEdit/PageEditContentViewModel.cs

@@ -810,12 +810,18 @@ namespace PDF_Master.ViewModels.PageEdit
                 if (isDiscryptied)
                 {
                     //先删除
-                    DoRemoveSelectedPages(indexList);
+                    DoRemoveSelectedPages(indexList, false, true);
 
+                    if (indexList.Count > 0 && indexList.Count == PDFViewer.Document.PageCount)
+                    {
+                        index = 0;
+                    }
                     //再新增,避免索引串号的情况
                     var result = await InsertFromFile(index, fileName, password);
-
-                    ReloadAfterOption(true, false, Tuple.Create(insertIndex - 1, insertIndex + pageCount));
+                    if (result)
+                    {
+                        ReloadAfterOption(true, false, Tuple.Create(insertIndex - 1, insertIndex + pageCount));
+                    }
                 }
 
                 IsLoading = Visibility.Collapsed;
@@ -1213,7 +1219,6 @@ namespace PDF_Master.ViewModels.PageEdit
                     {
                         DoRemoveSelectedPages(new List<int> { pageIndex });
                     }
-                    pageIndex = RightSelectedIndex;
                 }
                 else
                 {
@@ -1973,7 +1978,8 @@ namespace PDF_Master.ViewModels.PageEdit
             //刷新页码等
             ReloadAfterOption(true, false, new Tuple<int, int>(0, PDFViewer.Document.PageCount));
             //通知Xaml选中新增的页面,从VM设置选中项会有问题
-            NotifyUIToRefresh(pageRange);
+            //NotifyUIToRefresh(pageRange);
+            eventor.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, PageRange = pageRange, IsSingle = false });
             IsLoading = Visibility.Collapsed;
             IsAddPages = true;
         }
@@ -2175,7 +2181,7 @@ namespace PDF_Master.ViewModels.PageEdit
         /// 删除选中项的方法 不带Reload操作
         /// 方便其他逻辑中调用
         /// </summary>
-        private int DoRemoveSelectedPages(List<int> pageList = null, bool isFromUndoRedo = false)
+        private int DoRemoveSelectedPages(List<int> pageList = null, bool isFromUndoRedo = false, bool isReplace = false)
         {
             if (!ServiceHelper.IAPBeforeFunction())
             {
@@ -2212,9 +2218,13 @@ namespace PDF_Master.ViewModels.PageEdit
 
             if (indexList.Count > 0 && indexList.Count == PDFViewer.Document.PageCount)
             {
-                AlertsMessage alertsMessage = new AlertsMessage();
-                alertsMessage.ShowDialog("", App.MainPageLoader.GetString("PageEdit_DeleteAllPage"), App.ServiceLoader.GetString("Text_ok"));
-                return -1;
+                // 全部替换 不显示 不能删除所有的弹窗
+                if (isReplace == false)
+                {
+                    AlertsMessage alertsMessage = new AlertsMessage();
+                    alertsMessage.ShowDialog("", App.MainPageLoader.GetString("PageEdit_DeleteAllPage"), App.ServiceLoader.GetString("Text_ok"));
+                    return -1;
+                }
             }
 
             var result = PDFViewer.Document.RemovePages(indexList.ToArray());
@@ -2623,7 +2633,10 @@ namespace PDF_Master.ViewModels.PageEdit
             password = "";
             if (doc == null)
             {
-                ShowToast();
+                //ShowToast();
+                //return false;
+                AlertsMessage alertsMessage = new AlertsMessage();
+                alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Main_OpenFileFailedWarning"), App.ServiceLoader.GetString("Text_ok"));
                 return false;
             }
 
@@ -3368,6 +3381,38 @@ namespace PDF_Master.ViewModels.PageEdit
             return true;
         }
 
+        private void PDFViewer_InfoChanged(object sender, KeyValuePair<string, object> e)
+        {
+            //缩略图 复制粘贴后会选择第一项的问题
+            if (e.Key == "PageNum" && !viewContentViewModel.isInPageEdit)
+            {
+                int index = (e.Value as ComPDFKitViewer.RenderData).PageIndex - 1;
+                if (IsAddPages == false)
+                {
+                }
+                //注释掉 该方法有许多联动,避免联动影响
+                //NotifyUIToRefresh(new List<int> { (e.Value as ComPDFKitViewer.RenderData).PageIndex });
+                eventor.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, SelectedItemIndex = index, IsSingle = true });
+            }
+            //不准确 有时候会触发两次,就无法判断
+            //if (IsAddPages == false)
+            //{
+            //    //缩略图 复制粘贴后会选择第一项的问题
+            //    if (e.Key == "PageNum" && !viewContentViewModel.isInPageEdit)
+            //    {
+            //        int index = (e.Value as ComPDFKitViewer.RenderData).PageIndex - 1;
+            //        //注释掉 该方法有许多联动,避免联动影响
+            //        //NotifyUIToRefresh(new List<int> { (e.Value as ComPDFKitViewer.RenderData).PageIndex });
+            //        eventor.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, SelectedItemIndex = index, IsSingle = true });
+            //    }
+            //}
+            //else
+            //{
+            //    //IsAddPages = false;
+            //    return;
+            //}
+        }
+
         /// <summary>
         /// 从底层库获取对应页面的图片
         /// </summary>
@@ -3485,23 +3530,9 @@ namespace PDF_Master.ViewModels.PageEdit
             }
         }
 
-        private void PDFViewer_InfoChanged(object sender, KeyValuePair<string, object> e)
+        internal void GoToPage(int index)
         {
-            if (IsAddPages == false)
-            {
-                //缩略图 复制粘贴后会选择第一项的问题
-                if (e.Key == "PageNum" && !viewContentViewModel.isInPageEdit)
-                {
-                    //注释掉 该方法有许多联动,避免联动影响
-                    //NotifyUIToRefresh(new List<int> { (e.Value as ComPDFKitViewer.RenderData).PageIndex });
-                    eventor.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, SelectedItemIndex = (e.Value as ComPDFKitViewer.RenderData).PageIndex - 1 });
-                }
-            }
-            else
-            {
-                IsAddPages = false;
-                return;
-            }
+            PDFViewer.GoToPage(index);
         }
 
         #endregion Navigate

+ 50 - 64
PDF Office/ViewModels/ViewContentViewModel.cs

@@ -883,7 +883,7 @@ namespace PDF_Master.ViewModels
             dialogs = dialogService;
             events = eventAggregator;
             unicode = App.mainWindowViewModel.SelectedItem.Unicode;
-            Load = new DelegateCommand(()=> { LoadControl(); });
+            Load = new DelegateCommand(() => { LoadControl(); });
             MouseDown = new DelegateCommand(MouseDownEvent);
             SaveFile = new DelegateCommand(() => { saveFile(); }, CanSaveExcute).ObservesProperty(() => CanSave);
             SaveAsFlattenCommand = new DelegateCommand(saveAsFlatten);
@@ -2020,9 +2020,9 @@ namespace PDF_Master.ViewModels
                     if (PDFViewer != null)
                     {
                         //防止部分情况PDFViewer.CurrentIndex获取异常问题
-                        if (PDFViewer.Document.PageCount > 0) 
-                        { 
-                            events.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, SelectedItemIndex = PDFViewer.CurrentIndex });
+                        if (PDFViewer.Document.PageCount > 0)
+                        {
+                            events.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, SelectedItemIndex = PDFViewer.CurrentIndex, IsSingle = true });
                         }
                     }
 
@@ -2040,7 +2040,7 @@ namespace PDF_Master.ViewModels
                     //    }
                     //}
 
-                    #endregion part1
+                    #endregion 方案一,比较耗时,需要遍历
 
                     break;
 
@@ -2060,7 +2060,7 @@ namespace PDF_Master.ViewModels
                     //缩略图选中页面,要和当前显示的页面,一致
                     if (PDFViewer != null)
                     {
-                        events.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, SelectedItemIndex = PDFViewer.CurrentIndex });
+                        events.GetEvent<PageEditSelectedItemEvent>().Publish(new PageEditSelectedItemEventArgs() { Unicode = unicode, SelectedItemIndex = PDFViewer.CurrentIndex, IsSingle = true });
                     }
                     break;
 
@@ -2758,7 +2758,7 @@ namespace PDF_Master.ViewModels
                 //是否取消了水印保存步骤
                 bool flg = false;
                 //删掉Settings.Default.UserDate.isInFreeUseTime == false,没有试用期策略了
-                if ((!App.IsLogin || Settings.Default.UserDate.subscribestatus != 1) &&   (App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel).IsUsedVIP== true)
+                if ((!App.IsLogin || Settings.Default.UserDate.subscribestatus != 1) && (App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel).IsUsedVIP == true)
                 {
                     DialogParameters value = new DialogParameters();
                     value.Add(ParameterNames.ViewContentViewModel, this);
@@ -2766,15 +2766,14 @@ namespace PDF_Master.ViewModels
                     {
                         if (dialogResult.Result == ButtonResult.OK)
                         {
-                             flg = true;
+                            flg = true;
                         }
                         else
                         {
-                            flg= false;
+                            flg = false;
                         }
                     });
-                        return flg;
-
+                    return flg;
                 }
 
                 if ((string.IsNullOrEmpty(PDFViewer.Document.FilePath) || mainViewModel.NewFile) && !autosave)
@@ -3022,17 +3021,16 @@ namespace PDF_Master.ViewModels
         /// <summary>
         /// 另存为或新文档保存逻辑
         /// </summary>
-        public bool saveAsFile(Action RedactionAction = null, String IsFormSave=null)
+        public bool saveAsFile(Action RedactionAction = null, String IsFormSave = null)
         {
             //是否来自savefile方法
-            if(IsFormSave=="FormSave")
+            if (IsFormSave == "FormSave")
             {
                 var dlg = new Microsoft.Win32.SaveFileDialog();
                 dlg.Filter = Properties.Resources.OpenDialogFilter;
                 dlg.FileName = PDFViewer.Document.FileName;
                 if (dlg.ShowDialog() == true && !string.IsNullOrEmpty(dlg.FileName))
                 {
-                  
                     bool result = false;
                     if (RedactionAction != null)
                     {
@@ -3065,49 +3063,45 @@ namespace PDF_Master.ViewModels
                         }
 
                         PDFViewer.Document.Encrypt(openPassword, permissionsPassword, cPDFPermissionsInfo);
-                            Uri resourceUri = new Uri("pack://application:,,,/PDF Master;component/Resources/Service/Warermark.png");
-                            StreamResourceInfo resourceInfo = Application.GetResourceStream(resourceUri);
-                            if (resourceInfo != null)
+                        Uri resourceUri = new Uri("pack://application:,,,/PDF Master;component/Resources/Service/Warermark.png");
+                        StreamResourceInfo resourceInfo = Application.GetResourceStream(resourceUri);
+                        if (resourceInfo != null)
+                        {
+                            using (Stream stream = resourceInfo.Stream)
                             {
-                                using (Stream stream = resourceInfo.Stream)
+                                BitmapFrame frame = null;
+                                int width = 0;
+                                int height = 0;
+                                BitmapDecoder decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.Default);
+                                if (decoder != null && decoder.Frames.Count > 0)
                                 {
-                                    BitmapFrame frame = null;
-                                    int width = 0;
-                                    int height = 0;
-                                    BitmapDecoder decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.Default);
-                                    if (decoder != null && decoder.Frames.Count > 0)
-                                    {
-                                        frame = decoder.Frames[0];
-                                    }
-                                    if (frame != null)
-                                    {
-                                        var ImageArray = new byte[frame.PixelWidth * frame.PixelHeight * 4];
-                                        width = frame.PixelWidth;
-                                        height = frame.PixelHeight;
-                                        frame.CopyPixels(ImageArray, frame.PixelWidth * 4, 0);
-                                        watermark = PDFViewer.Document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_IMG);
-                                        watermark.SetImage(ImageArray, width, height);
-                                        watermark.SetScale(1);
-                                        watermark.SetRotation(0);
-                                        watermark.SetOpacity(255);
-                                        watermark.SetFront(true);
-                                        watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_TOP);
-                                        watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_LEFT);
-                                        watermark.SetFullScreen(false);
-                                        watermark.SetVertOffset(0);
-                                        watermark.SetHorizOffset(0);
-                                        watermark.SetHorizontalSpacing(0);
-                                        watermark.SetVerticalSpacing(0);
-                                        string setpages = $"0-{PDFViewer.Document.PageCount.ToString()}";
-                                        watermark.SetPages(setpages);
-                                        watermark.UpdateWatermark();
-                                        PDFViewer.Document.ReleasePages();
-                                        PDFViewer.ReloadDocument();
-
-                                    
-
+                                    frame = decoder.Frames[0];
+                                }
+                                if (frame != null)
+                                {
+                                    var ImageArray = new byte[frame.PixelWidth * frame.PixelHeight * 4];
+                                    width = frame.PixelWidth;
+                                    height = frame.PixelHeight;
+                                    frame.CopyPixels(ImageArray, frame.PixelWidth * 4, 0);
+                                    watermark = PDFViewer.Document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_IMG);
+                                    watermark.SetImage(ImageArray, width, height);
+                                    watermark.SetScale(1);
+                                    watermark.SetRotation(0);
+                                    watermark.SetOpacity(255);
+                                    watermark.SetFront(true);
+                                    watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_TOP);
+                                    watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_LEFT);
+                                    watermark.SetFullScreen(false);
+                                    watermark.SetVertOffset(0);
+                                    watermark.SetHorizOffset(0);
+                                    watermark.SetHorizontalSpacing(0);
+                                    watermark.SetVerticalSpacing(0);
+                                    string setpages = $"0-{PDFViewer.Document.PageCount.ToString()}";
+                                    watermark.SetPages(setpages);
+                                    watermark.UpdateWatermark();
+                                    PDFViewer.Document.ReleasePages();
+                                    PDFViewer.ReloadDocument();
                                 }
-
                             }
                         }
 
@@ -3132,7 +3126,6 @@ namespace PDF_Master.ViewModels
             }
             else
             {
-               
                 bool flg = false;
                 //删掉Settings.Default.UserDate.isInFreeUseTime == false,没有试用期策略了
                 if ((!App.IsLogin || Settings.Default.UserDate.subscribestatus != 1) && (App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel).IsUsedVIP == true)
@@ -3156,7 +3149,7 @@ namespace PDF_Master.ViewModels
                     {
                         return false;
                     }
-                  }
+                }
                 var dlg = new Microsoft.Win32.SaveFileDialog();
                 dlg.Filter = Properties.Resources.OpenDialogFilter;
                 dlg.FileName = PDFViewer.Document.FileName;
@@ -3195,7 +3188,7 @@ namespace PDF_Master.ViewModels
 
                         PDFViewer.Document.Encrypt(openPassword, permissionsPassword, cPDFPermissionsInfo);
                         //是否需要加水印
-                        if(flg==true)
+                        if (flg == true)
                         {
                             Uri resourceUri = new Uri("pack://application:,,,/PDF Master;component/Resources/Service/Warermark.png");
                             StreamResourceInfo resourceInfo = Application.GetResourceStream(resourceUri);
@@ -3235,15 +3228,10 @@ namespace PDF_Master.ViewModels
                                         watermark.UpdateWatermark();
                                         PDFViewer.Document.ReleasePages();
                                         PDFViewer.ReloadDocument();
-
                                     }
-
                                 }
-
                             }
                         }
-                          
-                        
 
                         result = PDFViewer.Document.WriteToFilePath(dlg.FileName);
                         if (result)
@@ -3263,9 +3251,7 @@ namespace PDF_Master.ViewModels
                 }
                 else
                     return false;
-
             }
-
         }
 
         /// <summary>

+ 17 - 18
PDF Office/Views/PageEdit/PageEditContent.xaml.cs

@@ -185,39 +185,35 @@ namespace PDF_Master.Views.PageEdit
                     break;
 
                 case NotifyType.SelectItems:
+                    int index = 0;
                     //根据Vm的参数选中部分页面
                     if (e.PageRange.Count == 1)
                     {
                         ListPageEdit.SelectedIndex = e.PageRange[0] - 1;
                         ListPageEdit.ScrollIntoView(ListPageEdit.SelectedItem);
-                        //缩略图 复制粘贴后,选中页面,要与阅读视图 对应
-                        if (viewModel.viewContentViewModel.isInPageEdit == false && GridBOTAHeader.Visibility == Visibility.Visible)
-                        {
-                            int index = ((PageEditItem)ListPageEdit.SelectedItem).PageNumber - 1;
-                            viewModel.PDFViewer.GoToPage(index);
-                            //if (index == ListPageEdit.Items.Count)
-                            //{
-                            //    viewModel.PDFViewer.GoToPage(index);
-                            //}
-                            //else
-                            //{
-                            //}
-                        }
+                        index = ((PageEditItem)ListPageEdit.SelectedItem).PageNumber - 1;
                     }
                     else
                     {
                         ListPageEdit.SelectedItems.Clear();
                         for (int i = 0; i < e.PageRange.Count; i++)
                         {
-                            if (e.PageRange[i] - 1 < ListPageEdit.Items.Count)
+                            index = e.PageRange[i] - 1;
+                            if (index < ListPageEdit.Items.Count)
                             {
-                                ListPageEdit.SelectedItems.Add(ListPageEdit.Items[e.PageRange[i] - 1]);
+                                ListPageEdit.SelectedItems.Add(ListPageEdit.Items[index]);
+
                                 //页码 下拉框 ,选择全选页面、奇数、偶数等情况,偶现IsMultiSelected=false,这里先强制设置一下
                                 viewModel.IsMultiSelected = true;
                             }
                             ListPageEdit.ScrollIntoView(ListPageEdit.SelectedItem);
                         }
                     }
+                    //缩略图 复制粘贴后,选中页面,要与阅读视图 对应
+                    if (viewModel.viewContentViewModel.isInPageEdit == false && GridBOTAHeader.Visibility == Visibility.Visible)
+                    {
+                        viewModel.PDFViewer.GoToPage(index);
+                    }
                     break;
 
                 case NotifyType.PageCountChanged:
@@ -1064,6 +1060,8 @@ namespace PDF_Master.Views.PageEdit
         /// <param name="e"></param>
         private void ListBoxItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
         {
+            //viewModel.IsAddPages = false;
+
             viewModel.IsMouseRightButtonDown = true;
             viewModel.RightSelectedIndex = -1;
             viewModel.RightSelectedIndexs.Clear();
@@ -1085,14 +1083,13 @@ namespace PDF_Master.Views.PageEdit
                 }
                 else
                 {
-                    if(viewModel.RightSelectedIndex!= viewModel.ListSelectedIndex)
+                    if (viewModel.RightSelectedIndex != viewModel.ListSelectedIndex)
                     {
                         viewModel.ListSelectedIndex = -1;
                     }
-                    
+
                     viewModel.IsMultiSelected = false;
                     viewModel.maxSelectedIndex = -1;
-                    
                 }
             }
 
@@ -1102,6 +1099,8 @@ namespace PDF_Master.Views.PageEdit
 
         private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
         {
+            //viewModel.IsAddPages = false;
+
             viewModel.IsMouseRightButtonDown = false;
             viewModel.RightSelectedIndex = -1;
             viewModel.RightSelectedIndexs.Clear();