Как создавать и использовать ресурсы в.NET

Как мне создать ресурс, на который я могу легко ссылаться и использовать в различных частях моей программы?

Моя конкретная проблема заключается в том, что у меня есть NotifyIcon, значок которого я хочу изменить в зависимости от состояния программы. Обычная проблема, но с которой я долго боролся.

4 ответа

Решение

Что ж, после поиска вокруг и объединения различных точек вокруг Stackru (оу, я уже обожаю это место), большинство проблем уже прошли этот этап. Мне все-таки удалось найти ответ на мою проблему.

Как создать ресурс.

В моем случае я хочу создать иконку. Это аналогичный процесс, независимо от того, какие данные вы хотите добавить в качестве ресурса.

  • Щелкните правой кнопкой мыши проект, в который вы хотите добавить ресурс. Сделайте это в обозревателе решений. Выберите опцию "Свойства" из списка.
  • Нажмите на вкладку "Ресурсы".
  • Первая кнопка в верхней части панели позволит вам выбрать тип ресурса, который вы хотите добавить. Это должно начаться на строке. Мы хотим добавить иконку, поэтому нажмите на нее и выберите "Иконки" из списка опций.
  • Далее перейдите ко второй кнопке "Добавить ресурс". Вы можете добавить новый ресурс или, если у вас уже есть значок, вы можете добавить его тоже. Следуйте инструкциям для любого варианта, который вы выберете.
  • На этом этапе вы можете дважды щелкнуть вновь добавленный ресурс, чтобы отредактировать его. Обратите внимание, что ресурсы также отображаются в обозревателе решений, и двойной щелчок там также эффективен

Как использовать ресурс.

Отлично, у нас есть наш новый ресурс, и мы жаждем иметь эти милые меняющиеся иконки... Как мы это делаем? Что ж, повезло нам, C# делает это чрезвычайно легко.

Существует статический класс Properties.Resources это дает вам доступ ко всем вашим ресурсам, поэтому мой код оказался таким простым:

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

Готово! Finis! Все просто, когда знаешь как, нет?

Вышеописанное на самом деле не сработало для меня, как я ожидал в Visual Studio 2010. Это не позволило мне получить доступ к Properties.Resources, заявив, что он недоступен из-за проблем с разрешениями. В конечном итоге мне пришлось изменить параметры сохраняемости в свойствах ресурса, а затем я нашел способ доступа к нему через файл Resources.Designer.cs, где у него был автоматический метод получения, который позволял мне получать доступ к значку через MyNamespace.Properties.Resources..NameFromAddingTheResource. Это возвращает объект типа Icon, готовый к использованию.

Вышеуказанный метод работает хорошо.

Другой метод (я предполагаю, что здесь) - создать вашу страницу. Добавить элементы управления на страницу. Затем, находясь в режиме разработки, перейдите: Инструменты> Создать локальный ресурс. Файл ресурсов автоматически появится в решении со всеми элементами управления на странице, отображенными в файле ресурсов.

Чтобы создать ресурсы для других языков, добавьте 4-символьный язык в конец имени файла перед расширением (Account.aspx.en-US.resx, Account.aspx.es-ES.resx... и т. Д.).

Чтобы получить конкретные записи в коде, просто вызовите этот метод: GetLocalResourceObject([ключ / имя записи ресурса]).

Код, опубликованный Мэтью Шарли, имеет утечку памяти:

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

Вам следует Dispose() notifyIcon.Icon перед его заменой, потому что Properties.Resources.SOME_ICON создает новый Iconкаждый раз, когда его используют. Это можно увидеть в журнале с помощью этого кода:

      Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());

В журнале вы увидите 3 разных хеш-кода. Значит, это разные объекты.

Итак, простое исправление будет:

      paused = !paused;
notifyIcon.Icon?.Dispose();
notifyIcon.Icon = paused 
                    ? Properties.Resources.RedIcon;
                    : Properties.Resources.GreenIcon;
Другие вопросы по тегам