2010-10-10 4 views
0

Я хочу создать своего рода симуляцию. Будут многочисленные спрайты, плавающие вокруг. Поскольку я думаю, что рендеринг каждого кадра в тысячу раз те же примитивы, которые составляют спрайт, будет медленным, я хочу сделать их один раз в растровое изображение, а затем показать этот спрайт в каждом кадре.WPF: Растровое изображение не отображается

Но, похоже, он не работает, экран остается белым.

источник My WPF тривиальна:

<Window x:Class="WPFGraphicsTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="800" Width="1000"> 
    <Canvas> 

    </Canvas> 
</Window> 

И это мой код:

public partial class MainWindow : Window 
    { 
     Ellipse e; 
     RenderTargetBitmap bmp2; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      e = new Ellipse(); 
      e.Width = 40; 
      e.Height = 40; 
      e.Fill = new SolidColorBrush(Color.FromRgb(0, 0, 200)); 

      ((Canvas)this.Content).Children.Add(e); 
      ((Canvas)this.Content).Measure(new Size(1000, 800)); 
      ((Canvas)this.Content).Arrange(new Rect(new Size(1000, 800))); 

      RenderTargetBitmap bmp2 = new RenderTargetBitmap(40, 40, 96, 96, PixelFormats.Pbgra32); 

      bmp2.Render(e); 
      ((Canvas)this.Content).Children.Remove(e); 
} 


     protected override void OnRender(DrawingContext drawingContext) 
     { 
      base.OnRender(drawingContext); 

      drawingContext.DrawImage(bmp2, new Rect(100,100, 40, 40)); 

     } 
} 

Почему это не работает?

ответ

1

Вы можете поместить объект изображения на холст, а затем использовать RenderTargetBitmap для обновления изображения. Например

<Window x:Class="WPFGraphicsTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="800" Width="1000"> 
    <Canvas> 
     <Image Name="frameImage" /> 
    </Canvas> 
</Window> 

Затем вы можете обновить изображение, как это, к примеру, я просто делает новую эллипс каждые 100 мс. Конечно, вы должны управлять ручками и кистями лучше, чем я показываю здесь, это просто пример, чтобы прояснить это предложение.

public partial class MainWindow : Window 
    { 
    DispatcherTimer _timer = new DispatcherTimer(); 

    RenderTargetBitmap _renderSurface = 
     new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32); 

    Random _rnd = new Random(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     _timer = new DispatcherTimer(); 
     _timer.Interval = TimeSpan.FromMilliseconds(100); 
     _timer.Tick += new EventHandler(_timer_Tick); 
     _timer.Start();  
    } 

    void _timer_Tick(object sender, EventArgs e) 
    { 
     DrawingVisual visual = new DrawingVisual(); 
     DrawingContext context = visual.RenderOpen(); 
     int value = _rnd.Next(40); 
     context.DrawEllipse(
     new SolidColorBrush(Colors.Red), 
     new Pen(new SolidColorBrush(Colors.Black), 1), 
     new Point(value, value), value, value); 
     context.Close(); 

     _renderSurface.Render(visual); 
     frameImage.Source = _renderSurface; 
    }  
    } 
+0

Спасибо за ответ, но ваш код отображает эллипс в каждом кадре. Я хочу, чтобы эллипс отображался один раз в растровое изображение, а затем каждый кадр рисовал только растровое изображение. – codymanix

+0

@codymanix, используя этот пример, вы можете получить растровое изображение для рендеринга. В основном код в _timer_Tick - это то, что вам нужно сделать для растрового изображения. Если вы хотите сделать это только один раз, вы можете перенести этот код из функции _timer_Tick. Я просто включил это в образец, чтобы вы могли видеть, что обновление к растровому изображению отображается на экране. –

+0

ОК спасибо, что сработает. Но это означает, что я должен создать объект Image для каждого спрайта, который я хочу рисовать. Разве нельзя рисовать изображения на лету? Что случилось с моим кодом, разве он не должен работать? – codymanix

Смежные вопросы