Wie kann man auf einfachstem Wege auf Bilder für Ribbon-Steuerelemente wie <button> oder <togglebutton> aus Projektresourcen laden?
Im ersten Schritt müssen die Bilder dem Projekt als Resource hinzugefügt werden.

Dazu öffnet man die Eigenschaften des Projekts und wechselt auf den Karteireiter "Resourcen", und importiert die gewünschten Bilddateien.
In der Abbildung oben ist der Resourcen-Eigenschaften-Seite von Visual Studio 2010(en) zu sehen.
Achtung: Nach dem Importieren einer Datei hat diese nicht den kompletten Dateinamen als Bezeichnung.
Der Name ist üblicherweise der Dateiname ohne Endung. Aus "questionred.png" wird zum Beispiel "questionred".
Wie wird nun auf diese Bilder per Programmcode zugegriffen?
Im Ribbon.xml muss dazu üblicherweise eine Callback-Methode definiert werden:
<buttonid="buttonMoveToNirwana"getImage ="buttonMoveToNirwana_GetImage" />
Im dazugehörigen Sourcecode muss eine öffentliche Methode definiert werden, welche ein stdole.IPictureDisp zurückliefert.
publicIPictureDisp buttonMoveToNirwana_GetImage(IRibbonControl control) {
returnnull;
}
Jetzt muss nur noch das .Net Image in ein IpictureDisp convertiert werden.
Der Zugriff auf die importierten Bilddateien ist sehr einfach, da bereits nach dem Import die entsprechende Methode dazu generiert.
Dazu steht eine Eigenschaft Properties.Resources.questionred bereit.
Um das Bild in ein COM-Interface umzuwandeln wird wird eine kleine Hilfsklasse benötigt.
In diesem Beispiel ist diese mit ImageHelper bezeichnet:
using System.Windows.Forms;
using System.Drawing;
using stdole;
namespace RibbonExplorer {
internalclassImageHelper : AxHost {
private ImageHelper()
: base(null) {
}
publicstaticIPictureDisp Convert(Image image) {
return (IPictureDisp)AxHost.GetIPictureDispFromPicture(image);
}
}
}
Die Verwendung der Klasse gestaltet sich sehr einfach:
publicIPictureDisp buttonMoveToNirwana_GetImage(IRibbonControl control) {
returnImageHelper.Convert(Properties.Resources.questionred);
}
Ein Nachteil dieser Verwendung ist, dass die Resourcen fest als Eigenschaften definiert sind. Um hier nochmals eine einfachere/flexiblere Möglichkeit zur Verwendung zu schaffen, wird die ImageHelper-Klasse um folgende Funktion erweitert:
publicstaticIPictureDisp GetImage(string resourceName) {
return Convert((Image)Properties.Resources.ResourceManager.GetObject(resourceName));
}
Dadurch lässt sich jetzt auch der Resourcename zum laden der Bilder verwenden. Der Name kann jetzt also auch im Tag eines Controls stehen, oder die RibbonId selbst sein.
Die Verwendung der Klasse kann man unten sehen:
publicIPictureDisp buttonMoveToNirwana_GetImage(IRibbonControl control) {
returnImageHelper.GetImage("questionred");
}
Dies ist einfach und flexibel.
Grüße, Helmut