'Select Resource' Dialog erscheint nicht im DesignMode einer Komponente

09/04/2008 - 11:56 von Branko Mikic | Report spam
Hallo NG,
ich benutze die VS2oo5 IDE mit dem 2.o Framework. Ich habe eine
Komponenten-Klasse die von System.ComponentModel.Component erbt und via
[DesignerAttribute(...)] die ComponentDocumentDesigner-Klasse verwendet da
ich im DesignMode nur das Properties Fenster der IDE verwenden möchte und
sonst auch keine Controls für meine Komponente verwende. Die Komponente kann
also nur 'non-visual-Components' enthalten. Trotzdem enthàlt meine
Komponenten-Klasse eine Eigenschaft vom Typ 'System.Drawing.Image'. Hier
eine vereinfachte Version meiner Komponenten-Klasse:



[Designer(typeof(...), typeof(...))]
public partial class myComponent : Component
{
Image _ic;

[DefaultValue(null)]
public Image myIcon
{
get { return _ic; }
set { _ic = value; }
}
}



Was ich möchte ist das ein externer Entwickler in der Lage ist zur
Entwurfszeit ein Bildchen aus den Projekt-resourcen in die Komponente
einzufügen dieses wird dann als Code in die Funktion InitializeComponents()
serialisiert und somit ist die Eigenschaft zur Laufzeit mit dem richtigen
Bildchen initialisiert. Soweit so gut!
Wenn ich in der IDE meine Komponente im DesignMode öffne so erscheint meint
DesignSurface mit den Eigenschaften in welchem meine 'myIcon' Eigenschaft
auftaucht. Klicke ich auf den [...] Button der Eigenschaft erscheint aber
nur der Datei-Dialog und mein Bildchen wird, als base64 enkodiert, in die
Resource des Projekts eingebettet. In der IntializeComponents() Funktion
sieht der serialisierte Code dann so aus:



//
// myComponent
//
resources.ApplyResources(this.myComponent, "myComponent");
myComponent.myIcon =
((System.Drawing.Image)(resources.GetObject("myComponent.myIcon")));



Der Nachteil beim serialisieren über den Datei Dialog ist das der Designer
keine Resource für das Bidlchen kennt und somit in der ResX Datei alles als
base64 enkodiert was die Größe des Bilds gleich enorm aufpumpt.
Was ich aber möchte ist das mein Bilchen aus den Resourcen des Projekts in
dem die Komponente verwendet wird kommt, so wie der Designer der Forms
Klasse das auch macht wenn man z.B. ein ToolStripButton im Menu des Forms
plaziert dann bekommt man diesen "Select Resource" dialog der es ermöglicht
das Bildchen aus einer Resource des Projekts zu entnehmen und der Designer
serialisiert das dann so:



//
// myToolStripButton
//
resources.ApplyResources(this.myToolStripButton, "myToolStripButton");
this.myToolStripButton.Image =
global::My.Project.Properties.Resources.myIcon;



Wie man sieht verwendet der Serializer nun direkt die Eigenschaft des
Bilchens aus dem StronglyTypedResourceBuilder-Objekt des Projekts anstatt
resources.GetObject() aufzurufen und das ist genau das was ich möchte. Dazu
muß der Serializer natürlich wissen dass das Bildchen aus der
Projekt-Resource stammt was beim Dateidialog offensichtlich nicht der Fall
ist.

Ich habe den merkwürdigen Effekt das wenn ich meine Solution neu starte und
meine Komponente im DesignMode öffne und ich anschließend auf den [...]
Button der myIcon Eigenschaft klicke das ich dann den Dateidialog erhalte.
Öffne ich aber anschließend ohne die Solution zu schließen irgendein anderes
Form-Objekt im DesignMode und kehre anschließend zu meine Komponente zurück
und klicke wieder auf den [...] Button der myIcon Eigenschaft dann erhalte
ich plötzlich den "Select Resource" dialog und das Bildchen wird auch
serialisiert wie ich mir das wünsche. Nun kann ich aber keinem externen
Entwickler vermitteln das man bei meiner Komponente erstmal irgendein Form
in der Solution öffnen muß so das die Auswahl für Bildchen aus der Resource
in meiner Komponente richtig klappt. Es fehlt also irgendwas in meiner
Komponente das die Verwendung des "Select Resource"-Dialogs antriggert.

Offensichtlich scheint der DesignerHost eines UserControl, Control oder Form
Objekts irgendwas in der IDE zu initialisieren was dazu führt das dieser
"Select Resource" dialog erscheint. Was ich soweit rausfinden konnte ist das
der TypeConverter meiner myIcon Eigenschaft ein simples ImageConverter
Objekt ist nachdem in der Solution ein Form Designer gestartet wurde ist
dieser TypeConerter plötzlich ersetzt durch ein
'Microsoft.VisualStudio.Windows.Forms.ResourceConverter<System.Drawing.ImageConverter>'-Objekt.
Der Name ResourceConverter deutet schon darauf hin das hier wohl die
Verbindung zu den Bildchen der Projekt-resource hergestellt wird. Leider ist
das eine Klasse die nicht öffentlich zugànglich ist, ich kann also diese
Ersetzung nicht hàndisch machen.

Was muß man im DesignerHost der eigenen Komponente implementieren damit
dieser "Select Resource" Dialog erscheint?
Muß vielleicht ein eigener abgeleiteter CodeDOM Serializer implementiert
werden um den gewünschten Dialog zu erhalten?
Das würde ich mir gerne ersparen. Für Hilfe wàre ich dankbar da mir
allmàhlich die Ideen ausgehen :)

Grüße
Branko Mikic
 

Lesen sie die antworten

#1 Branko Mikic
11/04/2008 - 11:39 | Warnen spam
Hi,
für diejenigen die sich mit diesem oder einem àhnlichen Problem rumschlagen.
Offenbar ist das ein Bug in der Visual Studio IDE. Weitere Details dazu
findet man hier:

http://forums.microsoft.com/MSDN/Sh...amp;mode=1

Ähnliche fragen