我想知道是否有人在将缩放变换应用于形状时设法覆盖了 WPF 形状渲染的默认行为。默认行为会转换整个形状绘图,包括笔划,但我只想缩放几何图形。困难在于我的形状位于视觉层次结构中,渲染变换应用于不同的级别(有点像 2D 场景图,但 WPF 视觉树),我无法更改(!)。我在不同的地方读到,可以创建一个自定义形状来取消渲染变换的变换并将其放在几何体上。目前我有类似的东西:
public sealed class MyPath : Shape
{
// This class has a Data property of type Geometry just like the normal Path class
protected override Geometry DefiningGeometry
{
get
{
Geometry data = Data;
if (data == null)
{
data = Geometry.Empty;
}
return data;
}
}
protected override void OnRender(DrawingContext drawingContext)
{
Transform tr = RenderedGeometry.Transform;
Geometry geomToDraw = RenderedGeometry.Clone();
geomToDraw.Transform = new MatrixTransform(tr.Value * tr.Value);
Matrix trInv = tr.Value; trInv.Invert();
drawingContext.PushTransform(new MatrixTransform(trInv));
drawingContext.DrawGeometry(Brushes.Transparent, new Pen() { Brush = Brushes.Black, Thickness = 1 }, geomToDraw);
}
}
很明显,我对此很陌生,上面的代码可能完全搞砸了。我试图将矩阵转移到几何而不改变最终得到的几何变换,因此 tr.Value*tr.Value 和 trInv。但它不像我想要的那样工作。我知道这种转移变换技术在理论上是有效的,因为我用恒定变换进行了尝试(测试设置 Geometry.Transform 以用 4 缩放 x 并推动变换以用 0.25 缩放 x 工作正常,但生成的形状绘图似乎并不适用拉伸=填充,我依赖)。所以渲染转换一定有一些我遗漏的东西。
不工作的测试场景是这样的:
- 我在 xaml 中应用了 scaleX=4 和 scaleY=1 的渲染比例变换。
- 内置的 Path 类缩放整个绘图,使 x 方向的笔划比 y 方向的笔划宽 4 倍。
- 我希望 MyPath 仅缩放几何图形,而不是笔划。<- 这不起作用!
- 发生的情况是:几何图形正确缩放,笔划在 x 方向缩放 4,在 y 方向缩放略小于 4。怎么了?我有一种感觉,我不应该只使用 RenderedGeometry.Transform 而是应该使用什么来代替?我需要在形状上合并渲染变换和拉伸=填充。我的渲染变换层次结构可能包含缩放、旋转和平移的混合,因此解决方案必须足够通用以处理任何变换,而不仅仅是轴对齐缩放。
注意:我知道在 OnRender 中创建几何体很糟糕,但我想在花时间清理它之前让它工作。
顺便说一句,我读了这篇文章:
如前所述,问题是我确实必须考虑渲染转换,我不确定如何调整该解决方案以与它们一起使用。