![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]()