C#表单 - 控制在线程操作期间丢失停靠状态

时间:2010-08-26 20:17:30

标签: c# winforms

我有一个带有菜单条,状态条和主拆分容器的表单(它本身包含其他拆分容器,树视图,选项卡控件等)。有时(相当频繁地,实际上),应用程序将停止调整主窗体内的控件(通常在后台线程操作期间或之后检索数据)。控件本身仍声称其DockStyle是Fill,但控件没有使用表单调整大小。我找不到任何可能导致此问题的信息,有没有人遇到过这样的事情?

2 个答案:

答案 0 :(得分:0)

确保从正确的线程操作UI至关重要。我建议使用以下扩展名methdds

public delegate void EmptyHandler();
public delegate void ParamHandler(params object[] args);

public static void SafeCall(this Control control, 
                      ParamHandler method, params object[] args)
{
    if (control.InvokeRequired)
    {
        control.Invoke(method, args);
    }
    else
    {
        method(args);
    }
}
public static void SafeCall(this Control control, EmptyHandler method)
{
    if (control.InvokeRequired)
    {
        control.Invoke(method);
    }
    else
    {
        method();
    }
}

然后你可以从错误的线程中调用适当的方法,比如

{  ... background thread 

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.SafeCall(SetImage, e.Result);
    }

 }

使用正确的线程调用方法SetImage(Bitmap bitmap)

答案 1 :(得分:0)

嗯,那太愚蠢了。

原来我有一个没有相应的ResumeLayout()调用的流氓SuspendLayout()调用。这种行为不是我所期望的。每天学些新东西!谢谢你的期待!