WriteableBitmap可以对元素产生贴图,而这个元素并不需要被实际添加到呈现元素中。Canvas的特点是在给定的宽度、高度显示元素,如果元素超出给定的viewport就不可见。对于一个元素来说裁剪左上部分的图片可以通过Canvas的SetLeft和SetTop函数或者对元素进行移动的变换(TranslateTransform)。而右下角的部分可以通过显示设置Canvas的宽度、高度来定义。比如你可以编写这么一个扩展函数来将元素裁剪到一个Canvas:
1 /// <summary> 2 /// 剪辑为画布 3 /// </summary> 4 /// <param name=”element”>元素</param> 5 /// <param name=”rect”>矩形</param> 6 /// <returns>画布</returns> 7 public static Canvas CropeedToCanvas(this FrameworkElement element, Rect rect) 8 { 9 // 平移变换 10 TranslateTransform transform = new TranslateTransform(); 11 12 transform.X = -rect.X; 13 transform.Y = -rect.Y; 14 15 Image image = new Image(); 16 17 image.Stretch = Stretch.None; 18 image.RenderTransform = transform; 19 image.Source = new WriteableBitmap(element, null); 20 21 Canvas canvas = new Canvas(); 22 23 canvas.Width = rect.Width; 24 canvas.Height = rect.Height; 25 26 canvas.Children.Add(image); 27 28 return canvas; 29 }
虽然Canvas内部只有一个元素,不要使用容纳单个元素的ContentControl来实现这个效果。比如Border,因为Border在指定Child的时候不会立刻计算出本身的ActualWidth和ActualHeight,而Canvas在调用Children属性的Add函数后,它的ActualWidth和ActualHeight会被重新计算。