Browse Source

compdfkit(win) - 按住鼠标中键自动滚动

liuaoran 11 months ago
parent
commit
ff9d688bc6

+ 98 - 14
Demo/Examples/Compdfkit_Tools/PDFView/PDFViewControl/PDFViewControl.xaml.cs

@@ -21,6 +21,8 @@ using ComPDFKit.Tool.DrawTool;
 using static ComPDFKit.Tool.CPDFToolManager;
 using static Compdfkit_Tools.PDFControlUI.CPDFViewModeUI;
 using SplitMode = Compdfkit_Tools.PDFControlUI.CPDFViewModeUI.SplitMode;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace Compdfkit_Tools.PDFControl
 {
@@ -32,6 +34,7 @@ namespace Compdfkit_Tools.PDFControl
         private CPDFViewerTool viewerTool;
         private CPDFToolManager toolManager;
 
+
         public CPDFViewerTool PDFViewTool { get; private set; }
         public CPDFToolManager PDFToolManager { get; private set; }
 
@@ -76,6 +79,7 @@ namespace Compdfkit_Tools.PDFControl
 
             PDFViewTool.SizeChanged -= PDFViewTool_SizeChanged;
             PDFViewTool.GetCPDFViewer().MouseWheelZoomHandler -= PDFViewControl_MouseWheelZoomHandler;
+            PDFViewTool.GetCPDFViewer().MouseMove -= PDFViewControl_MouseMove;
             PDFViewTool.DrawChanged -= PDFViewTool_DrawChanged;
             PDFToolManager.MouseLeftButtonDownHandler -= PDFToolManager_MouseLeftButtonDownHandler;
             PDFToolManager.MouseLeftButtonUpHandler -= PDFToolManager_MouseLeftButtonUpHandler;
@@ -85,6 +89,7 @@ namespace Compdfkit_Tools.PDFControl
 
             PDFViewTool.SizeChanged += PDFViewTool_SizeChanged;
             PDFViewTool.GetCPDFViewer().MouseWheelZoomHandler += PDFViewControl_MouseWheelZoomHandler;
+            PDFViewTool.GetCPDFViewer().MouseMove += PDFViewControl_MouseMove;
             PDFViewTool.DrawChanged += PDFViewTool_DrawChanged;
             PDFToolManager.MouseLeftButtonDownHandler += PDFToolManager_MouseLeftButtonDownHandler;
             PDFToolManager.MouseLeftButtonUpHandler += PDFToolManager_MouseLeftButtonUpHandler;
@@ -109,7 +114,6 @@ namespace Compdfkit_Tools.PDFControl
             splitToolManager.MouseMoveHandler += PDFToolManager_MouseMoveHandler;
             splitToolManager.AnnotDefaultEditedHandler += PDFToolManager_AnnotDefaultEditedHandler;
             splitToolManager.MouseRightButtonDownHandler += PDFToolManager_MouseRightButtonDownHandler;
-
         }
 
         private void PDFToolManager_AnnotDefaultEditedHandler(object sender, SelectedAnnotData e)
@@ -142,7 +146,7 @@ namespace Compdfkit_Tools.PDFControl
         {
             Point point = e.mouseButtonEventArgs.GetPosition(this);
             viewerTool.GetCPDFViewer().GetPointPageInfo(point, out int index, out Rect paintRect, out Rect pageBound);
-            if(index == -1)
+            if (index == -1)
             {
                 viewerTool.ContextMenu = null;
                 return;
@@ -380,7 +384,7 @@ namespace Compdfkit_Tools.PDFControl
                 FocusPDFViewTool?.GetCPDFViewer()?.UpdateRenderFrame();
             };
             contextMenu.Items.Add(fitWidthMenu);
-            
+
             MenuItem fitSizeMenu = new MenuItem();
             fitSizeMenu.Header = LanguageHelper.CommonManager.GetString("Menu_RealSize");
             fitSizeMenu.Click += (o, p) =>
@@ -389,7 +393,7 @@ namespace Compdfkit_Tools.PDFControl
                 FocusPDFViewTool?.GetCPDFViewer()?.UpdateRenderFrame();
             };
             contextMenu.Items.Add(fitSizeMenu);
-            
+
             MenuItem zoomInMenu = new MenuItem();
             zoomInMenu.Header = LanguageHelper.CommonManager.GetString("Menu_ZoomIn");
             zoomInMenu.Click += (o, p) =>
@@ -400,7 +404,7 @@ namespace Compdfkit_Tools.PDFControl
                 FocusPDFViewTool?.GetCPDFViewer()?.UpdateRenderFrame();
             };
             contextMenu.Items.Add(zoomInMenu);
-            
+
             MenuItem zoomOutMenu = new MenuItem();
             zoomOutMenu.Header = LanguageHelper.CommonManager.GetString("Menu_ZoomOut");
             zoomOutMenu.Click += (o, p) =>
@@ -411,9 +415,9 @@ namespace Compdfkit_Tools.PDFControl
                 FocusPDFViewTool?.GetCPDFViewer()?.UpdateRenderFrame();
             };
             contextMenu.Items.Add(zoomOutMenu);
-            
+
             contextMenu.Items.Add(new Separator());
-            
+
             MenuItem singleView = new MenuItem();
             singleView.Header = LanguageHelper.CommonManager.GetString("Menu_SinglePage");
             singleView.Click += (o, p) =>
@@ -422,7 +426,7 @@ namespace Compdfkit_Tools.PDFControl
                 FocusPDFViewTool?.GetCPDFViewer()?.UpdateRenderFrame();
             };
             contextMenu.Items.Add(singleView);
-            
+
             MenuItem singleContinuousView = new MenuItem();
             singleContinuousView.Header = LanguageHelper.CommonManager.GetString("Menu_SingleContinuous");
             singleContinuousView.Click += (o, p) =>
@@ -431,7 +435,7 @@ namespace Compdfkit_Tools.PDFControl
                 FocusPDFViewTool?.GetCPDFViewer()?.UpdateRenderFrame();
             };
             contextMenu.Items.Add(singleContinuousView);
-            
+
             MenuItem doubleView = new MenuItem();
             doubleView.Header = LanguageHelper.CommonManager.GetString("Menu_DoublePage");
             doubleView.Click += (o, p) =>
@@ -440,7 +444,7 @@ namespace Compdfkit_Tools.PDFControl
                 FocusPDFViewTool?.GetCPDFViewer()?.UpdateRenderFrame();
             };
             contextMenu.Items.Add(doubleView);
-            
+
             MenuItem doubleContinuousView = new MenuItem();
             doubleContinuousView.Header = LanguageHelper.CommonManager.GetString("Menu_DoubleContinuous");
             doubleContinuousView.Click += (o, p) =>
@@ -450,7 +454,7 @@ namespace Compdfkit_Tools.PDFControl
             };
             contextMenu.Items.Add(doubleContinuousView);
             contextMenu.Items.Add(new Separator());
-            
+
             MenuItem resetFormMenu = new MenuItem();
             resetFormMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Reset");
             resetFormMenu.Click += (o, p) =>
@@ -477,11 +481,11 @@ namespace Compdfkit_Tools.PDFControl
 
         public void WindowSizeChange()
         {
-            if(VerticalView.Visibility == Visibility.Visible)
+            if (VerticalView.Visibility == Visibility.Visible)
             {
                 ViewToolGrid.ColumnDefinitions[2].Width = new GridLength(ViewToolGrid.ActualWidth * splitWidthScale);
             }
-            if(HorizontalView.Visibility == Visibility.Visible)
+            if (HorizontalView.Visibility == Visibility.Visible)
             {
                 ViewToolGrid.RowDefinitions[2].Height = new GridLength(ViewToolGrid.ActualHeight * splitHeightScale);
             }
@@ -537,8 +541,20 @@ namespace Compdfkit_Tools.PDFControl
 
         #endregion
 
+        #region automatic scroll
+        internal bool EnableAutoScroll { get; set; } = true;
+
+        private bool cancelTask = false;
+        private bool scrollEnable = true;
+        private bool isAutomaticScroll = false;
+        private Point mouseCurrentPoint;
+        private Point middlePressPoint;
+        private Point middleMovePoint;
+        private Task MiddleScrollTask;
+
         private void PDFView_MouseDown(object sender, MouseButtonEventArgs e)
         {
+
             switch ((sender as Border).Tag)
             {
                 case "ViewerTool":
@@ -548,10 +564,78 @@ namespace Compdfkit_Tools.PDFControl
                     FocusPDFViewTool = splitViewerTool;
                     break;
             }
-            if (FocusPDFViewTool.IsLoaded&& FocusPDFViewTool.GetCPDFViewer()?.CurrentRenderFrame != null)
+            if (FocusPDFViewTool.IsLoaded && FocusPDFViewTool.GetCPDFViewer()?.CurrentRenderFrame != null)
             {
                 FocusPDFViewToolChanged?.Invoke(this, EventArgs.Empty);
             }
         }
+
+        private void PDFViewControl_MouseMove(object sender, MouseEventArgs e)
+        {
+            if (isAutomaticScroll)
+            {
+                middleMovePoint = e.GetPosition(this);
+                e.Handled = true;
+                return;
+            }
+        }
+
+        protected override void OnMouseDown(MouseButtonEventArgs e)
+        {
+            if (e.MiddleButton == MouseButtonState.Pressed)
+            {
+                isAutomaticScroll ^= true;
+            }
+            else
+            {
+                isAutomaticScroll = false;
+            }
+
+            if (isAutomaticScroll)
+            {
+                GetCPDFViewer().Cursor = Cursors.ScrollAll;
+                middlePressPoint = e.GetPosition(this);
+                middleMovePoint = middlePressPoint;
+
+                if (MiddleScrollTask != null && MiddleScrollTask.Status == TaskStatus.Running)
+                {
+                    cancelTask = true;
+                    MiddleScrollTask.Wait();
+                }
+
+                cancelTask = false;
+                MiddleScrollTask = Task.Factory.StartNew(() => DoScrollWork());
+            }
+        }
+
+        private void DoScrollWork()
+        {
+            try
+            {
+                while (!cancelTask && isAutomaticScroll)
+                {
+                    Vector subSize = middleMovePoint - middlePressPoint;
+                    Dispatcher.Invoke(() =>
+                    {
+                        GetCPDFViewer().SetVerticalOffset(GetCPDFViewer().VerticalOffset + subSize.Y);
+                        GetCPDFViewer().SetHorizontalOffset(GetCPDFViewer().HorizontalOffset + subSize.X);
+                    });
+                    Thread.Sleep(100);
+                }
+                Dispatcher.Invoke(() =>
+                {
+                    if (GetCPDFViewer().Cursor == Cursors.ScrollAll)
+                    {
+                        GetCPDFViewer().Cursor = Cursors.Arrow;
+                    }
+                });
+            }
+            catch (Exception ex)
+            {
+                MiddleScrollTask = null;
+            }
+        }
+
+        #endregion
     }
 }