代码如下:
using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; namespace WpfAppTest { public class SelectBoxRect { private Canvas MyCanvas { get; set; } private Point _startPoint; private Rectangle _drawingRectangle; public SelectBoxRect(Canvas canvas) { MyCanvas = canvas; _drawingRectangle = new Rectangle { Stroke = Brushes.Red, StrokeThickness = 2, StrokeDashArray = new DoubleCollection(new List<double>() { 4, 2 }), Width = 0, Height = 0 }; MyCanvas.Children.Add(_drawingRectangle); canvas.MouseLeftButtonDown += MyCanvas_MouseLeftButtonDown; canvas.MouseMove += MyCanvas_MouseMove; canvas.MouseLeftButtonUp += MyCanvas_MouseLeftButtonUp; } private void MyCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { _drawingRectangle.Visibility = Visibility.Visible; _startPoint = e.GetPosition(MyCanvas); Canvas.SetLeft(_drawingRectangle, _startPoint.X); Canvas.SetTop(_drawingRectangle, _startPoint.Y); } private async void MyCanvas_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { await UpdateRectangleAsync(e.GetPosition(MyCanvas)); } } private void MyCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { _drawingRectangle.Visibility = Visibility.Collapsed; } private async Task UpdateRectangleAsync(Point currentPoint) { try { await Task.Run(() => { Application.Current.Dispatcher.Invoke(() => { double width = currentPoint.X - _startPoint.X; double height = currentPoint.Y - _startPoint.Y; _drawingRectangle.Width = Math.Abs(width); _drawingRectangle.Height = Math.Abs(height); if (width < 0) { Canvas.SetLeft(_drawingRectangle, currentPoint.X); } if (height < 0) { Canvas.SetTop(_drawingRectangle, currentPoint.Y); } }); }); } catch { } } } }
如何调用:
一行代码调用即可,DrawingContainer指的是界面元素,绘制主题
new SelectBoxRect(DrawingContainer);
XAML代码参考:
<Window x:Class="WpfAppTest.shiliangTest" 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:WpfAppTest" PreviewMouseWheel="Window_PreviewMouseWheel" mc:Ignorable="d" Title="shiliangTest" Height="800" Width="1000"> <Grid> <Canvas x:Name="DrawingContainer" Width="800" Height="800" Panel.ZIndex="1" /> </Grid> </Window>