2015-10-13 50 views
0

我寫了一個處理畫布上曲線的C#wpf程序。 因此,我加載一條曲線(一個polylinesegment中的一系列點),然後我對它進行各種操作。每條曲線通過鼠標交互放置在屏幕上,並且工作正常。每條曲線隨後在其中心出現一個文本塊,以提供一些信息。 所以,當我想要鼠標移動形狀時,問題就出現了。 我首先用鼠標(工作)選擇形狀,然後通過OnMouseMove事件將其粘貼到光標上。最終我把它放在OnMouseLeftButtonDown事件上。OnLeftButtonDown在將文本塊放入canvas後發生困難。設置

所以總之,OnMouseLeftButtonDown總能正常工作,除非我必須移動形狀和標籤。在這種情況下,我必須多次(隨機)按下才能開始活動。

我然後搜索了導致問題的部分,那是我移動標籤的時候。

private void UpdateLabel(int index, PathInfo piToBeAdded) 
    { 
     plotCanvas.Children.Remove(names[index]); 

     TextBlock text = new TextBlock(); 
     text.TextAlignment = TextAlignment.Left; 
     text.FontSize = 12; 
     text.Inlines.Add(new Run("(" + (GetPathsIndexFromId(piToBeAdded.ID) + 1) + ")ID:" + piToBeAdded.ID + " " + piToBeAdded.Name) { FontWeight = FontWeights.Bold }); 
     Canvas.SetLeft(text, piToBeAdded.Center.X);<-----those cause the problem 
     Canvas.SetTop(text, piToBeAdded.Center.Y);<------those cause the problem 
     text.ReleaseMouseCapture(); 
     names[index] = text;    
     plotCanvas.Children.Add(text); 
    } 

NB:PATHINFO就是一個類存儲一些信息,其中還協調 具體來說它只是Canvas.SetLeft和Canvas.SetTop引起OnMouseLeftButtonDown在不能正常點火。我將它們從0,0和事件 中取走,但這些說明有什麼問題?我怎樣才能使OnLeftButtonDownEvent正常工作?

我希望我已經正確描述了這個問題,我試着把所有的相關信息。

提前感謝名單

帕特里克

+0

您究竟如何稱此方法?從OnMouseLeftButtonDown本身? – toadflakz

+0

該方法從OnMouseMove調用,它處理移動形狀和光標後面的標籤。這樣可行。這是當我用OnMouseLeftButtonDown放下這個事件沒有觸發的時候。 – Patrick

回答

0

Toadflakz thanx無論如何我不知道我的解決方案是否與你的建議有關。如果我會給你的國旗。 我注意到這個問題與移動shape + textblock時鼠標點完全位於形狀的中心(我故意這麼做)並因此完全位於文本塊上有關。因此,當我點擊我不點擊畫布,但在標籤上。這就是爲什麼畫布不能射擊。我想標籤正在發射。所以簡而言之,我只是將標籤移動了一些像素,並且做了這個訣竅!

+0

您也可以將標籤的「IsHitTestVisible」設置爲「false」。因此,該標籤不會捕捉任何mousclicks,並且您的代碼可以按預期工作...... –

+0

非常聰明!不知道,它的作品! – Patrick

1

通常最好是使用MouseButtonUp事件釋放鼠標捕獲的鼠標鍵,肯定是在這一點上發佈和運行已停止(這是你正在捕獲)。

您與Canvas.SetLeft問題,是因爲它只能在Canvas對象的孩子被調用,你叫Canvas.SetLeft後只添加textChildren集合。

編輯:

在回答您的意見,該Canvas.SetLeft只能呼籲Canvas的現有子,因此調用Canvas.SetLeft之前調用Add

private void UpdateLabel(int index, PathInfo piToBeAdded) 
{ 
    plotCanvas.Children.Remove(names[index]); 

    TextBlock text = new TextBlock(); 
    text.TextAlignment = TextAlignment.Left; 
    text.FontSize = 12; 
    text.Inlines.Add(new Run("(" + (GetPathsIndexFromId(piToBeAdded.ID) + 1) + ")ID:" + piToBeAdded.ID + " " + piToBeAdded.Name) { FontWeight = FontWeights.Bold }); 
    plotCanvas.Children.Add(text); // <---- moved this up 
    Canvas.SetLeft(text, piToBeAdded.Center.X); 
    Canvas.SetTop(text, piToBeAdded.Center.Y); 
    names[index] = text; 
} 

您的評論的第二部分,我會建議你附加處理程序的不同可拖動的項目,並設置標誌爲適當的操作「模式」,你是在IE布爾變量工作ShapeDragInProgressLabelDragInProgress 。這樣,您可以根據ButtonUp事件有條件地執行正確的發佈捕獲過程。

+0

好的,我會將左鍵上的形狀釋放按鈕向上移動,但這也不會觸發。至於這個問題,我如何設置沒有Canvas.SetXXX的TextBlock位置?我在畫布上有幾個形狀,這是有效的。當我將該標籤與Canvas放在一起時,問題就出現了。任何解決方法? – Patrick