在Silverlight / WPF中克隆PathGeometry

时间:2012-09-15 12:12:18

标签: wpf silverlight

我有一个简单的处理程序,它将椭圆添加到空的Silverlight画布

    private void UCLoaded(object sender, RoutedEventArgs e)
    {
        var geometry = MakeElipse(20, 15, new Point(100, 100));
        var ellipsePath = new Path
        {
            Data = geometry,
            Fill = new SolidColorBrush(Colors.DarkGray),
            StrokeThickness = 4,
            Stroke = new SolidColorBrush(Colors.Gray)
        };
        LayoutRoot.Children.Add(ellipsePath);
        //
        var duplicateEllipsePath = new Path();
        //duplicateEllipsePath.Data = ellipsePath.Data; 
        duplicateEllipsePath.Data = geometry;
        duplicateEllipsePath.Fill = ellipsePath.Fill; 
        duplicateEllipsePath.StrokeThickness = ellipsePath.StrokeThickness;
        duplicateEllipsePath.Stroke = ellipsePath.Stroke;
        LayoutRoot.Children.Add(duplicateEllipsePath);
    }

第一个椭圆ellipsePath很好,可以按预期渲染。但是行duplicateEllipsePath.Data = ellipsePath.Data或替代duplicateEllipsePath.Data = geometry各自抛出System.ArgumentException“值不在预期范围内”。如何在范围内一次,然后立即超出范围?在这样的代码中复制路径的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

看起来克隆路径的唯一方法是手动执行此操作。引用this answer from Yi-Lun Luo

  

Data属性实际上是一个Geometry。虽然在Silverlight中没有引人注意,但是几何实际上依赖于底层系统资源(因为它需要绘制一些东西)。如果需要绘制另一个Geometry,则需要另一个系统资源。因此,在将其分配给新路径之前,必须先克隆它。在WPF中,我们在Geometry上有一个Clone方法,遗憾的是Silverlight不支持这种方法。所以你必须手动完成克隆。

Yi-Lun声称包含用于克隆几何体的反射代码的另一篇文章,相同的代码似乎出现here,尽管后者格式更清晰。但是,在您的情况下,使用诸如此类的方法似乎有点过头了。您使用的几何图形由MakeElipse [原文]方法创建。提取公共代码以将几何生成为方法似乎是最好的方法。

错误消息“值不在预期范围内”有点误导。我没有看到任何“超出范围”,因为假设完全相同的物体在你的第一个椭圆的范围内。我不能确切地说出为什么会报告此错误消息,但我可以推测。 Silverlight是在本机代码中实现的,我相信因为本机代码不能抛出异常,所以它会返回数字错误代码。也许错误代码数量有限,而且“价值不在预期范围内”是错误选择的那个?