记录这篇博客方便自己时间久了可以回顾。
Xaml文件:
<Window x:Class="Arrows.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:Arrows"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" MouseMove="Window_MouseMove" MouseLeftButtonDown="Window_MouseLeftButtonDown" >
<Canvas x:Name="ca1" >
<Canvas x:Name="ca">
</Canvas>
</Canvas>
</Window>
window标签中添加了鼠标移动和鼠标左键点击事件以及两个Canvas容器
CS文件:
下面就是简单的代码了,算法比较简单有待改进;
public MainWindow()
{
InitializeComponent();
//如果多次适用线段的话,记得移除事件,否则出现事件累加的情况
l1.AddHandler(Line.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.btn_MouseLeftButtonUp), true);
System.Drawing.Color c = ColorTranslator.FromHtml("Black");
SolidColorBrush SCB = new SolidColorBrush(System.Windows.Media.Color.FromArgb(c.A, c.R, c.G, c.B));
l1.Stroke = SCB;
l1.StrokeThickness = 2;
Lab.Foreground = SCB;
}
Line l1 = new Line();
Label Lab = new Label();
System.Windows.Point p = new System.Windows.Point();
int buttonDown = 0;
bool flag1 = false;
bool flag2 = false;
bool flag3 = false;
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (buttonDown == 0)
{
ca.Children.Remove(l1);
p = e.GetPosition(ca);
l1.X1 = p.X;
l1.Y1 = p.Y;
ca.Children.Add(l1);
ca.Children.Add(Lab);
buttonDown += 1;
}
else if (buttonDown == 1)
{
p = e.GetPosition(ca);
l1.X2 = p.X;
l1.Y2 = p.Y;
buttonDown += 1;
GetLabelPosition();
}
else if ((l1.X1 - p.X) * (l1.X1 - p.X) + (l1.Y1 - p.Y) * (l1.Y1 - p.Y) < 300)
{
flag1 = true;
}
else if ((l1.X2 - p.X) * (l1.X2 - p.X) + (l1.Y2 - p.Y) * (l1.Y2 - p.Y) < 300)
{
flag2 = true;
}
else if (((l1.X2 + l1.X1) / 2 - p.X) * ((l1.X2 + l1.X1) / 2 - p.X) + ((l1.Y2 + l1.Y1) / 2 - p.Y) * ((l1.Y2 + l1.Y1) / 2 - p.Y) < 300)
{
flag3 = true;
}
}
private void Window_MouseMove(object sender, MouseEventArgs e)
{
p = e.GetPosition(ca);
if (buttonDown == 0)
return;
else if (buttonDown == 1)
{
l1.X2 = p.X;
l1.Y2 = p.Y;
}
else if (flag1)
{
l1.CaptureMouse();
l1.Cursor = Cursors.Hand;
if (e.LeftButton == MouseButtonState.Pressed)
{
l1.X1 = p.X;
l1.Y1 = p.Y;
}
GetLabelPosition();
}
else if (flag2)
{
l1.CaptureMouse();
l1.Cursor = Cursors.Hand;
if (e.LeftButton == MouseButtonState.Pressed)
{
l1.X2 = p.X;
l1.Y2 = p.Y;
}
GetLabelPosition();
}
else if (flag3)
{
double x1 = l1.X1 + p.X - (l1.X2 + l1.X1) / 2;
double y1 = l1.Y1 + p.Y - (l1.Y2 + l1.Y1) / 2;
double x2 = l1.X2 + p.X - (l1.X2 + l1.X1) / 2;
double y2 = l1.Y2 + p.Y - (l1.Y2 + l1.Y1) / 2; ;
l1.CaptureMouse();
l1.Cursor = Cursors.Hand;
if (e.LeftButton == MouseButtonState.Pressed)
{
l1.X1 = x1;
l1.Y1 = y1;
l1.X2 = x2;
l1.Y2 = y2;
}
GetLabelPosition();
}
}
void btn_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Line tmp = (Line)sender;
tmp.ReleaseMouseCapture();
flag1 = false;
flag2 = false;
flag3 = false;
}
void GetLabelPosition()
{
if (l1.X1 <= l1.X2)
{
Canvas.SetLeft(Lab, l1.X2);
Canvas.SetTop(Lab, l1.Y2);
}
else
{
Canvas.SetLeft(Lab, l1.X1);
Canvas.SetTop(Lab, l1.Y1);
}
Lab.Content = Math.Sqrt(Math.Pow(l1.X2 - l1.X1, 2) + Math.Pow(l1.Y2 - l1.Y1, 2)).ToString("0.00");
}