2010-10-03 55 views
1

我有同样的问题,如"Printing in Silverlight 4规定”的问题。
要解决这个问题,我试图扩大在打印前改变我的视觉树的根。如何克隆的Silverlight可视化树结构

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; 
    } 

现在上面的代码正确地打印出的Silverlight视觉装配在一张纸上。

现在的问题是,LayoutRoot本身现在被按比例缩小的屏幕上。
问题是,在应用缩放转换之前,我有没有办法创建LayoutRoot的克隆?

我步行约是打印后再次应用规模改造的探讨,但我想知道是否有克隆的视觉树

回答

1

天哪,谢谢你的问题。我有同样的问题,但试图将容器的尺寸(已在视觉树中)设置为可打印区域,不是的工作,因为似乎需要另一个布局。 ScaleTransform确实立即在这里工作。

我很满意“解决办法”,只需在EndPrint事件中执行myContainer.ClearValue(FrameworkElement.RenderTransformProperty)即可。试图克隆可视化树会产生大量的其他问题(我有懒加载内容等)。

+0

谢谢,herzmeister。我没有想过实际“清除”集装箱价值。这似乎是比保存旧的渲染比例值更好的方法,然后重新转换它。 – Sung 2010-11-06 12:11:02

0

看看这个link对Silverlight的对象克隆的详细信息的方式。

另一个想法是使用xamlreader/writer读取xaml字符串并创建可视化树工作的内存副本。

为前

如果您的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); 
+2

XamlWriter/Reader仅在WPF中可用。 – Sung 2010-10-03 15:55:38