Перемещение 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