我有一个usercontrol,其中包含一个动态加载到表单上的文本框。
在表单启动时,我启动usercontrol并将其可见性标记设置为“false”。
我希望在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();
}
答案 0 :(得分:2)
请参阅VisibleChanged事件。
答案 1 :(得分:2)
您可以尝试将文本框初始化代码添加到用户控件的Enter事件的处理程序中,当控件获得输入焦点时触发该事件,然后在激活控件的代码中触发,确保调用Focus方法控制将其设置为活动状态。你可能想要保留一个标志,这样只有在第一次出现控件获得输入焦点时才会这样做。
答案 2 :(得分:1)
Guillemaune在第一个回复中编写的应用解决方案!谢谢! 请记住,当对象不可见时(视情况而定)不要抛出函数
private void Control_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) {
if (e.Property.ToString().Equals("IsVisible") && (bool)e.NewValue)
doYourStuffHere();
}
答案 3 :(得分:0)
您可以订阅控件的VisibleChanged事件或覆盖OnVisibleChanged。要仅在显示用户控件时调用代码,请将方法调用到控制消息队列中。如果VisibleChanged在您的情况下失败,您也可以使用Paint事件尝试它,但我不这么认为。顺便说一句,为什么你通过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);
}
答案 4 :(得分:0)
由于您真正想要的是逐行填充文本框,我建议在触发VisibleChanged事件时启动计时器。在计时器的Tick事件中,您可以添加一行文本。如果您需要在第一个计时器滴答之前等待更长时间,则将计时器的延迟设置得更长,然后在第一次通过Tick事件处理程序时将其减少。