您可以使用 MatrixTransform 代替 ScaleTransform,它在 y 方向上按 -1 缩放并将坐标原点转换到控件的中心。但是,只要控件的大小发生变化,就必须更新此转换。因此,您将覆盖 OnRenderSizeChanged,如下所示(假设您设置了RenderTransform
控件的属性):
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
RenderTransform = new MatrixTransform(1d, 0d, 0d, -1d,
sizeInfo.NewSize.Width / 2d, sizeInfo.NewSize.Height / 2d);
}
编辑:如果您不想转换整个控件,您还可以将 MatrixTransform 定义为类成员并将其应用于可视子集合中的每个 Visual。
private MatrixTransform transform = new MatrixTransform();
分配给每个新视觉对象的 Transform 属性:
ContainerVisual visual = ...
visual.Transform = transform;
在大小更改时,您只需更新 MatrixTransform:
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
transform.Matrix = new Matrix(1d, 0d, 0d, -1d,
sizeInfo.NewSize.Width / 2d, sizeInfo.NewSize.Height / 2d);
}
当然,您只需要将变换应用到“顶级”视觉效果。这些视觉的孩子将被他们父母的变换所改变。我不完全了解您如何通过“包含 VisualCollection 的边框子类”来管理您的视觉效果。典型的方法是让一个父 ContainerVisual 作为可视化树的根。然后将仅将变换应用于此根视觉对象。