Uri, как BitmapImageSource и внедренный в приложение картинки. Мистика?..
Пишу программку и чувствую, как начинают шевелиться волосы.
Наверное, многие, пишущие на WPF, знакомы с представлением путей внутри приложений.
"pack://application:,,,/AssemblyName;component/Path/FileName.ext"
Такой вот пакостью мне и понадобилось подцепиться к заброшенному в приложение изображению в формате png.
Всё прописал, запустил - not found. Хлопнул себя по лбу, выставил им "Внедрённый ресурс". Радостно запускаю и... та же картинка. Уже не столь уверенно сменил внедренный ресурс на просто ресурс. Нет эффекта. Чудно, вдоволь нагуглившись, решил попробовать пробросить к ресурсу поток... получилось! Попытал удачу ещё раз с Uri - работает! Радостно бросился проверять все остальные файлы и... Хрен.
В общем, с часик я ещё поразвлекался, а затем полез в недра солюшена, чтобы разобраться - какого же фига одни ресурсы находятся, а другие нет. И вот что я там обнаружил?
<ItemGroup>
<Resource Include="UI\Resources\Icon1.png" />
<Resource Include="UI\Resources\Icon2.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="UI\Resources\Icon3.png" />
<Resource Include="UI\Resources\Icon4.png" />
</ItemGroup>
Иконки 1 и 2 приложение видит. Иконки 3 и 4 - нет. Группы сформировались, видимо, при добавлении - добавлял как раз по две иконки. Но... почему то о существовании второй он даже не предполагает. При этом, я естественно и переименовывал файлы, и кидал их в корень проекта, и как только не извращался. Безрезультатно. Из первой группы файлы видно, из второй нет.
Я, конечно, сейчас перетащу их все в одну, ручками, но всё же - в чем причина столь неадекватного поведения?
---
Блеск! Объединение не помогло. Удаление не помогло. Более того - перенёс всё в корень проекта, а путь поменять забыл. И... иконки 1 и 2 ПРОДОЛЖАЮТ НАХОДИТЬСЯ! О_О А 3 и 4 - нет. Что за?!..
Код:
private static BitmapImage GetIcon(string resourceFile)
{
BitmapImage result = new BitmapImage();
string path = String.Format("{0}.UI.Resources.{1}", Global.AssemblyName, resourceFile);
using (var stream = Global.Assembly.GetManifestResourceStream(path))
{
result.BeginInit();
result.StreamSource = stream;
result.EndInit();
}
return result;
}
{
BitmapImage result = new BitmapImage();
string path = String.Format("{0}.UI.Resources.{1}", Global.AssemblyName, resourceFile);
using (var stream = Global.Assembly.GetManifestResourceStream(path))
{
result.BeginInit();
result.StreamSource = stream;
result.EndInit();
}
return result;
}