1
我有一個家長控制,裏面有一個孩子。 現在我希望能夠通過在父母的周圍移動孩子
- 點擊以移動孩子周圍的家長裏就可以把它周圍
- 父某處點擊開始從點擊位置
- 按一下週圍拉在父母或孩子的地方設置孩子光標位置
我的父母和孩子,最初移動孩子,然後裝配的MouseMove處理程序給孩子和家長一個定義MouseDown事件。孩子和父母也有一個MouseUp處理程序,用於刪除MouseMove處理程序。即使MouseUp發生在窗口之外,或者如果窗口被alt + tab切離,我也希望MouseUp被調用。
這是我的代碼,它基本上工作,但不可靠。我經常在MM(MouseMove)被附加的情況下結束,但MouseUp或MouseDown不能再被調用,實質上是使我的應用程序死鎖。在該狀態下結束了一個辦法是
- 按父/子
- Alt + Tab鍵切換到另一個窗口
- 釋放鼠標盤旋而其他窗口
如何我是否正確實施了將其內部的孩子移動到父母的行爲?
我的孩子被稱爲滑塊。 此代碼位於我父母的代碼背後,這是我正在處理的自定義控件。
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舒適地處理所有的事件處理,但是有沒有辦法阻止它在一次拖放操作中累積HChange和VChange值並使用多次停止?就像我將它移動3個單位一樣,並且有三個事件,第一個包含VChange 1,第二個2和第三個3,當我希望所有三個事件都是1時(所有事件Vchange值總和導致移動單位的價值)。現在我總是保存最後的hc和vc值,並在實際使用過程中減去它們。我將它們設置爲DragStarted爲零。 – Traubenfuchs
這很奇怪,正如鏈接中的示例所示,事件數據通常只包含自上次增量以來的增量 - 正是您需要的增量。它似乎爲我做了。也許編輯你的問題或者用你的所有代碼打開一個新的問題。 – PhilMasterG