Как создавать и использовать ресурсы в.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;