From 9d7e27f22d0ae2046a396b9d7acf56bd11b38ff4 Mon Sep 17 00:00:00 2001 From: kriastans Date: Mon, 12 Aug 2024 21:21:13 +0800 Subject: [PATCH] =?UTF-8?q?[update]=20=E5=BD=A2=E7=8A=B6=E7=BB=98=E5=88=B6?= =?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8D=E5=85=8B=E9=9A=86=E5=88=B0=E7=99=BD?= =?UTF-8?q?=E6=9D=BF=E5=B7=A5=E5=85=B7=E6=A0=8F=E9=AB=98=E4=BA=AE=E7=8A=B6?= =?UTF-8?q?=E6=80=81Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InkCanvasForClass.csproj.user | 6 + InkCanvasForClass/MainWindow.xaml | 35 ++- InkCanvasForClass/MainWindow.xaml.cs | 1 + .../MainWindow_cs/MW_FloatingBarIcons.cs | 4 +- .../MainWindow_cs/MW_InkCanvas.cs | 57 +++++ .../MainWindow_cs/MW_ShapeDrawing.cs | 46 ++-- .../MainWindow_cs/MW_ShapeDrawingCore.cs | 29 +++ .../MainWindow_cs/MW_ShapeDrawingLayer.xaml | 203 ++++++++++++++++++ .../MW_ShapeDrawingLayer.xaml.cs | 163 ++++++++++++++ .../Popups/ShapeDrawingPopup.xaml | 3 +- .../Popups/ShapeDrawingPopup.xaml.cs | 39 +++- 11 files changed, 552 insertions(+), 34 deletions(-) create mode 100644 InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingCore.cs create mode 100644 InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml create mode 100644 InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml.cs diff --git a/InkCanvasForClass/InkCanvasForClass.csproj.user b/InkCanvasForClass/InkCanvasForClass.csproj.user index 064a598..403f6f0 100644 --- a/InkCanvasForClass/InkCanvasForClass.csproj.user +++ b/InkCanvasForClass/InkCanvasForClass.csproj.user @@ -8,6 +8,9 @@ ProjectDebugger + + Code + Code @@ -34,6 +37,9 @@ Designer + + Designer + Designer diff --git a/InkCanvasForClass/MainWindow.xaml b/InkCanvasForClass/MainWindow.xaml index 060f80b..2407407 100644 --- a/InkCanvasForClass/MainWindow.xaml +++ b/InkCanvasForClass/MainWindow.xaml @@ -126,7 +126,7 @@ - + @@ -493,6 +493,9 @@ + + + @@ -6402,6 +6405,36 @@ Foreground="#a1a1aa" /> + + + + + + + + + + + + + + + + + + + diff --git a/InkCanvasForClass/MainWindow.xaml.cs b/InkCanvasForClass/MainWindow.xaml.cs index 5c4ab9d..0e8cf0e 100644 --- a/InkCanvasForClass/MainWindow.xaml.cs +++ b/InkCanvasForClass/MainWindow.xaml.cs @@ -262,6 +262,7 @@ namespace Ink_Canvas { PenPaletteV2Init(); SelectionV2Init(); + ShapeDrawingV2Init(); InitStorageManagementModule(); diff --git a/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs b/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs index a8ee38e..f177619 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs @@ -340,6 +340,7 @@ namespace Ink_Canvas { // new popup PenPaletteV2Popup.IsOpen = false; SelectionPopupV2.IsOpen = false; + ShapeDrawingPopupV2.IsOpen = false; await Task.Delay(20); isHidingSubPanelsWhenInking = false; @@ -393,7 +394,7 @@ namespace Ink_Canvas { UnFoldFloatingBar_MouseUp(null, null); - if (SelectedMode == ICCToolsEnum.CursorMode) PenIcon_Click(null, null); + if (SelectedMode == ICCToolsEnum.CursorMode || SelectedMode == ICCToolsEnum.LassoMode) PenIcon_Click(null, null); if (currentMode == 0) { LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; @@ -869,7 +870,6 @@ namespace Ink_Canvas { /*if (forceEraser && currentMode == 0) BtnColorRed_Click(sender, null);*/ - StackPanelCanvasControls.Visibility = Visibility.Visible; CheckEnableTwoFingerGestureBtnVisibility(true); inkCanvas.EditingMode = InkCanvasEditingMode.Ink; diff --git a/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs b/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs index f1e02d3..f258213 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs @@ -1,11 +1,55 @@ using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; using System.Windows; using System.Windows.Controls; +using System.Windows.Ink; using System.Windows.Input; +using System.Windows.Media; +using iNKORE.UI.WPF.Helpers; namespace Ink_Canvas { + + public class IccStroke : Stroke { + + public IccStroke(StylusPointCollection stylusPoints, DrawingAttributes drawingAttributes) + : base(stylusPoints, drawingAttributes) { } + + public static Guid StrokeShapeTypeGuid = new Guid("6537b29c-557f-487f-800b-cb30a8f1de78"); + public static Guid StrokeIsShapeGuid = new Guid("40eff5db-9346-4e42-bd46-7b0eb19d0018"); + + // 自定义的墨迹渲染 + protected override void DrawCore(DrawingContext drawingContext, + DrawingAttributes drawingAttributes) { + if (!(this.ContainsPropertyData(StrokeIsShapeGuid) && + (bool)this.GetPropertyData(StrokeIsShapeGuid) == true)) { + base.DrawCore(drawingContext, drawingAttributes); + return; + } + + if ((int)this.GetPropertyData(StrokeShapeTypeGuid) == (int)MainWindow.ShapeDrawingType.DashedLine || + (int)this.GetPropertyData(StrokeShapeTypeGuid) == (int)MainWindow.ShapeDrawingType.DottedLine) { + StreamGeometry geometry = new StreamGeometry(); + var pts = new List(this.StylusPoints.ToPoints()); + using (StreamGeometryContext ctx = geometry.Open()) { + ctx.BeginFigure(pts[0], false , false); + pts.RemoveAt(0); + ctx.PolyLineTo(pts,true, true); + } + var pen = new Pen(new SolidColorBrush(DrawingAttributes.Color), + (drawingAttributes.Width + drawingAttributes.Height) / 2) { + DashCap = PenLineCap.Round, + StartLineCap = PenLineCap.Round, + EndLineCap = PenLineCap.Round, + DashStyle = (int)this.GetPropertyData(StrokeShapeTypeGuid) == (int)MainWindow.ShapeDrawingType.DottedLine ? DashStyles.Dot : DashStyles.Dash + }; + drawingContext.DrawGeometry(new SolidColorBrush(Colors.Transparent),pen, geometry); + } + + } + } + public class IccInkCanvas : InkCanvas { public IccInkCanvas() { // 通过反射移除InkCanvas自带的默认 Delete按键事件 @@ -35,6 +79,19 @@ namespace Ink_Canvas { })); } + protected override void OnStrokeCollected(InkCanvasStrokeCollectedEventArgs e) + { + // Remove the original stroke and add a custom stroke. + this.Strokes.Remove(e.Stroke); + IccStroke customStroke = new IccStroke(e.Stroke.StylusPoints, e.Stroke.DrawingAttributes); + this.Strokes.Add(customStroke); + + // Pass the custom stroke to base class' OnStrokeCollected method. + InkCanvasStrokeCollectedEventArgs args = + new InkCanvasStrokeCollectedEventArgs(customStroke); + base.OnStrokeCollected(args); + } + public event EventHandler DeleteKeyCommandFired; } } \ No newline at end of file diff --git a/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs index ef30beb..3df5d4e 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs @@ -22,34 +22,14 @@ namespace Ink_Canvas { ((Panel)lastBorderMouseDownObject).Background = new SolidColorBrush(Colors.Transparent); if (sender == ShapeDrawFloatingBarBtn && lastBorderMouseDownObject != ShapeDrawFloatingBarBtn) return; - // FloatingBarIcons_MouseUp_New(sender); - if (BorderDrawShape.Visibility == Visibility.Visible) { - AnimationsHelper.HideWithSlideAndFade(EraserSizePanel); - AnimationsHelper.HideWithSlideAndFade(BorderTools); - AnimationsHelper.HideWithSlideAndFade(BoardBorderTools); - AnimationsHelper.HideWithSlideAndFade(PenPalette); - AnimationsHelper.HideWithSlideAndFade(BoardPenPalette); - AnimationsHelper.HideWithSlideAndFade(BorderDrawShape); - AnimationsHelper.HideWithSlideAndFade(BoardBorderDrawShape); - AnimationsHelper.HideWithSlideAndFade(BoardEraserSizePanel); - AnimationsHelper.HideWithSlideAndFade(BorderTools); - AnimationsHelper.HideWithSlideAndFade(BoardBorderTools); - AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder); - AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder); - } - else { - AnimationsHelper.HideWithSlideAndFade(EraserSizePanel); - AnimationsHelper.HideWithSlideAndFade(BorderTools); - AnimationsHelper.HideWithSlideAndFade(BoardBorderTools); - AnimationsHelper.HideWithSlideAndFade(PenPalette); - AnimationsHelper.HideWithSlideAndFade(BoardPenPalette); - AnimationsHelper.HideWithSlideAndFade(BoardEraserSizePanel); - AnimationsHelper.HideWithSlideAndFade(BorderTools); - AnimationsHelper.HideWithSlideAndFade(BoardBorderTools); - AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder); - AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder); - AnimationsHelper.ShowWithSlideFromBottomAndFade(BorderDrawShape); - AnimationsHelper.ShowWithSlideFromBottomAndFade(BoardBorderDrawShape); + if (ShapeDrawingPopupV2.IsOpen == false) { + var transform = ShapeDrawFloatingBarBtn.TransformToVisual(Main_Grid); + var pt = transform.Transform(new Point(0, 0)); + ShapeDrawingPopupV2.VerticalOffset = pt.Y; + ShapeDrawingPopupV2.HorizontalOffset = pt.X - 32; + ShapeDrawingPopupV2.IsOpen = true; + } else { + HideSubPanels(); } } @@ -1604,6 +1584,16 @@ namespace Ink_Canvas { #region ShapeDrawingV2 + public void ShapeDrawingV2Init() { + ShapeDrawingV2Layer.MainWindow = this; + ShapeDrawingV2.ShapeDrawingPopupShouldCloseEvent += (sender, args) => { + ShapeDrawingPopupV2.IsOpen = false; + }; + ShapeDrawingV2.ShapeSelectedEvent += (sender, args) => { + ShapeDrawingV2Layer.StartShapeDrawing(args.Type); + }; + } + public enum ShapeDrawingType { Line, DottedLine, diff --git a/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingCore.cs b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingCore.cs new file mode 100644 index 0000000..2d56f7b --- /dev/null +++ b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingCore.cs @@ -0,0 +1,29 @@ +using System; +using System.Windows; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; + +namespace Ink_Canvas { + + public partial class MainWindow : Window { + + public StrokeCollection DrawShapeCore(PointCollection pts, ShapeDrawingType type) { + // 线 + if (type == MainWindow.ShapeDrawingType.Line || + type == MainWindow.ShapeDrawingType.DashedLine || + type == MainWindow.ShapeDrawingType.DottedLine) { + if (pts.Count != 2) throw new Exception("传入的点个数不是2个"); + var stk = new IccStroke(new StylusPointCollection() { + new StylusPoint(pts[0].X, pts[0].Y), + new StylusPoint(pts[1].X, pts[1].Y), + }, inkCanvas.DefaultDrawingAttributes.Clone()); + stk.AddPropertyData(IccStroke.StrokeIsShapeGuid, true); + stk.AddPropertyData(IccStroke.StrokeShapeTypeGuid, (int)type); + return new StrokeCollection() { stk }; + } + + return new StrokeCollection(); + } + } +} diff --git a/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml new file mode 100644 index 0000000..a97bb2d --- /dev/null +++ b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml.cs b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml.cs new file mode 100644 index 0000000..929c866 --- /dev/null +++ b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawingLayer.xaml.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +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.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Ink_Canvas { + public partial class ShapeDrawingLayer : UserControl { + + public ShapeDrawingLayer() { + InitializeComponent(); + + // ToolbarMoveHandle + ToolbarMoveHandle.MouseDown += ToolbarMoveHandle_MouseDown; + ToolbarMoveHandle.MouseUp += ToolbarMoveHandle_MouseUp; + ToolbarMoveHandle.MouseMove += ToolbarMoveHandle_MouseMove; + UpdateToolbarPosition(ToolbarNowPosition); + + // Update ToolBtns + ToolButtons = new Border[] { + CursorButton, + UndoButton, + RedoButton, + ClearButton, + GridLineButton, + SnapButton, + MultiPointButton, + InfoButton, + MoreButton, + }; + foreach (var tb in ToolButtons) { + tb.MouseDown += ToolButton_MouseDown; + tb.MouseUp += ToolButton_MouseUp; + tb.MouseLeave += ToolButton_MouseLeave; + } + + Toolbar.Visibility = Visibility.Collapsed; + + FullscreenGrid.MouseDown += FullscreenGrid_MouseDown; + FullscreenGrid.MouseUp += FullscreenGrid_MouseUp; + FullscreenGrid.MouseMove += FullscreenGrid_MouseMove; + } + + public MainWindow MainWindow { get; set; } + + public Border[] ToolButtons = new Border[] { }; + public Point ToolbarNowPosition = new Point(0, 0); + public bool IsToolbarMoveHandleDown = false; + public Point MouseDownPointInHandle; + public Border ToolButtonMouseDownBorder = null; + + public void UpdateToolbarPosition(Point? position) { + if (position == null) { + Toolbar.RenderTransform = null; + return; + } + Toolbar.RenderTransform = new TranslateTransform(((Point)position).X, ((Point)position).Y); + } + + private void ToolbarMoveHandle_MouseDown(object sender, MouseButtonEventArgs e) { + if (IsToolbarMoveHandleDown) return; + MouseDownPointInHandle = FullscreenGrid.TranslatePoint(e.GetPosition(null),ToolbarMoveHandle); + ToolbarMoveHandle.CaptureMouse(); + IsToolbarMoveHandleDown = true; + Trace.WriteLine("MD"); + } + + private void ToolbarMoveHandle_MouseUp(object sender, MouseButtonEventArgs e) { + if (IsToolbarMoveHandleDown == false) return; + ToolbarMoveHandle.ReleaseMouseCapture(); + IsToolbarMoveHandleDown = false; + Trace.WriteLine("MU"); + } + + private MainWindow.ShapeDrawingType? _shapeType; + + public void StartShapeDrawing(MainWindow.ShapeDrawingType type) { + _shapeType = type; + FullscreenGrid.Background = new SolidColorBrush(Color.FromArgb(1,0,0,0)); + FullscreenGrid.Visibility = Visibility.Visible; + Toolbar.Visibility = Visibility.Visible; + } + + public void EndShapeDrawing() { + _shapeType = null; + FullscreenGrid.Background = null; + FullscreenGrid.Visibility = Visibility.Collapsed; + Toolbar.Visibility = Visibility.Collapsed; + } + + private void ToolbarMoveHandle_MouseMove(object sender, MouseEventArgs e) { + if (IsToolbarMoveHandleDown == false) return; + var ptInScreen = e.GetPosition(null); + Trace.WriteLine($"x:{ptInScreen.X} y:{ptInScreen.Y}"); + ToolbarNowPosition = new Point(ptInScreen.X - MouseDownPointInHandle.X, ptInScreen.Y - MouseDownPointInHandle.Y); + UpdateToolbarPosition(ToolbarNowPosition); + } + + private void ToolButton_MouseDown(object sender, MouseButtonEventArgs e) { + if (ToolButtonMouseDownBorder != null) return; + ToolButtonMouseDownBorder = (Border)sender; + ToolButtonMouseDownBorder.Background = new SolidColorBrush(Color.FromRgb(228, 228, 231)); + } + + private void ToolButton_MouseUp(object sender, MouseButtonEventArgs e) { + if (ToolButtonMouseDownBorder == null || ToolButtonMouseDownBorder != sender) return; + + ToolButton_MouseLeave(sender, null); + } + + private void ToolButton_MouseLeave(object sender, MouseEventArgs e) { + if (ToolButtonMouseDownBorder == null || ToolButtonMouseDownBorder != sender) return; + ToolButtonMouseDownBorder.Background = new SolidColorBrush(Colors.Transparent); + ToolButtonMouseDownBorder = null; + } + + private bool isFullscreenGridDown = false; + public PointCollection points = new PointCollection(); + + private void FullscreenGrid_MouseDown(object sender, MouseButtonEventArgs e) { + if (isFullscreenGridDown) return; + points.Clear(); + points.Add(e.GetPosition(null)); + FullscreenGrid.CaptureMouse(); + isFullscreenGridDown = true; + } + + private void FullscreenGrid_MouseUp(object sender, MouseButtonEventArgs e) { + if (!isFullscreenGridDown) return; + FullscreenGrid.ReleaseMouseCapture(); + isFullscreenGridDown = false; + if (_shapeType == null) return; + using (DrawingContext dc = DrawingVisualCanvas.DrawingVisual.RenderOpen()) {} + MainWindow.inkCanvas.Strokes.Add(MainWindow.DrawShapeCore(points, (MainWindow.ShapeDrawingType)_shapeType)); + points.Clear(); + } + + private void FullscreenGrid_MouseMove(object sender, MouseEventArgs e) { + if (!isFullscreenGridDown) return; + if (_shapeType == null) return; + if (points.Count >= 2) points[1] = e.GetPosition(null); + else points.Add(e.GetPosition(null)); + + using (DrawingContext dc = DrawingVisualCanvas.DrawingVisual.RenderOpen()) { + if ((_shapeType == MainWindow.ShapeDrawingType.Line || + _shapeType == MainWindow.ShapeDrawingType.DashedLine || + _shapeType == MainWindow.ShapeDrawingType.DottedLine) && points.Count >= 2) { + MainWindow.DrawShapeCore(points, (MainWindow.ShapeDrawingType)_shapeType).Draw(dc); + } + } + } + } +} diff --git a/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml b/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml index 9f1f7e9..ad0d6f8 100644 --- a/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml +++ b/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml @@ -283,8 +283,7 @@ - - + diff --git a/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml.cs b/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml.cs index e4c1c32..ea133c0 100644 --- a/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml.cs +++ b/InkCanvasForClass/Popups/ShapeDrawingPopup.xaml.cs @@ -23,128 +23,162 @@ namespace Ink_Canvas.Popups { _items.Add(new ShapeDrawingItem() { Name = "直线", Image = FindResource("LineIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Line, }); _items.Add(new ShapeDrawingItem() { Name = "虚线", Image = FindResource("DashedLineIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.DashedLine, }); _items.Add(new ShapeDrawingItem() { Name = "点虚线", Image = FindResource("DottedLineIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.DottedLine, }); _items.Add(new ShapeDrawingItem() { Name = "箭头", Image = FindResource("ArrowLineIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.ArrowOneSide, }); _items.Add(new ShapeDrawingItem() { Name = "双箭头", Image = FindResource("ArrowLineTwoSideIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.ArrowTwoSide, }); _items.Add(new ShapeDrawingItem() { Name = "矩形", Image = FindResource("RectIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Rectangle, }); _items.Add(new ShapeDrawingItem() { Name = "椭圆", Image = FindResource("CircleIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Ellipse, }); _items.Add(new ShapeDrawingItem() { Name = "饼图形", Image = FindResource("PieIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.PieEllipse, }); _items.Add(new ShapeDrawingItem() { Name = "三角形", Image = FindResource("TriangleIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Triangle, }); _items.Add(new ShapeDrawingItem() { Name = "直角三角", Image = FindResource("RightTriangleIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.RightTriangle, }); _items.Add(new ShapeDrawingItem() { Name = "菱形", Image = FindResource("DiamondIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Diamond, }); _items.Add(new ShapeDrawingItem() { Name = "平行四边形", Image = FindResource("ParallelogramIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Parallelogram, }); _items.Add(new ShapeDrawingItem() { Name = "四线三格", Image = FindResource("FourLineIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.FourLine, }); _items.Add(new ShapeDrawingItem() { Name = "五线谱", Image = FindResource("FiveLineIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Staff, }); _items.Add(new ShapeDrawingItem() { Name = "平面坐标轴", Image = FindResource("DefaultAxisIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Axis2D, }); _items.Add(new ShapeDrawingItem() { Name = "平面坐标轴2", Image = FindResource("Axis2Icon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Axis2DA, }); _items.Add(new ShapeDrawingItem() { Name = "平面坐标轴3", Image = FindResource("Axis3Icon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Axis2DB, }); _items.Add(new ShapeDrawingItem() { Name = "平面坐标轴4", Image = FindResource("Axis4Icon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Axis2DC, }); _items.Add(new ShapeDrawingItem() { Name = "三维坐标轴", Image = FindResource("ThreeDimensionAxisIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Axis3D, }); _items.Add(new ShapeDrawingItem() { Name = "双曲线", Image = FindResource("HyperbolaIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Hyperbola, }); _items.Add(new ShapeDrawingItem() { Name = "带焦点的双曲线", Image = FindResource("HyperbolaWithFocalPointIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.HyperbolaF, }); _items.Add(new ShapeDrawingItem() { Name = "抛物线1", Image = FindResource("ParabolaIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Parabola, }); _items.Add(new ShapeDrawingItem() { Name = "抛物线2", Image = FindResource("Parabola2Icon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.ParabolaA, }); _items.Add(new ShapeDrawingItem() { Name = "带焦点的抛物线2", Image = FindResource("Parabola2WithFocalPointIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.ParabolaAF, }); _items.Add(new ShapeDrawingItem() { Name = "圆柱体", Image = FindResource("CylinderIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Cylinder, }); _items.Add(new ShapeDrawingItem() { Name = "立方体", Image = FindResource("CubeIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Cube, }); _items.Add(new ShapeDrawingItem() { Name = "圆锥体", Image = FindResource("ConeIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.Cone, }); _items.Add(new ShapeDrawingItem() { Name = "带圆心的圆形", Image = FindResource("CircleWithCenterPointIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.EllipseC, }); _items.Add(new ShapeDrawingItem() { Name = "带中心点的矩形", Image = FindResource("RectWithCenterPointIcon") as DrawingImage, + Type = MainWindow.ShapeDrawingType.RectangleC, }); } private class ShapeDrawingItem { public string Name { get; set; } public DrawingImage Image { get; set; } + public MainWindow.ShapeDrawingType Type { get; set; } } private ObservableCollection _items = new ObservableCollection(); private bool isCloseButtonDown = false; public event EventHandler ShapeDrawingPopupShouldCloseEvent; + public class ShapeSelectedEventArgs : EventArgs { + public MainWindow.ShapeDrawingType Type { get; set; } + } + public event EventHandler ShapeSelectedEvent; private void CloseButtonBorder_MouseDown(object sender, MouseButtonEventArgs e) { isCloseButtonDown = true; CloseButtonBorder.Background = new SolidColorBrush(Color.FromArgb(34, 220, 38, 38)); @@ -173,7 +207,10 @@ namespace Ink_Canvas.Popups { private void ShapeDrawingButtonBorder_MouseUp(object sender, MouseButtonEventArgs e) { if (shapeDrawingButtonDownBorder == null || shapeDrawingButtonDownBorder != sender) return; ShapeDrawingButtonBorder_MouseLeave(sender, null); - + ShapeDrawingPopupShouldCloseEvent?.Invoke(this,new RoutedEventArgs()); + ShapeSelectedEvent?.Invoke(this, new ShapeSelectedEventArgs() { + Type = ((ShapeDrawingItem)((Border)sender).Tag).Type + }); } } }