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을 정의 할 수 있습니다 시각적 인 하위 컬렉션의 모든 비주얼에 적용합니다. 크기에
ContainerVisual visual = ...
visual.Transform = transform;
당신이 단순히 MatrixTransform을 업데이트 변경 : 모든 새로운 시각의 변환 속성을
private MatrixTransform transform = new 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을 시각적 트리의 루트로 갖는 것입니다. 그런 다음 변환은이 루트 시각에만 적용됩니다.
이것은 불행히도 전체'Border' 컨트롤을 움직입니다. –
내 편집을 참조하십시오. 나는 아직도 당신의 솔루션보다 훨씬 간단하다고 생각합니다. 요점은 모든 Visual에 대해 동일한 Transform 인스턴스를 사용한다는 것입니다. – Clemens
그건 내 솔루션이하는 일입니다. –