找回密码
 立即注册

QQ登录

只需一步,快速开始

moukin

新手上路

1

主题

3

帖子

33

积分

新手上路

积分
33
  • 30

    金币

  • 主题

  • 帖子

最新发帖
moukin
新手上路   /  发表于:2013-7-29 10:16  /   查看:6024  /  回复:6
我想保存C1chart到文件中,代码如下:
RenderTargetBitmap bm = new RenderTargetBitmap(c1Chart.ActualWidth, c1Chart.ActualHeight, 96, 96, PixelFormats.Default);
bm.Render(c1Chart);

PngBitEncoder...
FileStream...

假如我将chart显示出来之后,把chart传进来,上面的代码可以将chart保存到文件中,但是假如我只是在后台生成了chart但是将其显示出来的话,传进来的chart的ActualHeight和ActualWidth都是0,保存出来的图像也都是空白的。

不知道有人碰到过类似的问题么?如何解决?谢谢各位大大~

6 个回复

倒序浏览
gw0506
超级版主   /  发表于:2013-7-29 10:54:00
沙发
是WPF还是Silverlight的C1Chart?

代码执行的时机是什么时候?如果提供一个demo,会更有效帮助问题尽快解决。
回复 使用道具 举报
moukin
新手上路   /  发表于:2013-7-30 11:31:00
板凳
WPF的C1Chart;
界面上有按钮需要将生成的图像保存到Excel中,我的做法就是将View中的C1Chart直接传回到ViewModel中,作为FrameworkElement交给RenderTargetBitmap做render参数处理;
现在的问题是我一口气生成了好几幅图像作为TabItem,只有那些在前台显示过的Chart才能正确保存到Excel中,未曾显示的Chart不能正确保存,断点跟进去发现是未显示的View的ActualHeight和Width都是0,假如我手动选取了TabItem,将其中某个Chart显示出来之后,这个Chart也能正确保存了。但是我不能要求用户每次保存之前要把每个图像都点过显示一遍额。。
回复 使用道具 举报
gw0506
超级版主   /  发表于:2013-7-30 11:43:00
地板
你描述的case我清楚了,没有显示的Chart处于性能考虑,可能没有Render所以各属性还是初始值。我想这个原因也符合你的判断。所以,我建议你直接把demo贴上来,我们根据实际case,一起想办法。
回复 使用道具 举报
moukin
新手上路   /  发表于:2013-7-30 13:50:00
5#
MainWindow的DataContext是MainWindowViewModel,
其中有<ContentControl Content="{Binding Path=Workspaces}">
每个Workspace有另外的Template定义。

MainWindowViewModel.cs的伪代码如下:
public observable<WorkspaceViewModel> Workspaces{get;set;}
Calc()
{
    foreach(AnalyzeType type in typeof(AnalyzeType).GetEnumValues())
    {
        AnalyzeViewModel vm = new AnalyzeViewModel(type);
        vm.Calc();
        vm.setView(new AnalyzeView());
        Workspaces.Add(vm);
    }
}

Report()
{
    ...
    foreach(AnalyzeViewModel vm in Workspaces)
    {
        InsertChart(vm.View.Chart, left, top, width, height);
    }
}
其中vm.SetView方法是将View和ViewModel进行绑定,并且可以通过vm.Chart属性访问与其绑定的View;
View中的Chart属性即为C1Chart所绘Chart;
函数调用顺序即为...->Calc->Report;

InsertChart为另外一个文件中定义的函数,如下所示:
InsertChart(FrameworkElement chart, left, top, width, height)
{
    RenderTargetBitmap bm = new();
    DrawVisual dv = new();
    using(DrawContext dc = dv.RenderOpen())
    {
`      VisualBrush vb = new VisualBrush(chart);
        dc.DrawRectangle(vb, null, new Rec(...));
    }
    bm.Render(dv);

    PngBitmapEncoder enc = new();
    enc.Frames.Add(BitmapFrame.Create(bm));

    using(FileStream fs = new tempFile(path))
    {
        enc.Save(fs);
    }

    SaveFileToExcel(path);
}

本来MainWindowViewModel也有ActivateViewModel去显示特定VM的,但是做循环的话只会渲染最后一个View#也是能理解的#,我甚至尝试了用定时器去循环触发,即使这么极其不负责任的做法也尚未成功。。:~

希望能提供解决思路,万分感谢~
回复 使用道具 举报
gw0506
超级版主   /  发表于:2013-7-30 15:02:00
6#
方便吧工程直接打包贴出来吗?用上传附件的方式。
回复 使用道具 举报
gw0506
超级版主   /  发表于:2013-9-3 15:16:00
7#
该问题是否已经解决?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部