2009-12-29 5 views
2

У меня есть простое приложение Windows Forms, в котором у меня есть usercontrol, называемый MyControl, полученный из PictureBox.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

+0

Я думаю, что у меня есть некоторое преимущество. Я добавил usercontrol и в этом добавил PictureBox. Теперь вы получили изображение для PictureBox внутри UserControl. Когда этот UC отбрасывается на форму, изображение PictureBox не копируется в локальный ресурс формы. Интересно, почему! –

+0

Вы также можете установить свое изображение как * embedded * resource в свой контроль? , наконец, может быть, идея оставить фоновое изображение для пользователя? – serhio

ответ

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 из-за этого;) –

0

Вы должны удалить фоновое изображение из «MyControl» и просто поместить изображение во все созданные вами экземпляры.

Если вы используете многого MyControl с изображением по умолчанию, создайте потомка из MyControl с этим изображением и используйте его только как MyControl с изображением по умолчанию (вы можете считать его как только для чтения). Когда требуется другое изображение, просто используйте MyControl без значения по умолчанию.

0

Вы можете удалить Me.BackgroundImage = My.Resources.MyImage из конструктора и перенести его на переопределенный метод управления OnLoad и повторить попытку DragDrop?

Действительно, я не думаю, что это сильно изменится, но этот подход кажется мне более правильным.

+0

Я пробовал это. Но элементы управления не имеют метода OnLoad. Я попытался переопределить метод OnCreateControl(). Но все же он копирует в ресурс формы –

Смежные вопросы