キャンバス コントロールがあり、そこにさまざまな形状を動的に追加しています。ScaleTransform を使用してズームを実装し、TranslateTransform によってパンを実装しました。 )、どうすればそれを達成できますか?
ありがとう、
ブラジル、
次の単純な派生 Canvas はCanvas.Left
、Canvas.Top
プロパティ値によって指定された変換された位置に子要素を配置します。変換は、ChildPositionTransform
依存関係プロパティによって適用されます。
public class ZoomCanvas : Canvas
{
public static readonly DependencyProperty ChildPositionTransformProperty =
DependencyProperty.Register(
"ChildPositionTransform", typeof(Transform), typeof(ZoomCanvas),
new FrameworkPropertyMetadata(
Transform.Identity, FrameworkPropertyMetadataOptions.AffectsArrange));
public Transform ChildPositionTransform
{
get { return (Transform)GetValue(ChildPositionTransformProperty); }
set { SetValue(ChildPositionTransformProperty, value); }
}
protected override Size ArrangeOverride(Size finalSize)
{
foreach (UIElement element in InternalChildren)
{
var x = GetLeft(element);
var y = GetTop(element);
var pos = new Point(double.IsNaN(x) ? 0d : x, double.IsNaN(y) ? 0d : y);
ArrangeElement(element, ChildPositionTransform.Transform(pos));
}
return finalSize;
}
private void ArrangeElement(UIElement element, Point position)
{
element.Arrange(new Rect(position, element.DesiredSize));
}
}
これで、ArrangeElement メソッドを改良することで、子要素のHorizontalAlignment
およびVerticalAlignment
プロパティも考慮に入れることができます。
private void ArrangeElement(UIElement element, Point position)
{
if (element is FrameworkElement)
{
switch (((FrameworkElement)element).HorizontalAlignment)
{
case HorizontalAlignment.Center:
position.X -= element.DesiredSize.Width / 2;
break;
case HorizontalAlignment.Right:
position.X -= element.DesiredSize.Width;
break;
default:
break;
}
switch (((FrameworkElement)element).VerticalAlignment)
{
case VerticalAlignment.Center:
position.Y -= element.DesiredSize.Height / 2;
break;
case VerticalAlignment.Bottom:
position.Y -= element.DesiredSize.Height;
break;
default:
break;
}
}
element.Arrange(new Rect(position, element.DesiredSize));
}