【发布时间】:2011-09-21 06:58:17
【问题描述】:
我有一个tabpage 用户控件和动态分配的tabpage 用户控件的3 个属性页。这个标签页控件显示在对话框中。
标签页控件的数据处理和过滤需要更多时间,这会导致在打开对话框之前显示忙碌图标超过 10 秒。
我想显示一个空的 Dialog 打开并显示忙碌图标,同时完成数据处理和过滤,最后显示在 Dialog 内。
这基本上是在改变处理顺序。
但是,我无法做到这一点,一旦打开对话框,它就会等待用户输入,并且在只给出输入后它会转到下一行。 (在调试过程中观察到)。
在下面的代码中,MnemonicSelector.InitializeMnemonicSelectorParameters(parameters); 行
负责处理和移动 showdialog 之后的处理和移动,当用户单击对话框下的属性页内的任何项目时导致找不到对象的操作。
public override MnemonicSelectorResult ShowMnemonicSelector(MnemonicSelectorSearchParameters parameters)
{
MnemonicSelector.InitializeMnemonicSelectorParameters(parameters);
ResizeMnemonicSelectorIfNeeded();
SetupMnemonicDialog(m_PropertyDialog, MnemonicSelector, MnemonicSelector.Title);
DialogResult dResult = ShowFakeDialog(m_PropertyDialog, MnemonicSelector.Title);
return MnemonicSelector.Result;
}
private void ResizeMnemonicSelectorIfNeeded()
{
if ((MnemonicSelector.ClientSize.Width < 909) || (MnemonicSelector.ClientSize.Height < 620))
m_PropertyDialog.ClientSize = new System.Drawing.Size(939, 697);
}
protected void SetupMnemonicDialog(PropertiesDialogControl propertydialog, PropertyPage page, string title)
{
List<PropertyPage> pages = new List<PropertyPage>();
pages.Insert(0, page);
PropertyPage[] propertyPages = pages.ToArray();
if (title != null)
propertydialog.Text = title;
propertydialog.SetPropertyPages(new List<PropertyPage>(propertyPages));
}
public virtual DialogResult ShowFakeDialog(Control contents, string title)
{
return ShowFakeDialog(contents, title, false, "");
}
public DialogResult ShowFakeDialog(Control contents, string title, bool isCancelButtonVisible, string cancelButtonText)
{
FakeDialog fakeDialog = new FakeDialog(this, contents, title, isCancelButtonVisible, cancelButtonText);
using (fakeDialog)
{
lock (this)
{
FakeDialog previousFakeDialog = _activeFakeDialog;
_activeFakeDialog = fakeDialog;
try
{
return fakeDialog.ShowDialog();
}
finally
{
_activeFakeDialog = previousFakeDialog;
}
}
}
}
请就我可以实现所需的功能提出建议,我可以稍后显示对话框并加载属性页(处理)。
【问题讨论】:
-
显示一个在 10 秒内无法使用的对话框对用户没有帮助。使用 BackgroundWorker 获取数据,这样 UI 就不会冻结。显示一个小小的“我正在处理它,而不是死掉”窗口,同时它运行动画,如选取框模式下的进度条。关闭该窗口并在 RunWorkerCompleted 事件处理程序中显示对话框。