2009-10-24 10 views
1

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

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

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

ответ

2

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

Альтернативное решение этой проблемы отвечает на

Connecting two WPF canvas elements by a line, without using anchors?

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

1

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

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

+0

Да, я думал об этом, но есть две причины, которые мне не нравится такой подход. 1) Я использую панорамирование и масштабирование в холсте, а также размеры узлов варьируются в зависимости от преобразования масштабирования содержимого и каждого узла. Мне просто сложно определить точные размеры узлов в координатах холста. Я знаю, что это выполнимо, я просто немного борюсь. 2) Даже если бы я знал точные границы узлов, рисование толстой линии для объединения границ создавало бы артефакты, если ребра линий и узлов не были перпендикулярны. Если я вместо этого закрою линию геометрией узла, она будет легко соединяться с ними. – angularsen

+0

Достаточно честно, я могу рассказать вам, как получить ограничительную рамку. Я уточню свой ответ. –

+0

Спасибо, это именно то, что я искал! – angularsen

0

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

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

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

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

+0

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