2010-10-26 18 views
17

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?

+1

Übrigens, das ist _System_.Drawing.Icon, und die 'ToBitmap()' _method_. – SLaks

+0

Hallo SLaks, du hast Recht. Entschuldigung für den Tippfehler. –

Antwort

11

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.

+0

Ich konnte das nicht zur Arbeit bringen. Die Zeichenfolge rname enthielt nicht die Namen der Ressourcen in der Datei –

+0

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

+0

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? –

0

Es gibt keine integrierte Methode im .Net-Framework, die dies tut.

Stattdessen können Sie this library verwenden.

0

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.

+0

Hallo danke. Dies würde Sinn machen, aber mein Icon befindet sich in einer Ressourcendatei. Wie ändere ich den Konstruktor? –

25

Hilft das?

Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64)); 
1
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); 
     } 
    } 
} 
+0

Zum Glück ist es nicht erforderlich, das Ganze so zu kopieren! – Ashe

18

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() 
+0

Sah lange Zeit dafür; funktioniert super! –

+0

Das ist genau das. Die Icon-Ressource enthält alle Größen. Verwenden Sie einfach New(), um die gewünschte Größe zu erhalten. –

3

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(); 
     } 
    } 
} 
Verwandte Themen