2013-01-05 3 views
2

저는 WPF에 익숙하지 않습니다. 그리고 꽤 많은 연주를 한 후에 마침내 제 컨트롤이 제대로 작동하고 있습니다. 이미지를 표시하는 사각형이 있습니다. 마우스 휠은 ScaleTransform 애니메이션으로 이미지의 크기를 조정하고 마우스를 클릭/끌면 화면에서 이미지가 움직입니다. 문제는 이미지를 위아래로 확대 한 다음 이동하려고하면 자동으로 1 (원본 크기)로 다시 조정됩니다. 크기가 조정될 때 주위를 움직일 방법이 있습니까? 편집 : ScaleTransform 및 TranslateTransform을 TransformGroup으로 설정하려고 시도했지만 여전히 작동하지 않았습니다.TranslateTransform은 ScaleTransform을 취소합니다.

다른 문제는 부모 컨테이너보다 이미지가 큽니다. 범위를 벗어났습니다. 부모 컨테이너에 ClipToBounds = True을 설정했지만 작동하지 않았습니다.

코드 : 사용자가 제공 한 코드가 매우 긴 때문에 내가 귀하의 경우에 다음 예를 적용하지 않은

private void Window_MouseWheel_1(object sender, MouseWheelEventArgs e) 
{ 
    if (e.Delta > 0) 
    { 
     ScaleTransform scaleP = new ScaleTransform(); 
     scaleP.CenterX = e.GetPosition(this).X; 
     scaleP.CenterY = e.GetPosition(this).Y; 

     rect.RenderTransform = scaleP; 

     DoubleAnimation dblAnimX = new DoubleAnimation(); 
     dblAnimX.From = scaleXFrom; 
     dblAnimX.To = scaleXTo + 0.1; 
     scaleXFrom = scaleXTo +0.1; 
     scaleXTo += 0.1; 
     Duration = new Duration(TimeSpan.FromSeconds(0.15)); 

     DoubleAnimation dblAnimY = new DoubleAnimation(); 
     dblAnimY.From = scaleYFrom; 
     dblAnimY.To = scaleYTo + 0.1; 
     scaleYFrom = scaleYTo +0.1; 
     scaleYTo += 0.1; 
     Duration = new Duration(TimeSpan.FromSeconds(0.15)); 

     scaleP.BeginAnimation(ScaleTransform.ScaleXProperty, dblAnimX); 
     scaleP.BeginAnimation(ScaleTransform.ScaleYProperty, dblAnimY); 
    } 
    else 
    { 
     ScaleTransform scaleM = new ScaleTransform(); 
     scaleM.CenterX = e.GetPosition(this).X; 
     scaleM.CenterY = e.GetPosition(this).Y; 

     rect.RenderTransform = scaleM;       

     DoubleAnimation dblAnimX = new DoubleAnimation(); 
     dblAnimX.From = scaleXFrom; 
     dblAnimX.To = scaleXTo -0.1; 
     scaleXFrom = scaleXTo -0.1; 
     scaleXTo -= 0.1; 
     dblAnimX.Duration = new Duration(TimeSpan.FromSeconds(0.15)); 

     DoubleAnimation dblAnimY = new DoubleAnimation(); 
     dblAnimY.From = scaleYFrom; 
     dblAnimY.To = scaleYTo - 0.1; 
     scaleYFrom = scaleYTo -0.1; 
     scaleYTo -= 0.1; 
     Duration = new Duration(TimeSpan.FromSeconds(0.15)); 

     scaleM.BeginAnimation(ScaleTransform.ScaleXProperty, dblAnimX); 
     scaleM.BeginAnimation(ScaleTransform.ScaleYProperty, dblAnimY); 
    } 
} 

private void rect_MouseMove_1(object sender, MouseEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     System.Windows.Point p = e.GetPosition(this); 
     TranslateTransform tt = new TranslateTransform(); 
     tt.X = (p.X - mouseDownX); 
     tt.Y = (p.Y - mouseDownY); 

     rect.RenderTransform = tt; 

    } 
} 

답변

4

또는 당신은 사용하십시오 MatrixTransform :

var matrix = Matrix.Identity; 
matrix.Scale(1.5, 2.5); 
matrix.Translate(30, 60); 
rect.RenderTransform = new MatrixTransform(matrix); 

심지어 짧은 :

var matrix = new Matrix(1.5, 0, 0, 2.5, 30, 60); 
rect.RenderTransform = new MatrixTransform(matrix); 

또는 더 나은, 당신은 새로운으로 RenderTransform 각 시간을 설정하고 바로 변환 매트릭스를 업데이트 할 피하기 :

// set RenderTransform once in constructor 
rect.RenderTransform = new MatrixTransform() 

... 

// update matrix in event handler 
((MatrixTransform)rect.RenderTransform).Matrix = new Matrix(...); 
+0

감사합니다. 이것은 매력처럼 작동했습니다! –

1

. 가능한 경우에만 중요한 부분을 게시하는 것을 고려하십시오.

Transform의 다른 유형을 결합하려면이 방법으로 TransformGroup을 사용할 수 있습니다.

void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    var button = sender as Button; 
    var transformGroup = new TransformGroup(); 
    var scale = new ScaleTransform(1.5, 2.5); 
    var translate = new TranslateTransform(30, 60); 
    transformGroup.Children.Add(scale); 
    transformGroup.Children.Add(translate); 
    button.RenderTransform = transformGroup; 
} 
관련 문제