m0_71976881 2025-01-07 14:43 采纳率: 25%
浏览 27
已结题

winform点击svg元素怎么获取到id

winform加载svg图,然后我想点击svg图上一个元素获取这个元素的id,怎么实现呢,以下是我原来的思路是:点击一个元素判断有没有超过范围,然后获取id,但是 if (element is SvgRectangle rect){}这个判断中rect要是为null,有没有好的解决方法

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            LoadSvg("D:\\11122.svg");
         
            //changElementColor();
        }
        SvgDocument svgDocument;

//加载svg图
        private void LoadSvg(string filePath)
        {
            svgDocument = SvgDocument.Open(filePath);

            // 将 SVG 转换为 Bitmap
            var bitmap = svgDocument.Draw();
            pictureBox1.Image = bitmap;
            //pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox1.MouseClick += PictureBox_MouseClick;
        }
//点击事件
  private void PictureBox_MouseClick(object sender, MouseEventArgs e)
        {
            foreach (var element in svgDocument.Children)
            {
                if (element is SvgVisualElement visualElement)
                {
                    Console.WriteLine(element.ID);
                    // 简单判断点击是否在元素的矩形范围内
                    if (IsPointInsideElement(e.Location, visualElement))
                    {
                        MessageBox.Show($"点击了元素: {visualElement.ID}");
                    }
                }
            }
        }
//判断图元范围
        private bool IsPointInsideElement(Point point, SvgVisualElement element)
        {
            // 判断点击点是否在图元范围内(根据元素的矩形范围来判断)
            if (element is SvgRectangle rect)
            {
                PointF pointF = new PointF(point.X, point.Y);
                var rectBounds = new RectangleF(rect.X, rect.Y, rect.Width, rect.Height);
                Console.WriteLine("element:" + element.ID + "  RectangleF===" + rect.X + "==" + rect.Y + "==" + rect.Width + "==" + rect.Height);
                Console.WriteLine("element:" + element.ID + "  pointF======" + pointF.X + "==" + pointF.Y);
                return rectBounds.Contains(pointF);
            }
            return false;
        }
  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-01-07 14:50
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    实现WinForm加载SVG图并实现点击获取元素ID的功能,可以采用以下步骤: 步骤一:引入必要的库和命名空间 确保安装了用于加载SVG图形的NuGet包,例如 Svg.Core 或 Svg.ExCSS。然后在代码文件中引入相关的命名空间,如:
    using System;
    using System.Windows.Forms;
    using Svg;
    

    步骤二:加载SVG图形并显示在WinForm中 在窗体加载时,读取SVG文件并显示在WinForm中,可以使用类似以下代码:

    private void Form1_Load(object sender, EventArgs e)
    {
        SvgDocument svgDocument = SvgDocument.Open(@"path_to_your_svg_file.svg");
        SvgPictureBox.Controls.Add(new PictureBox
        {
            Image = svgDocument.Draw(),
            Dock = DockStyle.Fill,
            SizeMode = PictureBoxSizeMode.AutoSize
        });
    }
    

    步骤三:实现点击获取元素ID的功能 为 SVG 图片注册鼠标点击事件,并在点击事件处理方法中获取点击的元素及其ID,可以参考以下代码:

    private void SvgPictureBox_Click(object sender, EventArgs e)
    {
        MouseEventArgs mouseEvent = e as MouseEventArgs;
        if (mouseEvent != null)
        {
            PictureBox pictureBox = sender as PictureBox;
            SvgDocument svgDocument = pictureBox.BackgroundImage as SvgDocument;
            
            if (svgDocument != null)
            {
                PointF svgPoint = new PointF(mouseEvent.X, mouseEvent.Y);
                SvgElement element = svgDocument.GetElementByPoint(svgPoint);
                
                if (element != null)
                {
                    string elementId = element.ID;
                    MessageBox.Show($"Clicked element ID: {elementId}");
                }
            }
        }
    }
    

    通过以上步骤,你可以在WinForm中加载SVG图形,并实现点击获取元素ID的功能。当点击SVG图中的元素时,将显示该元素的ID。

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月18日
  • 专家已采纳回答 1月10日
  • 修改了问题 1月7日
  • 创建了问题 1月7日