Что самый простой путь состоит в том, чтобы проверить, что uri пакета может быть найден?
Например, данный
pack://application:,,,Rhino.Mocks;3.5.0.1337;0b3305902db7183f;component/SomeImage.png
как я проверил бы, существует ли изображение на самом деле?
Удачи,
Berryl
Я не смог найти простого ответа на этот вопрос, поэтому в итоге я разработал свой собственный код для достижения трех вещей в отношении ресурсов изображений:
(1) иметь строковое представление uri пакета (databind)
(2) проверить, что изображение находится там, где я думаю, что оно находится (модульный тест)
(3) проверить, что pack uri можно использовать для установки изображения (unit test)
Отчасти это не просто потому, что pack uri поначалу немного запутанны и имеют несколько разновидностей. Этот код предназначен для pack uri, который представляет изображение, включенное в сборку VS (либо локально, либо в сборку по ссылке с действием сборки 'resource'). В этой msdn-статье разъясняется, что это значит в данном контексте. Вам также нужно понимать больше о сборках и билдах, чем может показаться на первый взгляд.
Надеюсь, это облегчит задачу кому-то еще. Будьте здоровы,
Berryl
/// <summary> (1) Creates a 'Resource' pack URI .</summary>
public static Uri CreatePackUri(Assembly assembly, string path, PackType packType)
{
Check.RequireNotNull(assembly);
Check.RequireStringValue(path, "path");
const string startString = "pack://application:,,,/{0};component/{1}";
string packString;
switch (packType)
{
case PackType.ReferencedAssemblySimpleName:
packString = string.Format(startString, assembly.GetName().Name, path);
break;
case PackType.ReferencedAssemblyAllAvailableParts:
// exercise for the reader
break;
default:
throw new ArgumentOutOfRangeException("packType");
}
return new Uri(packString);
}
/// <summary>(2) Verify the resource is located where I think it is.</summary>
public static bool ResourceExists(Assembly assembly, string resourcePath)
{
return GetResourcePaths(assembly).Contains(resourcePath.ToLowerInvariant());
}
public static IEnumerable<object> GetResourcePaths(Assembly assembly, CultureInfo culture)
{
var resourceName = assembly.GetName().Name + ".g";
var resourceManager = new ResourceManager(resourceName, assembly);
try
{
var resourceSet = resourceManager.GetResourceSet(culture, true, true);
foreach (DictionaryEntry resource in resourceSet)
{
yield return resource.Key;
}
}
finally
{
resourceManager.ReleaseAllResources();
}
}
/// <summary>(3) Verify the uri can construct an image.</summary>
public static bool CanCreateImageFrom(Uri uri)
{
try
{
var bm = new BitmapImage(uri);
return bm.UriSource == uri;
}
catch (Exception e)
{
Debug.WriteLine(e);
return false;
}
}