C#UserControl的refresh不能重绘问题?

wyj5550422 2019-01-23 09:20:55
C#的winform用UserControl控件自己编制了一个控件,然后多窗口切换显示不同画面,在切换到该画面时,控件是刷新的,但是当切换的别的画面时,该控件就不再刷新,请大神帮看看。谢谢
在程序中一直运行控件NME的 this.NME.Refresh();但是却进不了控件的OnPaint()函数。当切换到该画面时立即进入OnPaint函数。
...全文
658 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
货郎大叔 2019-01-24
  • 打赏
  • 举报
回复
不错诶,winform都还是能做自定义控件
xuzuning 2019-01-24
  • 打赏
  • 举报
回复
this.NME.Refresh(); this.ME.Refresh(); this.ME.Invalidate(); MoveEnergy1.Invalidate(); MoveEnergy1.Refresh(); MoveEnergy1.Invalidate(); this.colorBar1.Refresh(); 这些都是通知子控件重绘,当然不会触发控件的 OnPaint Refresh() 调用 Paint 事件响应方法重绘 Invalidate() 触发 Paint 事件进行重绘 正常情况下只 Invalidate() 就可以了 Refresh() 不经过事件链,有时会破坏事件传递,非必要慎用
assky124 2019-01-24
  • 打赏
  • 举报
回复
切换完成后,你的界面显示么? 不显示刷新干嘛,绘图是最消耗资源的一个动作
wyj5550422 2019-01-24
  • 打赏
  • 举报
回复
解决了,搞明白一件事情,控件画图OnPaint时是在显示的情况下才可以重绘,是系统控制的,如果不显示,即使this.refresh()也是无效的。实质上刷新是数据的变化,只要数据时刻在滚动变化,那么等打开显示时进入OnPaint()刷新时自然而然显示就是自己想要的结果。同时 感谢@assky124,确实是不显示时无需刷新,也不会刷新。
wyj5550422 2019-01-24
  • 打赏
  • 举报
回复
切换后,界面不显示,但是数据在更新,等再次切换到这个界面时,数据依据滚动了好一会了,再显示时应该是滚动后的效果,现在是数据滚动了,但是显示的是从上次切换显示时位置开始的。如下
加入切换前显示
0000
1111
0000
0000
切换后界面不显示,数据刷新为
0000
0000
1111
0000
等我再切换回来的话显示应该是
0000
0000
1111
0000
但是实际上显示的是
0000
1111
0000
0000
然后再开始刷新为
0000
0000
1111
0000
wyj5550422 2019-01-23
  • 打赏
  • 举报
回复
代码如下:
/// <summary>
/// 刷新数据函数
/// </summary>
private void RefreshDowork()
{

float[] maxarray = new float[row];
float[] minarray = new float[row];
//cloudChartControl_NoMove1.RecHeight = (cloudChartControl_NoMove1.Height) / column;
//cloudChartControl_NoMove1.RecWidth = (cloudChartControl_NoMove1.Width) / row;
try
{
#region 坐标显示
paintX(); paintY(); paintY1(); paintY_ColorBar();
#endregion
#region 左侧显示图
n = n + 50; if (n == 500) n = 0;
//Random random = new Random();
for (int y = 0; y < 151; y++)
{
for (int x = 0; x < 241; x++)
{
this.NME._DataDisp[x, y] = (float)(n / 640f * 600f);
}
}
for (int x = 0; x < 241; x++)
{
ME._ArraryDisp[x] = (float)(n / 640f * 600f);
}

this.NME.Refresh();
this.ME.Refresh(); this.ME.Invalidate(); this.ME.Update();
MoveEnergy1.Invalidate(); MoveEnergy1.Refresh(); MoveEnergy1.Invalidate();
this.colorBar1.Refresh();
#endregion
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics grap = e.Graphics;
SolidBrush sb = new SolidBrush(Color.White);
grap.FillRectangle(sb, 0, 0, this.Width, this.Height);//填充颜色
//----数组滑动
for (int y = dataheight - 1; y > 0; y--)
{
for (int x = 0; x < datawidth; x++)
{
DataDisp[x, y] = DataDisp[x, y - 1];
}
}
for (int i = 0; i < datawidth; i++)//将显示的数据对第一行赋值
{
DataDisp[i, 0] = ArraryDisp[i];
}
//---数组数据转换为颜色显示
for (int y = 0; y < this.Height / recHeight; y++)
{
for (int x = 0; x < this.Width / recWidth; x++)
{
sb.Color = getColor((int)DataDisp[x, y]); //根据_Data值改变颜色;
grap.FillRectangle(sb, x * recWidth, y * recHeight, recWidth, recHeight);//填充颜色
}
}
}
wyj5550422 2019-01-23
  • 打赏
  • 举报
回复
自制控件主要用于能量的滑动显示,当切换到别的画面时,即使数据更新仍然进不了OnPaint()停留不刷新,但是切换到该画面的话,能进入OnPaint()

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧