【发布时间】: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