Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
MVVM Есть модель для блок-схемы, которая описывает набор из N блоков, а также данные о том, что некоторые блоки нужно соединить некоторым количеством стрелочек. При этом начало и конец соединения - это не заведомая точка (типа - середина правой стороны блока), а точка на краю блока, которая зависит от того, как блок отрендерится, и в зависимости от компоновки текста внутри блока, эти точки могут плавать. То есть место нельзя вычислить заранее, а нужно будет смотреть по факту после рендеринга блока. Сама модель, естественно, о координатах и размерах блоков ничего не знает, просто содержит достаточно информации для некоего интеллектуального "расстановщика" на стороне представления, который расставит блоки и нарисует стрелочки. В голове возникает целый ворох подходов к написанию этого расстановщика, но ни один мне не нравится, либо возникает слишком много вопросов, когда начинаешь тщательно продумывать реализацию. Пока как рабочий вариант думаю за кастомную панель для ItemsControl-а, она получит доступ к размерам отрендеренных ContentPresenter-ов блоков, сама расставит их как требуется. Но она сама стрелочки не нарисует, значит должен быть какой-то второй этап. В общем, есть идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 15:31 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, Разбить задачи на два куска функционала. Иначе не взлетит. Первый это полный аналог стрелок и блоков эксель. Второй без ГУИ может изменить модель и расставить блоки без накладок и петель в стрелках. Второй блок просто скорректирует числа в Модели1. Второй функционал это математика и сложнее. Первый функционал расставление юзерами как в эксель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:10 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
За основу можно взять вот это: http://www.freedevelopertutorials.com/wpf-diagram-designer/ Там представлен дизайнер диаграм, это не совсем то, что вам нужно, но частично код можно скомуниздить. Например, код для стрелок (связей), код элемента который связывает стрелки, в дизайнере они только на гранях элемета, но лично я делал и комбинированные элементы с набором полей и для каждого поля плейсхолдер для стрелки, как у вас на рисуннке, это было не сложно. На счет ItemsControl'а вопрос спорный, по сути, это граф, а не список, возможно имеет смысл наследоваться от Control'а и в качестве источника задавать не список элементов, а веришну графа. И реализовать интерфейсы для обновления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:12 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Petro123 У меня нет вопросов, по математическому алгоритму расстановки. Позиционирование блоков достаточно простое, рисование стрелок тоже. Вопрос, куда засунуть код расстановки, чтобы ему были доступны фактические размеры блоков после рендеринга, получившиеся координаты точек старта стрелок и средства рисования этих стрелок. ЗЫ: Лично к тебе у меня вообще нет никаких вопросов, буду благодарен твоему отсутствию в топике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:18 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Shocker.Proза кастомную панель для ItemsControl-аПочему не Panel (в частности Canvas)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:23 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Roman Mejtes, Ок, ссылку посмотрю, спасибо Roman MejtesНа счет ItemsControl'а вопрос спорный, по сути, это граф, а не список, возможно имеет смысл наследоваться от Control'а и в качестве источника задавать не список элементов, а веришну графа. И реализовать интерфейсы для обновления. Ок, допустим, контрол, за основу берем Canvas Дальше в динамике создаем один блок, добавляем на Canvas Дальше заставляем принудительно выполнить рендер (как?), потому что не зная размеров предыдущего блока, мы не вычислим координаты для следующего В цикле добавляем все блоки аналогично, потом начинаем рисовать стрелки. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:29 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
refregПочему не Panel (в частности Canvas)?Чтобы автоматом получить коллекцию из уже N отрендеренных блоков, а не создавать их кодом вручную в цикле. Ну это как вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:32 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, зачем выполнять Render? Для вычисления размера элемента нужно вызвать Measure(), который вернет в Control.DesiredSize размеры элемента, после того как размеры 1 элемента вычеслены, берем элементы 2ого уровня и так далее, а потом, когда размеры все вычислены, размещаем через Arrage на панели элементы. Думаю как то так. Рендерить при этом их не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:34 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Roman Mejtesзачем выполнять Render? Для вычисления размера элемента нужно вызвать Measure(), который вернет в Control.DesiredSize размеры элемента, после того как размеры 1 элемента вычеслены, берем элементы 2ого уровня и так далее, а потом, когда размеры все вычислены, размещаем через Arrage на панели элементы. Думаю как то так. Рендерить при этом их не нужно.В случае панели - да, это понятно. Но ты же говоришь "наследоваться от Control'а" - я именно этот момент хотел прояснить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 16:37 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, Ну контрол должен содержать в себе Canvas и ScrollViewer, как и ItemsControl. Можно и ItemsControl использовать, если вершин может быть несколько. Как TreeView. Я бы сильно не замарачивался с PanelTemplate'ами и просто сделал Canvas в качестве TemplateParts ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 17:09 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
То есть вызвать UIElement.Measure() вне панели будет нормально? То есть я внутри контрола динамически создаю ContentPresenter, присваиваю ему Content, потом запрашиваю Measure() и имею размеры для дальнейшей работы, так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 17:15 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
ItemsControl использует ItemsPresenter. Если ItemsPresenter не использовать, то и ItemsControl не нужен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 17:21 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Shocker.Proзапрашиваю Measure() и имею размеры для дальнейшей работы В Measure() передается максимально возможный размер, контрол возвращает желаемый (читай минимальный) размер. Потом в Arrange передается действительный размер и положение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 17:24 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
refregВ Measure() передается максимально возможный размер, контрол возвращает желаемый (читай минимальный) размер. Потом в Arrange передается действительный размер и положениеЯ знаю как работает двухпроходная компоновка. Я спрашиваю, нормально ли это использовать вне панели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 17:26 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Shocker.ProrefregВ Measure() передается максимально возможный размер, контрол возвращает желаемый (читай минимальный) размер. Потом в Arrange передается действительный размер и положениеЯ знаю как работает двухпроходная компоновка. Я спрашиваю, нормально ли это использовать вне панели.Я не вижу препятствий для вызова Measure(), или, сори, не понял вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 18:52 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
refregЯ не вижу препятствий для вызова Measure(), или, сори, не понял вопроса.ну ок, я просто не встречал применения вне панели, вдруг есть нюансы. Roman Mejtes И еще вопрос - как проще вычислить абсолютные координаты (для Canvas-а) точки привязки начала стрелки? Навскидку - я закладываю точки в шаблон блока в виде, к примеру, бордера со специфическим именем или тэгом или еще как-то. Они там где-то выстраиваются с помощью выравниваний и пр. в нужных местах. Дальше, после расстановки блоков я ищу точки с помощью LogicalTreeHelper.FindLogicalNode или GetChildren. Дальше вычисляю относительную позицию с помощью Код: c# 1. Так? Или можно проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 19:03 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, у Вас получилось разобраться с вопросом? Просто самому интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 09:41 |
|
||
|
WPF: Нарисовать блок-схему - подход
|
|||
|---|---|---|---|
|
#18+
Ну в итоге я сделал как изначально планировал. Все нужные VM блоков и VM стрелочек закидываются в List<object>. В представлении для отображения используется ItemsControl, в котором используется кастомная панель. Сама панель получает доступ к визуальным элементам и через них - к необходимым свойствам VM блоков и стрелок. Зная размеры блоков и данные из моделей блоков, панель расставляет всё в нужных местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 16:25 |
|
||
|
|

start [/forum/topic.php?fid=21&msg=39641554&tid=1440416]: |
0ms |
get settings: |
5ms |
get forum list: |
7ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
25ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 276ms |

| 0 / 0 |
