【问题标题】:User Control with button and button events带有按钮和按钮事件的用户控件
【发布时间】:2012-11-29 20:11:19
【问题描述】:

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

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

这一切都按原样工作。当我想在右上角(相对于图片框)添加一个按钮时出现问题。

1. 该按钮将没有相对于 PictureBox 的正确位置。它放置在第 0 个 Y 坐标处,这很好,但 X 坐标仅位于位置 100,它应该是 160。我在放置按钮时使用User Controls Width property,但它似乎得到了一个default value 的 100 个,而不是在窗体上创建 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

谢谢!

【问题讨论】:

    标签: c# user-controls


    【解决方案1】:

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

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

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

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

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

    HTH

    【讨论】:

    • 我知道 Anchor 属性,但不幸的是这也不是问题。
    猜你喜欢
    • 2013-02-07
    • 2016-01-15
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多