У меня есть родительский элемент управления с дочерним элементом внутри. Теперь я хочу, чтобы иметь возможность двигаться, что ребенок вокруг внутри родителя поПеремещение ребенка вокруг его родителя
- Кликнув на нее, чтобы вытащить его вокруг
- Щелкнув где-то на родителей, чтобы начать потянув его вокруг от щелчка местоположения
- Нажмите где-то на родителей или ребенка, чтобы установить ребенка в положение курсоров
Я определила одно событие MouseDown для родителя и ребенка, который сначала перемещает ребенка, а затем прикрепляет MouseMove Handler для ребенка и родителя. У ребенка и родителя также есть обработчик MouseUp, который удаляет обработчик MouseMove. Я хочу, чтобы MouseUp вызывался, даже если MouseUp происходит за пределами окна или если окно alt + убрано.
Вот мой код, который в основном работает, но ненадежен. Я часто оказываюсь в ситуации, когда MM (MouseMove) подключен, но MouseUp или MouseDown больше не могут быть вызваны, по сути, блокируя мое приложение. Один из способов оказаться в этом состоянии
- нажав на родителя/ребенка
- Alt + обходе в другое окно
- рилизинг мыши при наведении на другом окне
Как правильно ли я реализую это поведение перемещения ребенка внутри его родителя?
Мой ребенок называется слайдер. Этот код находится в коде моего родителя, который является настраиваемым элементом управления, над которым я работаю.
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;
}
связанных с фото, что я работаю над:
Thumb удобно обслуживает все обработки событий, но есть ли способ остановить его от накопления значений Hhange & VChange при одной операции перетаскивания с несколькими остановками? Например, если я перемещаю его на 3 единицы вниз, и есть три события, первое имеет VCange 1, второе 2 и третье 3, когда я хотел бы, чтобы все три из них были 1 каждый (со всеми значениями Vchange события, суммированными в результате значение перемещенных единиц). Сейчас я всегда сохраняю последние значения hc и vc и вычитаю их во время фактического использования. Я установил их на ноль в DragStarted. – Traubenfuchs
Это странно, как вы можете видеть в примере в ссылке, данные события обычно содержат только дельта с момента последней дельта - именно то, что вам нужно. И, похоже, это для меня. Возможно, отредактируйте свой вопрос или откройте новый вопрос для всего кода. – PhilMasterG