2010-01-30 13 views
9

He subclasificado Canvas para poder anular su función Render. Necesito saber cómo puedo cargar un mapa de bits en WPF y renderizarlo en el lienzo. Soy completamente nuevo en WPF y no he encontrado ningún tutorial que te muestre cómo hacer algo tan aparentemente trivial. Las instrucciones paso a paso con ejemplos serían geniales.¿Cómo renderizar bitmap en canvas en WPF?

Respuesta

11

Esto debería empezar:

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

Si desea pintar el fondo del lienzo, yo recomendaría usar ImageBrush como Background, 'coz que es sencillo ya que no necesita subclase Canvas para anular Onender.

Pero te voy a dar una fuente de código de demostración de lo que has pedido:

crear una clase (la he llamado 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); 
      } 
     } 
    } 

Ahora se puede utilizar de esta manera :

<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> 
11

En WPF es un caso raro de que se necesitaría para anular OnRender especialmente si todo lo que quería hacer era dibujar un BMP a un fondo:

<Canvas> 
    <Canvas.Background> 
     <ImageBrush ImageSource="Resources\background.bmp" /> 
    </Canvas.Background> 
    <!-- ... --> 
</Canvas> 
Cuestiones relacionadas