проверка uri пакета

Что самый простой путь состоит в том, чтобы проверить, что uri пакета может быть найден?

Например, данный

pack://application:,,,Rhino.Mocks;3.5.0.1337;0b3305902db7183f;component/SomeImage.png

как я проверил бы, существует ли изображение на самом деле?

Удачи,
Berryl

5
задан Berryl 10 June 2010 в 20:21
поделиться

1 ответ

Я не смог найти простого ответа на этот вопрос, поэтому в итоге я разработал свой собственный код для достижения трех вещей в отношении ресурсов изображений:
(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;
        }
    }
5
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: