Как перевернуть PathGeometry по вертикали? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть 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 ]

1 голос
/ 06 апреля 2019

Большая проблема в том, что ваша ширина будет равна нулю.Шкалы 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);
    }
1 голос
/ 06 апреля 2019

Просто установите свойство PathGeometry Transform:

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

Обратите внимание, что вам также может потребоваться установить свойство ScaleTransform CenterY для правильного вертикального выравнивания.

0 голосов
/ 06 апреля 2019

И @Andy, и @Clemens дали правильные ответы.Причина, по которой я не получил ожидаемую форму, заключается в том, что я не заметил, что форма находится за пределами области экрана.Однако я использовал решение Энди, потому что мне нужно сохранить первоначальную форму.Также он уведомил меня о создании новых границ.Единственное, что я изменил в его ответе, - это значение новых границ, потому что с тем, который он использовал, форма все еще находилась за пределами области экрана.

double newY = (bounds.Bottom - bounds.Top); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...