2009-12-29 95 views
2

我有一个简单的Windows窗体应用程序,其中我有一个从PictureBox派生的名为“MyControl”的usercontrol。VB.NET - WinForms - 防止UserControl的资源被复制到窗体的本地资源

在这种MyControl,我有以下代码:

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

现在,当我拖累了,这MyControl放到一个形式,我得到的图像,以及那些东西。但问题是BackgroundImage被复制到窗体的本地.resx文件中。 所以,当我看进form.designer文件,我发现以下几点:

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

这是一个问题,也当我尝试更改控制图像,它不会反映在窗体的控制实例。所以这是一个痛苦。

这怎么解决?猜猜这将是试验和错误研究,但请帮助。

+0

我有同样的问题,不幸的是我还没有找到解决这个问题的办法(只需手工纠正一切)。 – Bobby 2009-12-29 09:30:00

+0

我想我有一些主角。我添加了一个用户控件,并添加了一个PictureBox。现在给了UserControl内的PictureBox一个图像。将此UC拖放到表单上时,PictureBox的图像不会复制到表单的本地资源中。想知道为什么! – 2009-12-29 10:23:16

+0

你是否也可以将图像设置为* embedded *资源在你的控件中? 终于,也许是一个想法将您的背景图像留给用户选择? – serhio 2009-12-29 12:17:49

回答

4

你必须告诉设计者它不应该序列化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 

我也用<Browsable>属性,它不再是有道理的,用户改变图像的变化,因为将不再保留。

+1

不错,我因此诅咒.NET;) – 2009-12-30 09:32:32

0

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

如果您使用很多MyControl与默认图像从MyControl创建一个后裔与该图像,并将其仅用作MyControl与默认图像(您可以认为它是只读)。当需要另一个图像时,只需使用MyControl而无需默认设置。

0

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

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

+0

我试过了。但是控件中没有OnLoad方法。我尝试了重写OnCreateControl()方法。但它仍然复制到窗体的资源 – 2009-12-29 10:40:16