Расположите путь WPF так, чтобы его источник находился внизу, в центре его контейнера. - PullRequest
0 голосов
/ 06 марта 2012

Я пытаюсь центрировать Path так, чтобы его источник (0, 0) находился внизу, в центре его контейнера. Предположим, что контейнер является Grid.


Пример:

Tail of arrow is at the center-bottom of the box

Примечание: хвост стрелки находится в начале координат (0, 0). Хвост отцентрирован горизонтально, но общая стрелка перекошена влево. Это то, чего я хочу достичь независимо от того, в каком направлении указывает стрелка.


Это должно работать для путей, где координаты x и y являются положительными, отрицательными или их комбинацией.

Как это можно сделать через XAML с наименьшей разметкой?

Ответы [ 3 ]

0 голосов
/ 06 марта 2012

Вот что я закончил.Кажется, работает, но если есть более чистый способ сделать это, я хотел бы услышать это:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Path Grid.Column="1"
          HorizontalAlignment="Left"
          VerticalAlignment="Bottom"
          StrokeThickness="1"
          Data="{Binding PathGeometry}" />
</Grid>
0 голосов
/ 15 мая 2018

Вот то, что я использовал. Просто нарисуйте свой путь, куда хотите, и затем переведите его в нужную отправную точку. Вы можете использовать привязки, чтобы центрировать его в сетке. Это позволяет разместить вашу геометрию в пределах вашей сетки.

<Grid>
    <Path Stroke="Black"
          StrokeThickness="1">
        <Path.Data>
            <PathGeometry>
                <!-- Your path geomrtry -->
            </PathGeometry>
        </Path.Data>
        <Path.RenderTransform>
            <TranslateTransform Y="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}, Path=ActualHeight, Converter={StaticResource widthAndHeightDivider}}"
                                X="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}, Path=ActualWidth, Converter={StaticResource widthAndHeightDivider}}"/>
        </Path.RenderTransform>
    </path>
</Grid>

И имея следующий конвертер, который делит фактическую ширину сетки на, чтобы выровнять ее по центру:

public class WidthAndHeightDivider : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double d = (double)value / 2.0;
        return d;
    }
}

Надеюсь, это поможет!

0 голосов
/ 06 марта 2012

Ну ... положение en в нижней средней части зависит от контейнера.Попробуйте что-то вроде этого:

<Grid>
  <Path Stroke="Black"
        StrokeThickness="1"
        VerticalAlignment="Bottom"
        HorizontalAlignment="Center"
        Data="M 0,0 L -50,-70 L -50,-80" />
</Grid>
...