WPF 如何刷新 Canvas

WPF页面上有个Canvas,里面有几个Textblock控件,当成模板用然后写个For循环对这个Canvas的大小和里面的控件进行赋值修改,代码如下:我的想法是,每次执... WPF页面上有个Canvas,里面有几个Textblock控件,当成模板用
然后写个For循环对这个 Canvas 的大小和里面的控件进行赋值修改,代码如下:
我的想法是,每次执行循环执行修改 Canvas 样式,然后生成 Image 图片放进 图片序列 lstPrintImage 中,可现在的问题是循环执行到第几次获取到的图片都是 Canvas 被赋值前的样子,整个方法执行完之后 Canvas 显示最后一次循环的样式结果,求大师帮忙解Canvas即时生成刷新的问题啊~!!在线等~!!
for (int i = 0; i < lstPreviewCoupon.Count; i++)
{
SetCanvasStyle(lstPreviewCoupon[i]);
lstPrintImage.Add(GetPrintImage(cvPreview));
}

private void SetCanvasStyle(CouponData model)
{
Dispatcher.Invoke(new Action(() =>
{
#region 样式赋值
cvPreview.Width = DrawTool.MillimetersToPixels(Convert.ToDouble(previewTemplate.TEMPLATESIZE_X));
cvPreview.Height = DrawTool.MillimetersToPixels(Convert.ToDouble(previewTemplate.TEMPLATESIZE_Y));
//备注显示设置
lblPreviewCpnRemark.FontSize = Convert.ToDouble(previewTemplate.REMARKSIZE);
lblPreviewCpnRemark.FontFamily = new System.Windows.Media.FontFamily(previewTemplate.REMARKSTYLE);
string str = previewTemplate.TEMPLATEREMARK.Replace("\\n", "\n");
lblPreviewCpnRemark.Text = str;
#endregion
}));
}
展开
 我来答
阳光的雷咩咩
2013-11-19 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7819万
展开全部
看了你的代码只是涉及到控件位置和大小的改变,没有其他精确的计算,那为何还要canvas这种绝对定位的容器?建议说说你的需求,并重新设计构架。
更多追问追答
追问

因为提问的时候粘贴不了那么长的代码,我只是复制了几句简单的赋值操作出来,方便大神读码,我的Canvas每次循环的时候都已经赋值成功了,执行完也可以显示,但是在循环中生成图片的时候都是赋值操作之前的样式截图,我程序的功能就是用 Canvas 作为打印样式模板,打印多个样式相同内容不同的图片比如这样的:

追答
打印我还没怎么做过,不过你可以把代码发给我调试一下。675686066#qq邮
khlerc
2013-11-19 · TA获得超过420个赞
知道小有建树答主
回答量:485
采纳率:0%
帮助的人:273万
展开全部
必然是这样的啊,C#对对象的使用本质上是引用,所以下面的语句:

lstPrintImage.Add(GetPrintImage(cvPreview));

for循环里一直改的是cvPreview对象的值,结果就是cvPreview只保存了最后一个cvPreview的更新。
解决方法:你应该new多个cvPreview对象,形成一个数组,最后循环打印这个数组。
追问
和你得分析有点出入,我for循环里是修改一次cvPreview对象就把他的生成图片保存好,我也分步骤跟踪了一下,循环生成的所有图片都是for循环开始之前的样子,最后代码都跑完以后,cvPreview对象变成了循环最后一次赋值的样子,这倒是真的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式