Как преобразовать xml в Image?
Я делаю векторный редактор диаграмм и схем(по типу diagrams. net). У меня есть два окна MainWindow и Startup(всплывающее окно с кнопками создать/октрыть диаграмму). Так вот я хочу чтобы у меня xml код преобразовывался в картинку, которая отобразится на канвасе.
Пробовал с chatgpt сделать, он вроде написал, но выдает ошибку Ошибка при открытии диаграммы значение параметра должно быть больше 0(Parameter pixelWidth;). Не знаю как пофиксить
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
private DrawingVisual ConvertXmlToDrawingVisual(string xmlFilePath)
{
// Загружаем XML-файл и анализируем его
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlFilePath);
// Создаем DrawingVisual для отображения содержимого XML
DrawingVisual visual = new DrawingVisual();
// Определяем шрифт и цвет для отображения текста
Typeface typeface = new Typeface("Arial");
Brush foreground = Brushes.Black;
// Создаем контекст рисования
using (DrawingContext context = visual.RenderOpen())
{
// Рекурсивно рисуем содержимое XML
DrawXmlOnVisual(context, xmlDoc.DocumentElement, typeface, foreground, new Point(10, 10));
}
return visual;
}
private void DrawXmlOnVisual(DrawingContext context, XmlNode node, Typeface typeface, Brush foreground, Point point)
{
// Рисуем текущий узел XML
string nodeText = node.Name;
FormattedText formattedText = new FormattedText(nodeText, CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeface, 12, foreground);
context.DrawText(formattedText, point);
point.Y += formattedText.Height;
// Если текущий узел имеет дочерние элементы, рекурсивно рисуем их
foreach (XmlNode childNode in node.ChildNodes)
{
DrawXmlOnVisual(context, childNode, typeface, foreground, point);
}
}
private void OpenExistingDiagram_Click(object sender, RoutedEventArgs e)
{
// Диалоговое окно открытия файла
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Диаграммы (*.xml)|*.xml|Все файлы (*.*)|*.*";
if (openFileDialog.ShowDialog() == true)
{
string filename = openFileDialog.FileName;
try
{
// Преобразуем XML в DrawingVisual
DrawingVisual visual = ConvertXmlToDrawingVisual(filename);
// Передаем DrawingVisual обратно в MainWindow для отображения на канвасе
(Application.Current.MainWindow as MainWindow).SetCanvasVisual(visual);
}
catch (Exception ex)
{
MessageBox.Show("Ошибка при открытии диаграммы: " + ex.Message);
}
}
}
public void SetCanvasVisual(DrawingVisual visual)
{
mainArea.Children.Clear();
// Создаем растровое изображение из DrawingVisual
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)mainArea.Width, (int)mainArea.Height, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(visual);
Image image = new Image();
image.Source = renderTargetBitmap;
mainArea.Children.Add(image);
}
По дате
По рейтингу
Используй сериализацию и десериализацию объектов, а не это кривое поделие.
нажать на виндовс + принтскрин предвратительно открыв хмл картинку , качество не гарантировано , но зато просто
Больше по теме