【问题标题】:Changing BorderStyle inside OnCreateControl causes it to fire again在 OnCreateControl 中更改 BorderStyle 会导致它再次触发
【发布时间】:2019-02-11 20:14:57
【问题描述】:

我有一个扩展RichTextBox

public class RichTextBoxEx : RichTextBox
{
    protected override void OnCreateControl()
    {
        Text = "Hello World";
        base.OnCreateControl();
    }
}

当我使用BorderStyle = BorderStyle.None;删除边框时,该方法被调用了两次:

protected override void OnCreateControl()
{
    BorderStyle = BorderStyle.None;
    Text = "Hello World";
    base.OnCreateControl();
}

为什么会这样?

【问题讨论】:

  • WinForms 就是这样,尤其是在控件创建到一半的时候。 WinForms 允许您在窗口创建时间之前和之后使用幕后魔法设置控件的样式(许多 样式 只能在 Win32 中创建控件时正确应用 - WinForms 将拆除并重新创建一个窗口(如果需要)完成此操作)如果此行为妨碍,请使用静态布尔值来防止长时间执行的代码运行两次,否则,您不必编写 Win32 代码您可以从 Windows 窗体中免费获得。
  • 或者...尝试在OnCreateControl之前设置样式。这样,控件将按照您想要的样式创建,而无需创建、拆卸和重新创建控件
  • @Flydog57 - 当我编辑 Margin 属性时,它工作得很好。那么MarginBorderStyle有什么区别呢?
  • 如果你是直接在windows下编程(使用win32和朋友(这个其实是user32)),windows(winforms控件通常是windows)有属性、样式和扩展样式。创建窗口时设置样式和扩展样式。可以随时设置属性(如“文本”、“前景色”等)。如果实际窗口已创建(Windows.Forms.Control 实例具有与之关联的句柄)并且您更改了样式或扩展样式,Windows 窗体会破坏现有控件并在其位置重新创建一个控件。呃 - 只是因为。
  • 这里有一些解释:blogs.msdn.microsoft.com/jfoscoding/2004/11/24/…。寻找“重新创建”

标签: c# .net winforms richtextbox windows-forms-designer


【解决方案1】:

设置BorderStyle时,它会检查新的边框样式是否与当前值不同,recreates the handle导致在方法调用结束时调用OnCreateControl

如果要更改BorderStyle 控件中已设置的BorderStyle 属性的默认值,正确的位置在控件的构造函数中:

public class RichTextBoxEx : RichTextBox
{
    RichTextBoxEx ()
    {
        BorderStyle = BorderStyle.None;
    }
}

Text 属性不同。我已经用answer 对你的其他问题进行了描述。

【讨论】:

  • 如果您在应用或验证解决方案时遇到任何问题,请告诉我。
猜你喜欢
  • 2011-01-15
  • 2013-04-12
  • 2015-02-19
  • 2022-01-11
  • 2017-04-23
  • 1970-01-01
  • 2020-08-16
  • 2019-11-09
  • 2015-10-20
相关资源
最近更新 更多