Сохранение плоского свойства LineCap для линии при заполнении пропущенных углов - PullRequest
0 голосов
/ 30 мая 2019

В настоящее время я пытаюсь смоделировать железнодорожные пути, используя заданные координаты.Ранее я использовал значение Rounded для свойства StrokeStart и StrokeEnd LineCap, однако добавленный радиус, который вы получаете с этим значением, вызывал проблемы при добавлении стыков треков.Я переключился на значение «flat» для LineCap, которое работает намного лучше, за исключением того факта, что «углы» моего трека не заполнены, например:

Отсутствуют углы https://imgur.com/a/EliIlzD

Я пытался противодействовать этому, рендерив все мои треки сначала со значением «Round», а затем снова перерисовывая их сверху с помощью значения «Flat», что кажетсячтобы заполнить углы, но это приводит к другим проблемам, таким как перекрывающиеся цвета, когда дорожка занята, и округленные дорожки, которые я рендерил, сначала появляются в конце дорожки:

Перекрывающиеся цвета https://imgur.com/a/0XCVGv5

Проблемы в конце дорожки https://imgur.com/a/fKju9uA

Мой XAML - это простая линия, образованная изсписок координат с различными привязками из моей модели вида и конвертеры для небольшого уменьшения моих координат.Это, очевидно, треки, отрисованные в первую очередь с помощью Rounded EndCaps:


<Line  X1="{Binding X1, Converter={StaticResource ScaleXCoordConverter}}" Y1="{Binding Y1, Converter={StaticResource ScaleYCoordConverter}}"
                                                   X2="{Binding X2, Converter={StaticResource ScaleXCoordConverter}}" Y2="{Binding Y2, Converter={StaticResource ScaleYCoordConverter}}"
                                                   Stroke="{Binding DataContext.LineColor, RelativeSource={RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}" 
                                                   StrokeThickness="2" StrokeEndLineCap="Round" StrokeStartLineCap="Round">
                                                <Line.InputBindings>
                                                    <MouseBinding Gesture="LeftClick" Command="{Binding DataContext.OccupyTrackCommand, RelativeSource={RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}"/>
                                                </Line.InputBindings>

                                            </Line>

У кого-нибудь была удача в создании пользовательской линии, которая решает эти проблемы, где вы можете использовать значение Flat для LineCap, сохраняя углыбез проблем?РЕДАКТИРОВАТЬ: просто чтобы прояснить, я полагаю, что я прошу о специальной реализации линии или линейного колпачка для решения всех этих проблем, но любое другое решение очень приветствуется.

1 Ответ

0 голосов
/ 18 июня 2019

Решение, которое я придумал, довольно специфично для моего проекта, но я подумал, что я все равно опубликую его на тот случай, если оно поможет любому, кто столкнется с этой темой в будущем.

private void SetLineCaps() {

        if (LineCoords.Count == 1) {
            LineCoords[0].StartLineCap = "Flat";
            LineCoords[0].EndLineCap = "Flat";
            return;
        }
        foreach (var currentCoord in LineCoords) {
            foreach (var compareCoord in LineCoords) {


                if(currentCoord == compareCoord) continue;
                if ((compareCoord.X1 == currentCoord.X1 && compareCoord.Y1 == currentCoord.Y1)
                    || (compareCoord.X2 == currentCoord.X1 && compareCoord.Y2 == currentCoord.Y1)) {
                    currentCoord.StartLineCap = "Round";
                }
                if ((compareCoord.X1 == currentCoord.X2 && compareCoord.Y1 == currentCoord.Y2 )
                    || (compareCoord.X2 == currentCoord.X2 && compareCoord.Y2 == currentCoord.Y2)){ 

                    currentCoord.EndLineCap = "Round";
                }
            }
        }
    }

По сути, в конечном итоге мне пришлось проверять начальную и конечную точки каждой из моих строк и проверять, касается ли начало или конец какой-либо другой точки этого конкретного списка строк.,Например, если у меня есть трек с 3 линиями, он будет проверять, касаются ли концы какой-либо линии, и если это так, он установит для этой конкретной строки ограничение на «Round», в противном случае он останется «Flat».Затем я ограничил свои StartLineCap и EndLineCap этими значениями, и все заработало, как и ожидалось.Посмотрите мои другие посты о z-index, если вы хотите увидеть, как я справляюсь с кровоточащими цветами.

...