我应该在这里使用Geometry.Freeze吗?

时间:2012-11-02 07:38:49

标签: wpf geometry shapes

当WPF项目被冻结时,文档说它无法更改。在这种情况下,我只是不太确定“改变”是什么意思。

例如,如果我创建一个形状的实例然后冻结它,即使它被冻结,是否可以进行旋转或翻译?

1 个答案:

答案 0 :(得分:6)

简答:

对象冻结后,您无法修改其上的任何属性。这适用于递归。

更长的回答:

首先,Shape类(以及路径,椭圆,矩形等)不可冻结。

但假设您正在讨论Geometry,这是可冻结的,那么一般答案是,因为尝试修改冻结对象的属性是不可能的。例如,以下代码将引发异常

var geo = new LineGeometry();
geo.Freeze();
// InvalidOperationException:
geo.Transform = new TranslateTransform(10, 10);

冻结是递归的,因此可能会像这样欺骗系统:

var tx = new TranslateTransform(10, 10);
var geo = new LineGeometry();
geo.Transform = tx;
geo.Freeze();
// InvalidOperationException:
tx.X = 20;

但是,回到你关于形状的原始问题,这些形状是由几何构造的(但不是从它们衍生出来的)。

您可以冻结形状的几何体,并仍然将变换应用于该形状。这是因为变换是在形状对象上,而不是在freezable上:

var geo = new LineGeometry(new Point(0,0), new Point(10,10));
geo.Freeze();
var myShape = new Path { Data = geo };
// This is fine, even though the geometry is frozen
myShape.RenderTransform = new TranslateTransform(10, 10);