我正在用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
控件
答案 0 :(得分:2)
您可以使用WriteableBitmap或使用WPF容器,例如Grid或Canvas,其中包含许多矩形。很大程度上取决于游戏板的大小。 WriteableBitmap可能更适合于大型地图,对于较小的尺寸,画布或网格可能更容易。
答案 1 :(得分:1)
我认为你使用WriteableBitmap.WritePixel让自己变得更难。使用Shapes或使用RendterTargetBitmap和DeviceContext绘制时间会更好。
以下是一些关于如何使用此方法绘制的代码。
MainForm的XAML:
<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”。