2010-09-10 87 views
1

我遍歷給定Canvas對象的所有子節點。麻煩的是,它隻影響到兩個孩子中的一個。我在另一個類似事件中進行的另一個迭代工作得很好。我這有讓您可以拖動的元素:Canvas.Children的迭代問題

private Point lastmousepoint; 
    private void Window_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) 
     {     
      Point mousepos = e.GetPosition(this); 
      foreach (UIElement element in canvas1.Children) 
      { 
       Canvas.SetLeft(element, Canvas.GetLeft(element) + (mousepos.X - lastmousepoint.X)); 
       Canvas.SetTop(element, Canvas.GetTop(element) + (mousepos.Y - lastmousepoint.Y)); 
       lastmousepoint = mousepos; 
      } 
     } 
     e.Handled = true; 
    } 
    private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     lastmousepoint = e.GetPosition(this); 
     e.Handled = true; 
    } 
    private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     e.Handled = true; 
    } 

但只有兩個文本的一個是移動的,而他們都很舉動。實際的運動很好,按預期工作。

此代碼

private int CurrentScaleLevel = 0; 
    private void Window_MouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     foreach (UIElement element in canvas1.Children) 
     { 
      Point p = e.MouseDevice.GetPosition(element); 
      Matrix m = element.RenderTransform.Value; 
      if (e.Delta > 0) 
      { 
       CurrentScaleLevel++; 
       m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y); 
      } 
      else 
      { 
       CurrentScaleLevel--; 
       m.ScaleAtPrepend(1/1.1, 1/1.1, p.X, p.Y); 
      } 
      Canvas.SetLeft(element, Canvas.GetLeft(element) + m.OffsetX); 
      Canvas.SetTop(element, Canvas.GetTop(element) + m.OffsetY); 
      m.Translate(-m.OffsetX, -m.OffsetY); 
      element.RenderTransform = new MatrixTransform(m); 
     } 
     e.Handled = true; 
    } 

影響兩個對象就好了,就像它應該。

回答

1

你可能不希望

lastmousepoint = mousepos; 

foreach循環中,因爲後續的迭代(mousepos.X - lastmousepoint.X)永遠是零,也將(mousepos.Y - lastmousepoint.Y)。添加0當然意味着沒有移動。

+0

天才。有時候,你需要的只是第二組眼睛。 – Puppy 2010-09-10 14:26:27