Я недавно работал над проектом, использующим WPF для создания диаграммы. В этом я должен показать текст рядом с символами, которые иллюстрируют информацию, связанную с текстом.
Для рисования символов я изначально использовал несколько изображений png, которые я создал. На моей диаграмме эти изображения выглядели размытыми и выглядели хуже только при увеличении. Чтобы улучшить это, я решил использовать векторный, а не растровый формат изображения. Ниже приведен метод, который я использовал для получения растрового изображения из пути к файлу:
protected Image GetSymbolImage(string symbolPath, int symbolHeight)
{
Image symbol = new Image();
symbol.Height = symbolHeight;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(symbolPath);
bitmapImage.DecodePixelHeight = symbolHeight;
bitmapImage.EndInit();
symbol.Source = bitmapImage;
return symbol;
}
К сожалению, это не распознает векторные форматы изображений. Поэтому вместо этого я использовал метод, подобный следующему, где «путь» - это путь к файлу с векторным изображением в формате .xaml:
public static Canvas LoadXamlCanvas(string path)
{
//if a file exists at the specified path
if (File.Exists(path))
{
//store the text in the file
string text = File.ReadAllText(path);
//produce a canvas from the text
StringReader stringReader = new StringReader(text);
XmlReader xmlReader = XmlReader.Create(stringReader);
Canvas c = (Canvas)XamlReader.Load(xmlReader);
//return the canvas
return c;
}
return null;
}
Это сработало, но резко убило производительность при повторном вызове.
Я обнаружил, что логика, необходимая для преобразования текста в холст (см. Выше), была основной причиной проблемы с производительностью, поэтому встраивание изображений .xaml само по себе не решит проблему с производительностью.
Я пытался использовать этот метод только при начальной загрузке моего приложения и сохранении полученных холстов в словаре, к которому впоследствии можно было получить доступ гораздо быстрее, но позже я понял, что при использовании холстов в словаре мне придется делать их копии , Вся логика, которую я обнаружил в Интернете, связанная с созданием копий, использует XamlWriter и XamlReader, что опять-таки просто создает проблему с производительностью.
Решение, которое я использовал, состояло в том, чтобы скопировать содержимое каждого изображения .xaml в его собственный пользовательский элемент управления, а затем использовать эти пользовательские элементы управления, где это необходимо. Это означает, что теперь я отображаю векторную графику, и производительность намного лучше.
Однако это решение мне кажется довольно неуклюжим. Я новичок в WPF, и мне интересно, есть ли какой-нибудь встроенный способ хранения и повторного использования xaml в приложении?
Извините за длительность этого вопроса. Я думал, что запись моих попыток может помочь кому-то с подобной проблемой.
Спасибо.