Как ограничить позицию элемента в Canvas? - PullRequest
1 голос
/ 20 сентября 2010

[РЕДАКТИРОВАТЬ]

Хорошо,

Я редактировал это сообщение, так как код, который я разместил тогда, не имел реальных ссылок на то, что я пытаюсь сделать сейчас, но вопрос тот же.

Когда я говорю об ограничении объектов Canvas, это больше похоже на вырезку из мыши, но, как я читал во многих потоках, эта функция не существует в SL.Поэтому я немного обыскал все форумы и получил эту ссылку .Но я не смог воспроизвести все это.Вот код, который используется для Drag & Drops Events:

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 Ответ

1 голос
/ 20 сентября 2010

Холст не имеет размеров, если говорить о его детях.Это просто относительная отправная точка для рендеринга.Фиксированный размер холста имеет отношение только к родителю холста.

Если вы имеете в виду, что объекты рисуются вне прямоугольника холста, то это правильное поведение для холста.

Чтобы остановить рисование объектов вне холста, вам нужно установить обтравочный прямоугольник в свойстве Clip холста.

Обновление:

Вот оченьхороший пример того, как иметь свойство ClipToBounds .Это, безусловно, самый простой способ реализовать ограничение границ, которое я видел.

Еще одно обновление:

Так что вы хотите просто сохранить дочерние элементы в родительском холсте.Если ваши предметы различаются по размеру и форме, то это, в основном, испытание на столкновение со сторонами и ограничьте значения min / max left / top.Насколько сложны фигуры, которые вы отбрасываете?Прямоугольники, очевидно, очень легко вычислить (как и круги).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...