2015-12-07 94 views
0

我在畫布上拖動拖放功能,我有很多圖像。我想改變我剛剛點擊的圖像的不透明度,顯然它工作。但是,當我單擊2個或更多圖像並更改不透明度時,所有單擊的圖像也會更改。我只想要我點擊的最後一張圖片發生了變化。拖動的圖像屬性畫布內

這裏是我的代碼:

private void CanvasLayout_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    var image = e.Source as Image; 

    if (image != null && CanvasLayout.CaptureMouse()) 
    { 
     mousePosition = e.GetPosition(CanvasLayout); 
     draggedImage = image; 
     Panel.SetZIndex(draggedImage, 1); 

     for (int i = 1; i < 9; i++) 
     { 
      if (draggedImage.Name == "Image" + i) 
      { 
       SelectComp_ComboBox.SelectedValue = "0" + (i + 1); 

       Binding binding = new Binding 
       { 
        Source = TransHidden_textBox, 
        Path = new PropertyPath("Text"), 
       }; 
       draggedImage.SetBinding(ContentControl.OpacityProperty, binding); 
      } 
     } 
    } 
} 
private void CanvasLayout_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if (draggedImage != null) 
    { 
     CanvasLayout.ReleaseMouseCapture(); 
     Panel.SetZIndex(draggedImage, 0); 
     draggedImage = null; 
    } 
} 

我認爲這個問題是在這條線draggedImage.SetBinding(ContentControl.OpacityProperty, binding);,我需要改變draggedImageImage + i但我不知道如何改變stringImage

我該怎麼做?有沒有其他簡單的方法來解決我的問題?

回答

0

從您提供的代碼中不清楚,但我想您並未清除不再拖動項目的不透明綁定。你應該叫

BindingOperations.ClearBinding(noLongerDraggedImage, ContentControl.OpacityProperty); 

爲了做到這一點,其中noLongerDraggedImage是(顯然)到不再拖動圖像的參考。根據您的代碼,您可以通過處理拖動結束的方法(即放置或取消)來執行此操作,或者,您可以遍歷CanvasLayout_MouseLeftButtonDown方法開始處的draggedImage以外的所有圖像。請注意,在後一種情況下,最後拖動的圖像將具有不同的不透明度,直到拖動另一圖像爲止,這不是標準行爲。

編輯

既然你提供的代碼爲CanvasLayout_MouseLeftButtonUp方法,就我所知,把上述行吧:

private void CanvasLayout_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if (draggedImage != null) 
    { 
     CanvasLayout.ReleaseMouseCapture(); 
     Panel.SetZIndex(draggedImage, 0); 
     BindingOperations.ClearBinding(draggedImage, ContentControl.OpacityProperty); 
     draggedImage = null; 
    } 
} 

應該讓你期望的結果。

編輯II

我不知道我的理解究竟你正試圖在這裏實現,所以也許我會是最好的退後一步,並回答你的問題 - 如何弄個具有特定名稱的圖像。一種可能性是找到它在Canvas.Children集合:

var name = "Image" + i.ToString(); 
var imageX = CanvasLayout.Children.OfType<Image>().Single(i => i.Name == name); 

注意,使用Single方法是唯一安全的,當你肯定有一個與集合在給定的名中的一個圖像,否則將引發異常。如果不是這種情況,您應該考慮使用SingleOrDefault - 如果有一個或沒有匹配名稱的圖像,或者FirstOrDefault - 對於任何數量的名稱匹配的圖像。

+0

我使用提供的'CanvasLayout_MouseLeftButtonDown'編輯我的代碼。我嘗試在'CanvasLayout_MouseLeftButtonDown'中使用'ClearBinding',但由於圖像爲空,導致錯誤。我仍然不明白怎麼做 – Mirza

+0

對於遲到的回覆感到抱歉,我做到了,但是使用該代碼時,只有當我按住鼠標時,不透明度纔會改變。我認爲最好的解決方案是通過String'Image + i'獲取'draggedImage'名稱,但我不知道該怎麼做。 – Mirza

+0

哦,我認爲那是目標...好的,所以在我更新我的答案之前,請確認我是否正確 - 您想在點擊圖像時將自定義不透明度應用於圖像,並且在點擊另一個圖像時恢復先前點擊的圖像一個正常? – Grx70