0

我在 Visual Studio 项目中有一个带有 TabControl 的表单,有 4 个选项卡。

当我加载表单时,我只准备了 3 个选项卡。

如果用户切换到第 4 个选项卡,我必须在选项卡中显示数据之前进行一些数学运算。

切换时我遇到一些图形伪影,如下所示:

在此处输入图像描述

(不要看模糊的,看中间的while条纹和右边的切割图形)

我在进行数学运算之前尝试了暂停布局,但可能在 TabControl.SelectedIndexChanged 中绘图已经开始。不,没有变化的事件。

我该如何解决这个问题?可能不使用单独的线程。

4

1 回答 1

2

由于您说在计算完成后工件会自行更正,这很可能是因为您没有给 UI 线程更新屏幕的机会,因为您正在花费 CPU 进行计算。您可能需要使用某种线程来解决问题。

Windows 窗体包含一个很好的BackgroundWorker控件,可以使此类任务变得非常简单。只需将控件从工具箱拖到表单设计器上,然后为DoWorkRunWorkerCompleted事件创建事件处理程序。将您的计算放在DoWork处理程序中,以及在处理程序中计算完成后需要对 UI 进行的任何更新RunWorkerCompleted(重要的是要注意,您不应从DoWork处理程序访问任何 UI 元素)。

这是一个简短的代码示例:

  public partial class Form1 : Form
  {
    private MyCalculationState _state;

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
      _state = new MyCalculationState();

      // Do some calculations
      _state.Value = 5;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      // Update the UI after calculations are complete
      textBox1.Text = _state.Value.ToString();
    }
  }
于 2012-09-21T14:56:01.690 回答