我有一个简单的处理程序,它将椭圆添加到空的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“值不在预期范围内”。如何在范围内一次,然后立即超出范围?在这样的代码中复制路径的正确方法是什么?
答案 0 :(得分:3)
看起来克隆路径的唯一方法是手动执行此操作。引用this answer from Yi-Lun Luo:
Data属性实际上是一个Geometry。虽然在Silverlight中没有引人注意,但是几何实际上依赖于底层系统资源(因为它需要绘制一些东西)。如果需要绘制另一个Geometry,则需要另一个系统资源。因此,在将其分配给新路径之前,必须先克隆它。在WPF中,我们在Geometry上有一个Clone方法,遗憾的是Silverlight不支持这种方法。所以你必须手动完成克隆。
Yi-Lun声称包含用于克隆几何体的反射代码的另一篇文章,相同的代码似乎出现here,尽管后者格式更清晰。但是,在您的情况下,使用诸如此类的方法似乎有点过头了。您使用的几何图形由MakeElipse
[原文]方法创建。提取公共代码以将几何生成为方法似乎是最好的方法。
错误消息“值不在预期范围内”有点误导。我没有看到任何“超出范围”,因为假设完全相同的物体在你的第一个椭圆的范围内。我不能确切地说出为什么会报告此错误消息,但我可以推测。 Silverlight是在本机代码中实现的,我相信因为本机代码不能抛出异常,所以它会返回数字错误代码。也许错误代码数量有限,而且“价值不在预期范围内”是错误选择的那个?