WPF实现一个完整的框选,以及超出框选区域后的处理,
CaptureMouse和ReleaseMouseCapture处理超出window部分处理
前端:
<Window x:Class="WpfApp1.BoxSelection"
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:WpfApp1"
mc:Ignorable="d"
Title="BoxSelection" Height="450" Width="800"
MouseDown="Window_MouseDown" MouseMove="Window_MouseMove" MouseUp="Window_MouseUp">
<Grid>
<Canvas Name="canvas" Width="400" Height="400" Background="AliceBlue">
<Rectangle Name="selectionBox" Visibility="Hidden" Stroke="Red" StrokeThickness="1"/>
</Canvas>
</Grid>
</Window>
代码:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace WpfApp1
{
/// <summary>
/// BoxSelection.xaml 的交互逻辑
/// </summary>
public partial class BoxSelection : Window
{
private Point startPoint;
private bool isDragging = false;
public BoxSelection()
{
InitializeComponent();
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(canvas);
Canvas.SetLeft(selectionBox, startPoint.X);
Canvas.SetTop(selectionBox, startPoint.Y);
selectionBox.Width = 0;
selectionBox.Height = 0;
selectionBox.Visibility = Visibility.Visible;
isDragging = true;
CaptureMouse();
}
private void Window_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging)
{
Point currentPoint = e.GetPosition(canvas);
double minX = startPoint.X < currentPoint.X ? startPoint.X : currentPoint.X;
double minY = startPoint.Y < currentPoint.Y ? startPoint.Y : currentPoint.Y;
double maxX = startPoint.X > currentPoint.X ? startPoint.X : currentPoint.X;
double maxY = startPoint.Y > currentPoint.Y ? startPoint.Y : currentPoint.Y;
// Ensure selection box stays within canvas bounds
minX = Math.Max(0, Math.Min(minX, canvas.ActualWidth));
minY = Math.Max(0, Math.Min(minY, canvas.ActualHeight));
maxX = Math.Max(0, Math.Min(maxX, canvas.ActualWidth));
maxY = Math.Max(0, Math.Min(maxY, canvas.ActualHeight));
Canvas.SetLeft(selectionBox, minX);
Canvas.SetTop(selectionBox, minY);
selectionBox.Width = maxX - minX;
selectionBox.Height = maxY - minY;
}
}
private void Window_MouseUp(object sender, MouseButtonEventArgs e)
{
selectionBox.Visibility = Visibility.Hidden;
isDragging = false;
ReleaseMouseCapture();
}
}
}