C# WPF:如何翻译矩形?

C# WPF:如何翻译矩形?,c#,wpf,C#,Wpf,我正在尝试通过鼠标拖放移动画布中绘制的矩形 当我单击矩形并移动鼠标时,保持单击到新位置即可: 但是,当我再次单击并移动鼠标一点时,矩形会移动到原来的位置: 我不知道为什么。谁能给我解释一下吗 这是我的代码,所有参数都已分配和初始化。 提前谢谢 private void MyCanvas_MouseMove_1(object sender, MouseEventArgs e) { if (e.RightButton == MouseButtonState.

我正在尝试通过鼠标拖放移动画布中绘制的矩形

当我单击矩形并移动鼠标时,保持单击到新位置即可:

但是,当我再次单击并移动鼠标一点时,矩形会移动到原来的位置:

我不知道为什么。谁能给我解释一下吗

这是我的代码,所有参数都已分配和初始化。 提前谢谢

private void MyCanvas_MouseMove_1(object sender, MouseEventArgs e)
        { 
            if (e.RightButton == MouseButtonState.Pressed && e.OriginalSource is Shape)
            {
                p2 = e.GetPosition(MyCanvas);
                TranslateTransform tf = new TranslateTransform(p2.X - p1.X, p2.Y - p1.Y);
                _MyTestRect.RenderTransform = tf;
            }

        }
private void MyCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {

            if (e.OriginalSource is Shape)
            {
                p1 = e.GetPosition(MyCanvas);
            }

        }

不应每次都创建转换,否则将重置转换

如果不存在TranslateTransform,则创建TranslateTransform

然后将翻译累积在里面


关于

您不应该每次都创建转换,否则将重置转换

如果不存在TranslateTransform,则创建TranslateTransform

然后将翻译累积在里面


关于Mvvm行为方法,请将参考添加到: System.Windows.Interactivity

在XAML中:

<Canvas x:Name="MyCanvas" Background="#00FFFFFF">
<i:Interaction.Behaviors>
    <!--soSandBox is the reffrence to the behavior-->
    <soSandBox:MoveElementsInCanvasBehavior/>
</i:Interaction.Behaviors>
<Rectangle x:Name="_MyTestRect1" Fill="Tomato" Width="50" Height="50"/>
<Rectangle x:Name="_MyTestRect2" Fill="Tomato" Width="50" Height="50"/>
<Rectangle x:Name="_MyTestRect3" Fill="Tomato" Width="50" Height="50"/></Canvas>
总结: 通过这种方式,您可以在画布中放置任意多的元素,当您单击该元素以及该元素是形状时,您将能够移动它。 转换XAML:

<Canvas x:Name="MyCanvas" Background="#00FFFFFF">
<i:Interaction.Behaviors>
    <!--convert event to command mechanism-->
    <soSandBox:CanvasMouseEventObservingBehavior 
        OnMouseMoveAction="{Binding OnMouseMoveAction, UpdateSourceTrigger=PropertyChanged}"
        OnMouseRightButtonDownAction="{Binding OnMouseRightButtonDownAction, UpdateSourceTrigger=PropertyChanged}"
        OnMouseRightButtonUpAction="{Binding OnMouseRightButtonUpAction, UpdateSourceTrigger=PropertyChanged}"/>
</i:Interaction.Behaviors>
<Rectangle x:Name="_MyTestRect1" Fill="Tomato" Width="50" Height="50">
    <Rectangle.RenderTransform>
        <TransformGroup>
            <TranslateTransform X="{Binding TranslateTransformX, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                                Y="{Binding TranslateTransformY, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TranslateTransform>
        </TransformGroup>
    </Rectangle.RenderTransform>
</Rectangle></Canvas>

关于Mvvm行为方法,请将参考添加到: System.Windows.Interactivity

在XAML中:

<Canvas x:Name="MyCanvas" Background="#00FFFFFF">
<i:Interaction.Behaviors>
    <!--soSandBox is the reffrence to the behavior-->
    <soSandBox:MoveElementsInCanvasBehavior/>
</i:Interaction.Behaviors>
<Rectangle x:Name="_MyTestRect1" Fill="Tomato" Width="50" Height="50"/>
<Rectangle x:Name="_MyTestRect2" Fill="Tomato" Width="50" Height="50"/>
<Rectangle x:Name="_MyTestRect3" Fill="Tomato" Width="50" Height="50"/></Canvas>
总结: 通过这种方式,您可以在画布中放置任意多的元素,当您单击该元素以及该元素是形状时,您将能够移动它。 转换XAML:

<Canvas x:Name="MyCanvas" Background="#00FFFFFF">
<i:Interaction.Behaviors>
    <!--convert event to command mechanism-->
    <soSandBox:CanvasMouseEventObservingBehavior 
        OnMouseMoveAction="{Binding OnMouseMoveAction, UpdateSourceTrigger=PropertyChanged}"
        OnMouseRightButtonDownAction="{Binding OnMouseRightButtonDownAction, UpdateSourceTrigger=PropertyChanged}"
        OnMouseRightButtonUpAction="{Binding OnMouseRightButtonUpAction, UpdateSourceTrigger=PropertyChanged}"/>
</i:Interaction.Behaviors>
<Rectangle x:Name="_MyTestRect1" Fill="Tomato" Width="50" Height="50">
    <Rectangle.RenderTransform>
        <TransformGroup>
            <TranslateTransform X="{Binding TranslateTransformX, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                                Y="{Binding TranslateTransformY, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TranslateTransform>
        </TransformGroup>
    </Rectangle.RenderTransform>
</Rectangle></Canvas>
问候

尝试只使用和

尝试使用and


@编辑在哪里?问题仍然是每次创建一个新的变换。在任何情况下,转换元素都应该放在XAML中,并且角度应该绑定到viewmodel属性。与其在每次鼠标事件时尝试更改转换,只需更改该值并让数据绑定通知转换即可element@Duy编辑在哪里?问题仍然是每次创建一个新的变换。在任何情况下,转换元素都应该放在XAML中,并且角度应该绑定到viewmodel属性。与其在每次鼠标事件时尝试更改转换,只需更改该值并让数据绑定通知转换元素如果您试图实现拖放效果,请使用,不要尝试从头开始实现。WPF已经支持拖放如果您试图实现拖放效果,请使用,不要尝试从头开始实现。WPF已经支持拖放
Rectangle myRectangle = new Rectangle();
myRectangle += myRectangle_MouseLeftButtonDown;

void myRectangle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    myRectangle.MouseMove += origin_MouseMove;
}

void myRectangle_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    Point p = new Point()
    {   
        // Just round the coordinates
        X = Math.Round(e.GetPosition(canvas).X, 0, MidpointRounding.AwayFromZero),  
        Y = Math.Round(e.GetPosition(canvas).Y, 0, MidpointRounding.AwayFromZero),
    };

    Canvas.SetTop(myRectangle, p.Y);
    Canvas.SetLeft(myRectangle, p.X);

    myRectangle.MouseLeftButtonUp += myRectangle_MouseLeftButtonUp;
}

void myRectangle_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    myRectangle.MouseMove -= origin_MouseMove;
    myRectangle.MouseLeftButtonUp -= origin_MouseLeftButtonUp;
}