如何克隆Silverlight可视化树结构

时间:2010-10-03 05:44:28

标签: silverlight silverlight-4.0 clone

我遇到与"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的克隆?

我的解决方法是在打印后再次应用缩放变换,但我想知道是否有办法克隆可视树

2 个答案:

答案 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);