如何解决Winforms:窗体在 Windows 10 上尝试移动/拖动时滞后
不确定标题是否有意义。 我有一个表单,它有几个面板,每个面板都有一个与之关联的表单。 我称这个表单为“mainForm”,当我在屏幕上移动/拖动它时,它滞后很多,鼠标也感觉非常无响应。
当你第一次打开它时,它根本没有延迟,但是在屏幕上有一些控件后,它变得很明显,当我有超过 100 个控件时,它变得非常滞后。如果我不移动它,则程序运行良好并且本身一切都很好,只有当我尝试移动它时。
我不完全确定这是如何工作的,但是当您移动它时,它是否会重新计算窗体和控件上的某些内容并在其上?如果是这样,是否可以在尝试移动时禁用它并在我们停止移动时重新启用它?
由于时间限制,此时无法更改为 WPF。
希望之前有人遇到过这样的问题。 非常感谢任何提示。
谢谢你们的时间!
解决方法
我最终解决了它。即使使用 Morten Bork 共享的代码,问题也会发生。控件太多了(我在测试中使用了大约 500 个控件)并且表单在移动时变得非常缓慢。
用户 Jimi 对此事的意见是关键,在环顾事件后,我尝试了以下方法,并解决了我的问题。所以希望需要类似解决方案的人可以使用我的解决方案。
在我的“mainForm”中,当它移动时,我清除了“ResizeBegin”中的主面板,并将子面板添加回“ResizeEnd”中的主面板,到目前为止它工作得很好。因为我还保存了当前正在显示的子面板,所以我可以先显示一个。
,我曾经在 winforms 中创建过这个:
public class FormExt : Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private IContainer components;
private readonly TableLayoutPanel tlp = new TableLayoutPanel();
public FormExt(IFormExtension formExtension)
{
FormExtension = formExtension;
InitializeComponent();
}
public FormExt()
{
InitializeComponent();
}
public Panel LowerLeft { get; set; }
public BorderedPanel LowerRight { get; set; }
public Panel UpperLeft { get; set; }
public IFormExtension FormExtension { get; set; }
public virtual void FormExtended_Closing(object sender,CancelEventArgs e)
{
if (FormExtension.Parent != null)
{
FormExtension.Parent.Refresh();
FormExtension.Parent.Show();
}
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise,false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && components != null) components.Dispose();
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
//TableLayoutPanel
tlp.Location = new Point(0,0);
tlp.Dock = DockStyle.Fill;
tlp.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute,100F));
tlp.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize,500F));
tlp.RowStyles.Add(new RowStyle(SizeType.Absolute,50F));
tlp.RowStyles.Add(new RowStyle(SizeType.AutoSize,550F));
tlp.CellBorderStyle = TableLayoutPanelCellBorderStyle.None;
tlp.BorderStyle = BorderStyle.None;
tlp.Margin = new Padding(0);
tlp.Padding = new Padding(0);
//Upper background color
Color myRgbColor = new Color();
#if DEBUG
myRgbColor = Color.FromArgb(255,0);
#else
myRgbColor = Color.FromArgb(10,19,39);
#endif
//LowerLeft
LowerLeft = new Panel();
LowerLeft.BackColor = Color.White;
LowerLeft.Dock = DockStyle.Fill;
//UpperLeft
UpperLeft = new Panel();
UpperLeft.BackColor = myRgbColor;
UpperLeft.BackgroundImageLayout = ImageLayout.None;
UpperLeft.Dock = DockStyle.Fill;
//LowerRight
LowerRight = new BorderedPanel();
LowerRight.Size = new Size(600,550);
LowerRight.BackColor = Color.White;
LowerRight.Dock = DockStyle.Fill;
components = new System.ComponentModel.Container();
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800,450);
FormClosing += FormExtended_Closing;
Text = "";
this.Controls.Add(tlp);
tlp.SetColumnSpan(UpperLeft,2);
LowerLeft.Margin = new Padding(0);
LowerLeft.Padding = new Padding(0);
tlp.Controls.Add(LowerLeft,1);
UpperLeft.Margin = new Padding(0);
UpperLeft.Padding = new Padding(0);
tlp.Controls.Add(UpperLeft,0);
LowerRight.Margin = new Padding(0);
LowerRight.Padding = new Padding(0);
tlp.Controls.Add(LowerRight,1,1);
}
#endregion
}
成为布局的模板。 然后我会在左下角添加按钮,在右下角添加内容,在左上角和右上角添加徽标和一些可能的页面机制,例如过滤器列表等。
好的概念是您一次拥有 1 个活动形式。虽然其他形式 by 仍然存在于内存中,但它们保持不活动状态,除非您故意传递它们,否则不要接收事件。我所知道的。至少,我从未遇到过您使用此组件描述的问题。但我从来没有在同一个表单上同时加载“数百个控件”。这只是...对单一表单承担的太多责任。
formExtension 接口:
public interface IFormExtension
{
public Form Parent { get; set; }
}
这只是创建多个表单的一种方式,每个表单都有自己的“表格布局”,您可以重载这个特定的布局 ->(或您制作的)
或者您可以简单地重新定义放置在 TableLayoutPanel 中的新布局,然后您的表单应该可以按预期工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。