【问题标题】:Window not fully painting until I grab and move it在我抓住并移动它之前,窗户没有完全绘画
【发布时间】:2021-11-10 23:31:54
【问题描述】:

我最近将一些图表添加到我正在使用实时数据更新的 WinForm 中。我的表单加载喜欢:

private void MyForm_Load (object sender, EventArgs e){
...bunch of code
//Waveforms
InitializeChartEKG();
InitializeSpO2WaveformChart();
InitializeEtCO2WaveformChart();
FillWaveformCharts();
}

实时图表是这样创建的:

public async void FillWaveformCharts() {
     waveformData = AnesthWaveformDatas.CreateWaveformObjects(anestheticRecordNum);
     Action action = () =>
     FillChartEKG(waveformData);
     Invoke(action);
     action = () =>
     FillChartSpO2(waveformData);
     Invoke(action);
     action = () =>
     FillChartEtCO2(waveformData);
     Invoke(action3);
}

然后,在每个 FillChart 方法中,我更新 UI 以使表单不会冻结:

public async void FillChartEKG (List<AnesthWaveformData> waveformData) {
 for (i = 0; i < waveformData.Count; i++){
   ...bunch of code that takes a long time to run...
  UpdateUI(); //updates UI to keep form from freezing

}

最后是 UpdateUI(),它更新 UI 以防止表单在图表中更新实时数据时冻结:

private void UpdateUI () {
   DispatcherFrame frame = new DispatcherFrame();
   Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, new 
   DispatcherOperationCallback(delegate (object parameter) {
     frame.Continue = false;
     return null;
   }), null);
   Dispatcher.PushFrame(frame);
}

所以这一切都很好 - 我的图表会随着从右到左的实时数据流进行更新,并且表单根本不会冻结。唯一的问题是,3/4 的表单控件没有在 Form_Load 上绘制。如果我抓住标题栏并移动窗口,控件将立即绘制。

我试过了:

this.Invalidate();
this.Update();

和:

this.Refresh();

在不工作的 FillWaveforms() 方法之后。

这是我在加载时看到的:

如果我抓住标题栏并稍微移动窗口,这就是它的样子:

有什么想法吗?

【问题讨论】:

  • 可能值得反复注释掉新代码并查看是什么位引入了问题。从症状来看,它似乎是一个损坏的图形上下文或从错误的线程操纵某些东西。如果您将慢速代码移动到另一个线程,则需要确保绘制结果的线程是正确的。
  • 是的,就是这样。使用该解决方案更新了答案。谢谢
  • @WilliamJ.Starck 欢迎您! :)

标签: c# winforms paint livecharts


【解决方案1】:

谢谢@Rekshino,就是这样。看起来我偶然发现了一个 Windows 错误。

添加

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
}

根据您提供的链接到我的表单顶部解决了问题。谢谢。

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多