2016-08-02 50 views
0

從這裏答案提供Can I choose a custom image for C# Windows Application Drag Drop functions?,爲什麼下面一行:如何將IntPtr轉換爲InteropService.SafeHandle?

return new Cursor(CreateIconIndirect(ref tmp)); 

會導致編譯器發出此錯誤:

The best overloaded method match for 'System.Windows.Input.Cursor.Cursor(string)' has some invalid arguments Argument 1: cannot convert from 'System.IntPtr' to 'System.Runtime.InteropService.SafeHandle'

,是有辦法解決它?

+0

該代碼只能在Winforms項目中使用。你並不一定要使用它,它有一個討厭的句柄泄漏了一段時間後,將你的程序崩潰。 –

回答

1

這裏的基本問題是您正嘗試使用用於Winforms API的代碼示例,當您實際使用WPF API時。該代碼中使用的Cursor類是System.Windows.Forms.Cursor,而您使用的類實際上是System.Windows.Input.Cursor。它們完全不同,包括具有完全不同的構造函數。

Winforms版本將接受IntPtr值,表示本機Windows遊標對象的句柄。但WPF類僅接受一些現有的.cur或.ani數據,可以通過Stream(數據本身)或string實例(文件的名稱;這可以是pack:方案路徑,因此您可以使用嵌入的資源if你喜歡)。

如果你想在WPF動態創建圖像的光標,您可以:

  1. 使用的WinForms的例子,但不是試圖將光標句柄傳遞到Cursor構造,使用附加通過interop檢索遊標數據的原始函數,將其寫入數組,然後將數組包裝在MemoryStream中,您可以將該數組傳遞給WPF Cursor構造函數。或者,
  2. 使用其中一種WPF特定解決方案從現有圖像數據創建Cursor對象。例如,Custom cursor in WPF?(我特別喜歡this answer…有幾個好的有,但它們都涉及使用GDI +通過System.Drawing命名空間在某些時候),或Rotating Cursor According to Rotated TextBox(再次,採用GDI +)。