WFP TranslateTransform 错误
WFP TranslateTransform Error
我正在做一个绘图项目。我没有在其中创建一个可拖动的 window,用户可以在其中 单击任何对象 并将其移动到不同的位置,就像我们在 PhotoShop 中使用我们的层所做的那样。
我编写的程序非常适合屏幕上的 One 对象,我可以通过简单地拖动它来移动到我想要的任何位置。但是当对象数量增加时,它会导致一个非常奇怪的问题。当我单击任何对象时,它会创建 windows 上所有对象的集群,并开始将转换应用于整个集群。
注意:所有对象都是图片,容器是Canvas.
这是我正在使用的一些图像和代码。
private Point _currentPoint;
private Point _ancherPoint;
private bool _isInDrag = false;
private TranslateTransform _transform = new TranslateTransform();
private Image _element;
private void DropList_MouseLeftButtonDown( object sender, MouseButtonEventArgs e )
{
_element = FindAnchestor<Image>( ( DependencyObject )e.OriginalSource );
if( _element != null )
{
_ancherPoint = e.GetPosition( DropList );
_isInDrag = true;
_element.CaptureMouse();
e.Handled = true;
}
}
private void DropList_MouseMove( object sender, MouseEventArgs e )
{
if( _isInDrag )
{
_currentPoint = e.GetPosition( DropList );
_transform.X += ( _currentPoint.X - _ancherPoint.X );
_transform.Y += ( _currentPoint.Y - _ancherPoint.Y );
Lbl.Content = _element.Source.ToString();
Source on which transfrom is going to happen
_element.RenderTransform = _transform;
_ancherPoint = _currentPoint;
}
}
private void DropList_MouseLeftButtonUp( object sender, MouseButtonEventArgs e )
{
if( _isInDrag )
{
_element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}
}
private static T FindAnchestor<T>( DependencyObject current ) where T : DependencyObject
{
do
{
if( current is T )
{
return ( T )current;
}
current = VisualTreeHelper.GetParent( current );
}
while( current != null );
return null;
}
这是一个单一的对象,我可以轻松地将它移动到任何我想要的地方,而不会造成任何混乱。
这里我有三个对象。当我点击它们中的任何一个时,它们会形成一个集群并开始一起移动。
问题是您对所有元素使用相同的 TranslateTransform
实例。您应该为每个元素创建一个新实例,或者在创建元素时,或者例如在 MouseDown 处理程序中:
private void DropList_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_element = FindAnchestor<Image>((DependencyObject)e.OriginalSource);
if (_element != null)
{
var point = e.GetPosition((IInputElement)sender);
_isInDrag = true;
_element.CaptureMouse();
_element.RenderTransform = new TranslateTransform(point.X, point.Y); // here
e.Handled = true;
}
}
并在移动时使用它:
private void DropList_MouseMove(object sender, MouseEventArgs e)
{
if (_isInDrag)
{
var point = e.GetPosition((IInputElement)sender);
var transform = (TranslateTransform)_element.RenderTransform;
transform.X = point.X;
transform.Y = point.Y;
}
}
我正在做一个绘图项目。我没有在其中创建一个可拖动的 window,用户可以在其中 单击任何对象 并将其移动到不同的位置,就像我们在 PhotoShop 中使用我们的层所做的那样。
我编写的程序非常适合屏幕上的 One 对象,我可以通过简单地拖动它来移动到我想要的任何位置。但是当对象数量增加时,它会导致一个非常奇怪的问题。当我单击任何对象时,它会创建 windows 上所有对象的集群,并开始将转换应用于整个集群。
注意:所有对象都是图片,容器是Canvas.
这是我正在使用的一些图像和代码。
private Point _currentPoint;
private Point _ancherPoint;
private bool _isInDrag = false;
private TranslateTransform _transform = new TranslateTransform();
private Image _element;
private void DropList_MouseLeftButtonDown( object sender, MouseButtonEventArgs e )
{
_element = FindAnchestor<Image>( ( DependencyObject )e.OriginalSource );
if( _element != null )
{
_ancherPoint = e.GetPosition( DropList );
_isInDrag = true;
_element.CaptureMouse();
e.Handled = true;
}
}
private void DropList_MouseMove( object sender, MouseEventArgs e )
{
if( _isInDrag )
{
_currentPoint = e.GetPosition( DropList );
_transform.X += ( _currentPoint.X - _ancherPoint.X );
_transform.Y += ( _currentPoint.Y - _ancherPoint.Y );
Lbl.Content = _element.Source.ToString();
Source on which transfrom is going to happen
_element.RenderTransform = _transform;
_ancherPoint = _currentPoint;
}
}
private void DropList_MouseLeftButtonUp( object sender, MouseButtonEventArgs e )
{
if( _isInDrag )
{
_element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}
}
private static T FindAnchestor<T>( DependencyObject current ) where T : DependencyObject
{
do
{
if( current is T )
{
return ( T )current;
}
current = VisualTreeHelper.GetParent( current );
}
while( current != null );
return null;
}
这是一个单一的对象,我可以轻松地将它移动到任何我想要的地方,而不会造成任何混乱。
这里我有三个对象。当我点击它们中的任何一个时,它们会形成一个集群并开始一起移动。
问题是您对所有元素使用相同的 TranslateTransform
实例。您应该为每个元素创建一个新实例,或者在创建元素时,或者例如在 MouseDown 处理程序中:
private void DropList_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_element = FindAnchestor<Image>((DependencyObject)e.OriginalSource);
if (_element != null)
{
var point = e.GetPosition((IInputElement)sender);
_isInDrag = true;
_element.CaptureMouse();
_element.RenderTransform = new TranslateTransform(point.X, point.Y); // here
e.Handled = true;
}
}
并在移动时使用它:
private void DropList_MouseMove(object sender, MouseEventArgs e)
{
if (_isInDrag)
{
var point = e.GetPosition((IInputElement)sender);
var transform = (TranslateTransform)_element.RenderTransform;
transform.X = point.X;
transform.Y = point.Y;
}
}