以下最小示例将 DrawingArea 放入 ScrolledWindow 中。在绘制事件反应中,绘制(部分)圆盘。当行 args.Cr.IdentityMatrix(); 时使用后,绘图无法正常工作,尽管应该不会有任何效果。没有线路,一切正常。问题发生在滚动过程中。该区域的某些矩形部分似乎没有更新。这是在 Windows 11 计算机上使用 GtkSharp 3.24.24 和 .NET 6.0(但我也可以在 Mac 上看到相同的效果)。
MinimalExample.cs
using Gtk; // GtkSharp (3.24.24.*), .NET 6.0, Windows 11
public class MainWindow : Window
{
public MainWindow() : base(WindowType.Toplevel)
{
DrawingArea Area = new DrawingArea();
Area.SetSizeRequest(1000, 1000);
Area.Drawn += AreaDrawn;
ScrolledWindow Win = new ScrolledWindow { Area };
Win.SetSizeRequest(500, 500);
Add(Win);
ShowAll();
}
void AreaDrawn(object sender, DrawnArgs args)
{
args.Cr.IdentityMatrix();
args.Cr.SetSourceRGB(1.0, 0.0, 0.0);
args.Cr.NewPath();
args.Cr.Arc(120, 120, 120, 0, 5);
args.Cr.Fill();
args.Cr.Dispose();
}
}
class Program
{
public static void Main()
{
Application.Init();
Window mainWindow = new MainWindow();
Application.Run();
}
}
它应该看起来像:,但通常看起来更像。难道我做错了什么?我知道,在这个最小的示例中,我可能会跳过 IdentiyMatrix() 调用,但在提取这个最小示例的更大项目中,我需要它。
期望:在 ScrolledWindow 内的 Gtk DrawingArea 上渲染一些绘图在滚动期间也应该正确显示。 观察:绘图混乱。
同时,我找到了解释:滚动后,args.Cr中的矩阵不再是单位矩阵,而是包含一个偏移量(对应于滚动的距离)。所以将其设置回单位矩阵是错误的。在操作它之前应该记住 args.Cr 中的矩阵(例如用于绘图的旋转),然后将其恢复到事件中传递的原始矩阵而不是恒等式。
我遇到了这个问题,因为 Cairo 上下文的处理由于 CairoHelper 的弃用而发生了变化,它总是为请求的 GdkWindow 提供一个 (0,0) 根矩阵。