2016-05-26 76 views
0

我在畫布上放置了一條線(讓它稱爲第1行),並附加了一個鼠標進入,鼠標離開,鼠標向上和鼠標向下的事件。然後創建另一行(第2行),並附上相同的事件。當選擇任何行時,所有事件都可以正常工作。 由於某些原因,當創建的第一行被拖動並釋放到創建的第二行時,該行不會在畫布上釋放,但它仍粘在鼠標指針上,直到從第二行刪除另一個單擊爲止。當創建的最早的行被拖到較新的行而不是相反時發生此問題(當行1被拖動並釋放在行2上時發生問題,但反之亦然,或者行1在2和3上,行2在行3上時發生等 我不知道是什麼代碼可能對這個問題的解決幫助,會有人有任何建議或也許也遇到了類似的問題在Silverlight中選擇和取消選擇重疊圖形

回答

0

的原因觀察到的行爲是很容易推導出:?

Panel中的所有元素的確有一個隱含的z順序,它將在沒有爲en元素指定ZIndex屬性時生效。以前添加的元素的z順序比後面添加的元素的x更低(xaml標記從上到下解析) ttom和之前發生的元素會在前面添加)。

現在,如果您開始移動元素並且兩個元素重疊,則z順序仍然有效。所以您之前添加的行將被視爲物理位於其他行的下方,並且所有鼠標事件都將按照z順序進入最上面的行。因此MouseUp事件不會被您移動的元素接收,並且它仍粘在鼠標指針上,直到您將鼠標從重疊區域移開並再次釋放鼠標。

我能想到的幾種方法來解決這個問題:

也許最簡單的事情將是剛剛設置的元素上明確ZIndex只要你選擇它,當你移動它周圍將永遠是所有其他元素的頂部,當你在任何地方釋放它時,你可以再次清除ZIndex。一些示例代碼,給你一個想法:

private void OnElementSelected() 
{ 
    // todo: maybe we need to store the previous zindex value and re-assign it later 
    // to prevent it from getting lost 
    Canvas.SetZIndex(this, Int32.MaxValue); 
} 

private void OnElementReleased() 
{ 
    this.ClearValue(Canvas.ZIndexProperty); 
    // todo: maybe re-assign stored z-index value 
} 

另一種解決辦法是有一個透明的MouseEventObserver放置在你的整個Canvas是被立即激活,你選擇一個元素,那麼你的元素的順序沒有按」沒關係。

編輯

一個很好的事實(很多開發者可能不知道的)有關Canvas.ZIndex附加屬性:它適用於所有的面板類型,不僅爲Canvas。因此,您甚至可以用Canvas.ZIndex指定Grid內的元素的z順序。

+0

非常感謝回覆:) 在我的情況下,每個元素在創建時都已經被賦予一個明確的z-index,總是比前一個元素大一個值,但這個問題仍然存在。我試圖改變鼠標上的畫布z-index和鼠標向下,因爲我有一個屬性來顯示一個元素是否被拖動,但是這不能解決問題。可能還有其他問題?並感謝您的耐心。 – Maeglin77

+0

無論您是分配一個明確且連續遞增的Z-Index屬性,還是隱式z順序生效都無關緊要。每當你移動一個較早的附加元素時,它將不可避免地位於後面添加的元素之下。因此,您必須確保當前選定並移動的元素具有當前存在的所有z-索引中最高的元素。我不明白爲什麼操縱畫布的Z-index應該以任何方式解決問題。 – Martin

+0

非常感謝您的建議:) – Maeglin77