如何将项目位置限制为Canvas?

时间:2010-09-20 14:48:22

标签: c# silverlight algorithm canvas

[编辑]

好的,

我编辑了这篇文章,因为我发布的代码与我现在要做的事情没有真正的联系,但问题是一样的。

当我谈到将对象限制为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。

1 个答案:

答案 0 :(得分:1)

就其子女而言,画布没有大小。它只是渲染的相对起点。固定的画布大小仅与画布的父级相关。

如果您的意思是在画布矩形之外绘制对象,那么这是画布的正确行为。

要停止在画布外绘制对象,您需要在画布的Clip属性中设置剪裁矩形。

更新

Here is a very nice example here of how to have a ClipToBounds attached property。这绝对是我见过的实现边界裁剪的最简单方法。

另一个更新:

因此,您只想将子项目保留在父画布中。如果您的商品尺寸和尺寸不同基本上与侧面碰撞测试的形状,并限制最小/最大左/上值。你放下的形状有多复杂?矩形显然很容易计算(圆圈也是如此)。