【问题标题】:C# click on controlC# 点击控件
【发布时间】:2014-11-02 22:16:36
【问题描述】:

我正在尝试创建一个自定义控件,它会在点击时触发偶数。 我的控件只是一个面板,里面有几个标签和一个图片框。

点击效果很好,唯一的问题是我必须点击控件的背景,如果我按下图片框,则无法正常工作。

我已将 on click 事件添加到控件中,但我想在它的每个位置按下以触发事件,而不仅仅是面板的背景。

我考虑过添加一个完全覆盖控件的透明对象。我实际上不喜欢这个想法,但是,我尝试过使用图片框,但我无法看穿它。它不透明。我只能看到面板背景,但它覆盖了标签和图像。

感谢您的支持。

【问题讨论】:

    标签: c# winforms custom-controls


    【解决方案1】:

    如果您的面板中只有几个对象,您可以将它包含的所有对象的Click 事件挂钩到同一个事件处理程序,这样做没有错。

    public class MyUserControl : UserControl
    {
        public event Action<MyUserControl> MyControlClick
    
        public string ID {get; set;}
    
        public MyUserControl()
        {
            InitializeComponents();
    
            // The same event handler code will be used for the three controls
            myPictureBox.Click += global_Click;
            myLabel1.Click += global_Click;
            myLabel2.Click += global_Click;
            this.Click += global_Click;
        }
    
        void global_Click(object sender, EventArgs e)
        {
            if (MyControlClick != null)
                MyControlClick(this);
        }
    }
    

    如果您有更多重要的对象,您可以依靠this answer 创建一个真正透明的面板来处理点击。缺点是您必须根据鼠标位置使用HitTest 检测单击了哪个对象。

    在表格方面:

    aControl.MyControlClick += aControl_MyControlClick;
    
    // ...
    
    // This code is triggered when a MyUserControl is clicked
    void aControl_MyControlClick(MyUserControl ctl)
    {
        MessageBox.Show(ctl.ID);
    }
    

    【讨论】:

    • 其实我更喜欢hook同一个点击事件,这样更简单。有没有办法继承子控件上的事件?
    • 我同意 :) 使用透明面板对于许多控件来说是值得的。例如,我正在使用这是一个项目,使用户能够移动和调整动态创建的控件。
    • 我正在为一个游戏创建一个服务器列表,每个服务器都有服务器名称、motd 和徽标/图像。所以这个自定义控件包含这三个元素,你可以点击任何你喜欢的地方来触发“选择服务器”动作。如果有东西可以自动化点击挂钩分配,我会很高兴。比如告诉孩子从父母那里继承......
    • 嗯,它可以使用代码而不是设计器快速完成(我编辑了我的答案)。如果您打算动态地向面板添加或删除控件,继承的事情会很有趣。
    • 是的,我刚刚这样做了.. 但我现在面临另一个问题:global_Click 方法包含发送者,它不再是控件本身。我使用sender参数从sender那里获取了一个属性,其实就是列表中被点击的服务器的服务器id..
    【解决方案2】:

    其实!除非您必须将自己的方法应用于您的用户控件,否则您不能向用户控件中的元素引发任何事件,或者您可以禁用用户控件中的元素,但它会更改该元素的颜色,但是当您单击时它会引发单击事件控制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多