c# - 使用 Visual Studio 2010 Express 创建我可以绘制的表面

标签 c# wpf winforms drawing system.drawing

我有 Java 背景,并试图将我编写的 Conway 生命游戏的简单版本移植到 C# 以学习该语言。

在 Java 中,我通过继承 JComponent 并覆盖 paint() 来绘制输出。我的新 Canvas 类然后有一个模拟后端的实例,它可以读取/操作。然后我能够获得 WYSIWYG GUI 编辑器(Matisse,来自 NetBeans)以允许我可视化放置 Canvas 。

在 C# 中,我发现我需要覆盖 OnPaint() 来绘制东西,这(据我所知)需要我继承某些东西(我选择了 Panel)。我不知道如何让 Windows 窗体编辑器让我放置自定义类。我也不确定我需要在生成的代码中的哪个位置放置我的类。

我该怎么做,并将我所有的绘图代码放入一个子类中,我真的应该怎么做?谷歌上缺乏简单的答案表明我在这里遗漏了一些重要的东西。如果有人也想建议一种在 WPF 中执行此操作的方法,我很想听听。

谢谢

最佳答案

在 Windows 窗体中,您可以通过调用其 CreateGraphics 方法简单地绘制任何控件。例如,如果你有一个面板,你可以这样画:

using (var g = panel1.CreateGraphics()) {
    g.DrawString("Hello World", 0, 0);
}

控件也有一个 Paint 事件。在属性窗口双击事件添加事件处理器,可以这样画:

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    e.Graphics.DrawString("Hello World", 0, 0);
}

如果您想从控件派生,您可以直接在代码中执行,或者创建一个新的用户控件并更改代码和 .Designer.cs 文件中的基类(虽然 UserControl 或者只是 Control 就可以了)。如果您在设计器中已经有一个窗体,它已经派生自 Form,您只需重写 OnPaint。

我的建议是:如果您只想绘制一些东西,通常不需要创建新类。只需使用 Paint 事件。如果需要立即重绘,请调用 Refresh 使控件自行重绘。这应该让你去。请注意,还有一个 protected DoubleBuffered 属性,它可以帮助您避免闪烁(为窗体或在您的派生控件中设置它)。

我不确定您会在 WPF 中做什么。我从来不需要在 WPF 中手动绘制一些东西,因为布局和渲染引擎非常强大,你可以只使用数据模板、控件模板等。WPF 的要点是你通常不绘制任何东西,引擎为您绘制。

关于c# - 使用 Visual Studio 2010 Express 创建我可以绘制的表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738781/

相关文章:

c# - 如何通过 MVVM 在 WPF Web 浏览器控件上使用 Javascript

c# - 如果结果返回 null,则为 TextBlock 提供默认值

C# Winform 桌面图标拒绝在特定计算机上更改

c# - 将值从子窗体转移到父窗体 c#.net

c# - 有没有办法写入同一个文件夹中的多个文件?

c# - 带有 Win32 父窗口的 WPF OpenFileDialog;窗口在关闭时没有重新获得焦点

c# - 添加此项目作为引用会导致循环依赖 mvvm

c# - 如何使用 C# 以编程方式切换用户

c# - HTTP 请求的多个小文件与一个大文件

.net - 在 Windows 窗体中运行 WCF