1

我有一个简单的处理程序,可以将椭圆添加到空的 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 “值不在预期范围内”。它怎么可能一次在范围内,然后立即超出范围?在这样的代码中复制路径的正确方法是什么?

4

1 回答 1

3

看起来克隆路径的唯一方法是手动进行。引用罗一伦的回答

Data 属性实际上是一个 Geometry。虽然在 Silverlight 中并不明显,但 A Geometry 实际上依赖于底层系统资源(因为它需要绘制一些东西)。如果您需要绘制另一个几何图形,则需要另一个系统资源。因此,您必须先克隆它,然后再将其分配给新路径。在 WPF 中,我们在 Geometry 上确实有一个 Clone 方法,不幸的是,Silverlight 不支持这种方法。所以你必须手动进行克隆。

Yi-Lun 声称包含用于克隆几何图形的反射代码的另一篇文章,此处似乎出现了相同的代码,尽管后者的格式更清晰。但是,在您的情况下,使用这样的方法似乎有点矫枉过正。您使用的几何图形是由您的MakeElipse[sic] 方法创建的。将生成几何图形的通用代码提取到一个方法中似乎是最好的方法。

错误消息“值不在预期范围内”有点误导。我没有看到任何“超出范围”的东西,因为假定完全相同的对象在您的第一个椭圆的范围内。我无法确切说明为什么会报告此错误消息,但我可以推测。Silverlight 是在本机代码中实现的,我相信由于本机代码不能抛出异常,它会返回数字错误代码。也许错误代码的数量有限,而“值不在预期范围内”的错误代码是为该错误选择的错误代码?

于 2012-09-15T15:57:29.363 回答