Exemple #1
0
        // 渲染并保存图片:传入文件全路径、要渲染的ItemsControl
        // todo 做成全局菜单栏里保存的方式
        public static void RenderImage(string path, ItemsControl itemsControl)
        {
            // 直接关闭导出窗口时path为空
            if (path == null)
            {
                return;
            }
            // 构造渲染图片的容器
            PixelSize          pixelSize          = new PixelSize((int)itemsControl.Width * 2, (int)itemsControl.Height * 2);
            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(pixelSize, new Vector(192, 192));

            // 在可视树上找到这个ItemsControl的的孩子ItemsPresenter
            IEnumerator <IVisual> panelChildren = itemsControl.GetVisualChildren().GetEnumerator();

            panelChildren.MoveNext();
            // ListBox > Border > ScrollViewer > Grid > ScrollContentPresenter > ItemsPresenter
            if (itemsControl is ListBox)
            {
                Border border = (Border)panelChildren.Current;
                panelChildren = border.GetVisualChildren().GetEnumerator();
                panelChildren.MoveNext();
                ScrollViewer scrollViewer = (ScrollViewer)panelChildren.Current;
                panelChildren = scrollViewer.GetVisualChildren().GetEnumerator();
                panelChildren.MoveNext();
                Grid grid = (Grid)panelChildren.Current;
                panelChildren = grid.GetVisualChildren().GetEnumerator();
                panelChildren.MoveNext();
                ScrollContentPresenter scrollContentPresenter = (ScrollContentPresenter)panelChildren.Current;
                panelChildren = scrollContentPresenter.GetVisualChildren().GetEnumerator();
                panelChildren.MoveNext();
            }
            // ItemsControl > Border > ItemsPresenter
            else
            {
                Border border = (Border)panelChildren.Current;
                panelChildren = border.GetVisualChildren().GetEnumerator();
                panelChildren.MoveNext();
            }
            ItemsPresenter itemsPresenter = (ItemsPresenter)panelChildren.Current;

            // 渲染并保存
            renderTargetBitmap.Render(itemsPresenter);
            renderTargetBitmap.Save(path);

            mainWindowVM.Tips = "导出图片至:" + path;
        }