如何在WPF中将位图渲染到画布上?

10

我已经子类化了 Canvas,以便可以重写它的 Render 函数。我需要知道如何在 WPF 中加载位图并将其渲染到画布上。我完全不熟悉 WPF,并且没有找到任何教程来展示如何做一些看似微不足道的事情。带有示例的分步说明将是很好的。

3个回答

15
在WPF中,如果您只想在背景上绘制一个BMP图像,那么您很少需要重写OnRender方法:
<Canvas>
    <Canvas.Background>
        <ImageBrush ImageSource="Resources\background.bmp" />
    </Canvas.Background>
    <!-- ... -->
</Canvas>

11

以下内容可以帮助您入门:

class MyCanvas : Canvas {
   protected override void OnRender (DrawingContext dc) {
      BitmapImage img = new BitmapImage (new Uri ("c:\\demo.jpg"));
      dc.DrawImage (img, new Rect (0, 0, img.PixelWidth, img.PixelHeight));
   }
}

3

如果您想要绘制画布的背景,我建议您使用ImageBrush作为Background,因为这很简单,您不需要子类化Canvas来重写Onender

但是我将为您提供所需的演示源代码:

创建一个类(我称之为ImageCanvas

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;

    namespace WpfApplication1
    {
        public class ImageCanvas : Canvas
        {
            public ImageSource CanvasImageSource
            {
                get { return (ImageSource)GetValue(CanvasImageSourceProperty); }
                set { SetValue(CanvasImageSourceProperty, value); }
            }

            public static readonly DependencyProperty CanvasImageSourceProperty =
                DependencyProperty.Register("CanvasImageSource", typeof(ImageSource),
                typeof(ImageCanvas), new FrameworkPropertyMetadata(default(ImageSource)));

            protected override void OnRender(System.Windows.Media.DrawingContext dc)
            {
                dc.DrawImage(CanvasImageSource, new Rect(this.RenderSize));
                base.OnRender(dc);
            }
        }
    }

现在你可以像这样使用它:
<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1" Title="Window1" Height="300" Width="300">
    <Grid>
        <local:ImageCanvas CanvasImageSource="/Splash.png">
            <TextBlock Text="Hello From Mihir!" />
        </local:ImageCanvas>
    </Grid>
</Window>

困惑中。我该如何使用这段代码?如果我有一个位图'b',我该怎么渲染它? ImageCanvas.Render(b);无法工作。 - john k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接