【问题标题】:C# Dynamic Panel SubPanel-Event Loop bugC# 动态面板子面板-事件循环错误
【发布时间】:2020-11-09 16:11:21
【问题描述】:

我目前正在使用 Visual Studio 19 中的流布局面板制作 UI。 如果我按下一个按钮,它会使用

克隆一个面板
public static T Clone<T>(this T controlToClone) where T : Control
    {
        PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

        T instance = Activator.CreateInstance<T>();
        foreach (PropertyInfo propInfo in controlProperties)
        {
            if (propInfo.CanWrite)
            {
                if (propInfo.Name != "WindowTarget")
                    propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null);
            }
        }

        return instance;
    }

在同一个新闻事件中,它会触发 AddNewPanel("name");

private void AddPanel(string name)
        {
            var label = new Label();
            label.AutoSize = false;
            label.TextAlign = ContentAlignment.MiddleCenter;
            label.Dock = DockStyle.Fill;
            label.Text = name;
            label.MouseEnter += labelEnter;
            label.MouseLeave += labelLeave;

            var panel = panel1.Clone();
            var button = button1.Clone();
            button.Name = "button" + new Random().Next(1, 100);

            panel.Controls.Add(button);
            panel.Controls.Add(label);

            flowLayoutPanel1.Controls.Add(panel);
        }

事件 labelEnter 触发 ShowButtons()

private void showButtons()
        {
            foreach (Control item in flowLayoutPanel1.Controls)
            {
                var button = item.Controls[1];
                button.Visible = true;
            }
        }

mouseLeave 事件的作用相同,只是将 Visible 设置为 false。

现在我已经体验过,将控件动态添加到面板中,然后将其添加到流程布局面板中会导致一些问题。例如,当将鼠标移到按钮上时,labelMouseEnter/Leave 事件会循环。有没有人经历过这个或类似的帖子?当按钮最初为 Visible 时不会发生这种情况,这意味着 Visible 在设计器视图中变为 true。它使用可见属性克隆它。

【问题讨论】:

  • 扔掉flowlayoutpanel。我发现太多问题试图做超出基础的事情。我创建了自己的一组子面板,它们具有面板的所有属性。 flowlayoutpanel 的属性很少。
  • "例如,将鼠标移到按钮上时 labelMouseEnter/Leave 事件会循环。"标签设置为 Dock 填充,因此它占据了面板的整个空间。据推测,按钮然后小于标签顶部?如果是这样,那么标签在您输入按钮时获得 mouseleave 事件是正常的,因为您确实离开了标签!如果您不希望这种情况发生,那么您必须在 mouseleave 事件中编写额外的代码来检查当前鼠标位置,并且如果标签的坐标包含鼠标,则不会将其视为“离开”。
  • @Idle_Mind 是的,就是这样。我之前尝试过但没有成功,我用另一种逻辑再试一次,它成功了。
  • 不错!很高兴能引导您朝着正确的方向前进。
  • 您可以将其作为解决方案发布并接受它作为答案。将来可能会对其他人有所帮助...

标签: c# dynamic panel flowlayoutpanel


【解决方案1】:

解决方案是在 MouseLeave 事件中添加一个检查,如下所示:

 private void control_MouseLeave(object sender, EventArgs e)
        {
            var control = sender as Control;
            if (control.ClientRectangle.Contains(control.PointToClient(Cursor.Position))) return;
            //rest 
            ShowButtons();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2016-09-22
    • 2020-06-11
    相关资源
    最近更新 更多