2010-10-26 22 views
17

Mam ikonę, która ma kilka różnych rozmiarów (16px, 32px, 64px). Dzwonię pod numer ToBitmap(), ale zawsze zwracam obraz 32px. Jak mogę pobrać 64px?Wybieranie rozmiaru pliku System.Drawing.Icon?

+1

Nawiasem mówiąc, to _System_.Drawing.Icon i 'ToBitmap()' _method_. – SLaks

+0

Hi SLaks, masz rację. Przepraszam za literówkę. –

Odpowiedz

11

Jest to dość bolesne ograniczenie w klasie ResourceManager. Jego metoda GetObject() nie zapewnia sposobu przekazywania dodatkowych argumentów, które pozwoliłyby na wybór zwróconej ikony według rozmiaru. Zamiast tego należy dodać ikonę do projektu. Użyj Project + Dodaj istniejący element, wybierz swój plik .ico. Wybierz dodaną ikonę i zmień właściwość Build Action na "Embedded Resource".

Teraz można pobrać odpowiednią ikonę z kodem tak:

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"); 
    } 

wykorzystanie próbki:

 var icon1 = GetIconFromEmbeddedResource("ARW04LT", new Size(16, 16)); 
     var icon2 = GetIconFromEmbeddedResource("ARW04LT", new Size(32, 32)); 

Strzeż jeden możliwy tryb awarii: Ten kod zakłada, że ​​ikona została dodana do tego samego zestaw zawierający metodę.

+0

Nie mogłem zmusić tego do działania. Nazwa rmy nie zawiera nazw zasobów w pliku –

+0

To działało dla mnie. Inne rozwiązania nie dlatego, że potrzebowałem ikony ze złożenia, biorąc pod uwagę jego ścieżkę. Załadowałem zespół tylko w kontekście odbicia. Ważne jest, aby ikona była "Osadzonym zasobem" w zespole; w przeciwnym razie nie działa. – redcurry

+0

Używając VS Express 15, ustawiam właściwość 'Persistence' dla Icon w moim' Resources.resx' na 'Embedded in .resx'; czy jest to równoważne ustawieniu właściwości 'Build Action' na' Embedded Resource'? –

0

Nie ma wbudowanej metody w środowisku .Net, która to robi.

Zamiast tego można użyć this library.

0

Rozmiar jest określany przy pierwszym utworzeniu instancji Icon, dlatego należy określić rozmiar, który ma być używany podczas jego tworzenia, przy użyciu jednego z Icon constructors, który pobiera parametr Size.

+0

Cześć dzięki. To miałoby sens, ale moja ikona znajduje się w pliku zasobów. Jak zmodyfikować konstruktora? –

25

Czy to pomaga?

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

Na szczęście nie ma potrzeby kopiowania tego wszystkiego! – Ashe

18

dla nikogo innego natrafiają na ten sam problem, Znalazłem ładny mały rozwiązanie.

Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap() 
+0

Długo się nad tym zastanawiałem; działa świetnie! –

+0

To jest dokładnie to. Zasób ikon zawiera wszystkie rozmiary, po prostu użyj New(), aby uzyskać ten, który chcesz. –

3

Poniżej przedstawiono rozmiar ikony dla wszystkich przycisków na pasku narzędzi.
Opiera się na nazwie zasobu zapisanej w tagu przycisku.

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