嘗試使用拇指在畫布上移動控件時遇到了奇怪的行爲。當我將控件添加到畫布並使用Thumb DragDelta事件將其移到一切看起來不錯時。但是當我將旋轉變換應用到控件時,拖動它變得異常怪異。控件開始繞光標旋轉,角度越大,圓圈越大。使用拇指移動已轉換的控件會產生奇怪的行爲
有誰知道如何使用變形元素進行拇指工作?我花了整整一天的時間試圖弄明白,沒有什麼聰明的想法。
感謝您的幫助!
嘗試使用拇指在畫布上移動控件時遇到了奇怪的行爲。當我將控件添加到畫布並使用Thumb DragDelta事件將其移到一切看起來不錯時。但是當我將旋轉變換應用到控件時,拖動它變得異常怪異。控件開始繞光標旋轉,角度越大,圓圈越大。使用拇指移動已轉換的控件會產生奇怪的行爲
有誰知道如何使用變形元素進行拇指工作?我花了整整一天的時間試圖弄明白,沒有什麼聰明的想法。
感謝您的幫助!
看來,拇指HorizontalChange和VerticalChange當拇指旋轉不發揮很好。所以,我只是在畫布中使用光標位置來獲取我的左側和頂部偏移量。它不完全準確,但它足夠接近我想要做的事情。
如果溝畫布屬性,並在一個TransformGroup
正確的順序應用運動,它應該工作:
<Thumb.RenderTransform>
<TransformGroup>
<TranslateTransform x:Name="translation" />
<RotateTransform ... />
</TransformGroup>
</Thumb.RenderTransform>
translation.X += e.HorizontalChange;
translation.Y += e.VerticalChange;
如果該組中開關的順序,你會得到相同的行爲時使用Canvas.Left
/Top
。
(如果您的動畫旋轉,這將不幫你)
如果將任何旋轉變換應用於FrameworkElement,則表示與其關聯的座標網格已旋轉。因此,此FrameworkElement的任何事件處理程序都將在自己的座標網格中接收位置值。
void DragThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
//You can use this values when RotateTransform is null
double deltaHorizontal = e.HorizontalChange;
double deltaVertical = e.VerticalChange;
//Transform coordinates
Vector v = Math2DHelper.RotateVector2d(e.HorizontalChange, e.VerticalChange, Math2DHelper.D2R(rotationInDegrees));
//Right values
deltaHorizontal = v.X;
deltaVertical = v.Y;
...
}
樣品math2D幫手
public static class Math2DHelper
{
public static Vector RotateVector2d(double x0, double y0, double rad)
{
Vector result = new Vector();
result.X = x0 * Math.Cos(rad) - y0 * Math.Sin(rad);
result.Y = x0 * Math.Sin(rad) + y0 * Math.Cos(rad);
return result;
}
public static double D2R(double degree)
{
return (degree%360)*Math.PI/180;
}
}
我遇到了這個問題,並找到了解決辦法,也許有人覺得它有用,你需要拖動拇指
private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
var thumb = dts as UIElement;
var transform = thumb.RenderTransform as RotateTransform;
Point dragDelta = new Point(e.HorizontalChange, e.VerticalChange);
if (transform != null)
{
dragDelta = transform.Transform(dragDelta);
}
Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + dragDelta.X);
Canvas.SetTop(thumb, Canvas.GetTop(thumb) + dragDelta.Y);
}
這之前檢查任何改造取決於你如何實現移動 – 2012-02-14 22:16:47
我正在採取e.HorizontalChange和e.VerticalChange,然後在Canvas.SetTop()和Canvas.SetLeft()中使用它們。那是你在說什麼? – chiefanov 2012-02-14 22:28:12
另外你在哪裏(在哪個屬性上)應用旋轉變換? – 2012-02-14 22:31:46