转换UIElement的Clip

时间:2012-10-15 15:33:27

标签: silverlight geometry transform clip uielement

我正在使用C#,Silverlight,Visual Studio for Windows Phone 7。

我想获得一个UIElement的剪辑,其中包含UIElement上已完成的任何变换。

此示例为我提供了Clip但不包含UIElement的任何转换:

// uie is a UIElement taken from a PhoneApplicationPage
Geometry myClip = uie.Clip;

我尝试了以下操作,但最终移动了UIElement

var frame = Application.Current.RootVisual as PhoneApplicationFrame;
var page = frame.Content as PhoneApplicationPage;
GeneralTransform gt = uie.TransformToVisual(page);
uie.RenderTransform = gt as Transform;
Geometry myClip = uie.Clip;

我还尝试在最后添加一个逆变换以撤消任何移动,但这似乎会使情况变得更糟:

uie.RenderTransform = gt.Inverse as Transform;

请帮助我使用UIElement的原始变换获取Clip,而不会弄乱UIElement本身。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我想出了如何在不弄乱原始UIElement的情况下解决这个问题。我需要创建一个具有相同数据的新Geometry对象,而不是使用原始Geometry。这不仅将新数据与旧数据分开,还可以防止对象被分配为多个对象的子对象。

以下是我使用的结果代码:

var frame = Application.Current.RootVisual as PhoneApplicationFrame;
var page = frame.Content as PhoneApplicationPage;
GeneralTransform gt = uie.TransformToVisual(page);
var place = gt.Transform(new Point());
// declaring new variables to hold these values
Geometry geom;
Path path = new Path();
// here I checked for other restrictions on my UIElements before assigning the variables
geom = new RectangleGeometry();
(geom as RectangleGeometry).Rect = new Rect(place.X, place.Y, uie.RenderSize.Width, uie.RenderSize.Height);
path.Data = geom;

我提到我在分配变量之前检查了我的UIElements的一些限制。这与我发布的关于剪辑的另一个问题(here)有关。