Перемещение user control

У меня стояла задача, сделать обычное перемещение в Silverlight 4.
Была не большая проблема, но я решил и выкладываю код.

Создаем User Contorl у него создаем 3 события, с которыми мы и будем работать.
Я создаю декларативно в XAML, но вы можете его создать и в коде.

    MouseLeftButtonDown="RootMouseLeftButtonDown"
    MouseLeftButtonUp="RootMouseLeftButtonUp"
    MouseMove="RootMouseMove" 

А в код добавляем такой не сильно заумный код

        Point m_anchorPoint;
        Point m_currentPoint;
        bool isDrag = false;
        private void RootMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var element = sender as FrameworkElement;
            m_anchorPoint = e.GetPosition(null);
            element.CaptureMouse();
            isDrag = true;
            e.Handled = true;
        }

        private readonly TranslateTransform m_transform = new TranslateTransform();
        private void RootMouseMove(object sender, MouseEventArgs e)
        {
            if (isDrag)
            {
                m_currentPoint = e.GetPosition(null);

                m_transform.X += m_currentPoint.X - m_anchorPoint.X;
                m_transform.Y += (m_currentPoint.Y - m_anchorPoint.Y);

                this.RenderTransform = m_transform;
                m_anchorPoint = m_currentPoint;
            }
        }

        private void RootMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (isDrag)
            {
                var element = sender as FrameworkElement;
                element.ReleaseMouseCapture();
                isDrag = false;
                e.Handled = true;
            }
        }

В данном примере я двигаю использую трансформацию, но если ваш элемент лежит в Canvas вы можете изменять положения свойствами Canvas.SetLeft() Canvas.SetTop().

Правда есть тут на первый взгляд не понятные строчки.

e.Handled = true; – указывает на то что не надо передавать событие в обработчик базового класса.
element.CaptureMouse(); и element.ReleaseMouseCapture(); – работают в паре один задает захват элемента, другой освобождает. Подробнее system.windows.uielement.capturemouse

Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Follow

Get every new post delivered to your Inbox.