WPF canvas draw ellipse,rectangle, triangle when mouse down,mouse move and mouse up

 

 

 

 

 

 

 

 

 

 

 

 

image

 

//xaml
<Window x:Class="WpfApp13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp13"
        mc:Ignorable="d"
        WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal"
                    >
            <CheckBox x:Name="elpCbx" Content="Ellipse" FontSize="50"
                      Checked="elpCbx_Checked"
                      Unchecked="elpCbx_Unchecked"/>
            <CheckBox x:Name="rectCbx" Content="Rectangle" FontSize="50"
                      Checked="rectCbx_Checked"
                      Unchecked="rectCbx_Unchecked"/>
            <CheckBox x:Name="triangleCbx" Content="Triangle" FontSize="50"
                      Checked="triangleCbx_Checked"
                      Unchecked="triangleCbx_Unchecked"/>

        </StackPanel>
        <Canvas Grid.Row="1"
                x:Name="cvs"
                Background="White"
                VerticalAlignment="Stretch"
                HorizontalAlignment="Stretch"
                MouseDown="cvs_MouseDown"
                MouseMove="cvs_MouseMove"
                MouseUp="cvs_MouseUp"/>
        <TextBlock x:Name="statusTbk"
                   Grid.Row="2"
                   FontSize="20"/>
    </Grid>
</Window>


using System.Text;
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 WpfApp13
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Point startPt;
        private Point secondPt;
        private Ellipse elp;
        private bool isDrawing = false;
        private Rectangle rect;
        private Polygon triangle;
        public MainWindow()
        {
            InitializeComponent();
            cvs.MouseMove+= cvs_MouseMove;
        }

        private void cvs_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if(elpCbx.IsChecked == true)
            {
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    startPt = e.GetPosition(cvs);
                    isDrawing = true;
                }

                elp = new Ellipse()
                {
                    Stroke = Brushes.Black,
                    StrokeThickness = 2,
                    Fill = Brushes.LightBlue,
                    Opacity = 0.7
                };

                Canvas.SetLeft(elp, startPt.X);
                Canvas.SetTop(elp, startPt.Y);
                cvs.Children.Add(elp);
                statusTbk.Text = "Drawing ellipse...";
            }
            else if(rectCbx.IsChecked==true)
            {
                if(e.LeftButton==MouseButtonState.Pressed)
                {
                    startPt=e.GetPosition(cvs);
                    isDrawing = true;

                    rect = new Rectangle()
                    {
                        Stroke = Brushes.Black,
                        StrokeThickness = 2,
                        StrokeDashArray = new DoubleCollection() { 4, 2 },
                        Fill = new SolidColorBrush(Colors.Red),
                        Opacity = 0.7
                    };

                    Canvas.SetLeft(rect, startPt.X);
                    Canvas.SetTop(rect, startPt.Y);
                    cvs.Children.Add(rect);
                    statusTbk.Text = "Drawing rectangle...";
                }
            }
            else if(triangleCbx.IsChecked==true)
            {
                startPt=e.GetPosition(cvs);
                isDrawing = true;
                triangle = new Polygon()
                {
                    Stroke= Brushes.Black,
                    StrokeThickness=2,
                    StrokeDashArray=new DoubleCollection() { 4,2},
                    Fill= new SolidColorBrush(Colors.Yellow),
                    Opacity=0.7
                };
                cvs.Children.Add(triangle);
                statusTbk.Text = $"Drawing triangle...";
            }           
        }

        private void cvs_MouseMove(object sender, MouseEventArgs e)
        {
            if(e.LeftButton==MouseButtonState.Pressed)
            {
                Point pos = e.GetPosition(cvs);
                statusTbk.Text = $"X:{pos.X},Y:{pos.Y}";
            }
           
            if(elpCbx.IsChecked==true)
            {
                if (isDrawing && elp != null)
                {
                    Point pt = e.GetPosition(cvs);
                    double width = pt.X - startPt.X;
                    double height = pt.Y - startPt.Y;

                    double left = startPt.X;
                    double top = startPt.Y;

                    if (width < 0)
                    {
                        left = pt.X;
                        width = -width;
                    }

                    if (height < 0)
                    {
                        top = pt.Y;
                        height = -height;
                    }

                    elp.Width = width;
                    elp.Height = height;
                    Canvas.SetLeft(elp, left);
                    Canvas.SetTop(elp, top);
                }
            }

            else if (rectCbx.IsChecked == true)
            {
                if(isDrawing && rect!=null)
                {
                    Point newPt= e.GetPosition(cvs);
                    double width= newPt.X - startPt.X;
                    double height= newPt.Y - startPt.Y;
                    double left=startPt.X;
                    double top=startPt.Y;

                    if (width<0)
                    {
                        left = startPt.X;
                        width = -width;
                    }

                    if (height<0)
                    {
                        top = startPt.Y;
                        height = -height;
                    }
                    rect.Width = Math.Max(width, 1);
                    rect.Height=Math.Max(height, 1);
                    Canvas.SetLeft(rect, left);
                    Canvas.SetTop(rect, top);
                }
            }
            else if (triangleCbx.IsChecked == true)
            {
                if(isDrawing &&  triangle!=null)
                {
                    secondPt= e.GetPosition(cvs);
                    double width= secondPt.X - startPt.X;
                    double height= secondPt.Y - startPt.Y;
                    PointCollection pts = new PointCollection();
                    pts = CreateFreeFormTriangle(startPt, secondPt);
                    triangle.Points = pts;
                }
            }
        }

        private PointCollection CreateFreeFormTriangle(Point start, Point end)
        {
            double width = end.X - start.X;
            double height = end.Y - start.Y;

            PointCollection points = new PointCollection();

            // Free form - use current mouse position as third vertex
            points.Add(start); // First vertex
            points.Add(new Point(start.X + width, start.Y + height)); // Second vertex (mouse position)
            points.Add(new Point(start.X, start.Y + height)); // Third vertex

            return points;
        }

        private void cvs_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if(elpCbx.IsChecked==true)
            {
                if (isDrawing && elp != null)
                {
                    elp.Opacity = 1.0;
                    elp.Fill = Brushes.SteelBlue;
                    elp.MouseRightButtonDown += Elp_MouseRightButtonDown;
                    isDrawing = false;
                    elp = null;
                }
            }
            else if (rectCbx.IsChecked == true)
            {
                if(isDrawing && rectCbx != null)
                {
                    Point endPt = e.GetPosition(cvs);
                    double width=Math.Abs(endPt.X-startPt.X);
                    double height=Math.Abs(endPt.Y-startPt.Y);
                    if(width>=5 && height>=5)
                    {
                        rect.StrokeDashArray = null;
                        rect.Opacity = 1.0;
                        rect.MouseRightButtonDown += Rect_MouseRightButtonDown;
                        rect.ToolTip = $"Rectangle:{rect.Width:F0}x{rect.Height:F0}";
                        statusTbk.Text = $"Rectangle drawn:{rect.Width:F0}x{rect.Height:F0}";
                    }
                    else
                    {
                        cvs.Children.Remove(rect);
                        statusTbk.Text = "Rectangle too small -removed";
                    }
                    isDrawing = false;
                    rect = null;
                }
            }
            else if (triangleCbx.IsChecked == true)
            {
                if(isDrawing && triangle!=null)
                {
                    double width=Math.Abs(secondPt.X-startPt.X);
                    double height=Math.Abs(secondPt.Y- startPt.Y);

                    if(width>=10 && height>=10)
                    {
                        triangle.StrokeDashArray = null;
                        triangle.Opacity = 1.0;
                        triangle.MouseRightButtonDown += Triangle_MouseRightButtonDown;
                        triangle.ToolTip = $"Triangle:{width:F0}x{height:F0}";
                        statusTbk.Text = $"Triangle drawn!";
                    }
                    else
                    {
                        cvs.Children.Remove(triangle);
                        statusTbk.Text = "Triangle too small-removed";
                    }

                    isDrawing = false;
                    triangle = null;
                }
            }
        }

        private void Triangle_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            if(sender is Polygon tempTriangle)
            {
                cvs.Children.Remove(tempTriangle);
                statusTbk.Text = "Triangle removed";
                e.Handled = true;
            }
        }

        private void Rect_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            throw new NotImplementedException();
        }

        private void Elp_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            if(sender is Ellipse tempElp)
            {
                cvs.Children.Remove(tempElp);
            }
        }

        private void elpCbx_Checked(object sender, RoutedEventArgs e)
        {
            rectCbx.IsChecked = false;
            triangleCbx.IsChecked = false;
        }

        private void elpCbx_Unchecked(object sender, RoutedEventArgs e)
        {

        }

        private void rectCbx_Checked(object sender, RoutedEventArgs e)
        {
            elpCbx.IsChecked = false;
            triangleCbx.IsChecked = false;
        }

        private void rectCbx_Unchecked(object sender, RoutedEventArgs e)
        {

        }

        private void triangleCbx_Checked(object sender, RoutedEventArgs e)
        {
            elpCbx.IsChecked= false;
            rectCbx.IsChecked = false;
        }

        private void triangleCbx_Unchecked(object sender, RoutedEventArgs e)
        {

        }
    }
}

 

 

image

 

 

 

 

 

 

 

 

 

image

 

 

image

 

 

 

 

image

 

 

 

image

 

 

 

image

 

posted @ 2025-09-26 21:51  FredGrit  阅读(5)  评论(0)    收藏  举报