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 шт):
Скорее всего (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 после этого фикса уйдет, то я прав. Ну или дальше копать в этом направлении.

