Jak tworzyć i wykorzystywać zasoby w .NET

192

Jak mogę łatwo utworzyć zasób, do którego mogę się odwoływać i z którego korzystać w różnych częściach mojego programu?

Moim szczególnym problemem jest to, że mam NotifyIcon, który chcę zmienić ikonę w zależności od stanu programu. Często spotykany problem, z którym walczyłem od dłuższego czasu.

Matthew Scharley
źródło

Odpowiedzi:

325

Cóż, po przeszukaniu i zebraniu razem różnych punktów z StackOverflow (rany, uwielbiam to miejsce), większość problemów już minęła. Udało mi się jednak znaleźć odpowiedź na mój problem.

Jak utworzyć zasób:

W moim przypadku chcę utworzyć ikonę. Jest to podobny proces, bez względu na rodzaj danych, które chcesz dodać jako zasób.

  • Kliknij prawym przyciskiem myszy projekt, do którego chcesz dodać zasób. Zrób to w Eksploratorze rozwiązań. Wybierz opcję „Właściwości” z listy.
  • Kliknij kartę „Zasoby”.
  • Pierwszy przycisk u góry paska pozwala wybrać typ zasobu, który chcesz dodać. Powinien zaczynać się od łańcucha. Chcemy dodać ikonę, więc kliknij ją i wybierz „Ikony” z listy opcji.
  • Następnie przejdź do drugiego przycisku „Dodaj zasób”. Możesz dodać nowy zasób lub jeśli masz już ikonę, możesz ją również dodać. Postępuj zgodnie z wyświetlanymi instrukcjami, aby wybrać dowolną opcję.
  • W tym momencie możesz dwukrotnie kliknąć nowo dodany zasób, aby go edytować. Uwaga: zasoby pojawiają się również w Eksploratorze rozwiązań, a dwukrotne kliknięcie tam jest równie skuteczne.

Jak korzystać z zasobu:

Świetnie, więc mamy nasz nowy zasób i staramy się, aby te piękne zmieniające się ikony ... Jak to zrobić? Cóż, na szczęście, C # sprawia, że ​​jest to niezwykle łatwe.

Istnieje klasa statyczna o nazwie, Properties.Resourcesktóra daje dostęp do wszystkich zasobów, więc mój kod był tak prosty jak:

paused = !paused;
if (paused)
    notifyIcon.Icon = Properties.Resources.RedIcon;
else
    notifyIcon.Icon = Properties.Resources.GreenIcon;

Gotowe! Skończone! Wszystko jest proste, kiedy wiesz jak, prawda?

Matthew Scharley
źródło
dzięki za to, szukałem dokładnie tego samego. czy istnieje sposób na osadzenie plików .ico w pliku wykonywalnym, aby nie były wyświetlane jako osobne pliki? mam nadzieję, że moje pytanie ma sens. pozdrowienia,
Amc_rtty,
1
@Andrei: Właśnie taki jest zasób. Po dodaniu zostanie osadzony jako część skompilowanego pliku exe.
Matthew Scharley,
1
„... większość problemów minęła już na tym etapie” - Too True ... Dziękujemy za złożenie tego razem! Wiedziałem, że to proste ... w końcu.
roadsunknown
1
Na marginesie, pliki zasobów są blokowane podczas kompilacji. Tak więc dynamiczne zmienianie ich w czasie wykonywania niewiele zmienia, aby zmienić istniejące wartości. Użyj plików konfiguracyjnych, jeśli chcesz zmienić wartości w czasie wykonywania. Jeśli to pomoże komukolwiek.
Purusartha
1
W VB.NET dostęp do zasobów można uzyskać np. Przez „My.Resources.GreenIcon”
andy
9

Powyższe nie działało dla mnie tak, jak się spodziewałem w Visual Studio 2010. Nie pozwoliłoby mi uzyskać dostępu do Properties.Resources, powiedział, że jest niedostępny z powodu problemów z uprawnieniami. Ostatecznie musiałem zmienić ustawienia Trwałości we właściwościach zasobu, a następnie znalazłem sposób dostępu do niego za pomocą pliku Resources.Designer.cs, w którym miał on automatyczny moduł pobierający, który pozwalał mi uzyskać dostęp do ikony, za pośrednictwem MyNamespace.Properties.Resources .NameFromAddingTheResource. Zwraca obiekt typu Icon, gotowy do użycia.

Quinxy von Besiex
źródło
7

Powyższa metoda działa dobrze.

Inną metodą (zakładam, że tutaj jest strona internetowa) jest utworzenie strony. Dodaj formanty do strony. Następnie w trybie projektowania przejdź do: Narzędzia> Generuj zasób lokalny . Plik zasobów pojawi się automatycznie w rozwiązaniu ze wszystkimi kontrolkami na stronie zmapowanymi w pliku zasobów.

Aby utworzyć zasoby dla innych języków, dołącz 4-znakowy język na końcu nazwy pliku, przed rozszerzeniem ( Account.aspx.en-US.resx, Account.aspx.es-ES.resx ... itd.).

Aby pobrać konkretne wpisy w kodzie opóźnieniem, po prostu zadzwoń do tej metody: GetLocalResourceObject([resource entry key/name]).

Chuck Conway
źródło