为什么在面板上绘制的文字会消失?
我正在尝试在面板上绘制文本(面板有背景图片)。
它很棒,但是当我最小化然后最大化应用程序时,文本就消失了。
我的代码:
using (Graphics gfx = Panel1.CreateGraphics()) { gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); }
如何保持静态,以免丢失?
如果您不使用Paint
事件,则只需在控件恰好出现的屏幕上绘图。 控件没有意识到这一点,所以它不知道你打算让文本留在那里……
如果将要绘制的值放在面板的Tag
属性中,则可以对所有面板使用相同的paint事件处理程序。
此外,您需要正确处理Font对象,否则在将资源返回系统之前,您将有很多等待最终确定。
private void panel1_Paint(object sender, PaintEventArgs e) { Control c = sender as Control; using (Font f = new Font("Tahoma", 5)) { e.Graphics.DrawString(c.Tag.ToString(), f, Brushes.White, new PointF(1, 1)); } }
从Panelinheritance,添加一个表示您需要编写的文本的属性,并覆盖OnPaintMethod():
public class MyPanel : Panel { public string TextToRender { get; set; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); e.Graphics.DrawString(this.TextToRender, new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); } }
这样,每个Panel都会知道它需要渲染什么,并且知道如何绘制自己。
只需为Paint事件添加一个处理程序:
private void panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); }
当您绘制某些内容时,它只会在下次刷新表单时保留。
刷新表单时,将调用Paint事件。 因此,如果要确保文本不会消失,则需要在Paint事件中包含绘制它的代码。
您可以使用Control.Invalidate触发重绘,但您无法预测它们何时会发生。
- FieldConverter ConverterKind.Date“dd / MM / yyyy”exception
- 通过T4代码生成自动INotifyPropertyChanged实现?
- 使用Dyanmic字段名称使用LINQ查询实体
- “Where”子句中的动态表达式 – Linq to SQL
- 通过引用传递:多个接口的子节点
- 如何美化JSON以在TextBox中显示?
- 禁用LinkButton不会禁用javascript中的click事件
- 如何将MultipartMemoryStreamProvider的文件内容作为字节数组获取?
- 无法使用GetManifestResourceStream()加载嵌入式资源