3

私はWPFを初めて使用し、かなりの時間をかけてプレイした後、作業中のプロジェクトで希望どおりにコントロールを配置できるようになりました。画像を表示する長方形があります。マウスホイールはScaleTransformアニメーションで画像を拡大縮小し、マウスをクリック/ドラッグすると画像が画面上を移動します。問題は、画像を拡大または縮小してから移動しようとすると、自動的に1(元のサイズ)に縮小されることです。スケーリングしたときに移動する方法はありますか?編集:ScaleTransformとTranslateTransformをTransformGroupに設定しようとしましたが、それでも機能しませんでした。

私が抱えているもう1つの問題は、画像が親コンテナよりも大きい場合、範囲外になり、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

3 に答える 3

5

または、 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(...);
于 2013-01-05T21:33:56.840 に答える
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;
}
于 2013-01-05T19:26:42.930 に答える