Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在usercontrol完全可见后执行方法_C#_.net_Winforms - Fatal编程技术网

C# 如何在usercontrol完全可见后执行方法

C# 如何在usercontrol完全可见后执行方法,c#,.net,winforms,C#,.net,Winforms,我有一个usercontrol,其中包含一个文本框,我可以动态加载到表单中。 在表单启动时,我启动usercontrol并将其可见性标记设置为“false”。 我想在usercontrol变为可见时自动触发一个方法,因为此方法将一些输出写入文本框,所以此方法应仅在usercontrol及其继承的所有控件变为可见后才开始执行。 我认为paintEventHandler应该是表单及其继承控件在控件的可见性更改后重新绘制时触发的最后一个事件。 因此,订阅paintEventHandler应该在表单完

我有一个usercontrol,其中包含一个文本框,我可以动态加载到表单中。 在表单启动时,我启动usercontrol并将其可见性标记设置为“false”。 我想在usercontrol变为可见时自动触发一个方法,因为此方法将一些输出写入文本框,所以此方法应仅在usercontrol及其继承的所有控件变为可见后才开始执行。

我认为paintEventHandler应该是表单及其继承控件在控件的可见性更改后重新绘制时触发的最后一个事件。

因此,订阅paintEventHandler应该在表单完全重新绘制后触发我订阅的方法,但显然不是,我的方法在文本框仍然隐藏时执行,只有在方法完成执行后才可见。

有什么想法吗

private void processControl_SetActive(object sender, CancelEventArgs e)
        {

            this.BeginInvoke((MethodInvoker)delegate
           {
               this.Paint += new PaintEventHandler(processControl_Paint);
           });

        }

void processControl_Paint(object sender, PaintEventArgs e)
        {
            //Should only be called when everything is fully loaded and visible on the form.
            //Application.DoEvents()  ->probably bad idea??
            AddStuffToTextBox();
        }

请参阅事件。

请参阅事件。

您可以订阅控件的VisibleChanged事件或覆盖OnVisibleChanged。若要仅在显示用户控件时调用代码,请将方法调用发布到控件消息队列中。如果VisibleChanged在您的案例中失败,您也可以尝试使用Paint event,但我不这么认为。顺便问一下,为什么要通过BeginInvoke添加事件

void OnVisibleChanged(EventArgs e)
{
    //Should only be called when everything is fully loaded and visible on the form.
    //Application.DoEvents()  -> actually bad idea!!
    if (IsHandleCreated)
        BeginInvoke(new MethodInvoker(AddStuffToTextBox));
    base.OnVisibleChanged(e);
}

您可以订阅控件的VisibleChanged事件或重写OnVisibleChanged。若要仅在显示用户控件时调用代码,请将方法调用发布到控件消息队列中。如果VisibleChanged在您的案例中失败,您也可以尝试使用Paint event,但我不这么认为。顺便问一下,为什么要通过BeginInvoke添加事件

void OnVisibleChanged(EventArgs e)
{
    //Should only be called when everything is fully loaded and visible on the form.
    //Application.DoEvents()  -> actually bad idea!!
    if (IsHandleCreated)
        BeginInvoke(new MethodInvoker(AddStuffToTextBox));
    base.OnVisibleChanged(e);
}

您可以尝试将文本框初始化代码添加到用户控件的Enter事件的处理程序中,该事件在控件获得输入焦点时触发,然后在激活控件的代码中确保调用控件上的focus方法以将其设置为活动。您可能希望保留一个标志,以便仅在控件获得输入焦点的第一次出现时才执行此操作。

您可以尝试将文本框初始化代码添加到用户控件的Enter事件的处理程序中,当控件获得输入焦点时激发,然后在激活控件的代码中确保调用控件上的focus方法将其设置为活动。您可能希望保留一个标志,以便仅在控件第一次获得输入焦点时才执行此操作。

因为您真正想要做的是逐行填充文本框,所以我建议在触发VisibleChanged事件时启动计时器。在计时器的勾号事件中,可以添加一行文本。如果您需要在第一个计时器开始计时之前等待更长的时间,请将计时器的延迟设置得更长,然后通过计时事件处理程序将其减少为第一次。

因为您真正想做的是逐行填充文本框,我建议在触发VisibleChanged事件时启动计时器。在计时器的勾号事件中,可以添加一行文本。如果需要在第一个计时器滴答声之前等待更长时间,请将计时器的延迟设置得更长,然后通过滴答声事件处理程序将其减少到第一个时间。

Guillemaune在第一次回复时编写的应用解决方案!谢谢 请记住,当对象不可见时,不要抛出函数(这取决于具体情况)


Guillemaune在第一次回复时编写的应用解决方案!谢谢 请记住,当对象不可见时,不要抛出函数(这取决于具体情况)


请参见此处的链接,了解表单生命周期的“VisibleChanged”在“Paint”事件之前被触发,因此这不起作用。在UserControl的visible changed上注册,而不是在表单上注册。VisibleChanged。请参阅此处表单生命周期的链接,“VisibleChanged”在“Paint”事件之前被触发,因此这将不起作用。在UserControl的visible changed上注册,而不是在Form.VisibleChanged上注册。您试图从更高的级别实现什么?例如,为什么在文本框不可见时向其添加文本是不可接受的?让我们帮助您尝试解决真正的问题,这可能涉及到与您在问题中概述的方法不同的方法。但是,如果用户在文本框中添加一行又一行的文本,并且在这两行之间有一定的延迟,那么用户就可以看到文本框从一开始就被填满了。现在,表单仍在加载时写入文本框的行在表单完成后立即出现。在“visibleChanged”事件上注册显然不起作用。我更希望看到这样一个事件:“我现在已经完成加载和处理所有UI事件,您现在可以在表单上添加/使用任何控件了”。您试图从更高的级别实现什么?例如,为什么在文本框不可见时向其添加文本是不可接受的?让我们帮助您尝试解决真正的问题,这可能涉及到与您在问题中概述的方法不同的方法。但是,如果用户在文本框中添加一行又一行的文本,并且在这两行之间有一定的延迟,那么用户就可以看到文本框从一开始就被填满了。现在,表单仍在加载时写入文本框的行在表单完成后立即出现。在“visibleChanged”事件上注册显然不起作用。我更希望看到这样一个事件:“我现在已经完成加载和处理所有UI事件,您现在可以在表单上添加/使用任何控件”。