2013-03-27 67 views
0

我有一个画布控制,我动态添加不同的形状。我已经通过使用ScaleTransform和TranslateTransform平移实现了缩放。如果我必须放大和缩小而不调整形状在画布上(即调整画布的大小而不调整其子项),我将如何实现这一目标?缩放和平移问题翻译/ ScaleTransform WPF

感谢,

BR,

+1

你能发布你的代码吗? – 2013-03-27 18:52:41

+0

我认为粘贴代码不会有帮助。我没有做任何需要纠正的事情,建议我一些东西,这是我想问的。 – 2013-03-27 19:08:48

+0

如果你没有做任何事情,你不应该问别人的帮助。看看大多数负面评分的帖子。你会发现大多数评论都在问**你有什么试过?** – 2013-03-27 19:12:35

回答

0

下面的简单衍生帆布将安排在通过Canvas.LeftCanvas.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)); 
    } 
} 

现在你也可以采取子元素的HorizontalAlignmentVerticalAlignment属性考虑在内,通过细化ArrangeElement方法。

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)); 
}