2010-08-05 5 views
0

와 텍스트 상자를 이동 내가 제어가 캔버스에 배치됩니다마우스

<UserControl HorizontalAlignment="Left" x:Class="WPFDiagramDesignerControl.Components.UcWBSBlock" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="100" Width="100" IsEnabled="True"> 

    <Grid > 
     <TextBox x:Name="txtBox" IsEnabled="True" Background="AntiqueWhite" Margin="10,10,10,10" TextWrapping="Wrap"> </TextBox> 
    </Grid> 

</UserControl> 

이 MyDesigner라는 하나의 텍스트 상자로 구성되어 사용자 지정 WPF 제어 할 수 있습니다.

텍스트 상자를 클릭하고 마우스를 움직여야 캔버스에서 컨트롤을 이동하고 싶습니다. 컨트롤 테두리와 텍스트 상자 사이의 여백을 클릭 할 때 컨트롤을 이동하고 싶지 않습니다. 나는 코드를을 writting 시작은 그러나 내 컨트롤이 이동하지 않습니다 :(그것은이 :

답변

2

를 디버깅하기 어렵다 ?? 내가 잘못 했습니까 무슨

public partial class UcWBSBlock : UserControl 
{ 

    bool textChanged = false; 
    bool isClicked = false; 
    Point startPoint; 
    DesignerItem parentItem; 
    DesignerCanvas parentCanvas; 

    public UcWBSBlock() 
    { 

     InitializeComponent(); 

     txtBox.MouseDoubleClick+=new MouseButtonEventHandler(txtBox_MouseDoubleClick); 
     txtBox.MouseMove+=new MouseEventHandler(txtBox_MouseMove); 
     txtBox.PreviewMouseDown+=new MouseButtonEventHandler(txtBox_PreviewMouseDown); 
     txtBox.PreviewMouseUp+=new MouseButtonEventHandler(txtBox_PreviewMouseUp); 
     txtBox.Cursor = Cursors.SizeAll; 

    } 

    private void txtBox_MouseMove(object sender, RoutedEventArgs e) 
    { 
     if (isClicked) 
     { 
      Point mousePos = Mouse.GetPosition(parentCanvas); 

      parentItem = this.Parent as DesignerItem; 
      parentCanvas = parentItem.Parent as DesignerCanvas; 
      Point relativePosition = Mouse.GetPosition(parentCanvas); 
      DesignerCanvas.SetLeft(parentItem,DesignerCanvas.GetLeft(parentItem) - (startPoint.X - mousePos.X)); 
      DesignerCanvas.SetTop(parentItem, DesignerCanvas.GetTop(parentItem) - (startPoint.Y - mousePos.Y)); 
     } 
    } 

    private void txtBox_PreviewMouseDown(object sender, RoutedEventArgs e) 
    { 
     if (!isClicked) 
     { 
      isClicked = true; 
      parentItem = this.Parent as DesignerItem; 
      parentCanvas = parentItem.Parent as DesignerCanvas; 
      startPoint = Mouse.GetPosition(parentCanvas); 
     } 
    } 

    private void txtBox_PreviewMouseUp(object sender, RoutedEventArgs e) 
    { 
     isClicked = false; 
    } 
} 

}

처럼 보인다 상위 항목의 왼쪽/상단을 설정하고, 아닌 제어 :

DesignerCanvas.SetLeft(parentItem,DesignerCanvas.GetLeft(parentItem) - (startPoint.X - mousePos.X)); 
DesignerCanvas.SetTop(parentItem, DesignerCanvas.GetTop(parentItem) - (startPoint.Y - mousePos.Y)); 

은 (아마도)이 같아야합니다

DesignerCanvas.SetLeft(this,DesignerCanvas.GetLeft(this) - (startPoint.X - mousePos.X)); 
DesignerCanvas.SetTop(this, DesignerCanvas.GetTop(this) - (startPoint.Y - mousePos.Y)); 
+0

음, 내가 확인해 보겠습니다. 그러나 parentItem은 "this"와 같아야합니다. 귀하의 솔루션이 PreviewMouseDown 이벤트에서 – george

+0

으로 작동한다면, 당신에게 말할 것입니다. parentItem을 this.Parent ... parentItem = this.Parent로 설정하고 있습니다. DesignerItem; –

관련 문제