2015-08-22 6 views
1

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

  1. Кликнув на нее, чтобы вытащить его вокруг
  2. Щелкнув где-то на родителей, чтобы начать потянув его вокруг от щелчка местоположения
  3. Нажмите где-то на родителей или ребенка, чтобы установить ребенка в положение курсоров

Я определила одно событие MouseDown для родителя и ребенка, который сначала перемещает ребенка, а затем прикрепляет MouseMove Handler для ребенка и родителя. У ребенка и родителя также есть обработчик MouseUp, который удаляет обработчик MouseMove. Я хочу, чтобы MouseUp вызывался, даже если MouseUp происходит за пределами окна или если окно alt + убрано.

Вот мой код, который в основном работает, но ненадежен. Я часто оказываюсь в ситуации, когда MM (MouseMove) подключен, но MouseUp или MouseDown больше не могут быть вызваны, по сути, блокируя мое приложение. Один из способов оказаться в этом состоянии

  1. нажав на родителя/ребенка
  2. Alt + обходе в другое окно
  3. рилизинг мыши при наведении на другом окне

Как правильно ли я реализую это поведение перемещения ребенка внутри его родителя?

Мой ребенок называется слайдер. Этот код находится в коде моего родителя, который является настраиваемым элементом управления, над которым я работаю.

slider.MouseLeftButtonDown += MD; 
    MouseLeftButtonDown += MD; 

    slider.MouseUp += MU; 
    PreviewMouseUp += MU; 

    private void MM(object sender, MouseEventArgs meva) 
    { 
     double percentage = meva.GetPosition(this).Y/this.ActualHeight; 
     if (percentage <= 0) 
     { 
      Percentage = 0; 
      slider.Margin = new Thickness(0, -2, 0, 0); 
     } 
     else if (percentage >= 1) 
     { 
      Percentage = 1; 
      slider.Margin = new Thickness(0, this.ActualHeight - 2, 0, 0); 
     } 
     else 
     { 
      Percentage = percentage; 
      slider.Margin = new Thickness(0, meva.GetPosition(this).Y - 2, 0, 0); 
     } 
    } 
    // MouseDown Handler 
    private void MD(object sender, MouseButtonEventArgs e) 
    { 
     ReleaseMouseCapture(); // might be unnecessary? 
     MM(sender, e); // initial movement of child 
     this.CaptureMouse(); // To enable MouseUp outside 
     this.PreviewMouseMove += MM; 
     slider.PreviewMouseMove += MM; 
    } 
    // MouseUp Handler 
    private void MU(object sender, MouseButtonEventArgs e) 
    { 
     ReleaseMouseCapture(); 
     this.PreviewMouseMove -= MM; 
     slider.PreviewMouseMove -= MM; 
    } 

связанных с фото, что я работаю над: enter image description here

ответ

1

Оберните элемент, который вы хотите перетащить в <Thumb>, которая имеет событие DragDelta с HorizontalChange и VerticalChange в данных событиях. Посмотрите here

+0

Thumb удобно обслуживает все обработки событий, но есть ли способ остановить его от накопления значений Hhange & VChange при одной операции перетаскивания с несколькими остановками? Например, если я перемещаю его на 3 единицы вниз, и есть три события, первое имеет VCange 1, второе 2 и третье 3, когда я хотел бы, чтобы все три из них были 1 каждый (со всеми значениями Vchange события, суммированными в результате значение перемещенных единиц). Сейчас я всегда сохраняю последние значения hc и vc и вычитаю их во время фактического использования. Я установил их на ноль в DragStarted. – Traubenfuchs

+0

Это странно, как вы можете видеть в примере в ссылке, данные события обычно содержат только дельта с момента последней дельта - именно то, что вам нужно. И, похоже, это для меня. Возможно, отредактируйте свой вопрос или откройте новый вопрос для всего кода. – PhilMasterG

Смежные вопросы