В настоящее время я пытаюсь смоделировать пути железной дороги, используя заданные координаты. Ранее я использовал значение «Скругленный» для свойств StrokeStart и StrokeEnd LineCap, однако добавленный радиус, который вы получаете с этим значением, вызывал проблемы при добавлении соединений дорожек. Я переключился на «плоское» значение для LineCap, которое работает намного лучше, за исключением того факта, что «углы» моей дорожки не заполняются, например:
Отсутствующие углыhttps://imgur.com/a/EliIlzD
Я пытался противодействовать этому, сначала визуализируя все свои дорожки со значением «Круглый», а затем снова визуализируя их поверх со значением «Плоский», которое, кажется, заполняет углы, но приводит к другим проблемам. например, перекрывающиеся цвета, когда дорожка занята, и закругленные дорожки, которые я визуализировал первыми, появляются в конце дорожки:
Перекрывающиеся цвета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, сохраняя при этом углы без проблем? Обновлено: Просто чтобы уточнить, я полагаю, что прошу пользовательскую реализацию строки или строки, чтобы решить все эти проблемы, но любое другое решение очень приветствуется.
Решение, которое я придумал, весьма специфично для моего проекта, но я решил опубликовать его в любом случае, если оно поможет кому-нибудь в будущем, кто столкнется с этой веткой.
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 линиями, она будет проверять, соприкасаются ли какие-либо концы линий, и если да, то для этой конкретной линии будет установлено значение «Круглое», в противном случае она будет оставаться «Плоской». Затем я привязал StartLineCap и EndLineCap к этим значениям, и все заработало, как и ожидалось. Посмотрите другие мои посты о z-index, если хотите увидеть, как я справился с кровоточащими цветами.