Windows Phone 使用 WriteableBitmap后台生成图片

这几天项目是遇到一个需求,需要后台把几个元素生成到一张图片上,并保存到文件中

 private void cutscreen_Click(object sender, EventArgs e)
        {
            Grid contentGrid = new Grid()
            {
                Width = 400,
                Background = new SolidColorBrush(Colors.White)
            };
            RowDefinition row1 = new RowDefinition();
            RowDefinition row2 = new RowDefinition();

            contentGrid.RowDefinitions.Add(row1);
            contentGrid.RowDefinitions.Add(row2);


            Image ShowImg = new Image()
            {
                Source = new BitmapImage(new Uri("/Assets/Kelly-Clarkson.jpg", UriKind.Relative))
            };

            Grid.SetRow(ShowImg, 0);
            contentGrid.Children.Add(ShowImg);

            TextBlock ShowIntrotbk = new TextBlock()
            {
                Text = "我要把你和图片连接在一起",
                FontSize = 22,
                TextWrapping = TextWrapping.Wrap
            };

            Grid.SetRow(ShowIntrotbk, 1);
            contentGrid.Children.Add(ShowIntrotbk);

            SaveImage(contentGrid);
        }

        private void SaveImage(UIElement _cutimgPanel)
        {
            WriteableBitmap wrbitmap = new WriteableBitmap(_cutimgPanel, null);

            using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream fileStream = storage.CreateFile("CutPanel.jpg"))
                {
                    wrbitmap.SaveJpeg(fileStream, (int)_cutimgPanel.DesiredSize.Width, (int)_cutimgPanel.DesiredSize.Height, 0, 100);
                    MessageBox.Show("生成成功!");
                }
            } 
        }
View Code

这样居然有异常了

原来 获得的 Width和Height都是0,上面已经指定了宽度,但是依然没有获得

这时把生成的Grid添加的页面上,居然正常显示了(为了和下一张区分,我加了一个TextBox)

这就说明生成成功能,可为什么会报错呢?

原来,windows phone如果控件不在界面上显示时,是不会计算其布局大小的,所以没有宽度和高度的,那我们就手动计算一下呗,在后面添加完以下代码

contentGrid.Measure(new Size(400, 7000));//这时重新计算一下,这个高度是没有效果的最好超过你所有控件的加起来的高度
            contentGrid.Arrange(new Rect(0, 0, (int)contentGrid.DesiredSize.Width, (int)contentGrid.DesiredSize.Height));
View Code

完工了,这样我们就可以在后台拼接任意图片了

原文地址:https://www.cnblogs.com/LeeYZ/p/3691874.html