[编辑]
好的,
我编辑了这篇文章,因为我发布的代码与我现在要做的事情没有真正的联系,但问题是一样的。
当我谈到将对象限制为Canvas时,它更像是一个鼠标剪辑,但正如我在许多线程上读到的那样,SL中不存在此功能。所以我在所有论坛上搜索了一下并获得了link。但我无法重现这一切。以下是用于Drag& Drops事件的代码:
public class RoomImage : ContentControl
{
public RoomImage()
{
DefaultStyleKey = typeof(RoomImage);
}
public static readonly DependencyProperty BackgroundImageProperty = DependencyProperty.Register("Source", typeof(ImageSource), typeof(RoomImage), null);
public ImageSource BackgroundImage
{
get { return (ImageSource)GetValue(BackgroundImageProperty); }
set { SetValue(BackgroundImageProperty, value); }
}
//Instance Drag variable
private FrameworkElement _translateZone;
bool _isDrag;
Point StartingDragPoint;
public double Top
{
get { return (double)GetValue(Canvas.TopProperty); }
set { SetValue(Canvas.TopProperty, value); }
}
public double Left
{
get { return (double)GetValue(Canvas.LeftProperty); }
set { SetValue(Canvas.LeftProperty, value); }
}
//Instance Drag events
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_translateZone = GetTemplateChild("PART_TranslateZone") as FrameworkElement;
DefineDragEvents();
}
private void DefineDragEvents()
{
if (_translateZone != null)
{
_translateZone.MouseLeftButtonDown += new MouseButtonEventHandler(translateZone_MouseLeftButtonDown);
_translateZone.MouseLeftButtonUp += new MouseButtonEventHandler(translateZone_MouseLeftButtonUp);
_translateZone.MouseMove += new MouseEventHandler(translateZone_MouseMove);
}
}
private void translateZone_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_isDrag = true;
//start the drag
FrameworkElement DragBar = (FrameworkElement)sender;
DragBar.CaptureMouse();
// drag starting point
StartingDragPoint = e.GetPosition(this);
}
private void translateZone_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
FrameworkElement translateZone = (FrameworkElement)sender;
translateZone.ReleaseMouseCapture();
_isDrag = false;
}
private void translateZone_MouseMove(object sender, MouseEventArgs e)
{
if (_isDrag)
{
UIElement ui = (UIElement)this.Parent;
Point Point = e.GetPosition(ui);
Move(Point.X - StartingDragPoint.X, Point.Y - StartingDragPoint.Y);
}
}
public void Move(double left, double top)
{
Left = left;
Top = top;
}
}
我在教程中发现了这部分代码,他们根本没有解释Mouse.Clip。我可以理解它并重复使用它,但我不知道我可以设置限制。顺便说一下,这个项目的父级是Canvas。
如果有人可以提供某种代码,或者我应该实施我的代码,那就太棒了!
谢谢你,Ephismen。
答案 0 :(得分:1)
就其子女而言,画布没有大小。它只是渲染的相对起点。固定的画布大小仅与画布的父级相关。
如果您的意思是在画布矩形之外绘制对象,那么这是画布的正确行为。
要停止在画布外绘制对象,您需要在画布的Clip属性中设置剪裁矩形。
Here is a very nice example here of how to have a ClipToBounds attached property。这绝对是我见过的实现边界裁剪的最简单方法。
因此,您只想将子项目保留在父画布中。如果您的商品尺寸和尺寸不同基本上与侧面碰撞测试的形状,并限制最小/最大左/上值。你放下的形状有多复杂?矩形显然很容易计算(圆圈也是如此)。