代替ScaleTransform,您可以使用MatrixTransform,它在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爲類並將其應用於視覺兒童收藏中的每個視覺。
private MatrixTransform transform = new MatrixTransform();
分配到每一個新的Visual的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的Border子類」來管理視覺效果。典型的做法是將一個父ContainerVisual作爲可視化樹的根。然後,轉換將僅應用於此根視覺。
這不幸地移動了整個'邊界'控制。 –
看我的編輯。我認爲它比你的解決方案簡單得多。主要的一點是它對所有的Visuals都使用相同的Transform實例。 – Clemens
這正是我的解決方案正在做的,實際上。 –