2015-12-28 58 views
0

我正在將Winforms項目轉換爲WPF,並且這樣做時我遇到了一個非常特殊的問題。請允許我解釋一下。在我的項目中,我使用的是OpenTK,這意味着我需要在WindowsFormHost中託管GLControl。 GLControl使用了第一人稱相機,爲了使其工作,我需要計算GLControl的確切中心,這是我在用戶「環顧四周」時放置鼠標的位置。這裏是我的應用程序的例子在WPF:尋找在Wpf WindowsFormsHost中託管的Winforms控件的中心

enter image description here

,我曾在以前的WinForms使用的功能是:

 public static Point FindCenterOfControl(Form parent, Control control) 
     { 
      Point location = parent.PointToScreen(control.Location); 
      return new Point(location.X + control.Width/2, location.Y + control.Height/2); 
     } 

但當然,這並不在WPF工作。我已經嘗試了各種參數,但是我一直收到空崩潰,主要來自我的GLControl,當它在WPF應用程序中託管時,顯然不再使用「Location」屬性。所以,坦率地說,我對如何實現這一點感到不知所措。

作爲另一個說明,我的代碼工作,只要我猜中心應該在哪裏。我可以移動相機,看起來很好。當我重新調整窗口大小時,問題就出現了,因爲那時中心距離它的距離應該很遠,我的第一人稱攝像機會彈道。我需要一種方法來複制我之前在我的WPF應用程序中計算控件的絕對中心的功能。

有沒有人有任何想法如何將我的舊功能轉換爲支持WPF環境內的託管控件的東西?

回答

0

沒關係,我找到了一個解決方案,或者至少......一個骯髒的黑客也許。訣竅是不要試圖找到我的GLControl的中心,而是找到WindowsFormsHost的中心。這是我的代碼,以便將來可以幫助其他人。

 public Point FindCenter() 
     { 
      System.Windows.Point relativePoint = _host.TransformToAncestor(_parent).Transform(new System.Windows.Point(0, 0)); 
      return new Point((int) (relativePoint.X + _host.ActualWidth/2), (int) (relativePoint.Y + _host.ActualHeight/2)); 
     } 

更新:

事實證明,上述方法實際上是錯誤的。它將我的光標置於預定義位置,無論我的窗口大小或位置如何。這個位置是錯誤的。我已經制定了一種新方法,但是,它會給出所需的結果。

 public Point FindCenter() 
     { 
      System.Windows.Point relativePoint = _host.PointToScreen(new System.Windows.Point(0, 0)); 
      return new Point((int)(relativePoint.X + (this.Width/2)), (int)(relativePoint.Y + (this.Height/2))); 
     } 

該方法確保將光標置於控件的正確位置。如果你打算在你自己的應用程序中使用它,我會建議試着確定哪一個適合你的需求。

相關問題