WPF. Визуальный редактор не отображает ресурс

Описание проблемы

Решил автоматизировать добавление векторной графики из SVG файлов.
Создал свой UserControl, добавил DependencyProperty Source типа Uri и в PropertyChangedCallback достаю текст SVG файла загруженного в сборку как Resource (Свойства > Действия при сборке > Resource) из полученного пути:

string ReadResourceText(Uri Resource)
{
    var StreamInfo = Application.GetResourceStream(Resource);
    var StreamReader = new System.IO.StreamReader(StreamInfo.Stream);
    return StreamReader.ReadToEnd();
}
//string ResourceText = ReadResourceText((Uri)e.NewValue);

Дальше парсил этот текст и на его основе создавал "реальные" элементы в своём контроле и задавал им свойства.
Добавил свой контрол (называется VectorImage) в окно: <local:VectorImage Source="android.svg"/>

При компиляции программы всё работает, но в визуальном дизайнере не результат не отображается и на присвоении свойства Source="android.svg" выдаёт ошибку Ссылка на объект не указывает на экземпляр объекта. В чём может быть проблема?

Код

VectorImage.xaml.cs

public partial class VectorImage : UserControl
{
    public VectorImage()
    {
        InitializeComponent();
    }

    public static DependencyProperty SourceProperty;

    static VectorImage()
    {
        SourceProperty = DependencyProperty.Register("Source", typeof(Uri), typeof(VectorImage),
            new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnSourceChanged)));
    }

    public Uri Source
    {
        get { return (Uri)GetValue(SourceProperty); }
        set { SetValue(SourceProperty, value); }
    }

    static void OnSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        // Извлечение текста из указанного ресурса
        string ReadResourceText(Uri Resource)
        {
            var StreamInfo = Application.GetResourceStream(Resource);
            var StreamReader = new System.IO.StreamReader(StreamInfo.Stream);
            return StreamReader.ReadToEnd();
        }

        // Получение расширения файла ресурса
        string Extension = System.IO.Path.GetExtension((e.NewValue as Uri).OriginalString).Substring(1);
        // (sender as VectorImage).viewbox - создан в xaml (больше ничего)
        // Проверка расширения
        switch (Extension)
        {
            case "svg":
                (sender as VectorImage).viewbox.Child = Converter.FromSVG(ReadResourceText((Uri)e.NewValue));
                return;
            default:
                throw new Exception("Расширение \"" + Extension + "\" не поддерживается.");
        }
    }

    static class Converter
    {
        public static Grid FromSVG(string ResourceText)
        {
            // Тут много кода
            // Работа с текстом и создание элементов
        }
    }
}

Скриншоты

В редакторе

При запуске


Ответы (1 шт):

Автор решения: aepot

Скорее всего (sender as VectorImage).viewbox возвращает null. Попробуйте разобраться, почему. В вашем коде я не вижу никакого viewbox. Ну либо можно начать с того, что добавить проверку на null

switch (Extension)
{
    case "svg":
        if (sender is VectorImage vectorImage && vectorImage.viewbox != null)
            vectorImage.viewbox.Child = Converter.FromSVG(ReadResourceText((Uri)e.NewValue));
        break;
    default:
        throw new Exception("Расширение \"" + Extension + "\" не поддерживается.");
}

Если NullReferenceException после этого фикса уйдет, то я прав. Ну или дальше копать в этом направлении.

→ Ссылка