【发布时间】:2010-09-24 10:27:35
【问题描述】:
嗨,我的一个朋友指着你们。
我有一个 MDI 应用程序(C#、Winforms、.NET 2.0、VS2005、DevExpress 8.2),我的一个表单的行为非常奇怪 - 在与同一表单类的另一个实例重叠的地方没有正确地重新绘制自身。
表单包含一个自定义控件(其中包含各种 DevExpress 控件),并且继承自基本表单(它本身是继承的)。
由于表单继承的问题(那个老栗子),在构造函数中进行了一些控制重新排列。
问题 1(次要):除非调整表单大小,否则此控件重新定位/调整大小似乎都不会生效,因此我在重新排列后将宽度上下微调了一个像素。丑陋,hacky,我真的不想这样做。
问题 2(主要): 如果显示表单然后使用 API 调用 SetParent 将其附加到 MDI 表单,当我显示第二个实例时,两个表单的各个部分在它们重叠的地方没有正确绘制 - 顶部的位在现有的后面 - 这当表单四处移动时问题会变得更糟,使它们基本上无法使用。其他不同类型的子窗体(如果存在)似乎不受影响...
停止新闻:我已经确定它不必是子表单的 2 个实例。只有一个仍然存在问题 - 主要是围绕表单的边缘,例如正在刷新的区域小于表单本身。
如果使用子窗体的 .MDIParent 属性设置父窗体,则不会出现此问题 - 但我们不能这样做,因为窗体可能由非 .Net 应用程序中托管的控件显示。此外,即使现有子项(不同类型)已最大化,我也需要显示未最大化的子表单,并且仅使用 SetParent 发生。
我已经在这种类型的所有表单上尝试了 Refresh() (我有一个保存它们列表的控制器),但没有任何乐趣。我试图从具有相同继承结构的基本应用程序中重现这种效果,但我做不到。显然它与表单有关 - 因为我昨天从头开始重新创建表单,它仍然是相同的,它必须是代码 - 但是什么?
我不是表格绘画等活动中最热门的,所以我错过了什么吗?
【问题讨论】:
-
你太远了……太大了,我无法咀嚼。 Prob1 尝试使 UI 无效,以便重新绘制。并形成继承......糟糕的举动。
-
我已经尝试过 Invalidate() - 这只是 Refresh() 但延迟到一个方便的点。 Refresh() dpes 似乎也没有什么好处。表单继承是一个很好的idea。这是 VS 的实现。叹。控件似乎没问题,这就是我受到诱惑的原因。
标签: c# winforms visual-studio-2005 .net-2.0