Подвижный пользовательский элемент управления - PullRequest
2 голосов
/ 11 декабря 2011

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

    void MoveableStackPanel_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMoving)
        {
            Point newLoc = e.GetPosition(null);
            MainWindow.Instance.Title = newLoc.ToString(); // Debug
            Margin = new Thickness(newLoc.X - 48, newLoc.Y - 48, 0, 0);
        }
    }

Обратите внимание на «-48» в коде.Когда мышь перемещают вверх или влево, мышь больше не находится в области управления и, таким образом, больше не вызывает событие MouseMove.Поэтому я дважды добавил -48, чтобы обойти это.Но когда пользователь перемещает мышь быстрее, чем каркас может обновить, мышь выйдет за пределы области управления, и элемент управления также больше не будет двигаться.

Я думал о назначении IMovableInterface и сохранении списков элементов управлениякоторые движутся в основной форме и тому подобное, но это все такие хлопоты и такие ... Какое правильное решение?

PS: элементы управления генерируются динамически, поэтому мне нужно решение в коде C #, а нев XML.

1 Ответ

1 голос
/ 11 декабря 2011

Попробуйте использовать метод CaptureMouse .

Посмотрите, работает ли что-то подобное для вас.

void moveableStackPanel1_MouseUp(object sender, MouseButtonEventArgs e)
    {
        ReleaseMouseCapture();
    }

    void moveableStackPanel1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (IsEnabled && IsVisible)
            CaptureMouse();
    }

    void moveableStackPanel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMouseCaptured)
        {
            Point newLoc = e.GetPosition(null);
            Margin = new Thickness(newLoc.X, newLoc.Y, 0, 0);
        }
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...