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#也是能理解的#,我甚至尝试了用定时器去循环触发,即使这么极其不负责任的做法也尚未成功。。:~
希望能提供解决思路,万分感谢~ |