2013-04-18 123 views
2

讓我們假設我有一個要在視覺設計器中旋轉和縮放的元素: 用戶應該能夠拖動邊並且圖形應該適當縮放。
旋轉輸入度數。旋轉元素的縮放



以下事實與旋轉元件的一個問題:
在左上點拖動不僅寬度和高度都會發生變化,但左上角的位置爲好。 當右上角的點被拖動時,尺寸改變,並且Y位置也是如此012ff

如果元素被旋轉但是(WPF RenderTransform,圍繞它的中心旋轉),那麼行爲必須相應地改變,我不知道怎麼樣。假設元素被旋轉90°,那麼之前左上角的點是右上角的點。
這意味着我必須改變一些東西,但我完全難倒我害怕

我正在尋找在任何圖形程序中實現的行爲。
用戶基本上拖動邊界框的點,圖形應投影在框內。

WPF中如何解決這個問題?
繪製的元素派生自UIElement,所以我可以訪問所有需要的變換屬性。該解決方案應適用於任何輸入的輪換。
如果你能幫助我,或者指引我走向正確的方向,我將不勝感激。

編輯:
我知道如何縮放和旋轉元素。理想的結果是元素完全適合用戶拖動的框。所以這個問題與WPF相關的數學更相關。

編輯:
謝謝不提供我什麼我可以改進建議downvoting。
爲了理解問題,請嘗試以下操作:
創建一個新的WPF項目,添加任意UIElement並旋轉它,例如90°。
現在記住拖動前的邊距,並將某個地方的右下角拖動。正如你所看到的邊距(=位置)也是如此。我的問題是如何計算這種補償,以便在拖動時爲用戶提供期望的結果。因爲如果我做而不是改變位置來補償比例,比結果只是奇怪,並不像預期的那樣。
補償取決於元素的比例。明顯。
請參考以下圖片:
你在這裏看到的是Canvas.Top和Canvas.Left屬性,然後拖動右下角的點,然後拖動右下角的點。
http://imageshack.us/photo/my-images/268/beforeaftert.png/?sa=0

回答

1

您應該使用TransformGroup。

在TransformGroup中,您可以同時具有ScaleTransform,RotateTransform,TranslateTransform和SkewTransform(按此順序,這很重要)。

這樣,您可以將每個動作映射到不同的轉換。

實際上您不需要考慮不同點,您只需將鼠標移動映射到不同的轉換。例如:

如果點擊了其中一個角,則每次鼠標移動都會觸發ScaleTransform中的更改。 如果您單擊一個旋轉點,則可以觸發RotateTransform中的更改。

如果需要縮放,傾斜或旋轉中心的周圍的不同點,則需要爲當前正在執行的一個補償轉型:

  • 一個ScaleTransform需要一個translateTransformation以補償由縮放造成的橫向/垂直差異。
  • 當圍繞不同的中心點旋轉,你可以改變rotatetransform
+0

感謝您的回答。但是,我使用的轉換組與您描述的完全相同的順序工作,我遇到的問題是,例如,如果元素旋轉100°,並且用戶將元素的一個點拖動到特定位置,則元素應該完美地適合用戶拖動的盒子。這是問題的根源。問題是:如果用戶移動元素的縮放點以完美地適合所得到的框,那麼旋轉元素的縮放比例是如何改變的。 –

+0

好吧,就像我說的,你需要添加一些補償轉換。例如,如果您進行縮放,則會向左,向上,向右和向下擴展5px。如果您希望它保持在底部,則需要向上執行5px的translatetransform。至於旋轉,用戶選擇哪一點並不重要,如果他拖拉下來,則需要向下擴展,補償向上擴展,反之亦然,左邊,右邊和上邊(以及橫向和縱向移動的組合)。可能會涉及很多數學,但不幸的是我不能爲你做這項工作。 – Kenneth

+0

謝謝,也許我應該更具體一些,數學部分是我需要一些技巧的人。更具體地說,這種補償應該如何發生。 –