2 Stimmen

Verwendung von GDI+ in einer WPF-Anwendung

Ich schreibe ein Programm in WPF-Anwendung, die das Spiel des Lebens simuliert. Wie kann ich GDI+ wie Grafik-Operationen vorbereiten, um ein Bild zu erstellen, das das Gitter der Zellen enthält?

(Normalerweise hätte ich in WinForms gewusst, wie man diesen Vorgang durchführt).

Bearbeiten: Ich habe diesen Code verwendet:

            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;

Hintergrund ist ein System.Windows.Controls.Image Kontrolle

2voto

Emond Punkte 48911

Sie könnten eine WriteableBitmap oder verwenden Sie einen WPF-Container wie ein Grid oder Canvas mit vielen Rechtecken darin. Vieles hängt von der Größe des Spielfelds ab. Eine WriteableBitmap könnte für eine große Karte besser geeignet sein und ein Canvas oder Grid könnte für kleinere Größen einfacher sein.

Ist es das, wonach Sie suchen?

1voto

JacobJ Punkte 3027

Ich denke, Sie machen es sich selbst schwerer, wenn Sie WriteableBitmap.WritePixel verwenden. Sie haben eine viel bessere Zeit Zeichnen mit Shapes oder mit RendterTargetBitmap und ein DeviceContext.

Hier ist etwas Code, wie Sie mit dieser Methode zeichnen würden.

MainForm's XAML:

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

MainForm's Code-Behind:

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);
}

Stellen Sie die Breite/Höhe des Bildes so ein, wie Sie es wünschen. Die gesamte Zeichenlogik sollte sich innerhalb der using-Anweisung befinden. Sie werden feststellen, dass die Methoden von DrawingContext viel flexibler und leichter zu verstehen sind als WritePixel. Rufen Sie "DrawStuff" immer dann auf, wenn Sie ein erneutes Zeichnen auslösen wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X