首页 > 解决方案 > 如何从主窗体控制或停止动态用户控件的绘制事件?

问题描述

我对一件小事有一个大问题。我正在编写一个消息传递应用程序。

这是我使用的布局: 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)中的布尔值。

如果您对此问题有任何想法,请提供帮助。

标签: c#winformsuser-controlspaintevent

解决方案


推荐阅读