我有一个用C#制作的绘图框架。最近我一直在尝试做某事并发现以下问题:
当我使用Geometry
在DrawingVisual
上手动绘制RenderOpen
,然后使用TranslateTransform
移动它时,我有时会失去填充。
要查看会发生什么,您可以将以下框架元素插入到Window中并运行它:
class MyVisual : FrameworkElement {
private readonly DrawingVisual _visual = new DrawingVisual();
private readonly Geometry _geom;
private readonly Random _r = new Random();
public MyVisual()
{
AddVisualChild(_visual);
_geom = Geometry.Parse("M 95 100 L 130 130 95 160 Z").Clone();
_geom.Transform = new TranslateTransform();
UpdateVisual();
}
public void MoveGeom() {
var transform = _geom.Transform as TranslateTransform;
var x = _r.Next(-60, 200);
var y = _r.Next(-60, 200);
transform.X = x;
transform.Y = y;
}
void UpdateVisual()
{
using (var dc = _visual.RenderOpen())
{
UpdateVisual(dc);
}
}
private void UpdateVisual(DrawingContext dc)
{
var color = Brushes.Red;
var pen = new Pen(Brushes.Blue, 1);
dc.DrawGeometry(color, pen, _geom);
}
protected override int VisualChildrenCount => 1;
protected override Visual GetVisualChild(int index) => _visual;
}
public partial class MainWindow : Window
{
Timer _t = new Timer(500) { AutoReset = true };
public MainWindow()
{
InitializeComponent();
_t.Elapsed += (x, y) => Dispatcher.Invoke(() => _vis.MoveGeom());
_t.Start();
}
}
这是一个已知问题,是否有一些简单的解决方法或其他解决方案?
答案 0 :(得分:1)
这个解决方案似乎解决了这个问题:
{{1}}
显然,当单独设置两个坐标时会出现问题,因为设置单个坐标会导致两个更新,并且渲染过程会以任何方式混淆。