如何垂直翻转PathGeometry?

时间:2019-04-06 12:20:10

标签: c# wpf

我有一个PathGeometry,我想垂直翻转。我尝试了以下方法,但是它不起作用,我是否缺少某些东西?

PathGeometry myPathGeometry = new PathGeometry();
myPathGeometry.Figures.Add(myPathFigure);
PathGeometry flipMyPathGeometry = new PathGeometry();
ScaleTransform transform = new ScaleTransform(0, -1);
flipMyPathGeometry = Geometry.Combine(Geometry.Empty, myPathGeometry, GeometryCombineMode.Union, transform);

3 个答案:

答案 0 :(得分:1)

只需设置PathGeometry的Transform属性:

var myPathGeometry = new PathGeometry();
myPathGeometry.Figures.Add(myPathFigure);
myPathGeometry.Transform = new ScaleTransform(1, -1);

请注意,您可能还需要设置ScaleTransform的CenterY属性以实现正确的垂直对齐。

答案 1 :(得分:1)

一个大问题是您的宽度将为零。 X和Y标度是因素。如乘数。任何时候零为零。 因此

ScaleTransform(0, -1);

会给你没有宽度的东西。

您大概想要相同的宽度,因此:

ScaleTransform(1, -1);

如果您希望将事物翻转到其中心,那可能还会有另一个问题,但至少在使用时应该显示出来。

CenterY计算可能不那么明显。您可以使用边界来计算几何图形的高度。

由于您正在创建新的路径几何,因此您可能希望保留原始路径而不进行任何变换。

我将一些代码组合在一起,这些代码可以从资源中操纵几何图形,并使用它为画布添加路径。

标记:

<Window.Resources>
    <Geometry x:Key="Star">
        M16.001007,0L20.944,10.533997 32,12.223022 23.998993,20.421997 25.889008,32 16.001007,26.533997 6.1109924,32 8,20.421997 0,12.223022 11.057007,10.533997z
    </Geometry>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Button x:Name="myButton" Click="MyButton_Click">
    </Button>
    <Canvas Grid.Column="1" Name="myCanvas"/>
</Grid>

代码

    private void MyButton_Click(object sender, RoutedEventArgs e)
    {
        Geometry geom = this.Resources["Star"] as Geometry;
        Geometry flipped = geom.Clone();
        var bounds = geom.Bounds;
        double halfY = (bounds.Bottom - bounds.Top) / 2.0;
        flipped.Transform = new ScaleTransform(1, -1, 0, halfY );
        PathGeometry pg = PathGeometry.CreateFromGeometry(flipped);

        var path = new System.Windows.Shapes.Path {Data=pg, Fill= System.Windows.Media.Brushes.Red };
        this.myCanvas.Children.Add(path);
    }

答案 2 :(得分:0)

@Andy和@Clemens都给出了正确的答案。我没有得到预期形状的原因是因为我没有注意到形状在屏幕区域之外。但是,我使用了Andy的解决方案,因为我需要保持原始形状。此外,他还通知我有关创建新界限的信息。我对他的答案唯一更改的是新边界的值,因为使用他使用的那个边界,形状仍然在屏幕区域之外。

double newY = (bounds.Bottom - bounds.Top);