Рисование WPF Polygon с обводкой сплошным цветом или прозрачным вокруг - PullRequest
0 голосов
/ 19 апреля 2019

Мне нужно создать общий треугольник в WPF, указывающий координаты, обводку и цвета для обводки и области заливки.Проблема в том, что я хочу указать в качестве цвета также Прозрачный для обводки, то есть, используя ту же координату, я хочу нарисовать внутри этой фигуры прозрачный штрих, который заменит его толщину цветом заливки, но это кажется невозможным.(Я с трудом обнаружил и решил ту же проблему для круговых и прямоугольных фигур, но с полигоном это не работает: Рисование фигуры WPF в виде прямоугольника: StrokeThickness делится пополам, если Stroke является прозрачным ).Код, который я сейчас использую, включает в себя клип, потому что часть обводки растет внутри, а часть вне профиля координат, мне нужно удалить внешнюю часть и какой-то преобразователь, чтобы правильно задать массив точек:

<UserControl.Clip>
    <PathGeometry>
        <PathFigure StartPoint="{Binding Triangle.Points, Converter={StaticResource PointLocationClipConverter}}" IsClosed="True">
            <PolyLineSegment Points="{Binding Triangle.Points, Converter={StaticResource PointCollectionClipConverter}}" />
        </PathFigure>
    </PathGeometry>
</UserControl.Clip>

<Grid x:Name="_grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Polygon Points="{Binding Triangle.Points, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource PointCollectionConverter}}" Grid.Row="0" Grid.Column="0" Margin="0,0,0,0"
             Width="{Binding ActualWidth, ElementName=_grid}"
             Height="{Binding ActualHeight, ElementName=_grid}"
             Stroke="{Binding Triangle.BorderColorBrush}"
             StrokeThickness="{Binding Triangle.Thick, Converter={StaticResource PoligonThickConverter}}" 
             Fill="{Binding Triangle.BackgroundBrush}" />

</Grid>

На данный момент у меня есть:

current result

, что я хочу вместо этого:

wanted result

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

Спасибо за помощь!

1 Ответ

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

Начиная с указания @Clemens, я разрабатываю решение с серией преобразований без какого-либо геометрического исчисления. Меньше или больше решение здесь, я постараюсь применить к своему контексту, но в конце концов:

    <Path MouseLeftButtonUp="PathPolyline_MouseLeftButtonUp"
          StrokeThickness="0" Stroke="Transparent" Fill="Gold" ClipToBounds="False">
        <Path.Data>
            <PathGeometry FillRule="EvenOdd" >
                <PathFigure StartPoint="0,0" IsClosed="True">
                    <PolyLineSegment Points="50,50 0,80"/>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>

и разработка в коде C # сделает что-то вроде:

private void PathPolyline_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
  Brush brush = Brushes.Black;
  Pen pen = new Pen(brush, 20.0); //thickness double than wanted measure: 20 to reduce 10
  //
  Path path = sender as Path;
  PathGeometry pg = path.Data as PathGeometry;
  PathGeometry pg2 = pg.GetWidenedPathGeometry(pen);
  //
  Transform tr = Transform.Identity;
  PathGeometry pg324 = Geometry.Combine(pg, pg2, GeometryCombineMode.Intersect, tr);
  pg.AddGeometry(pg324);
}
...