如何获得picturebox的非公开成员的价值?

时间:2010-07-22 09:04:28

标签: c#

我需要从图片框的非公开成员中获取Image矩形的值。

如何获得该值?

提前致谢。

3 个答案:

答案 0 :(得分:9)

这是使用反射获取值的方法:

PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", 
    System.Reflection.BindingFlags.Public | 
    System.Reflection.BindingFlags.NonPublic | 
    System.Reflection.BindingFlags.Instance);

Rectangle rectangle = (Rectangle)pInfo.GetValue(pictureBox1, null);

虽然正如乔恩所说,但可能有更好的方法来实现你想要做的事情。通过反射访问私人成员通常是一个非常大的代码味道。

答案 1 :(得分:2)

嗯,你可以用反射来做...但你不应该这样做。目前尚不清楚“图像矩形的值”究竟是什么意思,但你绝对应该尝试通过公共API完成所有这些工作。你想要实现什么目标?可能有不同的方式。

编辑:好的,现在我看到你想要访问的属性......你可能对2004年提交的这个Connect issue感兴趣。你并不是唯一一个想要这个... ...不管你是否因为同样的原因需要它,我不知道。

答案 2 :(得分:0)

虽然Nivas没有陈述他想要完成的任务,但我怀疑它与我刚刚看到的相似 - 将用户绘制的(即裁剪)矩形转换为图片框的图像空间。我没有像RvdK建议的那样尝试继承,我使用反射方法作为快速解决方法。 RvdK的建议或Microsoft开放的替代方法是访问ImageRectangle,将提供RectangleToImageRectangle方法。我想我可以包装一个继承自PB的对象...

Microsoft Connect Issue链接已损坏。

这是我使用的代码,它提供了PB图像的矩形,并测试了.Zoom和.StretchImage模式:

PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle",
            System.Reflection.BindingFlags.Public |
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Instance);

Rectangle ImRectangle = (Rectangle)pInfo.GetValue(pictureBox1, null);

Point rTL = new Point((rectCropArea.Left - ImRectangle.Left) * pictureBox1.Image.Width / ImRectangle.Width,
                      (rectCropArea.Top - ImRectangle.Top) * pictureBox1.Image.Height / ImRectangle.Height);
Size rSz = new Size(pictureBox1.Image.Width * rectCropArea.Width / ImRectangle.Width,
                    pictureBox1.Image.Height * rectCropArea.Height / ImRectangle.Height);

'rect' = new Rectangle(rTL,rSz);