将Brush和BitmapImage合并在一起

时间:2014-11-11 19:42:16

标签: c# wpf

我尝试使用应用于按钮背景的画笔并在其上呈现BitmapImage,从而合并图像并将其设置为背景。

RenderTargetBitmap source = new RenderTargetBitmap(Convert.ToInt32(button.RenderSize.Width), Convert.ToInt32(button.RenderSize.Height), 96, 96, PixelFormats.Pbgra32);
DrawingVisual visual = new DrawingVisual();

using (DrawingContext drawingContext = visual.RenderOpen())
{
    drawingContext.DrawRectangle(button.Background, null, new Rect(new Point(0, 0), new Point(button.RenderSize.Width, button.RenderSize.Height)));
    drawingContext.Close();
    source.Render(visual);
}

visual = new DrawingVisual();

using (DrawingContext context = visual.RenderOpen())
{
    context.DrawImage(source, new Rect());
    context.DrawImage(image, new Rect());
    context.Close();
}

source.Render(visual);

但是,我无法将RenderTargetBitmap设置为按钮的Background属性。我甚至不确定这是否是做这种事情的最佳方式。

如果我可以将RenderTargetBitmap转换为画笔,这是最有效的方法吗?

干杯。

1 个答案:

答案 0 :(得分:0)

我们有很多方法可以使用代码隐藏来实现这一点,但我会尝试在这里使用XAML代码。这个想法是使用一些DrawingBrush作为背景。这个画笔需要一些Drawing。我们可以在这里使用DrawingGroup,因为它允许我们附加多个图纸。我们关心GeometryDrawingImageDrawingGeometryDrawing可以使用简单的RectangleGeometry渲染画笔,而ImageDrawing可以渲染图像。以下是示例XAML代码,我想您将输入包括输入brush和输入image作为一些资源:

<DrawingBrush>
   <DrawingBrush.Drawing>
      <DrawingGroup>
        <GeometryDrawing Brush="{StaticResource someBrush}">
           <GeometryDrawing.Geometry>
              <RectangleGeometry Rect="0,0,1,1"/>
           </GeometryDrawing.Geometry>
        </GeometryDrawing>
        <ImageDrawing ImageSource="{StaticResource someImage}" Rect="0,0,1,1"/>
      </DrawingGroup>
   </DrawingBrush.Drawing>
</DrawingBrush>

请注意,将上面的画笔用于某些背景时,通常会填充整个元素。所以Rect在这里并不重要,我们可以将它(对于RectangleGeometry和ImageDrawing)设置为相同的值。但是当你设置一些平铺背景时,那个Rect可能很重要。然后,您应该将其设置为其他值。

在上面的代码中,ImageDrawingGeometryDrawing之后声明,因此它会在GeometryDrawing之上呈现。这意味着后来宣布的图纸将在之前的图纸之上。这是我在GeometryDrawing之后声明LinearGradientBrush(从{绿色到红色呈现ImageDrawing)的结果,以便您可以看到LinearGradientBrush的透明效果:

enter image description here