【问题标题】:DoubleBuffered versus SetStyleDoubleBuffered 与 SetStyle
【发布时间】: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


【解决方案1】:

Reference Source这里是DoubleBuffered属性的实现:

protected virtual bool DoubleBuffered {
    get {
        return GetStyle(ControlStyles.OptimizedDoubleBuffer);
    }
    set {
        if (value != DoubleBuffered) {
            if (value) {
                SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, value);
            }
            else {
                SetStyle(ControlStyles.OptimizedDoubleBuffer, value);
            }
        }
    }
}

(注意属性是继承的,所以要回到Control类才能找到。)

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2013-10-12
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多