Export chart to xaml icons disappear
Export chart to xaml icons disappear
Hello,
We are using WPF TChart.
When we try to add to the chart some text and icons
and export the chart to xaml, the icons are not shown
When exporting the chart to bitmap the icons do show up.
We need the icons to show when exporting to xaml..
I add a sample project that demonstrate the problem,
just click "show xaml and image" button.
Thanks for your help
Best regard
We are using WPF TChart.
When we try to add to the chart some text and icons
and export the chart to xaml, the icons are not shown
When exporting the chart to bitmap the icons do show up.
We need the icons to show when exporting to xaml..
I add a sample project that demonstrate the problem,
just click "show xaml and image" button.
Thanks for your help
Best regard
- Attachments
-
- TChartXamlBug.rar
- (59.59 KiB) Downloaded 678 times
-
- Guru
- Posts: 1603
- Joined: Fri Nov 15, 2002 12:00 am
Re: Export chart to xaml icons disappear
You can add them in manually to the XAML file, e.g.yosi wrote: When exporting the chart to bitmap the icons do show up.
We need the icons to show when exporting to xaml..
d
Code: Select all
<Image Canvas.Left="20" Canvas.Top="10" Source="D:\Downloads\TChartXamlBug\TChartXamlBug\WpfApplication54\WpfApplication54\pic20.png"/>
<TextBlock TextOptions.TextFormattingMode="Ideal" Canvas.Left="50" Canvas.Top="10" Foreground="#FF000000" FontFamily="Verdana" FontSize="11.2" >
X
</TextBlock>
Best Regards,
Christopher Ireland / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Export chart to xaml icons disappear
Thanks for your answer.
We are using your component as part of critical care software.
Doctors and nurses using reports on daily base.
Your request that we will handle these icons is beyond our scope of development schedule.
We are using your component as a black box and we expect that a trivial behaver such as this will work.
We need a time line for fixing this bug so we will able to update our customers.
Best Regards
We are using your component as part of critical care software.
Doctors and nurses using reports on daily base.
Your request that we will handle these icons is beyond our scope of development schedule.
We are using your component as a black box and we expect that a trivial behaver such as this will work.
We need a time line for fixing this bug so we will able to update our customers.
Best Regards
-
- Guru
- Posts: 1603
- Joined: Fri Nov 15, 2002 12:00 am
Re: Export chart to xaml icons disappear
You're very welcome.yosi wrote:Thanks for your answer.
An alternative way to solve the issue is the following:
Code: Select all
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xaml;
using System.Xml;
using Steema.TeeChart.WPF.Drawing;
using XamlReader = System.Windows.Markup.XamlReader;
using XamlWriter = System.Windows.Markup.XamlWriter;
namespace WpfApplication54
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private const string xamlFile = "TTT.Xaml";
private const string imageFile = "TTT.bmp";
private string _xamlFilePath;
private string _imageFilePath;
public MainWindow()
{
InitializeComponent();
SetFilePath();
}
private void TChartControl_OnAfterDraw(object sender, Graphics3D g)
{
var icon = (BitmapImage)Resources["V"];
int x = 0;
int y = 0;
for (int i = 0; i < 10; i++)
{
x += 20;
y += 10;
TChartControl.Graphics3D.Draw(x, y, icon);
TChartControl.Graphics3D.TextOut(x + 30, y, "X ");
}
}
private void SetFilePath()
{
var dir = Environment.CurrentDirectory;
_xamlFilePath = System.IO.Path.Combine(dir, xamlFile);
_imageFilePath = System.IO.Path.Combine(dir, imageFile);
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
MyXAMLFormat xmal = new MyXAMLFormat(TChartControl.Chart);
xmal.Save(_xamlFilePath);
TChartControl.Export.Image.Bitmap.Save(_imageFilePath);
Window1 win = new Window1();
object canvas = null;
using (var fs = new FileStream(_xamlFilePath, FileMode.Open, FileAccess.Read))
{
canvas = XamlReader.Load(fs);
}
win.PalceHolder1.Content = canvas;
BitmapImage bimg = BitmapFromUri(new Uri(_imageFilePath));
win.PalceHolder2.Source = bimg;
win.ShowDialog();
}
public static BitmapImage BitmapFromUri(Uri source)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = source;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
return bitmap;
}
}
public class MyGraphics3DXAML : Steema.TeeChart.WPF.Drawing.Graphics3DXAML
{
public MyGraphics3DXAML(Stream stream, Steema.TeeChart.WPF.Chart chart, bool doShowImage)
: base(stream, chart, doShowImage)
{
}
private int imageCount = 0;
public override void Draw(double x, double y, BitmapSource image)
{
++imageCount;
string path = ImageExportPath + "\\MyImage" + imageCount.ToString() + ".png";
using (var fileStream = new FileStream(path, FileMode.Create))
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(fileStream);
}
AddToStream("<Image Width=\"" + image.PixelWidth + "\" Height=\"" + image.PixelHeight + "\" Canvas.Left=\"" + FloatToStr(x) + "\" Canvas.Top=\"" + FloatToStr(y) + "\" Source=\"" + path + "\"/>");
}
public void AddToStreamPublic(string s)
{
AddToStream(s);
}
public string ImageExportPath
{
get;
set;
}
}
public class MyXAMLFormat : Steema.TeeChart.WPF.Export.XAMLFormat
{
Steema.TeeChart.WPF.Chart chart;
public MyXAMLFormat(Steema.TeeChart.WPF.Chart c)
: base(c)
{
chart = c;
}
public override void Save(string FileName)
{
ImageExportPath = System.IO.Path.GetDirectoryName(FileName);
base.Save(FileName);
}
public override void Save(Stream stream)
{
Steema.TeeChart.WPF.Drawing.Graphics3D oldGraphics = chart.Graphics3D;
try
{
chart.Graphics3D = new MyGraphics3DXAML(stream, chart, false);
((MyGraphics3DXAML)chart.Graphics3D).ImageExportPath = ImageExportPath;
chart.Draw(null, new Rect(0, 0, Width, Height));
AdornerLayer parent = AdornerLayer.GetAdornerLayer(chart.Parent.GetControl());
if (parent != null)
{
Adorner[] adorners = parent.GetAdorners(chart.Parent.GetControl());
if (adorners != null)
{
foreach (Steema.TeeChart.WPF.TeeAdorner item in adorners)
{
item.Draw(chart.Graphics3D);
}
}
}
((MyGraphics3DXAML)chart.Graphics3D).AddToStreamPublic("</Canvas>");
}
finally
{
chart.Graphics3D = oldGraphics;
}
}
public string ImageExportPath
{
get;
set;
}
}
}
Best Regards,
Christopher Ireland / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Export chart to xaml icons disappear
Hi
Thanks for the solution
It works if the picture is on the disk.
If we resize the pictures and the pictures is in memory it not working
I add test project that demonstrate the Situation
I would appreciate your help
Best Regards
Thanks for the solution
It works if the picture is on the disk.
If we resize the pictures and the pictures is in memory it not working
I add test project that demonstrate the Situation
I would appreciate your help
Best Regards
- Attachments
-
- TChartXamParse.rar
- (69.82 KiB) Downloaded 663 times
-
- Guru
- Posts: 1603
- Joined: Fri Nov 15, 2002 12:00 am
Re: Export chart to xaml icons disappear
Hello,
You're code is wrong. Have a look at the TTT.Xaml file in a text editor:
This " Source="System.Windows.Media.Imaging.BitmapFrameEncode"" is wrong, and it is wrong because of your code in MyGraphics3DXAML:
If you have a look at my original code, you will be able to see how to do this correctly.
You're code is wrong. Have a look at the TTT.Xaml file in a text editor:
Code: Select all
</TextBlock>
<Image Width="24" Height="24" Canvas.Left="140" Canvas.Top="70" Source="System.Windows.Media.Imaging.BitmapFrameEncode"/>
<TextBlock TextOptions.TextFormattingMode="Ideal" Canvas.Left="170" Canvas.Top="70" Foreground="#FF000000" FontFamily="Verdana" FontSize="11.2" >
X
</TextBlock>
Code: Select all
public override void Draw(double x, double y, BitmapSource image)
{
AddToStream("<Image Width=\"" + image.PixelWidth + "\" Height=\"" + image.PixelHeight
+ "\" Canvas.Left=\"" + FloatToStr(x) + "\" Canvas.Top=\""+ FloatToStr(y)
+ "\" Source=\"" +image + "\"/>");
}
Best Regards,
Christopher Ireland / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Export chart to xaml icons disappear
Hi
As I say if you work with path for the pictures it work and the TTT.xaml file look like this
<Image Width="24" Height="24" Canvas.Left="80" Canvas.Top="40" Source="pack://application:,,,/TChartXamParse;component/pic20.png"/>
<TextBlock TextOptions.TextFormattingMode="Ideal" Canvas.Left="110" Canvas.Top="40" Foreground="#FF000000" FontFamily="Verdana" FontSize="11.2" >
X
</TextBlock>
Look for the ResizeBitmap method it resize the picture and the draw method get
System.Windows.Media.Imaging.BitmapFrameEncode so we don’t have path
If you mark this method it work and get the picture path
We need solution for this Situation
Best regards
As I say if you work with path for the pictures it work and the TTT.xaml file look like this
<Image Width="24" Height="24" Canvas.Left="80" Canvas.Top="40" Source="pack://application:,,,/TChartXamParse;component/pic20.png"/>
<TextBlock TextOptions.TextFormattingMode="Ideal" Canvas.Left="110" Canvas.Top="40" Foreground="#FF000000" FontFamily="Verdana" FontSize="11.2" >
X
</TextBlock>
Look for the ResizeBitmap method it resize the picture and the draw method get
System.Windows.Media.Imaging.BitmapFrameEncode so we don’t have path
If you mark this method it work and get the picture path
We need solution for this Situation
Best regards
-
- Guru
- Posts: 1603
- Joined: Fri Nov 15, 2002 12:00 am
Re: Export chart to xaml icons disappear
I'm sorry, I don't understand your problem. I see two possibilities:yosi wrote: Look for the ResizeBitmap method it resize the picture and the draw method get
System.Windows.Media.Imaging.BitmapFrameEncode so we don’t have path
If you mark this method it work and get the picture path
We need solution for this Situation
1) you save the TTT.xaml to file, in which case there is no problem
2) you save the TTT.xaml to stream, in which case there is no solution
Best Regards,
Christopher Ireland / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Export chart to xaml icons disappear
Hi
The TTT file saves to Xaml file.
The problem is to add the pictures to the xaml file in the draw method
public override void Draw(double x, double y, BitmapSource image)
{
AddToStream("<Image Width=\"" + image.PixelWidth + "\" Height=\"" + image.PixelHeight
+ "\" Canvas.Left=\"" + FloatToStr(x) + "\" Canvas.Top=\""+ FloatToStr(y)
+ "\" Source=\"" +image + "\"/>");
}
Because the picture is BitmapFrameEncode type after it resize in the ResizeBitmap method
The chart and the Bitmap.Save() display the images;
The xaml not, it set the source of the images to BitmapFrameEncode this is the problem
The test project demo this
Best Regards,
The TTT file saves to Xaml file.
The problem is to add the pictures to the xaml file in the draw method
public override void Draw(double x, double y, BitmapSource image)
{
AddToStream("<Image Width=\"" + image.PixelWidth + "\" Height=\"" + image.PixelHeight
+ "\" Canvas.Left=\"" + FloatToStr(x) + "\" Canvas.Top=\""+ FloatToStr(y)
+ "\" Source=\"" +image + "\"/>");
}
Because the picture is BitmapFrameEncode type after it resize in the ResizeBitmap method
The chart and the Bitmap.Save() display the images;
The xaml not, it set the source of the images to BitmapFrameEncode this is the problem
The test project demo this
Best Regards,
-
- Guru
- Posts: 1603
- Joined: Fri Nov 15, 2002 12:00 am
Re: Export chart to xaml icons disappear
If I replace the MyXAMLFormat class and the MyGraphics3DXAML class in your demo with the classes in my example, there is no problem. I do not understand why you cannot use my version of these classes.yosi wrote:Because the picture is BitmapFrameEncode type after it resize in the ResizeBitmap method
The chart and the Bitmap.Save() display the images;
The xaml not, it set the source of the images to BitmapFrameEncode this is the problem
The test project demo this
,
The ResizeBitmap is not a problem. This method calls "TChartControl.Graphics3D.Draw(x, y, rIcon);" and this method is overridden in "MyGraphics3DXAML.Draw(double x, double y, BitmapSource image)". If you do not save this image to file in MyGraphics3DXAML.Draw, as I do in my version of this method but as you do not do in your version of this method, then the XAML file cannot contain the correct image.
Best Regards,
Christopher Ireland / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |