好的,更好的一些更正并仅适用于X坐标: 鉴于以下代码:
private Point MouseDownPosition;
private void OnStartDrag(object sender, MouseButtonEventArgs e)
{
if (!this.AssociatedObject.IsMouseCaptured)
{
this.AssociatedObject.AddHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
this.AssociatedObject.RenderTransform = new TranslateTransform();
this.MouseDownPosition = Mouse.GetPosition(null);
Mouse.Capture(this.AssociatedObject, CaptureMode.Element);
}
}
private void OnDrag(object sender, MouseEventArgs e)
{
if (this.AssociatedObject.IsMouseCaptured)
{
this.AssociatedObject.AddHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
TranslateTransform Translate = this.AssociatedObject.RenderTransform as TranslateTransform;
Point CurrentPosition = Mouse.GetPosition(null);
Translate.X = CurrentPosition.X - this.MouseDownPosition.X;
}
}
private void OnStopDrag(object sender, MouseButtonEventArgs e)
{
if (this.AssociatedObject.IsMouseCaptured)
{
this.AssociatedObject.ReleaseMouseCapture();
this.AssociatedObject.RemoveHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
this.AssociatedObject.RemoveHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
}
}
1.(MouseLeftButtonDown)当我在拖动对象上单击第一次时,它正在正确移动。
2.(MouseMove)我将对象拖到ex的任意位置。在我的小组上100点。
3.(MouseLeftButtonUp)对象定位在我左侧拖拽的位置。
直到现在没有问题。但是当我开始第二次活动链时:
1.(MouseLeftButtonDown)拖动的对象移动到后面:
CurrentPointerPosition + FIRSTPosition
2。 (MouseMove)执行拖动移动但MousePointer位于CurrentPointerPosition + FIRSTPosition FROM拖动的对象。
3.(MouseLeftButtonUp)与第一次一样正确执行(但很明显)。
似乎在MouseLeftButtonDown上MouseDownPosition和拖动对象的位置必须重置...
为什么呢? 我做错了什么? 谢谢!
答案 0 :(得分:2)
感谢MSDN上的“TheKiller556”,我根据布局变化找到了解决问题的正确方法,因此制作了真正的通用且强大的拖动行为。
无法解决RenderTransforms问题的链接似乎在复杂的逻辑面板上解决了Margin属性ALSO(已测试):
http://social.msdn.microsoft.com/Forums/en/wpf/thread/eb3a912b-1046-4902-8c7a-bbc0566209c0
我希望将来在变换问题中会有一个深刻的解释。 谢谢大家! (我知道我不能自己投票,但如果有人深入了解我的帖子,我有效地找到了一个解决方案,所以,如果有可能的话,我想知道我是否可以获得一些积分。) 再次感谢你!
答案 1 :(得分:0)
好的,经过几个小时的挖掘,我终于找到了解决方案。 我祈祷每个人在WPF / Silverlight中真正体验到解释我(以及其他有这个问题的人)为什么我的代码工作正常,因为,真诚地,我找不到合乎逻辑的理由:
public class DragBehavior : Behavior<FrameworkElement>
{
#region Constructors
static DragBehavior()
{
}
public DragBehavior()
{
}
#endregion
private Point MouseDownPosition;
protected override void OnAttached()
{
this.AssociatedObject.AddHandler(FrameworkElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.OnStartDrag));
this.AssociatedObject.RenderTransform = new TranslateTransform();
this.AssociatedObject.UpdateLayout();
base.OnAttached();
}
protected override void OnDetaching()
{
this.AssociatedObject.RenderTransform = null;
this.AssociatedObject.RemoveHandler(FrameworkElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.OnStartDrag));
base.OnDetaching();
}
private void OnStartDrag(object sender, MouseButtonEventArgs e)
{
if (!this.AssociatedObject.IsMouseCaptured)
{
this.AssociatedObject.AddHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
this.MouseDownPosition = Mouse.GetPosition(this.AssociatedObject);
Mouse.Capture(this.AssociatedObject, CaptureMode.SubTree);
}
}
private void OnDrag(object sender, MouseEventArgs e)
{
if (this.AssociatedObject.IsMouseCaptured)
{
this.AssociatedObject.AddHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
TranslateTransform Translate = this.AssociatedObject.RenderTransform as TranslateTransform;
Translate.X = (Mouse.GetPosition(this.AssociatedObject.Parent as FrameworkElement).X - this.MouseDownPosition.X) / 3;
Translate.Y = (Mouse.GetPosition(this.AssociatedObject.Parent as FrameworkElement).Y - this.MouseDownPosition.Y) / 3;
Point Position = new Point(Translate.X,Translate.Y);
Size Size = this.AssociatedObject.DesiredSize;
Rect Bounds = new Rect(Position,Size);
this.AssociatedObject.Arrange(this.AssociatedObject.RenderTransform.TransformBounds(Bounds));
}
}
private void OnStopDrag(object sender, MouseButtonEventArgs e)
{
if (this.AssociatedObject.IsMouseCaptured)
{
this.AssociatedObject.ReleaseMouseCapture();
this.AssociatedObject.RemoveHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
this.AssociatedObject.RemoveHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
}
}
我希望这可以帮助每个人/将会遇到这个奇怪的问题,解决或深入了解WPF布局过程以找到MS可能存在的任何错误/未知默认值。 我想我还不知道WPF布局这个巨大的争论。 目前,我只假设在Identity和翻译矩阵之间的Matrix产品中存在一些标量值,可能会影响容器布局过程中Basis的变化,但它只是一个代数考虑因素,在MS实现中没有任何证据。 请大家详细解释我们如何正确使用TranslateTransform,而不依赖于Panel所有者。 非常感谢大家! 等待回复,考虑因素,我的代码的解释。