2013-03-27 68 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)); 
}