命中测试:是指某点是否在目标元素范围之内
HitTestResult hitTestResult=VisualTreeHelper.HitTest(this,point);
hitTestResult.VisualHit as DrawingVisual;
属性的类型时DependencyObject 即依赖对象,因此这里需要转换成 DrawingVisual类型
示例代码
using System.Windows;
using System.Windows.Media;
namespace WpfApp_DrawingVisual
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
MouseLeftButtonDown += MainWindow_MouseLeftButtonDown;
MouseRightButtonDown += MainWindow_MouseRightButtonDown;
}
private void MainWindow_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
Point point = e.GetPosition(myPanel);
Visual visual = GetVisual(point);
if (visual != null)
{
myPanel.DeleteVisual(visual);
}
}
private void MainWindow_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
Point pointClicked=e.GetPosition(myPanel);
DrawingVisual visual = new DrawingVisual();
DrawSqure(visual, pointClicked);
myPanel.AddVisual(visual);
}
public DrawingVisual GetVisual(Point point) {
HitTestResult hitTestResult = VisualTreeHelper.HitTest(this, point);
if (hitTestResult != null)
{
return hitTestResult.VisualHit as DrawingVisual;
}
else
return null;
}
private void DrawSqure(DrawingVisual visual, Point topLeftCorner)
{
DrawingContext dc = visual.RenderOpen();
Brush brush = Brushes.LightGreen;
Pen pen = new Pen(Brushes.SteelBlue, 3);
dc.DrawRectangle(brush, pen,new Rect(topLeftCorner, new Size(50, 50)));
dc.Close();
}
}
}
自定义容器类
using System.Collections.Generic;
using System.Windows.Controls;
using System.Windows.Media;
namespace WpfApp_DrawingVisual
{
public class MyPanel:Panel
{
private List<Visual> visuals = new List<Visual>();
protected override Visual GetVisualChild(int index)
{
return visuals[index];
}
protected override int VisualChildrenCount => visuals.Count;
public void AddVisual(Visual visual) {
visuals.Add(visual);
base.AddLogicalChild(visual);
base.AddVisualChild(visual);
}
public void DeleteVisual(Visual visual)
{
visuals.Remove(visual);
base.RemoveVisualChild(visual);
base.RemoveLogicalChild(visual);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!