Ich habe ein Symbol, das ein paar verschiedene Größen (16px, 32px, 64px) hat. Ich rufe ToBitmap()
darauf, aber es gibt immer das 32px Bild zurück. Wie kann ich die 64px eins abrufen?Auswählen der Größe eines System.Drawing.Icon?
Antwort
Dies ist eine ziemlich schmerzhafte Einschränkung in der ResourceManager-Klasse. Die GetObject() -Methode bietet keine Möglichkeit, zusätzliche Argumente zu übergeben, mit denen das zurückgegebene Symbol nach Größe ausgewählt werden kann. Eine Problemumgehung besteht darin, das Symbol stattdessen dem Projekt hinzuzufügen. Verwenden Sie Projekt + Vorhandenes Element hinzufügen, wählen Sie Ihre .ico-Datei aus. Wählen Sie das hinzugefügte Symbol aus und ändern Sie die Eigenschaft Build Action in "Embedded Resource".
Sie können nun das gewünschte Symbol mit Code wie folgt abrufen:
public static Icon GetIconFromEmbeddedResource(string name, Size size) {
var asm = System.Reflection.Assembly.GetExecutingAssembly();
var rnames = asm.GetManifestResourceNames();
var tofind = "." + name + ".ICO";
foreach (string rname in rnames) {
if (rname.EndsWith(tofind, StringComparison.CurrentCultureIgnoreCase)) {
using (var stream = asm.GetManifestResourceStream(rname)) {
return new Icon(stream, size);
}
}
}
throw new ArgumentException("Icon not found");
}
Verwendungsbeispiel:
var icon1 = GetIconFromEmbeddedResource("ARW04LT", new Size(16, 16));
var icon2 = GetIconFromEmbeddedResource("ARW04LT", new Size(32, 32));
Modus ein mögliches Versagen Vorsicht: Dieser Code geht davon aus, dass das Symbol auf den gleichen hinzugefügt wurde Assembly, die die Methode enthält.
Ich konnte das nicht zur Arbeit bringen. Die Zeichenfolge rname enthielt nicht die Namen der Ressourcen in der Datei –
Dies funktionierte für mich. Die anderen Lösungen nicht, weil ich das Symbol von einer Assembly benötigte, wenn man ihren Pfad wählte. Ich habe die Assembly nur in einen Reflektionskontext geladen. Es ist wichtig, dass das Symbol eine "eingebettete Ressource" in der Baugruppe ist. Ansonsten funktioniert es nicht. – redcurry
Mit VS Express 15 habe ich die 'Persistence' Eigenschaft für Icon in meiner' Resources.resx' auf 'Embedded in .resx' gesetzt; Ist das gleichbedeutend damit, die 'Build Action' Eigenschaft auf' Embedded Resource' zu setzen? –
Es gibt keine integrierte Methode im .Net-Framework, die dies tut.
Stattdessen können Sie this library verwenden.
Die Größe wird bestimmt, wenn Sie zuerst die Icon
Instanz erstellen, so müssen Sie angeben, welche Größe Sie verwenden möchten, wenn Sie es schaffen, eine der Icon
constructors verwenden, die ein Size
Parameter nehmen.
Hallo danke. Dies würde Sinn machen, aber mein Icon befindet sich in einer Ressourcendatei. Wie ändere ich den Konstruktor? –
Hilft das?
Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64));
internal static class IconHelper {
public static Icon GetSize(this Icon icon, int width, int height) {
return icon.GetSize(new Size(width, height));
}
public static Icon GetSize(this Icon icon, Size size) {
using(var mem = new MemoryStream()) {
icon.Save(mem);
mem.Position = 0;
return new Icon(mem, size);
}
}
}
Zum Glück ist es nicht erforderlich, das Ganze so zu kopieren! – Ashe
Für alle anderen auf dem gleichen Problem zu stolpern, ich habe eine nette kleine Lösung gefunden.
Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap()
Sah lange Zeit dafür; funktioniert super! –
Das ist genau das. Die Icon-Ressource enthält alle Größen. Verwenden Sie einfach New(), um die gewünschte Größe zu erhalten. –
Im Folgenden wird die Symbolgröße für alle Schaltflächen in der Symbolleiste festgelegt.
Es hängt davon ab, dass der Ressourcenname im Schaltflächen-Tag gespeichert wird.
public void SetButtons(object toolstrip, int IconWidth, int IconHeight)
{
var ts = (ToolStrip) toolstrip;
var size = new System.Drawing.Size();
size.Height = IconSize;
size.Width = IconSize;
foreach (ToolStripButton tsBtn in ts.Items)
{
tsBtn.ImageScaling = ToolStripItemImageScaling.None;
var resourcename = (String) tsBtn.Tag;
if (resourcename != null)
{
var myIcon = (Icon) Properties.Resources.ResourceManager.GetObject(resourcename);
var newIcon = new Icon(myIcon, IconWidth, IconHeight);
tsBtn.Image = newIcon.ToBitmap();
}
}
}
- 1. Convert System.Drawing.Icon zu System.Media.ImageSource
- 2. Einstellen der Größe eines JPanel
- 3. System.Drawing.Icon Konstruktor „Operation erfolgreich beendet“ Ausnahme
- 4. XamlParseException auf System.Drawing.Icon in WPF C#
- 5. Auswählen eines img-Elements auf der Polymerelementlast
- 6. Auswählen eines Entwurfsmusters
- 7. Auswählen eines InstallShield-Projekttyps
- 8. Auswählen der Datenbank FILEGROWTH als% oder als feste Größe
- 9. Auswählen eines guten Wörterbuchschlüssels
- 10. Auswählen eines Python-Webframeworks
- 11. Auswählen Kinder eines Objekts
- 12. Größe eines QWebView und einer QMessagebox entsprechend der QMainWindow Größe
- 13. Probleme beim Erstellen eines Vollbildmodus Auswählen der Klasse
- 14. Dynamisches Ändern der Größe eines geöffneten Akkordeons
- 15. Ändern der Größe eines Godaddy Trust-Siegels
- 16. Erste die Größe der Daten eines Pointer
- 17. Ändern der Größe eines gescrollten Tkinter-Textfelds
- 18. Festlegen der Größe eines Fensters in vim
- 19. Ändern der Größe eines Svg Hintergrundbild wiederholen
- 20. Ändern der Größe eines PopOver View Controllers
- 21. Papierklammer Ändern der Größe eines rechteckigen Kastens
- 22. iPhone - Anpassen der Größe eines UIActionSheet
- 23. Ändern der Größe eines Steuerelements in WPF
- 24. Ändern der Größe eines Kendo-Drop-downs
- 25. Auswählen eines bestimmten Elements innerhalb eines div?
- 26. Alle Kontrollkästchen eines Formulars auswählen
- 27. Android Auswählen eines bestimmten Dateispeicherorts
- 28. Auswählen einer Spalte eines Arrays
- 29. Einstellen der Größe eines ContentPane (innerhalb eines JFrames)
- 30. Größe eines NSArray
Übrigens, das ist _System_.Drawing.Icon, und die 'ToBitmap()' _method_. – SLaks
Hallo SLaks, du hast Recht. Entschuldigung für den Tippfehler. –