C# Winforms:在windows 10上尝试移动/拖动表单时,表单会延迟
不确定这个标题是否有意义。 我有一个表单,它有几个面板,每个面板都有一个与之关联的表单。 我把这个表单称为“mainForm”,当我在屏幕上移动/拖动它时,它会滞后很多,鼠标也会感觉非常迟钝 当你们第一次打开它时,它一点也不滞后,但在屏幕上有一些控件后,滞后变得明显,当我有100多个控件时,它变得非常滞后。如果我不移动它,程序运行良好,一切都很好,只有当我尝试移动它时 我不完全确定它是如何工作的,但是当你移动它时,它会重新计算窗体和控件上的某些内容吗?如果是这样的话,在尝试移动时是否可以禁用该功能,并在停止移动时重新启用该功能 由于时间限制,此时无法更改为WPF 希望有人以前有过这样的问题。 任何提示都非常感谢C# Winforms:在windows 10上尝试移动/拖动表单时,表单会延迟,c#,winforms,move,drag,lag,C#,Winforms,Move,Drag,Lag,不确定这个标题是否有意义。 我有一个表单,它有几个面板,每个面板都有一个与之关联的表单。 我把这个表单称为“mainForm”,当我在屏幕上移动/拖动它时,它会滞后很多,鼠标也会感觉非常迟钝 当你们第一次打开它时,它一点也不滞后,但在屏幕上有一些控件后,滞后变得明显,当我有100多个控件时,它变得非常滞后。如果我不移动它,程序运行良好,一切都很好,只有当我尝试移动它时 我不完全确定它是如何工作的,但是当你移动它时,它会重新计算窗体和控件上的某些内容吗?如果是这样的话,在尝试移动时是否可以禁用该功
谢谢你们抽出时间,伙计们 我曾经在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, 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, 0, 1);
UpperLeft.Margin = new Padding(0);
UpperLeft.Padding = new Padding(0);
tlp.Controls.Add(UpperLeft, 0, 0);
LowerRight.Margin = new Padding(0);
LowerRight.Padding = new Padding(0);
tlp.Controls.Add(LowerRight, 1, 1);
}
#endregion
}
这只是创建多个表单的一种方法,每个表单都有自己的“表布局”,您可以重载此特定布局->(或您制作的布局)
或者,您可以简单地重新定义放置在TableLayoutPanel中的新布局,然后表单就可以按预期工作。我最终解决了它。即使是Morten Bork共享的代码也出现了问题。它只是太多的控件(在我做的测试中,我有大约500个控件),当移动表单时,它会变得非常慢 用户Jimi对这个问题的输入是关键,在查看了事件之后,我尝试了以下方法,它解决了我的问题。因此,希望需要类似解决方案的人可以使用我的解决方案
在我的“mainForm”中,当它移动时,我清除了“ResizeBegin”中的主面板,并将子面板添加回“ResizeEnd”中的主面板,到目前为止,它工作正常。因为我还保存了当前显示的子面板,所以我可以先显示该子面板。我对“mainForm”面板中的表单有点困惑。我认为可能有一个小问题,你正在导致大量的“重画”事件发生。不需要在现有表单中嵌入表单。如果希望将控件添加到面板中,可以这样做。可能是当您拖放时,重画事件会触发所有表单重画(显示或不显示)。无论如何,我不会将表单与“父表单”上的面板关联?这似乎。。奇怪的选择?请包含足够的代码来重现您的问题学习如何构建UserControls,而不是将表单用作子容器。UserControls提供的设计器与表单完全相同。@MortenBork感谢您的回复。我有一些按钮,当按下时会在“主”窗体上的特定面板上添加和打开窗体。我尝试过用户控件,但是,它导致了不希望的结果,因此我切换到表单。因此,在这种情况下,我不能简单地将控件添加到面板中,而通过代码添加控件将是一个很大的麻烦。移动表单会导致重画事件吗?如果用户控件在表单中,是否也会发生这种情况?因为当我将一个表单添加到一个包含大量控件的用户控件的面板中时,它的延迟最大。@Jimi如果我早一点想到这一点就好了:(@UltraWazer尝试在代码中创建一个分支,在那里您没有将表单链接到面板。尝试使用私有只读TableLayoutPanel tlp=new TableLayoutPanel();用于将按钮或其他UI组件添加到表单中。您应该能够将“大部分”代码复制粘贴到布局面板中,并将其添加为控件。这样,如果需要“新表单”,就可以将新表单“弹出”为了显示,否则,你可以简单地删除并添加新的布局面板到你的用户控件中,以获得相同的功能?我相信。我会尝试一下,看看我是否可以应用任何我有滞后的东西。我想主要的原因可能是我有很多用户控件,可能会触发很多重绘/重绘事件,如ano这里的另一位用户指出。谢谢:)
public interface IFormExtension
{
public Form Parent { get; set; }
}