События OnEnter, OnLeave, OnGotFocus и OnLostFocus никогда не происходят для формы - PullRequest
0 голосов
/ 20 марта 2019

Я написал тестовую программу, чтобы попытаться понять некоторые события для Form и UserControl.Я щелкаю и выключаю приложение, и события OnEnter, OnLeave, OnGotFocus и OnLostFocus никогда не происходят для MyFakeForm.Почему нет?

using System.Windows.Forms;

namespace MyFakeFormAndViewText
{
    public partial class MyFakeForm : Form
    {
        public MyFakeForm()
        {
            InitializeComponent();

            MyUserControl myUserControl = new MyUserControl();

            Controls.Add(myUserControl);
        }

        protected override void OnEnter(EventArgs eventArgs)
        {
            base.OnEnter(eventArgs);
            System.Diagnostics.Trace.WriteLine("MyFakeForm.OnEnter(): eventArgs: " + eventArgs.ToString());
        }

        protected override void OnLeave(EventArgs eventArgs)
        {
            base.OnLeave(eventArgs);
            System.Diagnostics.Trace.WriteLine("MyFakeForm.OnLeave(): eventArgs: " + eventArgs.ToString());
        }

        protected override void OnGotFocus(EventArgs eventArgs)
        {
            base.OnGotFocus(eventArgs);
            System.Diagnostics.Trace.WriteLine("MyFakeForm.OnGotFocus(): eventArgs: " + eventArgs.ToString());
        }

        protected override void OnLostFocus(EventArgs eventArgs)
        {
            base.OnLostFocus(eventArgs);
            System.Diagnostics.Trace.WriteLine("MyFakeForm.OnLostFocus(): eventArgs: " + eventArgs.ToString());
        }

    }
}

using System.Windows.Forms;

namespace MyFakeFormAndViewText
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            //this.Load += new System.EventHandler(this.OnLoad);


            InitializeComponent();
        }

        private void OnLoad(object sender, EventArgs eventArgs)
        {
            System.Diagnostics.Trace.WriteLine("MyUserControl.OnLoad");
            //base.OnLoad(eventArgs);
            textBox1.Text = System.DateTime.Now.ToLongTimeString();

        }

        private void OnMyUserControlEnter(object sender, EventArgs eventArgs)
        {
            System.Diagnostics.Trace.WriteLine("MyUserControl.OnMyUserControlEnter: sender: " + sender + "\teventArgs:" + eventArgs);
        }

        private void OnMyUserControlLeave(object sender, EventArgs eventArgs)
        {
            System.Diagnostics.Trace.WriteLine("MyUserControl.OnMyUserControlLeave: sender: " + sender + "\teventArgs:" + eventArgs);
        }

        private void OnTextBox1Enter(object sender, EventArgs eventArgs)
        {
            System.Diagnostics.Trace.WriteLine("MyUserControl.OnTextBox1Enter: sender: " + sender + "\teventArgs:" + eventArgs);
        }

        private void OnTextBox1Leave(object sender, EventArgs eventArgs)
        {
            System.Diagnostics.Trace.WriteLine("MyUserControl.OnTextBox1Leave: sender: " + sender + "\teventArgs:" + eventArgs);
        }

        private void OnButton1Click(object sender, EventArgs eventArgs)
        {
            System.Diagnostics.Trace.WriteLine("MyUserControl.OnButton1Click: sender: " + sender + "\teventArgs:" + eventArgs);
        }
    }
}

using System.Windows.Forms;

namespace MyFakeFormAndViewText
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyFakeForm());
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Это потому, что формы обычно не получают фокус, а элементы управления в форме.Форма может быть заполнена элементами управления?Можете ли вы щелкнуть саму форму, а не элемент управления в форме?

Я думаю, что активированные / деактивированные события могут быть больше, чем вы хотите.
Они будут срабатывать всякий раз, когда форма становится активной или другой.форма становится активной.

0 голосов
/ 20 марта 2019

Я могу сказать по сигнатурам (EventArgs eventArgs), что вы написали это сами. Если бы VS сделал это за вас, они были бы "(отправитель объекта, EventArgs e)"

При отображении вида [Дизайн] выберите значок молнии в окне свойств. Дважды щелкните событие, для которого вы хотите настроить уведомление, и дайте Visual Studio подключить его для вас. enter image description here

Здесь нет волшебства .. вы также можете создавать делегатов (уведомления о событиях) вручную. Чтобы увидеть, что делает Visual Studio, посмотрите на MyFakeForm.Designer.cs и вы увидите, как назначаются события.

Удачи! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...