ScaleTransform の代わりに、y 方向に -1 ずつスケーリングし、座標原点をコントロールの中心に変換する MatrixTransform を使用できます。ただし、この変換は、コントロールのサイズが変更されるたびに更新する必要があります。RenderTransform
したがって、以下のように OnRenderSizeChanged をオーバーライドします (コントロールのプロパティを設定すると仮定します)。
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);
}
もちろん、Transform を「トップレベル」のビジュアルに適用するだけで済みます。これらのビジュアルの子は、親の変換によって変換されます。「VisualCollection を含む Border サブクラス」でビジュアルを管理する方法が正確にはわかりません。典型的なアプローチは、1 つの親 ContainerVisual をビジュアル ツリーのルートとして持つことです。変換は、このルート ビジュアルのみに適用されます。