C# 显示Windows对话框后如何进行处理?

C# 显示Windows对话框后如何进行处理?,c#,windows,dialog,C#,Windows,Dialog,我有一个tabpage用户控件和3个动态分配的tabpage用户控件属性页。此选项卡页控件显示在对话框中 public override MnemonicSelectorResult ShowMnemonicSelector(MnemonicSelectorSearchParameters parameters) { MnemonicSelector.InitializeMnemonicSelectorParameters(parameters); ResizeMnemonicS

我有一个
tabpage
用户控件和3个动态分配的
tabpage
用户控件属性页。此选项卡页控件显示在对话框中

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;
            }
        }
    }
}
tabpage控件的数据处理和过滤需要更多的时间,这会导致在打开对话框之前显示一个忙图标超过10秒

我想显示一个打开的空
对话框
,并在数据处理和过滤完成时显示忙碌图标,最后显示在
对话框

这基本上改变了处理的顺序

但是,我无法实现这一点,一旦打开对话框,它将等待用户输入,在只给出输入后,它将进入下一行。(如调试期间所观察到的)

在下面的代码中,
MnemonicSelector.InitializeMnemonicSelectorParameters(参数)行
当用户单击对话框下属性页内的任何项目时,负责处理和移动showdialog导致object not found操作之后的内容

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;
            }
        }
    }
}
公共覆盖助记符选择器或结果显示助记符选择器(助记符选择器搜索参数)
{
助记符选择项。初始化函数选择项参数(参数);
ResizeMonicSelectorIfNeed();
设置助记符对话框(m_PropertyDialog,助记符选择器,助记符选择器.Title);
DialogResult dResult=ShowFakeDialog(m_PropertyDialog,助记符Selector.Title);
返回助记符选择器。结果;
}
私有void ResizeMonicSelectorIfNeed()
{
if((助记符select.ClientSize.Width<909)| |(助记符select.ClientSize.Height<620))
m_PropertyDialog.ClientSize=新系统.Drawing.Size(939697);
}
受保护的无效设置助记符对话框(属性对话框控件属性对话框,属性页面,字符串标题)
{
列表页=新列表();
页码。插入(0,第页);
PropertyPage[]PropertyPage=pages.ToArray();
如果(标题!=null)
propertydialog.Text=标题;
setPropertyPage(新列表(PropertyPage));
}
公共虚拟对话框结果ShowFakeDialog(控件内容、字符串标题)
{
返回ShowFakeDialog(内容、标题、假“);
}
公共对话框结果ShowFakeDialog(控件内容、字符串标题、bool isCancelButtonVisible、字符串cancelButtonText)
{
FakeDialog FakeDialog=新建FakeDialog(此,内容,标题,isCancelButtonVisible,cancelButtonText);
使用(伪造对话框)
{
锁(这个)
{
FakeDialog previousFakeDialog=\u activeFakeDialog;
_activeFakeDialog=fakeDialog;
尝试
{
返回fakeDialog.ShowDialog();
}
最后
{
_activeFakeDialog=previousFakeDialog;
}
}
}
}

请告知我可以实现所需的功能,其中,我可以稍后显示对话框并加载属性页(处理)。

您应该为此使用后台工作线程。检查。使用后台工作线程将进度动画从处理逻辑中分离出来应该会有帮助。

为此,应该使用后台工作线程。检查。使用后台工作程序将进度动画从处理逻辑中分离出来应该会有帮助。

显示一个10秒钟内无法使用的对话框对用户没有帮助。使用BackgroundWorker获取数据,这样UI就不会冻结。显示一个小窗口“我正在处理它,不是死的”,而它运行的动画,如在字幕模式下的进度条。关闭该窗口并在RunWorkerCompleted事件处理程序中显示对话框。显示一个在10秒钟内无法使用的对话框对用户没有帮助。使用BackgroundWorker获取数据,这样UI就不会冻结。显示一个小窗口“我正在处理它,不是死的”,而它运行的动画,如在字幕模式下的进度条。关闭该窗口并在RunWorkerCompleted事件处理程序中显示该对话框。