DevCrm 06: «Верхняя панель ушла к себе!»
Привели интерфейс в приглядный вид, сели довольные. И тут до меня дошло: верхняя панель стала неподъёмной.
Судите сами. На ней жило всё сразу: логотип «CRM Arkheonzero», строка поиска, фильтр по статусу, кнопки «Добавить» и «Обновить», а под ними — целая россыпь плоских кнопок: Дашборд, Excel, ДР, Email, Telegram, PDF, Backup. И ещё правая часть — «Войти», «Выйти», имя текущего пользователя.
Всё это — в одном Border, в одном StackPanel, прямо в MainWindow.xaml. И самое неприятное: панель не просто занимала место на экране, она занимала место в коде. Открываешь MainWindow.xaml — и первым делом утыкаешься в простыню разметки, а до формы клиентов надо ещё доскроллить.
Я открыл этот файл и честно признался: тут уже не разберёшься. Не потому что я плохо писал, а потому что панель переросла своё место.
Знаете это чувство, когда в шкафу всё свалено в одну кучу? Вещи-то все нужные, но найти что-то конкретное — целое приключение. Вот с панелью было так же. Вроде бы «просто верх окна», а по факту — отдельный мир со своей логикой.
И тогда я вспомнил, как в детстве складывал конструктор: сначала всё в одну кучу, а потом — по коробочкам. Панель — это отдельная коробочка.
Так родился TopPanelView.
Решение простое, как всё гениальное: выносим верхнюю панель в отдельный UserControl. Заводим папку Views/Controls, а в ней два файла — TopPanelView.xaml и TopPanelView.xaml.cs.
В XAML переезжает вся разметка панели:
А код-бэхинд — проще некуда:
И вот главный фокус: в MainWindow вместо простыни остаётся одна строка:
Одна строка вместо, по-хорошему, полторы сотни. Плюс надо было не забыть подключить пространство имён:
Казалось бы, просто перенёс разметку из одного файла в другой. Что тут такого? А эффект — как будто разобрал захламлённый шкаф. Любо дорого смотреть. MainWindow.xaml снова читается. Открываешь — и сразу видишь структуру: панель, вкладки, формы. А панель теперь можно менять, не трогая всё остальное.
Правда, вылезли и грабли. Ожидаемые и не очень.
Первая: DataContext. UserControl по умолчанию наследует контекст от родителя, так что все привязки — SearchText, StatusFilter, команды — работают как раньше. Но стоило где-то случайно влепить свой DataContext — и привязки «отваливались». Пришлось следить, чтобы панель жила на общем контексте.
Вторая, самая подлая: фокус. У UserControl своя логика фокусировки, и клавиша Enter в строке поиска один раз перестала «проглатываться» — нажатие уходило куда-то не туда. Разбирался, пока не понял, что дело в порядке обработки клавиш внутри контрола.
Но в целом — оно того стоило. Панель ушла к себе, и впервые за долгое время MainWindow стал похож на файл, который можно открыть без страха.
А дальше меня, как обычно, понесло. Раз у нас есть отдельная панель — почему бы не завести отдельную вкладку с чатом? Но это уже следующая история.