【问题标题】:VB.NET - WinForms - Prevent UserControl's resources being copied into the Form's local resourceVB.NET - WinForms - 防止 UserControl 的资源被复制到 Form 的本地资源中
【发布时间】:2009-12-29 08:56:22
【问题描述】:

我有一个简单的 Windows 窗体应用程序,其中我有一个从 PictureBox 派生的名为“MyControl”的用户控件。

在这个 MyControl 中,我有以下代码:

Sub New()
   MyBase.New()
   Me.BackgroundImage = My.Resources.MyImage 'This is a project resource image
End Sub

现在,当我将此 MyControl 拖放到表单中时,我会得到图像以及这些东西。但问题是 BackgroundImage 正在被复制到 Form 的本地 .resx 文件中。 因此,当我查看 form.designer 文件时,我发现以下内容:

Me.MyControl1.BackgroundImage = CType(resources.GetObject("MyControl1.BackgroundImage"), System.Drawing.Image)

这是一个问题,当我尝试更改控件中的图像时,它不会反映在表单的控件实例中。所以这很痛苦。

如何解决?猜猜这将是反复试验的研究,但请帮忙。

【问题讨论】:

  • 我遇到了同样的问题,不幸的是我还没有找到解决这个问题的方法(只是手动更正所有内容)。
  • 我认为我对此有所了解。我添加了一个用户控件,并在其中添加了一个 PictureBox。现在为 UserControl 中的 PictureBox 提供了一个图像。当将此 UC 拖放到表单上时,PictureBox 的图像不会复制到表单的本地资源中。想知道为什么!
  • 您能否也将您的图像设置为您控件中的嵌入资源?最后,将背景图片留给用户选择是否可行?
  • @serhio,即使我嵌入控件,它也会被复制。但是@nobugz 给出了一个很好的解决方案。看看吧。

标签: .net vb.net winforms user-controls


【解决方案1】:

你必须告诉设计者它不应该序列化 BackgroundImage 属性的值。您可以使用<DesignerSerializationVisibility> 属性来做到这一点:

Imports System.ComponentModel

Public Class MyControl
  Inherits Control

  Public Sub New()
    Me.BackgroundImage = My.Resources.MyImage
  End Sub

  <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
  <Browsable(false)> _
  Public Overrides Property BackgroundImage() As System.Drawing.Image
    Get
      Return MyBase.BackgroundImage
    End Get
    Set(ByVal value As System.Drawing.Image)
      MyBase.BackgroundImage = value
    End Set
  End Property
End Class

我还使用了&lt;Browsable&gt; 属性,用户更改图像不再有意义,因为更改将不再保留。

【讨论】:

  • 很好,因为这个我在诅咒.NET ;)
【解决方案2】:

您必须从“MyControl”中删除背景图像,并将图像放入您创建的所有实例中。

如果您经常使用带有默认图像的 MyControl,则使用该图像从 MyControl 创建一个后代,并将其仅用作带有默认图像的 MyControl(您可以将其视为只读)。当需要另一个图像时,只需使用 MyControl 而不使用默认值。

【讨论】:

    【解决方案3】:

    您能否从构造函数中删除 Me.BackgroundImage = My.Resources.MyImage 并将其移动到覆盖的 OnLoad 控件的方法并重试 DragDrop?

    真的,我不认为它会改变很多,但这种方法在我看来更正确。

    【讨论】:

    • 我试过这个。但是控件中没有 OnLoad 方法。我尝试重写 OnCreateControl() 方法。但它仍然会复制到表单的资源中
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2018-03-31
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多