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?
Odpowiedz
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ę.
Nie mogłem zmusić tego do działania. Nazwa rmy nie zawiera nazw zasobów w pliku –
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
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'? –
Nie ma wbudowanej metody w środowisku .Net, która to robi.
Zamiast tego można użyć this library.
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
.
Cześć dzięki. To miałoby sens, ale moja ikona znajduje się w pliku zasobów. Jak zmodyfikować konstruktora? –
Czy to pomaga?
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);
}
}
}
Na szczęście nie ma potrzeby kopiowania tego wszystkiego! – Ashe
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()
Długo się nad tym zastanawiałem; działa świetnie! –
To jest dokładnie to. Zasób ikon zawiera wszystkie rozmiary, po prostu użyj New(), aby uzyskać ten, który chcesz. –
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();
}
}
}
Nawiasem mówiąc, to _System_.Drawing.Icon i 'ToBitmap()' _method_. – SLaks
Hi SLaks, masz rację. Przepraszam za literówkę. –