[英]C# WinForms Control on order changed event
我有一个带有自定义“选项卡”概念的WinForms应用程序,其中有3个按钮,它们分别调用其面板“ BringToFront()”方法。
由于这些面板都是在初始化窗体时初始化的,但是包含它们自己的单独功能,因此在将面板“切换”之前,我不想初始化一些更复杂的任务。
例如,我的一个面板具有Twitter连接功能。 如果我在面板初始化上初始化Twitter连接,则在理论上用户位于完全不同的面板/功能上时可能会失败。
我只希望用户访问此面板后尝试连接到Twitter。
因此,我一直在阅读MSDN,但找不到更改控件显示顺序时触发的事件。
我遇到过这些事件,但不确定哪些/如果是最好的,或者是最好的:
Panel.OnVisibleChanged Panel.OnEnter Panel.OnGotFocus
我仍在学习C#,因此感谢您的任何帮助/评论。
我遇到了同样的问题,并通过使每个选项卡实现接口并在每次尝试加载它时都对其进行尝试来修复它(我希望这是有道理的)( https://github.com/WithoutCaps/LimitlessUI/blob/master/ LimitlessUI / TabsAdapter_WOC.cs )
30/31行
if(tab is Tab_WOC)
((Tab_WOC)tab).onShowTab();
随时使用此代码/库
注意:也有演示应用程序!
这个问题是后台任务的一个很好的例子。 一旦感觉到当前面板的属性已设置,就可以开始在后台初始化其他面板。 Panel的tag属性可用于保留布尔值(无论是否设置)。 此外,您可以隐藏和显示面板的而不是BringToFront。 这将触发VisibleChanged事件,并且一旦可见就易于捕获和处理。 这是为了向您展示后台工作人员代码将如何。
private void BackgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
if (!Convert.ToBoolean(Panel1.Tag)) {
//Intialize panel1
Panel1.Tag = true;
}
if (!Convert.ToBoolean(Panel2.Tag)) {
//Intialize panel2
Panel2.Tag = true;
}
if (!Convert.ToBoolean(Panel3.Tag)) {
//Intialize panel3
Panel3.Tag = true;
}
}
显然,我不知道您的项目布局如何,但我看到两个选择。
选项1:延迟加载的属性
创建一个属性,在调用该属性时将检查字段是否为空,如果为空,则通过调用所需的任何昂贵的类构造函数来对其进行初始化。
public TwitterCommunicator TwitterCommunicator => _twitterCommunicator ?? (_twitterCommunicator = new TwitterCommunicator());
public void AnotherTwitterPanelMethod()
{
TwitterCommunicator.LoadTweets();
}
选项2:使用Lazy<T>
类似于延迟加载属性。 实际使用Lazy,当您实际希望对对象进行初始化时,它可以提供对对象的延迟初始化。
public partial class MainForm : Form
{
public MainForm()
{
Lazy<TwitterCommunicator> _lazyTwitter = new Lazy<TwitterCommunicator>();
}
}
public void SomeTwitterPanelMethod()
{
_lazyTwitter.Value.LoadTweets();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.