【发布时间】:2016-06-05 11:16:40
【问题描述】:
我得到了相互矛盾的 Google 结果,我想知道这是否可以澄清一下?
我有:
typeof(TableLayoutPanel)
.GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
.SetValue(tableLayoutPanel, true, null);
typeof(TableLayoutPanel)
.GetMethod("SetStyle",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
.Invoke(tableLayoutPanel, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true });
但有人告诉我,如果我将 DoubleBuffered 设置为 true,我不需要手动设置这 3 种样式,因为系统会在内部进行。目前我正在调用两者。
【问题讨论】:
-
你就不能测试一下看看吗?此外,如果您摆脱反射代码,整个实验将会变得更简单。让我们知道你的进展:)
-
好吧,这里跑题了,但是当我从 TableLayoutPanel 派生我自己的类然后在我的表单上使用它时,我在显示表单时遇到错误。这就是我使用反射代码的原因。
-
@AndrewTruckle 我认为反射只会隐藏错误,而不是攻击原因。
DoubleBuffered属性是受保护的,所以当你派生你的类时,你应该能够访问它。 -
@MicroVirus 我所知道的是,当我派生一个类,然后将其拖到我的表单中时,设计器 IDE 并不高兴。
-
Control.SetStyle() 不是一个用户友好度很高的方法,委婉地说。所以他们添加了 DoubleBuffered 属性以使其更容易。 ResizeRedraw 是另一个。总是倾向于派生你自己的类来访问受保护的属性,而不是用反射来破解它们。使用 Winforms 时,您永远无法尽早开始继承,这是使对象模型为您工作的关键技术。
标签: c# winforms double-buffering