为了账号安全,请及时绑定邮箱和手机立即绑定

动态用户控件事件未执行C#中的方法

动态用户控件事件未执行C#中的方法

C#
扬帆大鱼 2021-04-30 14:15:11
我正在努力弄清为什么我的用户控制事件没有执行。我在动态UserControl“ MainControl”中有一个动态UserControl“ MainMenu”。在MainMenu中,我有以下内容:public partial class MainMenu : UserControl{    public MainMenu()    {        InitializeComponent();        ///        ///Event Subscriptions        ///         this.LostFocus += this.MainMenu_LostFocus;    }    public void MainMenu_LostFocus(object sender, EventArgs e)    {        this.Visible = false;    }}在MainControl中:public partial class MainControl : UserControl{    private Custom_UI.MainMenu mainMenu = new Custom_UI.MainMenu();    public MainControl()    {        InitializeComponent();        mainMenu.Visible = false;        mainMenu.BringToFront();                    this.Controls.Add(mainMenu);        mainMenu.BringToFront();    }    private void menuButton1_Click(object sender, EventArgs e)    {        if (mainMenu.Visible)        {            mainMenu.Visible = false;                        }        else        {            mainMenu.Visible = true;            this.Focus();        }    }}最后是主要形式:public partial class Form1 : Form{    MainControl mainControl = new MainControl() {        Dock = DockStyle.Fill    };    public Form1()    {        InitializeComponent();        this.Controls.Add(mainControl);    }}因此,基本上,MainMenu_LostFocus当我单击表单上的其他位置时,不会调用该方法。我也尝试使用this.MouseLeave代替this.LostFocus。希望我已经足够清楚了,在此先感谢。
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

好的,以免尝试另一种改进的方法。原因是我们不想强迫我们处理添加到每个控件上的单击MainControl并强迫它获得焦点。只是笨拙。


我们还希望将整个代码封装在一个控件(MainMenu)中-不是“必须”,而是“一定要”


这是我的新主意:


 public partial class MainMenu : UserControl

    {


        //this class will be checking native windows messages, the one we're interested in is "MouseDown" with 0x0201 code 

        //(i won't be describing the whole stuff what is going inside: have that checked if you wish in documentation :)


        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]

        public class TestMessageFilter : IMessageFilter

        {

            const int WM_MOUSEMOVE = 0x200;

            const int WM_LBUTTONDOWN = 0x0201;


            public event EventHandler MouseMoved;

            public event EventHandler MouseDown;


            public bool PreFilterMessage(ref Message m)

            {

                // Blocks all the messages relating to the left mouse button.

                if (m.Msg == WM_LBUTTONDOWN)

                {

                    MouseDown?.Invoke(this, new EventArgs());

                }

                return false;

            }

        }



        public MainMenu()

        {

            InitializeComponent();


            //use our class that checks Windows Messages, subscribe it's event

            var tmf = new TestMessageFilter();

            tmf.MouseDown += UserControl1_MouseDown;

            //and add our class to Application's messages filter.

            Application.AddMessageFilter(tmf);


            //use "ordinary" events to detect mouse enter/mouse leave over control

            this.MouseLeave += UserControl1_MouseLeave;

            this.MouseEnter += UserControl1_MouseEnter;

        }


        private void UserControl1_MouseDown(object sender, EventArgs e)

        {

            //if mouse is not over control make it's visible false

            if (mouseLeft)

            {

                this.Visible = false;

            }

        }


        //variable to save mouse state (if that is over the control, or left)

        private bool mouseLeft;


        private void UserControl1_MouseEnter(object sender, EventArgs e)

        {

            mouseLeft = false;

        }



        private void UserControl1_MouseLeave(object sender, EventArgs e)

        {

            mouseLeft = true;

        }


    }

希望这个解决方案会更好,更实用


查看完整回答
反对 回复 2021-05-15

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号