猿问

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

我正在努力弄清为什么我的用户控制事件没有执行。我在动态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。


希望我已经足够清楚了,在此先感谢。


扬帆大鱼
浏览 198回答 2
2回答

www说

好的,以免尝试另一种改进的方法。原因是我们不想强迫我们处理添加到每个控件上的单击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;        }    }希望这个解决方案会更好,更实用
随时随地看视频慕课网APP
我要回答