2

我是新来的,这是我在这里的第一篇文章。如果我不遵循在 SO 上创建新问题的标准,我深表歉意。

在过去的几个小时里,我一直在绞尽脑汁尝试编写一个自定义类,它允许我向现有的 PictureBox 控件添加一个新属性,允许我为我的自定义属性设置一个颜色,这将导致设置当用户悬停控件时,带有所选颜色的边框。

以下是我到目前为止编写的代码:

[ProvideProperty("HoverColor", typeof(PictureBox))]
public class PictureBoxHover : Component, IExtenderProvider
{
    private readonly Dictionary<IntPtr, Color> _hoverColors;
    public PictureBoxHover()
    {
        _hoverColors = new Dictionary<IntPtr, Color>();
    }
    public bool CanExtend(object extendee)
    {
        return (extendee is PictureBox);
    }
    public Color GetHoverColor(PictureBox picb)
    {
        Color color;
        if (_hoverColors.TryGetValue(picb.Handle, out color))
            return color;
        return Color.Empty;
    }
    public void SetHoverColor(PictureBox picb, Color color)
    {
        Color hoverColor;
        _hoverColors[picb.Handle] = color;
    }
}

上面的代码将自定义属性“HoverColor”添加到我的解决方案中的所有现有 PictureBox 控件 - 正如我需要的那样。我现在需要做的就是当用户将鼠标悬停在控件上时,以某种方式让它使用设置的颜色在我的 PictureBoxes 周围绘制一个边框。

我不希望我的类继承 PictureBox 或 Control 类,因为这需要将我的所有 PictureBoxes 从普通的 PictureBox 更改为我的自定义 PictureBox - 这就是为什么我想“附加”这个自定义属性和功能普通的 PictureBox 控件。

任何帮助将不胜感激 =)

4

1 回答 1

0

也许您可以通过使用自定义用户控件而不是为图片框创建扩展属性来更简单地实现您的目标。下面是一个简单的示例:

public class FramedPictureBox : UserControl
{
    private readonly PictureBox _pictureBox;

    public FramedPictureBox()
    {
        const int FRAME_SIZE = 3;
        _pictureBox = new PictureBox
                          {
                              Left = FRAME_SIZE,
                              Top = FRAME_SIZE,
                              Width = Width - 2*FRAME_SIZE,
                              Height = Height - 2*FRAME_SIZE,
                              Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Top
                          };

        _pictureBox.MouseEnter += OnPictureBoxMouseEnter;
        _pictureBox.MouseLeave += OnPictureBoxMouseLeave;

        Controls.Add(_pictureBox);
    }

    protected override void OnLoad(EventArgs e)
    {
        var image = new Bitmap(_pictureBox.Width, _pictureBox.Height);
        var graphics = Graphics.FromImage(image);
        graphics.Clear(Color.White);

        _pictureBox.Image = image;

        base.OnLoad(e);
    }

    private void OnPictureBoxMouseEnter(object sender, EventArgs e)
    {
        BackColor = Color.Red;
    }

    private void OnPictureBoxMouseLeave(object sender, EventArgs e)
    {
        BackColor = SystemColors.Control;
    }
}
于 2013-02-14T11:53:05.593 回答