2016-01-26 152 views
0

我有一個ListView,其視圖設置爲LargeIcon。
我特別需要檢測何時通過用鼠標拖動圍繞它們的選擇框來選擇多個項目。 (例如,我不想知道何時通過CTRL + Click選擇項目)檢測是否通過拖動選擇了多個ListView項目

我以爲我可以簡單地通過跟蹤鼠標是否處於關閉狀態而它正在移動時顯示拖動來執行此操作,然後如果它是一個拖拽,然後我可以設置另一個變量來表明這一點。

在我下面的示例中,mouseDown設置爲true,但是當我將鼠標放下並移動它時,isDrag從未設置爲true,我看不到我做錯了什麼。
(編輯:isDrag成爲真實的,如果我刪除if子句是奇怪的,因爲我說mouseDown肯定是真的)。

我意識到代碼比它需要的時間稍長,但它是爲了清晰起見。

bool mouseDown; 
bool isDrag; 
bool wasDrag; 

private void listView1_MouseDown(object sender, MouseEventArgs args) 
{ 
    wasDrag = false; 
    mouseDown = true; 
} 

private void listView1_MouseMove(object sender, MouseEventArgs args) 
{ 
    if (mouseDown) 
     isDrag = true; // <-- Never becomes true, even though mouseDown is true 
} 

private void listView1_MouseUp(object sender, MouseEventArgs args) 
{ 
    if (isDrag) 
     wasDrag = true; 

    mouseDown = false; 
    isDrag = false; 
} 

我知道這將是一件愚蠢的事。請把我從痛苦中解救出來。
或者,如果有人知道更好的是檢測拖動選擇(什麼是適當的術語?),那麼我都是耳朵。

+0

在你的mouseup中,獲取ListView1.SelectedItems屬性。一旦鼠標被釋放,任何在拖動過程中選擇的項目都應該在此屬性中可用。 – Alex

+0

這將包括通過按住控件進行選擇的項目。我想要通過拖動專門選擇的項目。 – Equalsk

+0

可能聽起來像一個愚蠢的問題,但我必須問它:你確定'listView1_MouseMove'方法實際上分配給'listview1'的'MouseMove'事件處理程序嗎?只需看看'InitializeComponent()'方法 –

回答

0

經過進一步調查,我發現對於ListView控件,MouseMove事件不會在MouseDown發生時觸發,並在釋放鼠標後立即觸發。
我只能假設內置在這個控件中的邏輯允許你通過拖拽選擇來選擇多個文件,這些事件都與這些事件搞混了,並且基本上使它們同步。

我已經爲此做了一個基本的解決方法。這不是理想的,但它做的工作,所以我想我會分享。

基本上,當鼠標滑下時,我記錄下位置。當鼠標上升時,我檢查它是否在任何方向移動了一定距離。如果它沒有,我認爲它是一個點擊,如果它有,我認爲它是一個拖動。

// Records the mouse position on mousedown 
int beforeMoveX; 
int beforeMoveY; 

// How far in pixels the mouse must move in any direction 
// before we consider this a drag rather than a click 
int moveBounds = 20; 

private void listView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    // Save the mouse position 
    beforeMoveX = e.X; 
    beforeMoveY= e.Y; 
} 

private void listView1_MouseUp(object sender, MouseEventArgs e) 
{ 
    // Did we move more than the bounds in any direction? 
    if (e.X < (beforeMoveX - moveBounds) || 
     e.X > (beforeMoveX + moveBounds) || 
     e.Y < (beforeMoveY - moveBounds) || 
     e.Y > (beforeMoveY + moveBounds)) 
    { 
     // DRAGGED! 
    } 
    else 
    { 
     // NOT DRAGGED! 
    } 
} 
1

你可以試試這個:

private void listView1_MouseMove(object sender, MouseEventArgs args) 
{ 
    isDrag = mouseDown; 
} 

我認爲,出於某種原因,你的事件listView1_MouseUp仍是起火,使您的isDrag變量設置爲其他比預期值。嘗試在MouseMoveMouseUp事件上設置斷點,以查看它們正在觸發的順序。

+0

儘管我已經嘗試了這兩件事,但他們很不幸沒有工作,所以你慢跑了我的大腦並且讓我解決它,所以我的朋友有了一個滿意的答覆。 – Equalsk

相關問題