использование GDI + в приложении WPF - PullRequest
2 голосов
/ 03 марта 2011

Я пишу программу в приложении WPF, которая имитирует игру жизни.Как я могу предварительно выполнить графические операции, подобные GDI +, чтобы создать изображение, содержащее сетку ячеек?

(Обычно в WinForms я бы знал, как выполнять эту операцию).

Редактировать: Я использовал этот код:

            WriteableBitmap wb = new WriteableBitmap(width * 5, height * 5, 100, 100, new PixelFormat(), new BitmapPalette(new List<Color> { Color.FromArgb(255, 255, 0, 0) }));
        wb.WritePixels(new Int32Rect(0, 0, 5, 5), new IntPtr(), 3, 3);
        Background.Source = wb;

Фон является System.Windows.Controls.Image Элемент управления

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Вы можете использовать WriteableBitmap или использовать контейнер WPF, такой как Grid или Canvas с большим количеством прямоугольников в нем. Многое зависит от размера игрового поля. WriteableBitmap может лучше подходить для огромной карты, а холст или сетка может быть проще для меньших размеров.

Это то, что вы ищете?

1 голос
/ 04 марта 2011

Я думаю, что вы усложняете себе жизнь, используя WriteableBitmap.WritePixel.Вы будете гораздо лучше рисовать время с помощью Shapes или с помощью RendterTargetBitmap и DeviceContext.

Вот некоторый код того, как вы будете рисовать, используя этот метод.

XAML из MainForm:

<Grid>
    <Image Name="Background"
           Width="200"
           Height="200"
           VerticalAlignment="Center"
           HorizontalAlignment="Center" />
</Grid>

Основной код MainForm:

private RenderTargetBitmap buffer;
private DrawingVisual drawingVisual = new DrawingVisual();

public MainWindow()
{
    InitializeComponent();            
}

protected override void OnRender(DrawingContext drawingContext)
{
    base.OnRender(drawingContext);
    buffer = new RenderTargetBitmap((int)Background.Width, (int)Background.Height, 96, 96, PixelFormats.Pbgra32);
    Background.Source = buffer;
    DrawStuff();
}

private void DrawStuff()
{
    if (buffer == null)
        return;

    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
    {
        drawingContext.DrawRectangle(new SolidColorBrush(Colors.Red), null, new Rect(0, 0, 10, 10));
    }

    buffer.Render(drawingVisual);
}

Настройте ширину / высоту изображения по своему усмотрению.Вся ваша логика рисования должна быть внутри оператора using.Вы найдете, что методы DrawingContext гораздо более гибкие и более простые для понимания, чем WritePixel.Вызывайте DrawStuff всякий раз, когда вы хотите вызвать перерисовку.

...