【问题标题】:C# form - controls losing dock state during threaded operationC# 表单 - 控制在线程操作期间丢失停靠状态
【发布时间】:2010-08-27 08:05:15
【问题描述】:

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

【问题讨论】:

  • 您的后台线程是否在访问您的任何 UI 控件?您是否正确使用 Invoke?
  • 以前从未听说过那个。我们需要重现代码。
  • 我正在 UI 控件上测试 InvokeRequired,所以这应该不是问题。我会尝试制作一个可重现的测试用例。

标签: c# winforms


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

    好吧,那太愚蠢了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2023-03-14
      • 2013-06-11
      • 2017-06-17
      • 1970-01-01
      相关资源
      最近更新 更多