使用TranslateTransform的几何有时会失去填充

时间:2016-05-11 09:40:19

标签: c# wpf

我有一个用C#制作的绘图框架。最近我一直在尝试做某事并发现以下问题:

当我使用GeometryDrawingVisual上手动绘制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();
        }
    }

这是一个已知问题,是否有一些简单的解决方法或其他解决方案?

1 个答案:

答案 0 :(得分:1)

这个解决方案似乎解决了这个问题:

{{1}}

显然,当单独设置两个坐标时会出现问题,因为设置单个坐标会导致两个更新,并且渲染过程会以任何方式混淆。