|
Модератор
|
||||||||||||||||||||||||||||||||||||
Пример создания приложения для тестирования [WPF, Элд Хасп]13.06.2019, 22:43. Показов 28020. Ответов 24
Метки нет (Все метки)
Тема из цикла Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
Пример практической реализации приложения для тестирования по мотивам темы Где можно глянуть примеры создания теста? от ahtik95. 1) Создание XML структуры Сначала создал XML для хранения теста Test.xml
<Test/>Тест имеет тег для названия <NameTest/> и тег для вопросов теста <Questions/>.В теге <Questions/> содержится список тегов <Question/> для информации об одном вопросе.Атрибут IsOnlyOne обозначает тип вопроса: true - только с одним правильным ответом, false - с разным количеством правильных ответов.Тег <Answers/> содержит список вариантов ответов.Вариант ответа содержится в теге <Answer/>. Атрибут ответа IsRight обозначает правильный или ложный ответ. Значение тега - текст ответа.2) Классы для десериализации XML По этой XML структуре через конструктор VS (Меню -> Правка -> Специальная вставка -> Вставить XML как классы) были созданы классы для десериализации этого XML. Полученные классы после "косметической" доводки
Модель очень простая. В конструкторе происходит десериализация XML и проверка на ошибки. Два свойства: одно - для хранения теста, второе - для названия файла из которого был загружен тест.
Использую в самых простых реализациях
5
|
||||||||||||||||||||||||||||||||||||
| 13.06.2019, 22:43 | |
|
Ответы с готовыми решениями:
24
Пример создания приложения "Работа с комнатами в студенческих общежитиях" [WPF, SQLite, Элд Хасп] WPF vs WinForms (для начинающих) [Элд Хасп] WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп] |
|
Модератор
|
||||||||||||||||||||||||||||||||||||||||||||||
| 13.06.2019, 23:26 [ТС] | ||||||||||||||||||||||||||||||||||||||||||||||
|
5) Классы теста для ViewModel
Тест полученный после десериализации неудобен и неполон для View. Поэтому создал классы в которые будут конвертироваться классы Модели. Эти классы созданы как контейнеры для классов Модели - в конструкторе они получают класс Модели и сохраняют ссылку на него. Значения своих свойств получают от значений свойств класса Модели. Класс ответа на вопрос имеет свойства:
Для вопроса в ViewModel создал базовый класс QuestionVM. В конструкторе рандомно перемешиваются варианты ответов. Так же класс (по сравнению с классом для Модели) дополнен свойством Value возвращающим True если все варианты ответов отмечены или не отмечены верно.
Их отличие от базового только в том, что в базовом свойство IsOnleOne может иметь любое значение, в QuestionRadioButtonVM - True, в QuestionCheckBoxVM -False.
Для контента VM создал базовый класс с одной командой для перехода к следующему контенту
У него есть:
ViewModel создаёт Модель. Получает от неё тест и сохраняет его в приватном поле Test. У ViewModel два свойства: TestView - возвращает тест в типах VM с рандомно перемешанными вопросами и ответами и Content - для текущего контента VM.Также в VM три приватных метода для изменения контента. Делегаты на них передаются при изменении контента в соответствующий тип контента.
4
|
||||||||||||||||||||||||||||||||||||||||||||||
|
Модератор
|
|||||||||||||||||||||
| 13.06.2019, 23:45 [ТС] | |||||||||||||||||||||
|
8) UserControl'ы для отображения различного контента
Для отображения типов TitleContent и TotalContent используются очень простые UC в каждом по одной кнопке для перехода к следующему контенту и одному TextBlock заключённому в ViewBox для вывода информации.
QuestionsContent используется уже более сложный UC. В нём три кнопки: для перехода к контенту итогов теста, для перехода к следующему вопросу и для перехода к предыдущему вопросу.Верху UC TextBlock выводит текст вопроса. Под ним находится ContentControl у которого свойство Content привязано к текущему вопросу. В ресурсах ContentControl прописано два шаблона данных для разного типа вопросов. Для QuestionRadioButtonVM выводится список RadioButton, для QuestionCheckBoxVM - CheckBox.
View очень простая. Создаёт в Window.DataContext экземпляр ViewModel. В Grid единственный элемент ContentPresenter с тремя шаблонами данных для типов TitleContent, QuestionsContent и TotalContent.
5
|
|||||||||||||||||||||
|
Модератор
|
|||||||||||
| 14.06.2019, 09:26 [ТС] | |||||||||||
|
10) Как создавалось приложение
Рекомендуемый порядок создания MVVM приложения Model, View, ViewModel. В данном случае тема изложена в несколько ином порядке Model, ViewModel, View. Но это только изложение, так как на мой взгляд, так понятнее описываются связи в приложении. Для разъяснения решил написать как же это приложение создавалось. Создание приложения началось с его проектирования и формирования ТЗ самого приложения и каждой из частей приложения. ТЗ приложения:
Исходя из общего ТЗ были сформированы ТЗ к частям приложения. ТЗ Модели:
Создание Модели
Создание View При правильном подходе надо было создать интерфейсы для всех типов ViewModel, потом контекст данных времени разработки (Я обычно это делаю в виде Модели Представления Времени Разработки - VMDD). Заполнить в XAML этот контекст данных и по нему создавать View. Но в данном случае, так как функционал очень простой, я использовал другой подход. Создал все нужные типы ViewModel со свойствами-"заглушками", то есть свойства выводили заранее заданные значения. Допустим, для типа предназначенного для отображения итогов теста был создан такой код
Эти типы облегчили создание типов View в конструкторе VS. По мере создания и отладки типов View вносились необходимые изменения в типы VM. Допустим все свойства предназначенные для отображения были дополнены поддержкой INPC, добавлены сеттеры для нужных свойств, методы команд. Создание ViewModel К концу создания View у всех типов VM сторона обращённая к View тоже уже была полностью создана. То есть фактически это была создана VMDD, просто, вместо наследования от неё VM, я продолжил добавлять функционал для связи с Моделью в эти же типы. Для связи типов VM с типами Модели я выбрал принцип контейнера. Это когда экземпляр типа Модели сохраняется внутри экземпляра типа VM и свойства VM не сами хранят свои значения, а обмениваются этими значениями с сохранённым экземпляром типа Модели. В данном случае, так как типы Модели неизменяемы, то свойства VM просто ссылаются на свойства Модели через оператор => там где их надо предоставить для отображения.Или просто получают значение, если это нужно для какого-то внутреннего функционала. Пример строка public bool Value => IsRightView == TestAnswer.IsRight; из типа AnswerVM.На этом вроде всё. Объяснил подробно насколько смог.
5
|
|||||||||||
|
78 / 67 / 13
Регистрация: 04.10.2018
Сообщений: 330
|
||||||
| 11.11.2019, 18:05 | ||||||
|
Элд Хасп, Добрый вечер. Подскажите как вы реализовали, где три ответа получается три RadioButton, где два то два?
Начал изучать ваш пример. Для практики очень хорош! Я делаю свою реализацию. И столкнулся с проблемами. 1) У меня RadioButton, при переходе на новый вопрос не сбрасывается "нажатый". 2) Если было четыре вопроса, а на следующем вопросе три то четвертый остается видимым но без текста. 3) Я ещё не придумал как правильно сохранять выбранный вопрос. 4) Переход на DownEnd Вопросов много. Но ваш пример очень помогает. В моем понимании все кроется здесь?
0
|
||||||
| 11.11.2019, 21:13 [ТС] | |||||||
0
|
|||||||
|
5 / 5 / 0
Регистрация: 12.08.2015
Сообщений: 340
|
|
| 23.07.2020, 14:22 | |
|
0
|
|
|
5 / 5 / 0
Регистрация: 12.08.2015
Сообщений: 340
|
|
| 23.07.2020, 15:18 | |
|
Элд Хасп, проделал все шаги, но проблема в том, что у меня такого пункта меню в принципе нет...
0
|
|
|
Модератор
|
|||
| 23.07.2020, 18:35 [ТС] | |||
|
Версия Студии какая? Добавлено через 2 минуты Прочитайте https://stackoverflow.com/ques... s-installe
2
|
|||
|
5 / 5 / 0
Регистрация: 12.08.2015
Сообщений: 340
|
|
| 24.07.2020, 13:53 | |
|
А в чем принципиальная разница использования ContentControl и ContentPresenter? Получается это взаимозаменяемые контролы?
P.S. Элд Хасп, в вашем примере ContentControl используется в QuestionsUC, а ContentPresenter - в MainWindow.
0
|
|
|
Модератор
|
|||
| 24.07.2020, 14:22 [ТС] | |||
|
Окно (Window) тоже производный от ContentControl класс. ContentPresenter более "лёгкий", но некоторые функции требуют ContentControl. Я часто "на автомате" вставляю ContentPresenter, но если он начинает как-то не так работать, заменяю его на ContentControl. По какой причине использовал в QuestionsUC именно ContentControl сейчас не помню. Посмотрите тему пост в теме Создание приложения "Штатное Расписание" в паттерне MVVM [WPF, Элд Хасп] Мне там после начала отладки тоже пришлось заменить ContentPresenter на ContentControl.
1
|
|||
|
0 / 0 / 0
Регистрация: 01.10.2019
Сообщений: 8
|
|
| 17.05.2021, 13:00 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 13
|
|
| 22.05.2021, 18:53 | |
|
Элд Хасп, А что нужно изменить для реализации несколько разных тестов в приложении? Заранее спасибо.
0
|
|
|
Модератор
|
||
| 22.05.2021, 21:01 [ТС] | ||
|
Или в БД добавить таблицу тестов, а в вопросы Id теста к котором он относится. В разделе есть пара тем, для нескольких тестов. Добавлено через 39 секунд Вот один из аналогов Заполнение вкладок TabItem данными из БД WPF Добавлено через 1 минуту Вот ещё Создания приложения для тестирования с заполнением тестов в БД
0
|
||
|
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 13
|
|
| 31.05.2021, 04:38 | |
|
А если мне нужно сохранить количество правильных ответов в конце теста допустим в переменную как реализовать? Заранее спасибо.
0
|
|
|
Модератор
|
||
| 31.05.2021, 08:09 [ТС] | ||
|
Количество правильных вопросов и правильных ответов находится в свойствах TotalContent. Вы можете добавить туда команду и/или метод сохраняющий их куда вам надо. Команду можно вызывать из кнопки добавленной на соответствующую страницу, команду и метод можно вызывать при загрузке страницы. Добавлено через 1 минуту ocbsmokingraw, если у вас есть трудности с реализацией, советую создавть свою теиу, показать в ней, что у вас получилось сделать самостоятельно, объяснить что хотелось реализовать, но не получилось. Тогда можно будет дать более детальные ответы, рекомендации.
0
|
||
|
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 35
|
|
| 18.04.2022, 16:08 | |
|
Здравствуйте,Элд Хасп. Делаю приложение по вашему примеру со своими дополнениями. Мне нужно реализовать список окон и переходы между ними, как на картинке ниже. Стоит ли делать одну главную View, а остальные реализовывать через user control'ы и потом также их отображать на главном View через <ContentControl/>? Или всё сделать именно окнами?
0
|
|
|
Модератор
|
||
| 18.04.2022, 17:02 [ТС] | ||
|
В WPF это реализуется на Page или UserControl. Но вам потребуется хотя бы минимальное изучение способов построения навигации в WPF/UWP. UserControl более типичен для WPF, особенно, с учётом единого основного Контекста Данных в Окне для всех страниц. Page требует задание для каждой страницы своего Контекста Навигации или в коде самой Страницы, или при навигации на неё. В описанной вами задаче оба подхода приемлемы. Добавлено через 3 минуты Bellatrix27, и насколько это "серьёзное" приложение? Если делать "по взрослому" в расчёте на многопользовательское применение, WEB сервер и т.п. - потребуется очень много труда и знаний, в том числе в областях не связанных с WPF. Добавлено через 1 минуту Или это просто курсач - надо сделать минимальный функционал для однопользовательского использования на переносимой БД?
0
|
||
| 18.04.2022, 17:02 | |
|
Помогаю со студенческими работами здесь
20
WPF конвертеры [Элд Хасп]
Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|