【问题标题】:Shadowed property is not set by the designer设计者未设置阴影属性
【发布时间】:2014-04-11 10:33:23
【问题描述】:

我有一个从Panel 派生的自定义控件。

我正在遮蔽 Size 属性,因为我需要调整它(控件基本上是 Winforms 中的扩展器):

Private DesiredSize As Size
Public Shadows Property Size As Size
   Get
       Return DesiredSize
   End Get
   Set(value As Size)
       DesiredSize = value
       AdjustHeight()
   End Set
End Property

AdjustHeight() 或多或少将基本 Size 设置为基于 IsExpanded 属性的值

    Public Property CollapsedWidth As Integer
    Private Sub AdjustHeight()
        If IsExpanded Then
            MyBase.Size = DesiredSize
        Else
            Dim newh As Integer = 15
            Dim neww As Integer
            If CollapsedWidth > 0 Then
                neww = CollapsedWidth
            Else
                neww = DesiredSize.Width
            End If
            MyBase.Size = New Size(neww, newh)
        End If
    End Sub

我在构造函数中使用 DesiredSize = MyBase.Size 初始化 DesiredSize。

这很好用,但是我在 Visual Studio 设计器中遇到了问题。每当我调整控件大小时,Size 属性都不会更新。设计时窗体上的控件会调整大小,但一旦我启动应用程序,它就会在运行时和设计时恢复到初始大小。

在 Designer 中实际如何处理 Size 属性?我是否可能需要向阴影大小属性添加某种属性才能使其工作?

非常感谢 VB.NET 和 C# 中的答案。

编辑:
我尝试将 <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> 标记添加到属性中,因为我读到它可能会在此类情况下有所帮助,但它不会改变我所遇到的行为。

编辑 2:
我通过采用不同的路径并避免遮蔽 Size 属性来解决问题。不过,我将把这个问题留着,因为我仍然想知道上面发布的方法是否可行。

【问题讨论】:

  • 只处理 SizeChanged 事件而不是隐藏属性可能更容易。

标签: c# vb.net winforms visual-studio-2012 windows-forms-designer


【解决方案1】:

我不希望表单设计者可以读取Shadowed 属性,因为它将把所有东西都当作Control 处理——它不知道你的类,这就是风险使用影子方法 - 您正在提供一个新的实现,但仅限于了解您的人 - 了解您的基类的人将获得您的基类的实现。

如果Control.Size property 是可覆盖的(虚拟的,如果你愿意的话),那么你可以覆盖它,它会工作的。

【讨论】:

  • 那是我不太明白的。如果我遮蔽 Size 属性,设计师不会认为它与以前的 size 属性相同吗?如果是这种情况,我的代码会起作用,因为它只是通过另一个函数重新路由了 MyBase.Size 属性的实际设置。
  • 取决于它是使用基类类型的指针(例如,Control),还是对每个控件都使用反射。我假设它会将Control 基类用于大多数 事物,并反映它尚未见过的任何属性
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多