2010-08-31 79 views
7

我们的应用程序在画布上有许多对象;画布包含在滚动查看器中。我们也有一个滑块控件和一些按钮,总是居中在窗口的顶部。
我试图通过捕获应用程序的位图来打印应用程序,但没有任何“装饰” - 滑块,按钮或滚动条。SL 4 - 强制重绘视觉树

 _scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; 
     _scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; 
     var s = xSlider; 
     s.Visibility = Visibility.Collapsed; 
     var b = xPlusButton; 
     b.Visibility = Visibility.Collapsed; 
     b = xMinusButton; 
     b.Visibility = Visibility.Collapsed; 

     b = xButton; 
     b.Visibility = Visibility.Collapsed; 

滑块和按钮被隐藏,如预期的那样,但滚动条不是。
我怀疑应用程序需要重绘布局以隐藏滚动条。有没有办法做到这一点?由于SL 4中的打印操作必须由UI手势启动,所以这变得更加复杂; (AFAIK)无法以编程方式启动,因此此重绘必须发生在PrintDocument事件处理程序之一中。

感谢您的任何建议....

+0

您可以显示您正在打印的Canvas的Xaml吗? “捕捉位图”评论听起来有点偏离,你能否说得通吗? – AnthonyWJones 2010-08-31 19:58:38

+0

我无法真正显示xaml,因为所有对象都在运行时添加,并大量使用模板。我相信这是导致恶作剧的模板;将Canvas传递给PrintDocument之后,该树永远不会重绘(至少不会完全)。由于打印输出是大量缺失或未完成绘制的对象,因此显示出来。 我们试图捕获Canvas的位图来解决未完成绘制的对象问题。 – Number8 2010-09-08 14:52:48

+0

你可以发布你的捕获位图的代码吗? – 2011-06-30 06:43:56

回答

7

尝试以下,

canvas.InvalidateMeasure(); 
canvas.InvalidateArrange(); 

您也可以使用WritableBitmap捕获的运行时刻图像和发送图像打印的文档,在情况打印文档时忽略渲染变换。

另外,如果您使用WritableBitmap捕获元素,则应该将RenderTransform作为第二个参数。你可以发布你的代码来捕获屏幕?

+0

请标记为答案,如果它帮助你。 – 2011-07-26 05:07:46

+0

+1为正确!这正是我需要强制LayouUpdated事件触发。 – dFlat 2011-09-20 05:50:36

2

除了Akash建议的InvalidateMeasure和InvalidateArrange方法之外,您还可以尝试使用UpdateLayout方法。

两个无效方法将标记控件的度量或安排为需要再次执行,但不一定立即执行。 UpdateLayout将强制它立即执行一些更新。

这是一个黑盒子,所以你可能需要无效然后调用UpdateLayout。有时你可能只需要调用UpdateLayout。