Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Архитектура приложения Windows Forms на C# (N мониторов, N форм)

#c_sharp #xml #winforms #архитектура #сериализация


Пытаюсь создать приложение на C# Windows Forms, в котором есть N мониторов и N форм.

Формы делятся на два типа:
1) Главная форма (может быть только одна);
2) Дополнительная форма (максимальное количество N-1).

При запуске приложения открывается главная форма, у которой есть кнопка "Открыть",
при нажатии на которую мы можем создать дополнительную форму.

На одном мониторе может находиться только одна форма и при нажатии на кнопку "Открыть",
мы должны проверять есть ли свободные мониторы. Если есть, то помещаем новую форму
на свободный монитор, если таковых нет, то выводим сообщение об этом.

Цель приложения:
1) При закрытии, для всех форм: сохранить Width, Height, Location.X, Location.Y и
номер монитора, на котором находится форма;
2) При открытии, выгрузка сохранённых параметров, если таковые есть;
3) Осуществлять контроль свободных и занятых мониторов.



Для сохранения и выгрузки я использую класс XmlSerializer, вся информация о мониторах
есть в классе Screen. С главной формой всё работает, но трудности возникают со множеством
форм. Как лучше всего продумать иерархию классов, чтобы все данные можно было сериализовать
в один файл? Где хранить информацию (Width, Height, Location.X, Location.Y, номер монитора)
о всех формах и где отслеживать события (создание, перемещение, изменение размера)
связанные с ними? Может использовать паттерн MVC?

Надеюсь, получилось доходчиво объяснить суть вопроса. Заранее спасибо за советы,
решения, наводки.
    


Ответы

Ответ 1



Первое, что приходит в голову - создание специального класса, который будет решать задачу по управлению нужными данными для форм в том числе и их сериализацию/десереализацию. Т.е. вероятно, вам нужна некая коллекция, в которой хранятся нужные параметры каждой формы, и реализован механизм сериализации этой коллекции в этот самый один файл. Варианты разные технически могут быть (через массив, List или еще как), суть одна - имеем коллекцию в которой каждый элемент - есть набор данных по конкретной форме. Соответственно, должны быть методы, которые могут работать с этими данными (например, считывать значения из формы и устанавливать их форме), находить нужную форму, загружать в/из XML, обработчики событий.... Потому и напрашивается класс, так как нужен механизм по хранению самих данных, так и набор методов для работы с этими данными. В качестве дальнейшего развития я бы дополнительно сделал класс базовой формы, где были бы прописаны (например, в обработчиках событий) нужные действия (например, отслеживание изменений размеров и положения формы). Таким образом сама форма умела бы работать с коллекцией, и при её изменении она сама бы автоматически записывала данные в "свой" элемент коллекции. Тут же можно было бы сделать механизмы валидации, т.е. проверки, а не занят ли монитор другой формой и что делать, если занят и т.д. Естественно, тогда все остальные формы были бы унаследованы от базовой. Либо, несколько иной вариант, это вызывать методы нашего объекта по считыванию и записи информации из коллекции только тогда, когда это необходимо (запуск и завершение программы). Но тут не решается вопрос с автоматической валидацией (проверками дополнительных условий). Т.е. если мы читаем и пишем данные руками, то и вызов проверяющих методов тоже нужно делать будет руками. Более того, возможно, я бы создал еще и интерфейс, который объявлял бы все методы по работе с данными, это позволило бы делать разные и независимые друг от друга варианты реализации.

Комментариев нет:

Отправить комментарий