WPF: растровое изображение не отображается - PullRequest
0 голосов
/ 10 октября 2010

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

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

Мой источник 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 Ответ

1 голос
/ 10 октября 2010

Вы можете поместить объект Image на холст, а затем использовать 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;
    }    
  }
...