C# 在WPF中逐个应用时,旋转和变换不起作用

C# 在WPF中逐个应用时,旋转和变换不起作用,c#,wpf,xaml,C#,Wpf,Xaml,我正在旋转面板(栅格)并翻转(变换)面板。当我分开做这件事时,两者都很好。先旋转再翻转(或)先翻转再旋转无法正常工作 我每次都将面板旋转90度。当我旋转到90度时,面板的高度和宽度会发生变化。在这种情况下,如果我翻转面板,问题就会出现。对于180度,没有问题 发布步骤 第1步:单击示例中的旋转按钮,将图像旋转90度。您将获得以下输出 第二步:现在通过“变换”按钮翻转图像,图像移到左侧。预期的输出是,它应该是中心和翻转 通过直接单击“变换”按钮,而不单击“旋转”,可以看到图像变换的差异 这是我

我正在旋转面板(栅格)并翻转(变换)面板。当我分开做这件事时,两者都很好。先旋转再翻转(或)先翻转再旋转无法正常工作

我每次都将面板旋转90度。当我旋转到90度时,面板的高度和宽度会发生变化。在这种情况下,如果我翻转面板,问题就会出现。对于180度,没有问题

发布步骤 第1步:单击示例中的旋转按钮,将图像旋转90度。您将获得以下输出

第二步:现在通过“变换”按钮翻转图像,图像移到左侧。预期的输出是,它应该是中心和翻转

通过直接单击“变换”按钮,而不单击“旋转”,可以看到图像变换的差异

这是我的密码

[XAML]:

   <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition  Height="50"/>
        </Grid.RowDefinitions>
        <Grid x:Name="grid1" Grid.Row="0">
        <Image x:Name="image1" Source="Images/Buldingimage.jpeg"/>
        </Grid>
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Button Click="Button_Click_1" Grid.Column="0">Rotate</Button>
            <Button Click="Button_Click_2" Grid.Column="1">Transform</Button>
        </Grid>
    </Grid>
    double rotationAngle = 0;
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        //Rotate
        this.rotationAngle += 90;
        this.grid1.RenderTransformOrigin = new Point(0.5, 0.5);
        this.grid1.LayoutTransform = new RotateTransform() { Angle = this.rotationAngle };
    }

    bool mIsHorizontalImageflipped = false;
    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        //Transform
        int[] value ;
        float[] origin = new float[] { 0.5f, 0.5f };
        string path = "(UIElement.RenderTransform).(ScaleTransform.ScaleX)";
        if (!this.mIsHorizontalImageflipped)
        {
            value = new int[] { 1, -1 };
            this.mIsHorizontalImageflipped = true;
        }
        else
        {
            this.mIsHorizontalImageflipped = false;
          value = new int[] { -1, 1 };
        }
        this.Animate(value, origin, path);
    }
    internal void Animate(int[] value, float[] origin, string path)
    {
        this.grid1.RenderTransform = new ScaleTransform();
        Storyboard sb = new Storyboard();
        this.grid1.RenderTransformOrigin = new Point(origin[0], origin[1]);
        DoubleAnimationUsingKeyFrames keyFrames = new DoubleAnimationUsingKeyFrames();

        SplineDoubleKeyFrame keyFrame = new SplineDoubleKeyFrame();
        keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
        keyFrame.Value = value[0];
        keyFrames.KeyFrames.Add(keyFrame);
        keyFrame = new SplineDoubleKeyFrame();
        keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1));

        KeySpline keySpline = new KeySpline();
        keySpline.ControlPoint1 = new Point(0.64, 0.84);
        keySpline.ControlPoint2 = new Point(0, 1);

        keyFrame.KeySpline = keySpline;
        keyFrames.KeyFrames.Add(keyFrame);
        keyFrame.Value = value[1];
        Storyboard.SetTargetProperty(keyFrames, new PropertyPath(path));
        Storyboard.SetTarget(keyFrames, this.grid1);
        sb.Children.Add(keyFrames);
        sb.Begin();
    }
下载示例

请提供建议或我在这方面做错了什么

问候,


Bharathi.

如果将
RenderTransform
属性设置为
ScaleTransform
,则实际上是在删除
RotateTransform
,反之亦然

为了能够同时应用两种转换,您可以使用
TransformGroup

<Grid x:Name="grid1" Grid.Row="0">
    <Image x:Name="image1" Source="Images/Buldingimage.jpeg"/>
    <Grid.RenderTransform>
        <TransformGroup>
            <RotateTransform x:Name="rt" />
            <ScaleTransform x:Name="st" />
        </TransformGroup>
    </Grid.RenderTransform>
</Grid>

“工作不正常…出现问题”-什么类型的问题?旋转90度后,然后翻转,图像位置移动错误。不在中心请注意,RenderTransformorMorigin(顾名思义)对LayoutTransform没有影响。如果您需要同时应用多个转换,请使用TransformGroup或MatrixTransform进行RenderTransform。@Clemens您能从上面的链接查看我的示例并提供更好的解决方案吗?也许可以详细说明您正试图实现的目标。现在我还不清楚。谢谢你的回答。我会尽快核实的。。我现在正在度假。
double rotationAngle = 0;
private void Button_Click_1(object sender, RoutedEventArgs e)
{
    //Rotate
    this.rotationAngle += 90;
    this.grid1.RenderTransformOrigin = new Point(0.5, 0.5);
    rt.Angle = this.rotationAngle;
}

bool mIsHorizontalImageflipped = false;
private void Button_Click_2(object sender, RoutedEventArgs e)
{
    //Transform
    int[] value;
    float[] origin = new float[] { 0.5f, 0.5f };
    string path = "RenderTransform.Children[1].ScaleX";
    if (!this.mIsHorizontalImageflipped)
    {
        value = new int[] { 1, -1 };
        this.mIsHorizontalImageflipped = true;
    }
    else
    {
        this.mIsHorizontalImageflipped = false;
        value = new int[] { -1, 1 };
    }
    this.Animate(value, origin, path);
}

internal void Animate(int[] value, float[] origin, string path)
{
    Storyboard sb = new Storyboard();
    this.grid1.RenderTransformOrigin = new Point(origin[0], origin[1]);
    DoubleAnimationUsingKeyFrames keyFrames = new DoubleAnimationUsingKeyFrames();

    SplineDoubleKeyFrame keyFrame = new SplineDoubleKeyFrame();
    keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
    keyFrame.Value = value[0];
    keyFrames.KeyFrames.Add(keyFrame);
    keyFrame = new SplineDoubleKeyFrame();
    keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1));

    KeySpline keySpline = new KeySpline();
    keySpline.ControlPoint1 = new Point(0.64, 0.84);
    keySpline.ControlPoint2 = new Point(0, 1);

    keyFrame.KeySpline = keySpline;
    keyFrames.KeyFrames.Add(keyFrame);
    keyFrame.Value = value[1];
    Storyboard.SetTargetProperty(keyFrames, new PropertyPath(path));
    Storyboard.SetTarget(keyFrames, this.grid1);
    sb.Children.Add(keyFrames);
    sb.Begin();
}