0

我目前正在开发我的第一个用户控件,现在遇到了一些小问题。

该控件是一个自定义PictureBox的,Button用于清除图片。我正在重写该OnPaint(PaintEventArgs e)方法并使控件无效MouseEnterMouseLeave根据鼠标状态为控件绘制新边框。

这一切都应该正常工作。当我想在右上角(相对于图片框)添加一个按钮时,就会出现问题。

1. 按钮相对于 PictureBox 的位置不正确。它被放置在第 0 个 Y 坐标处,这很好,但 X 坐标仅位于位置 100,它应该是 160。我User Controls Width property在放置按钮时使用的是,但它似乎得到了default value100分配在窗体上创建 PictureBox 的 160 个。

CustomPictureBox cpic = new CustomPictureBox();
cpic.Location = new Point(20, 20);
cpic.Height = 80;
cpic.Width = 160;
this.Controls.Add(cpic);

按钮是这样添加的:

btnClear = new Button();
btnClear.Width = 20;
btnClear.Height = 20;
btnClear.Location = new Point(this.Width - btnClear.Width, 0);
btnClear.Text = "X";
this.Controls.Add(btnClear);

这个 DefaultValue 来自哪里,它如何阻止控件使用它,而是遵循在初始化控件的新实例时指定的宽度?

2. 另一件事是我无法让按钮工作的事件。我一直在谷歌上搜索并尝试了我能想到的一切,但事件仍然没有触发:(

必须可以直接从用户控件连接到按钮 MouseClick、MouseEnter 和 MouseLeave 事件吗?

如果你想看完整的代码,你可以在这里找到:http: //pastebin.com/vL14Q5CX

谢谢!

4

1 回答 1

0

该按钮未按预期对齐,因为:

  1. 按钮的位置在用户控件的构造函数中设置
  2. 然后在表单中设置用户控件的宽度
  3. 未处理用户控件的 Resize 事件

在您的用户控件中连接 Resize 事件并更新按钮的位置,即:

private void CustomPictureBox1_Resize(object sender, EventArgs e)
{
    btnClear.Location = new Point(this.Width - btnClear.Width, 0);
}

按钮单击事件不起作用的原因是它们只会冒泡到父用户控件;托管控件的表单不会收到它们。您需要在您的用户控件上创建一个新的自定义事件处理程序,该处理程序是从用户控件的按钮单击事件中触发的。然后,您在表单上处理该自定义事件处理程序。

高温高压

于 2012-11-29T20:40:15.037 回答