Как клонировать визуальную древовидную структуру Silverlight - PullRequest
1 голос
/ 03 октября 2010

У меня та же проблема, что и вопрос, заданный в «Печать в 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;
    }

Теперь приведенный выше код правильно распечатывается с использованием визуальных элементов silverlight, помещенных на листе бумаги.

Теперь проблема в том, что само LayoutRoot теперь уменьшено на экране.
Вопрос в том, можно ли мне создать клон LayoutRoot перед применением масштабного преобразования?

Мой способ - снова применить преобразование масштаба после печати, но я хотел бы знать, есть ли способ клонировать визуальное дерево

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Боже мой, спасибо за вопрос. У меня возникла та же проблема, но я попытался возиться с установкой размеров контейнера (который уже находится в визуальном дереве) в область печати, которая работает , а не , так как, по-видимому, требуется еще один проход макета. , ScaleTransform работает здесь, однако, мгновенно.

Я хорошо справляюсь с "обходным путем", просто делая myContainer.ClearValue(FrameworkElement.RenderTransformProperty) в событии EndPrint. Попытка клонировать визуальное дерево приведет к множеству других проблем (у меня ленивая загрузка контента и т. Д.).

0 голосов
/ 03 октября 2010

Проверьте эту ссылку для получения подробной информации о клоне объекта 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);
...