2015-11-17 2 views
0

Как изменить положение времени выполнения на холсте, у кого динамически я добавил элементы управления, такие как (метки, строки). Я могу масштабировать холст со всеми элементами управления, но я не могу двигаться в другом положении с помощью MouseMove, MouseUp, MouseDown.Как изменить положение на холсте в WPF?

<Canvas Name="canvas" Width="1000" Height="400" 
      Margin="100 0 0 50" 
      Background="White" 
      VerticalAlignment="Bottom" 
      HorizontalAlignment="Center" 
      MouseWheel="Canvas_MouseWheel" 
      MouseMove="Canvas_MouseMove" 
      MouseUp="Canvas_MouseUp" 
      MouseDown="Canvas_MouseDown"> 
     <Canvas.RenderTransform> 
      <ScaleTransform x:Name="st" /> 
     </Canvas.RenderTransform> 
    </Canvas> 

Я нахожу этот код в Интернете, но для моего случая не работает

bool activated; 
    Point point; 

    private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     activated = true; 
     point = Mouse.GetPosition(canvas); 
     Mouse.Capture(canvas); 
    } 

    private void Canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (activated) 
     { 
      double top = Canvas.GetTop(canGraph) + Mouse.GetPosition(canvas).Y - point.Y; 
      Canvas.SetTop(canvas, top); 
      double left = Canvas.GetLeft(canvas) + Mouse.GetPosition(canvas).X - point.X; 
      Canvas.SetLeft(canvas, left); 
      point = Mouse.GetPosition(canvas); 
     } 
    } 

    private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     activated = false; 
     Mouse.Capture(null); 
    } 

ответ

3

Edit - Предыдущее решение, которое я представил не будет работать после того, как первый шаг элемента без более код так вот лучше

Для правильной работы элемент холста должен быть выровнен по отношению к системе координат его родителя, чего мы достигаем, когда мы кладем холст в верхнем левом углу, если вы надеваете Положите его там, вам нужно рассчитать разницу yourselve.

код за

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     canvas.CaptureMouse(); 
    } 

    Stopwatch sw = new Stopwatch(); 
    private void Canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (canvas.IsMouseCaptured) 
     { 
      translate.X = e.GetPosition(container).X; 
      translate.Y = e.GetPosition(container).Y; 
     } 
    } 

    private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     canvas.ReleaseMouseCapture(); 
    } 

XAML

<Grid Background="Green" x:Name="container"> 
    <Canvas Name="canvas" Width="100" Height="100" 
     Margin="0 0 0 0" 
     Background="Purple" 
     VerticalAlignment="Top" 
     HorizontalAlignment="Left" 
     MouseMove="Canvas_MouseMove" 

     MouseDown="Canvas_MouseDown"> 
     <StackPanel Background="White"> 

     <TextBlock >asdasda</TextBlock> 
     <TextBlock >cccc</TextBlock> 
     <TextBlock >aaaaa</TextBlock> 
     <TextBlock >bbbb</TextBlock> 
     </StackPanel> 
    <Canvas.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform x:Name="st" /> 
       <TranslateTransform x:Name="translate" /> 
      </TransformGroup> 
     </Canvas.RenderTransform> 
</Canvas> 
</Grid> 

Оригинальный ответ


XAML

Я хотел бы сделать что-то вроде этого:

  • Добавить транслят преобразования и держать вас в предыдущее преобразование положить его в группе

  • Использование перевести преобразования в порядке для перемещения холста с позициями из событий мыши

  • Для отправной точки ваших переводов вы можете использовать c oordinates в контейнере за

Код:

bool activated; 
    Point point; 

    private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     activated = true; 
     point = e.GetPosition(container); 
    } 

    private void Canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (activated) 
     { 
      translate.X = e.GetPosition(container).X - point.X; 
      translate.Y = e.GetPosition(container).Y - point.Y; 
     } 
    } 

    private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     activated = false; 
    } 

XAML

<Canvas Name="canvas" Width="100" Height="100" 
     Margin="0 0 0 0" 
     Background="Purple" 
     VerticalAlignment="Stretch" 
     HorizontalAlignment="Stretch" 
     MouseMove="Canvas_MouseMove" 
     MouseUp="Canvas_MouseUp" 
     MouseDown="Canvas_MouseDown"> 
    <Canvas.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform x:Name="st" /> 
       <TranslateTransform x:Name="translate" /> 
      </TransformGroup> 
     </Canvas.RenderTransform> 
</Canvas> 
</Grid> 
+0

Спасибо, я могу двигаться теперь холст, но когда я переехал в моргать все элементы в полотне , Переменный контейнер в моем случае - холст, не так ли? –

+0

После того, как мышь, затем снова, я перемещаю холст, который начинает двигаться с первой позиции, когда был. –

+0

У меня было несколько минут, и я заметил, что, пожалуйста, внесите изменения. Если у вас есть проблемы, я помогу, если найду какое-то время :) – kirotab

Смежные вопросы