2011-06-08 21 views
7

Me moví crear usercontrolArrastre de un control de usuario de WPF

<UserControl x:Class="Restaurant.Views.Managerer.TablePanel" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:Restaurant.Helpers.Converter" 
     mc:Ignorable="d" 
     x:Name="root" 
     MouseLeftButtonDown="root_MouseLeftButtonDown" 
     MouseLeftButtonUp="root_MouseLeftButtonUp" 
     MouseMove="root_MouseMove"  
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
.... 

código

Point anchorPoint; 
     Point currentPoint; 
     bool isInDrag = false; 

     private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      var element = sender as FrameworkElement; 
      anchorPoint = e.GetPosition(null); 
      element.CaptureMouse(); 
      isInDrag = true; 
      e.Handled = true; 
     } 

     private void root_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (isInDrag) 
      { 
       var element = sender as FrameworkElement; 
       currentPoint = e.GetPosition(null); 

       var transform = new TranslateTransform 
            { 
             X = (currentPoint.X - anchorPoint.X), 
             Y = (currentPoint.Y - anchorPoint.Y) 
            }; 
       this.RenderTransform = transform; 
       anchorPoint = currentPoint; 
      } 
     } 

     private void root_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      if (isInDrag) 
      { 
       var element = sender as FrameworkElement; 
       element.ReleaseMouseCapture(); 
       isInDrag = false; 
       e.Handled = true; 
      } 
     } 

si cambiar el código

X = (currentPoint.X - anchorPoint.X), 
Y = (currentPoint.Y - anchorPoint.Y) 

a

X = (currentPoint.X), 
Y = (currentPoint.Y) 

Puedo mover el control de usuario, pero el mouse y el control de usuario no coinciden

+5

@mazbsky - no hay duda, y las últimas palabras que podrían tal vez posiblemente implicar una cuestión no son gramaticalmente correcta. –

Respuesta

13

Buenos días. He dormido y se me ocurre)))

private TranslateTransform transform = new TranslateTransform(); 
     private void root_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (isInDrag) 
      { 
       var element = sender as FrameworkElement; 
       currentPoint = e.GetPosition(null); 

       transform.X += currentPoint.X - anchorPoint.X; 
       transform.Y += (currentPoint.Y - anchorPoint.Y); 
       this.RenderTransform = transform; 
       anchorPoint = currentPoint; 
      } 
     } 
+1

Agradable, pero este enfoque no es muy eficiente. Al arrastrar una grilla que contiene alrededor de 10 controles de plantilla personalizados, ¡la carga de mi CPU aumenta al 23%! (Core i7 3770) ¿No hay una mejor manera de hacerlo? También cambié el contenedor primario a canvas y utilicé Canvas.SetLeft, pero no cambié el rendimiento. – SepehrM

+0

Sugiero que también use la regulación de rx en el movimiento del mouse para manejar menos enents –

+2

¿Cómo se evita que el control se salga de los límites? Comencé a usar esto para arrastrar un control y funciona muy bien, pero cuando el usuario llega al borde, deja que el control salga de la ventana y se vuelva invisible. –

6

Realmente no estoy seguro de qué es exactamente lo que intentas lograr en tu pregunta, pero los Thumbs son mucho más fáciles de arrastrar. Puede ver una explicación y un código de muestra (en la parte inferior) here.

-2

En base a la información en @Mediator respuesta. He subido y editado para evitar que el control se salga de los límites.

private TranslateTransform transform = new TranslateTransform(); 
    private void root_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (isInDrag) 
     { 
      var element = sender as FrameworkElement; 
      currentPoint = e.GetPosition(null); 

      transform.X += currentPoint.X - anchorPoint.X; 
      transform.Y += (currentPoint.Y - anchorPoint.Y); 
      if (currentPoint.X < Application.Current.MainWindow.RenderSize.Width && currentPoint.Y < Application.Current.MainWindow.RenderSize.Height 
       && currentPoint.X > 0 && currentPoint.Y > 0) 
      { 
       this.RenderTransform = transform; 
       anchorPoint = currentPoint; 
      } 
      else 
      { 
       transform = new TranslateTransform(); 
       this.RenderTransform = transform; 
      } 
     } 
    } 

Pero los errores de enlace son su ventana de salida en VS.

Parece que este es un problema en WPF, pero uno que Microsoft no solucionará.

Para obtener más información aquí:

https://connect.microsoft.com/VisualStudio/feedback/details/1423399/system-windows-data-error-4-when-using-relativesource-findancestor-inside-a-translatetransform-inside-a-style

+0

Esto da como resultado un comportamiento de "salto" fácilmente evitable. (Se puede evitar, por ejemplo, al referirse a 'Thumb'.) Además, el supuesto "error" no tiene relación con el problema en cuestión. – Informagic

Cuestiones relacionadas