我遇到与"Printing in Silverlight 4中所述问题相同的问题。
为了解决这个问题,我尝试在打印之前缩放视觉树的变换根。
void document_PrintPage(object sender, PrintPageEventArgs e)
{
var renderScale = 1.0D;
if (LayoutRoot.ActualWidth > e.PrintableArea.Width)
renderScale = e.PrintableArea.Width/LayoutRoot.ActualWidth;
var scaleTransform = new ScaleTransform();
scaleTransform.ScaleX *= renderScale;
scaleTransform.ScaleY *= renderScale;
e.PageVisual = LayoutRoot;
e.PageVisual.RenderTransform = scaleTransform;
}
现在上面的代码正确打印出来,银色视觉效果适合放在一张纸上。
现在的问题是LayoutRoot
本身现在缩小了屏幕。
问题是,在应用缩放变换之前,我有没有办法创建LayoutRoot
的克隆?
我的解决方法是在打印后再次应用缩放变换,但我想知道是否有办法克隆可视树
答案 0 :(得分:1)
我的天哪,谢谢你的问题。我遇到了同样的问题,但试图将容器的尺寸(已经在可视树中)设置到可打印区域,这样做不工作,因为另一个布局通道似乎是需要。 ScaleTransform
立即在这里工作。
我只需在myContainer.ClearValue(FrameworkElement.RenderTransformProperty)
事件中执行EndPrint
即可完成“解决方法”。尝试克隆可视树将产生大量其他问题(我有延迟加载内容等)。
答案 1 :(得分:0)
有关silverlight对象克隆的详细信息,请查看此link。
另外一个想法是使用xamlreader / writer来读取xaml字符串并创建可视树工作的内存中副本。
for ex
如果您的xaml有一个名为originalbutton的按钮,使用下面的代码,您将获得readerLoadButton中按钮的副本
// Save the Button to a string.
string savedButton = XamlWriter.Save(originalButton);
// Load the button
StringReader stringReader = new StringReader(savedButton);
XmlReader xmlReader = XmlReader.Create(stringReader);
Button readerLoadButton = (Button)XamlReader.Load(xmlReader);