2017-06-16 236 views
0

我正在尋找一種解決方案來透明地添加平移&變焦能力的WPF圖像控制,我發現該溶液https://stackoverflow.com/a/6782715/584180,通過Wiesław ŠoltésKonrad Viltersten,開發了非常出色。獲取圖像座標

現在我想向控件添加一個「鼠標點擊」事件,以便我可以在原始圖像座標系中點擊點的座標,以便我可以使用它們檢索像素顏色。

我知道會有一些舍入,如果圖像被縮小,顏色將不對應屏幕上顯示的實際顏色。我也明白,用戶可以點擊圖像邊界外,在這種情況下,我期望返回空點或負座標。

我不是做變換的C#這樣的專家,此刻我堅持這一點(在ZoomBorder.cs類中添加):

public Point GetImageCoordsAt(MouseButtonEventArgs e) 
{ 
    if (child != null) 
    { 
     var tt = GetTranslateTransform(child); 
     var mousePos = e.GetPosition(this); 
     var transformOrigin = new Point(tt.X, tt.Y); 

     return mousePos; // Wrong: how do I transform this? 
    } 

    return null; 
} 
+1

如果要獲取相對於其的座標,請將對Image的引用傳遞給GetPosition方法:var mousePos = e.GetPosition(theImage);這是你想要的嗎? – mm8

+0

你的意思是圖像控件將負責將屏幕位置映射到圖像位置?圖像可能已被縮放和翻譯。 – Lordalcol

+0

如果你想讓某人能夠幫助你,你應該澄清你的要求。你可以從改變問題的標題開始,因爲這個問題似乎與你的實際問題無關......? – mm8

回答

1

由於MM8建議你可以得到你想使用的位置e.GetPosition(child); ,沒有必要執行任何轉換。出於測試目的,我已覆蓋重置行爲。從the link you provided使用代碼,更改

void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    this.Reset(); 
} 

public Point GetImageCoordsAt(MouseButtonEventArgs e) 
{ 
    if (child != null && child.IsMouseOver) 
    { 
     return e.GetPosition(child); 
    } 
    return new Point(-1, -1); 
} 

void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    MessageBox.Show(GetImageCoordsAt(e).ToString()); 
} 

如果你右擊在圖像在相同的位置,你會得到(大約)相同的座標,無論平移和縮放的。

+0

這仍然給我基於圖像控件大小的座標,而不是原始的BitmapSource,但我可以自己做轉換。謝謝 – Lordalcol

1

以供將來參考,我試圖實現是這樣的:

public Point GetImageCoordsAt(MouseButtonEventArgs e) 
    { 
     if (child != null && child.IsMouseOver) 
     { 
      var controlSpacePosition = e.GetPosition(child); 
      var imageControl = this.Child as Image; 
      var mainViewModel = ((MainViewModel)base.DataContext); 
      if (imageControl != null && imageControl.Source != null) 
      { 
       // Convert from control space to image space 
       var x = Math.Floor(controlSpacePosition.X * imageControl.Source.Width/imageControl.ActualWidth); 
       var y = Math.Floor(controlSpacePosition.Y * imageControl.Source.Height/imageControl.ActualHeight); 

       return new Point(x, y); 
      } 
     } 
     return new Point(-1, -1); 
    } 

它返回鼠標指針的座標在原始圖像系統。