Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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# Winforms控件赢得';t显示_C#_Winforms - Fatal编程技术网

C# Winforms控件赢得';t显示

C# Winforms控件赢得';t显示,c#,winforms,C#,Winforms,我正在从另一个Winforms对象(应该是一个简单的加载窗口)中调用Winforms窗口,但是当调用window.Show()时,我看到的是: 顶部空间应该是带有“等待”文本的标签,底部应该是动画GIF。我已逐步验证是否为此对象调用了InitializeComponent()。下面是调用它的代码: LoadWindow loading = new LoadWindow(); loading.Show(); loading.BringToFront

我正在从另一个Winforms对象(应该是一个简单的加载窗口)中调用Winforms窗口,但是当调用window.Show()时,我看到的是:

顶部空间应该是带有“等待”文本的标签,底部应该是动画GIF。我已逐步验证是否为此对象调用了InitializeComponent()。下面是调用它的代码:

        LoadWindow loading = new LoadWindow();
        loading.Show();
        loading.BringToFront();

        //Perform loading function in background worker
        //BackgroundWorker worker = new BackgroundWorker();
        //worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        //worker.RunWorkerAsync();

        // Close the loading window
        System.Threading.Thread.Sleep(10000);
        loading.Close();

暂停是为了调试目的,正如您所看到的,在我试图弄清楚这一点的时候,后台工作程序暂时没有运行。有人对如何正确显示此窗口有什么建议吗?

您可以通过调用
Thread.Sleep()
冻结UI线程。因此控件不能使其布局无效。 我猜,
load.Close()
的调用必须在
BackgroundWorker.RunWorkerCompleted
事件中

private void Show()
{
    LoadWindow loading = new LoadWindow();
    loading.Show();
    loading.BringToFront();

    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(
        (s, e) => 
        {
            // your logic
            Thread.Sleep(10000);
        });
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (s, e) =>
        {
            loading.Close();
        });
    worker.RunWorkerAsync();
}

通过调用
Thread.Sleep()
冻结UI线程。因此控件不能使其布局无效。 我猜,
load.Close()
的调用必须在
BackgroundWorker.RunWorkerCompleted
事件中

private void Show()
{
    LoadWindow loading = new LoadWindow();
    loading.Show();
    loading.BringToFront();

    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(
        (s, e) => 
        {
            // your logic
            Thread.Sleep(10000);
        });
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (s, e) =>
        {
            loading.Close();
        });
    worker.RunWorkerAsync();
}

我猜你的问题是在UI线程中调用
Thread.Sleep(10000)

一个可能的解决办法是:

public void LoadSomething()
{
 LoadWindow loading = new LoadWindow();
 loading.Show();
 loading.BringToFront();

 BackgroundWorker worker = new BackgroundWorker();
 worker.DoWork += new DoWorkEventHandler(worker_DoWork);
 worker.RunWorkerCompleted += WorkerOnRunWorkerCompleted;
 worker.RunWorkerAsync(loading)
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
 // Do your background-work here
 Thread.Sleep(10000);
 e.Result = e.Argument;
}

private void WorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
 LoadWindow loading= (LoadWindow)e.Result;
 loading.Close();
}

我猜你的问题是在UI线程中调用
Thread.Sleep(10000)

一个可能的解决办法是:

public void LoadSomething()
{
 LoadWindow loading = new LoadWindow();
 loading.Show();
 loading.BringToFront();

 BackgroundWorker worker = new BackgroundWorker();
 worker.DoWork += new DoWorkEventHandler(worker_DoWork);
 worker.RunWorkerCompleted += WorkerOnRunWorkerCompleted;
 worker.RunWorkerAsync(loading)
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
 // Do your background-work here
 Thread.Sleep(10000);
 e.Result = e.Argument;
}

private void WorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
 LoadWindow loading= (LoadWindow)e.Result;
 loading.Close();
}

如果你删除了Sleep(),你能不能把你的代码发布到那个
BackgroundWorker
上。同时发布
worker\u DoWork
-方法尝试删除
Sleep()
并通过
loading
BeginInvoke()
添加loading.Update()从
worker\u DoWork
调用
Close()
;是一个解决这个问题的黑客。不要将UI线程置于睡眠状态。
加载.Show()
在线程中运行?如果删除睡眠(),会怎么样?请发布您的代码与
BackgroundWorker
的外观。同时发布
worker\u DoWork
-方法尝试删除
Sleep()
并通过
loading
BeginInvoke()
添加loading.Update()从
worker\u DoWork
调用
Close()
;是一个解决这个问题的黑客。不要将UI线程置于睡眠状态。
加载.Show()
在线程中运行?谢谢Tomtom!我无法让(LoadWindow)e.Result工作,所以我唯一的选择就是加载一个全局变量(bleah),或者使用al amanat的建议并使用lambda。谢谢Tom!我无法让(LoadWindow)e.Result工作,所以我唯一的选择是让加载一个全局变量(bleah)或使用al-amanat的建议并使用lambda。