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;
}