c# - 如何从主窗体控制或停止动态用户控件的绘制事件?
问题描述
我对一件小事有一个大问题。我正在编写一个消息传递应用程序。
这是我使用的布局: Main Form --> container (UserControl) --> bubble(UserControl)
我将这些参数发送到容器
this.container1.addOutMessage(message, get_min_sec(time), tickStatus);
容器本身会动态创建气泡。
public void addOutMessage(string message, string time, int tick_status) {...}
根据我在这个论坛上得到的建议,我在 Paint 事件中绘制了消息气泡的内容。由于创建时宽度和高度信息尚不清楚,我无法正确创建消息之间的垂直距离。
这就是我创建这个函数的原因。
public void ContaninerConfigure()
{
int counter = 0;
int keepBottom = 0;
foreach (var item in container1.panel.Controls.OfType<Control>().OrderBy(ee => ee.TabIndex))
{
//SuspendDrawing(item);
if (item != null)
{
if (counter != 0)
{
item.Top = keepBottom + 10;
keepBottom = item.Bottom;
}
else keepBottom = item.Top + item.Height;
}
counter++;
}
counter = 0;
}
然后
我的问题从这里开始。当我将它添加到容器的调整大小事件中时,它工作正常,但是当我在加载消息后在主窗体中调用它时,它根本不起作用。Paint 事件在每次滚动移动时继续运行。在容器的 resize 事件中,只有出现在屏幕上的消息气泡是对齐的。当我向上滚动时,它可能会再次崩溃。然后需要再次调用之前的函数来对齐。
我没有在 Bubble(UC) 中访问 Paint 事件,它是在 Container(UC) 中动态创建的。这就是为什么我无法控制 Paint 事件,它的运行或停止。
经过一番研究,我发现了 SuspendDrawing 方法。我以这种方式实现了它,但我不想使用它。25 个气泡在面板上排成一行需要 3 秒,并且主窗体在编译期间保持“最新”。
必须有一种更实际的方法来做到这一点。例如,我不知道如何从主窗体中检查气泡(UC)中的布尔值。
如果您对此问题有任何想法,请提供帮助。
解决方案
推荐阅读
- go - 结构中的空字段会消耗内存吗?
- r - 在导航栏闪亮布局中使用 boostrap 页脚类
- business-objects - 业务对象:带有空请求的计划
- javascript - 有没有办法恢复动画循环计时器的动画?
- anychart - 如何使用不同的参数进行排序和着色而不是值
- google-app-engine - 使用 Google 脚本解析 RSS 翻译
- docker - 如何为 Ubuntu VM 增加 docker 容器的 CPU 和内存?
- javascript - 如何将条件放入道场的功能中
- ios - 无法从自定义框架呈现 SwiftUI 预览
- javascript - 选中单选按钮时将类添加到父 div,如果选中其他单选则删除类