Отсечение элементов WPF на холсте

Я работаю над интерактивным инструментом графа/дерева WPF, и узлы и связи между ними размещены на холсте. Узлы — это пользовательские элементы управления, а ссылки — это просто линии, и в настоящее время ссылки идут от центра узла к центру другого узла.

Проблема возникает, когда я хочу, чтобы узлы были слегка прозрачными, и можно было видеть ссылки за узлами. Я подумал, что наиболее удобным решением будет применить отсечение или маску непрозрачности к линиям, чтобы они не рисовались за узлами, но я не могу понять, как это сделать?

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


person angularsen    schedule 24.10.2009    source источник


Ответы (3)


Кажется, что метод VisualTreeHelper.GetContentBounds() каждый раз возвращает Empty.

Ответ на альтернативное решение этой проблемы см.

Соединение двух элементов холста WPF с помощью линия без использования якорей?

который использует ограничивающие рамки, чтобы найти точки пересечения, чтобы провести линии от/до.

person angularsen    schedule 15.11.2009

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

Тем не менее, чтобы получить ограничивающую рамку визуального элемента, вы можете использовать VisualTreeHelper:: Вспомогательный метод GetContentBoundds.

person Drew Marsh    schedule 24.10.2009
comment
Да, я думал об этом, но есть две причины, по которым мне не нравится такой подход. 1) Я использую панорамирование и масштабирование холста, а также размеры узлов варьируются в зависимости от содержимого и преобразований масштабирования для каждого узла. Мне просто трудно определить точные размеры узлов в координатах холста. Я знаю, что это выполнимо, я просто немного борюсь. 2) Даже если бы я знал точные границы узлов, рисование толстой линии для соединения границ привело бы к артефактам, если края линии и узла не были перпендикулярны. Если вместо этого я обрежу линию по геометрии узла, она соединит их без проблем. - person angularsen; 25.10.2009
comment
Достаточно честно, я могу рассказать вам, как получить ограничительную рамку. Я обновлю свой ответ. - person Drew Marsh; 25.10.2009
comment
Спасибо, это именно то, что я искал! - person angularsen; 14.11.2009

Мы работали над чем-то похожим, и наше решение состояло в том, чтобы разместить ссылки и узлы на разных слоях.

Поэтому, если вы хотите, чтобы узлы отображались над ссылками, а кончики ссылок были скрыты узлами, вы просто меняете z-порядок слоев так, чтобы слой узлов находился перед слоем ссылок.

В качестве слоев мы использовали VisualHosts (вы найдете класс VisualHost здесь), а наши объекты node и link были DrawingVisuals.

Работает нормально, и вам не нужно беспокоиться о поиске границ ваших узлов и т. д.

person Knasterbax    schedule 11.06.2012
comment
Проблема заключалась в слегка прозрачных узлах, из-за которых были видны линии. Вот почему я хотел, чтобы линии заканчивались на краю узлов. - person angularsen; 13.06.2012