powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Нарисовать блок-схему - подход
18 сообщений из 18, страница 1 из 1
WPF: Нарисовать блок-схему - подход
    #39641491
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MVVM

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

При этом начало и конец соединения - это не заведомая точка (типа - середина правой стороны блока), а точка на краю блока, которая зависит от того, как блок отрендерится, и в зависимости от компоновки текста внутри блока, эти точки могут плавать. То есть место нельзя вычислить заранее, а нужно будет смотреть по факту после рендеринга блока.

Сама модель, естественно, о координатах и размерах блоков ничего не знает, просто содержит достаточно информации для некоего интеллектуального "расстановщика" на стороне представления, который расставит блоки и нарисует стрелочки.

В голове возникает целый ворох подходов к написанию этого расстановщика, но ни один мне не нравится, либо возникает слишком много вопросов, когда начинаешь тщательно продумывать реализацию.
Пока как рабочий вариант думаю за кастомную панель для ItemsControl-а, она получит доступ к размерам отрендеренных ContentPresenter-ов блоков, сама расставит их как требуется. Но она сама стрелочки не нарисует, значит должен быть какой-то второй этап.
В общем, есть идеи?
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641534
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Разбить задачи на два куска функционала.
Иначе не взлетит.
Первый это полный аналог стрелок и блоков эксель.
Второй без ГУИ может изменить модель и расставить блоки без накладок и петель в стрелках.
Второй блок просто скорректирует числа в Модели1.
Второй функционал это математика и сложнее.
Первый функционал расставление юзерами как в эксель.
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641536
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За основу можно взять вот это: http://www.freedevelopertutorials.com/wpf-diagram-designer/
Там представлен дизайнер диаграм, это не совсем то, что вам нужно, но частично код можно скомуниздить.
Например, код для стрелок (связей), код элемента который связывает стрелки, в дизайнере они только на гранях элемета, но лично я делал и комбинированные элементы с набором полей и для каждого поля плейсхолдер для стрелки, как у вас на рисуннке, это было не сложно.

На счет ItemsControl'а вопрос спорный, по сути, это граф, а не список, возможно имеет смысл наследоваться от Control'а и в качестве источника задавать не список элементов, а веришну графа. И реализовать интерфейсы для обновления.
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641542
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123

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

ЗЫ: Лично к тебе у меня вообще нет никаких вопросов, буду благодарен твоему отсутствию в топике.
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641547
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proза кастомную панель для ItemsControl-аПочему не Panel (в частности Canvas)?
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641552
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Ок, ссылку посмотрю, спасибо

Roman MejtesНа счет ItemsControl'а вопрос спорный, по сути, это граф, а не список, возможно имеет смысл наследоваться от Control'а и в качестве источника задавать не список элементов, а веришну графа. И реализовать интерфейсы для обновления.

Ок, допустим, контрол, за основу берем Canvas
Дальше в динамике создаем один блок, добавляем на Canvas
Дальше заставляем принудительно выполнить рендер (как?), потому что не зная размеров предыдущего блока, мы не вычислим координаты для следующего
В цикле добавляем все блоки аналогично, потом начинаем рисовать стрелки.

Так?
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641554
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregПочему не Panel (в частности Canvas)?Чтобы автоматом получить коллекцию из уже N отрендеренных блоков, а не создавать их кодом вручную в цикле. Ну это как вариант
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641556
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

зачем выполнять Render?
Для вычисления размера элемента нужно вызвать Measure(), который вернет в Control.DesiredSize размеры элемента, после того как размеры 1 элемента вычеслены, берем элементы 2ого уровня и так далее, а потом, когда размеры все вычислены, размещаем через Arrage на панели элементы.
Думаю как то так. Рендерить при этом их не нужно.
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641562
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesзачем выполнять Render?
Для вычисления размера элемента нужно вызвать Measure(), который вернет в Control.DesiredSize размеры элемента, после того как размеры 1 элемента вычеслены, берем элементы 2ого уровня и так далее, а потом, когда размеры все вычислены, размещаем через Arrage на панели элементы.
Думаю как то так. Рендерить при этом их не нужно.В случае панели - да, это понятно. Но ты же говоришь "наследоваться от Control'а" - я именно этот момент хотел прояснить.
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641587
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Ну контрол должен содержать в себе Canvas и ScrollViewer, как и ItemsControl.
Можно и ItemsControl использовать, если вершин может быть несколько. Как TreeView.
Я бы сильно не замарачивался с PanelTemplate'ами и просто сделал Canvas в качестве TemplateParts
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641597
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть вызвать UIElement.Measure() вне панели будет нормально?

То есть я внутри контрола динамически создаю ContentPresenter, присваиваю ему Content, потом запрашиваю Measure() и имею размеры для дальнейшей работы, так?
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641601
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ItemsControl использует ItemsPresenter. Если ItemsPresenter не использовать, то и ItemsControl не нужен
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641604
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proзапрашиваю Measure() и имею размеры для дальнейшей работы
В Measure() передается максимально возможный размер, контрол возвращает желаемый (читай минимальный) размер.
Потом в Arrange передается действительный размер и положение
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641606
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregВ Measure() передается максимально возможный размер, контрол возвращает желаемый (читай минимальный) размер.
Потом в Arrange передается действительный размер и положениеЯ знаю как работает двухпроходная компоновка. Я спрашиваю, нормально ли это использовать вне панели.
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641645
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProrefregВ Measure() передается максимально возможный размер, контрол возвращает желаемый (читай минимальный) размер.
Потом в Arrange передается действительный размер и положениеЯ знаю как работает двухпроходная компоновка. Я спрашиваю, нормально ли это использовать вне панели.Я не вижу препятствий для вызова Measure(), или, сори, не понял вопроса.
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39641647
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregЯ не вижу препятствий для вызова Measure(), или, сори, не понял вопроса.ну ок, я просто не встречал применения вне панели, вдруг есть нюансы.



Roman Mejtes

И еще вопрос - как проще вычислить абсолютные координаты (для Canvas-а) точки привязки начала стрелки?

Навскидку - я закладываю точки в шаблон блока в виде, к примеру, бордера со специфическим именем или тэгом или еще как-то.
Они там где-то выстраиваются с помощью выравниваний и пр. в нужных местах.
Дальше, после расстановки блоков я ищу точки с помощью LogicalTreeHelper.FindLogicalNode или GetChildren.
Дальше вычисляю относительную позицию с помощью
Код: c#
1.
Point relativePoint = myVisual.TransformToAncestor(rootVisual).Transform(new Point(0, 0));

Так? Или можно проще?
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39650863
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
у Вас получилось разобраться с вопросом? Просто самому интересно
...
Рейтинг: 0 / 0
WPF: Нарисовать блок-схему - подход
    #39651176
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в итоге я сделал как изначально планировал. Все нужные VM блоков и VM стрелочек закидываются в List<object>. В представлении для отображения используется ItemsControl, в котором используется кастомная панель. Сама панель получает доступ к визуальным элементам и через них - к необходимым свойствам VM блоков и стрелок. Зная размеры блоков и данные из моделей блоков, панель расставляет всё в нужных местах.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Нарисовать блок-схему - подход
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]