Модератор
|
||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||
Пример создания приложения для тестирования [WPF, Элд Хасп]13.06.2019, 22:43. Показов 26547. Ответов 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, Элд Хасп] WPF команды и MVVM. Часть 1. [WPF, Элд Хасп] |
Модератор
|
||||||||||||||||||||||||||||||||||||||||||||||
13.06.2019, 23:26 [ТС] | 2 | |||||||||||||||||||||||||||||||||||||||||||||
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 [ТС] | 3 | ||||||||||||||||||||
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 [ТС] | 4 | ||||||||||
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
Сообщений: 327
|
||||||
11.11.2019, 18:05 | 5 | |||||
Элд Хасп, Добрый вечер. Подскажите как вы реализовали, где три ответа получается три RadioButton, где два то два?
Начал изучать ваш пример. Для практики очень хорош! Я делаю свою реализацию. И столкнулся с проблемами. 1) У меня RadioButton, при переходе на новый вопрос не сбрасывается "нажатый". 2) Если было четыре вопроса, а на следующем вопросе три то четвертый остается видимым но без текста. 3) Я ещё не придумал как правильно сохранять выбранный вопрос. 4) Переход на DownEnd Вопросов много. Но ваш пример очень помогает. В моем понимании все кроется здесь?
0
|
Элд Хасп
|
||||||
11.11.2019, 21:13
[ТС]
#6
|
||||||
0
|
5 / 5 / 0
Регистрация: 12.08.2015
Сообщений: 340
|
|
23.07.2020, 14:22 | 7 |
0
|
5 / 5 / 0
Регистрация: 12.08.2015
Сообщений: 340
|
|
23.07.2020, 15:18 | 9 |
Элд Хасп, проделал все шаги, но проблема в том, что у меня такого пункта меню в принципе нет...
0
|
Модератор
|
|
23.07.2020, 18:35 [ТС] | 10 |
Может какого-то плагина не стоит....
Версия Студии какая? Добавлено через 2 минуты Прочитайте https://stackoverflow.com/ques... s-installe
2
|
5 / 5 / 0
Регистрация: 12.08.2015
Сообщений: 340
|
|
24.07.2020, 13:53 | 11 |
А в чем принципиальная разница использования ContentControl и ContentPresenter? Получается это взаимозаменяемые контролы?
P.S. Элд Хасп, в вашем примере ContentControl используется в QuestionsUC, а ContentPresenter - в MainWindow.
0
|
Модератор
|
||
24.07.2020, 14:22 [ТС] | 12 | |
Между ними есть небольшая разница как они реагируют на изменение контекста данных, и предназначении.
Окно (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 | 13 |
0
|
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 13
|
|
22.05.2021, 18:53 | 15 |
Элд Хасп, А что нужно изменить для реализации несколько разных тестов в приложении? Заранее спасибо.
0
|
Модератор
|
|
22.05.2021, 21:01 [ТС] | 16 |
Добавить в XML дерево Тестов в которое будут вложены тестов тестов из топика темы.
Или в БД добавить таблицу тестов, а в вопросы Id теста к котором он относится. В разделе есть пара тем, для нескольких тестов. Добавлено через 39 секунд Вот один из аналогов Заполнение вкладок TabItem данными из БД WPF Добавлено через 1 минуту Вот ещё Создания приложения для тестирования с заполнением тестов в БД
0
|
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 13
|
|
31.05.2021, 04:38 | 17 |
А если мне нужно сохранить количество правильных ответов в конце теста допустим в переменную как реализовать? Заранее спасибо.
0
|
Модератор
|
|
31.05.2021, 08:09 [ТС] | 18 |
А где находится эта переменная?
Количество правильных вопросов и правильных ответов находится в свойствах TotalContent. Вы можете добавить туда команду и/или метод сохраняющий их куда вам надо. Команду можно вызывать из кнопки добавленной на соответствующую страницу, команду и метод можно вызывать при загрузке страницы. Добавлено через 1 минуту ocbsmokingraw, если у вас есть трудности с реализацией, советую создавть свою теиу, показать в ней, что у вас получилось сделать самостоятельно, объяснить что хотелось реализовать, но не получилось. Тогда можно будет дать более детальные ответы, рекомендации.
0
|
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 35
|
|
18.04.2022, 16:08 | 19 |
Здравствуйте,Элд Хасп. Делаю приложение по вашему примеру со своими дополнениями. Мне нужно реализовать список окон и переходы между ними, как на картинке ниже. Стоит ли делать одну главную View, а остальные реализовывать через user control'ы и потом также их отображать на главном View через <ContentControl/>? Или всё сделать именно окнами?
0
|
Модератор
|
|
18.04.2022, 17:02 [ТС] | 20 |
В современном дизайне превалирует однооконный многостраничный GUI - это позволяет строить унифицированные (Desktop, WEB, UWP и т.д.) GUI для приложения.
В WPF это реализуется на Page или UserControl. Но вам потребуется хотя бы минимальное изучение способов построения навигации в WPF/UWP. UserControl более типичен для WPF, особенно, с учётом единого основного Контекста Данных в Окне для всех страниц. Page требует задание для каждой страницы своего Контекста Навигации или в коде самой Страницы, или при навигации на неё. В описанной вами задаче оба подхода приемлемы. Добавлено через 3 минуты Bellatrix27, и насколько это "серьёзное" приложение? Если делать "по взрослому" в расчёте на многопользовательское применение, WEB сервер и т.п. - потребуется очень много труда и знаний, в том числе в областях не связанных с WPF. Добавлено через 1 минуту Или это просто курсач - надо сделать минимальный функционал для однопользовательского использования на переносимой БД?
0
|
18.04.2022, 17:02 | |
18.04.2022, 17:02 | |
Помогаю со студенческими работами здесь
20
WPF конвертеры [Элд Хасп] INPC (INotifyPropertyChanged) и получение данных из Модели [WPF, Элд Хасп] Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп] Создания приложения для тестирования с заполнением тестов в БД Пример реализации WPF+MVVM приложения Обсуждение языка C↑ᶜC (стрелки), начатое Etyuhibosecyu и Элд Хасп Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Блоги программистов | |||||
Подброка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов.
. . .
|
С чего начать программировать микроконтроллеры
raxper 06.01.2025
Введение в мир микроконтроллеров
Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
|
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
|
Обновление сайта www.historian.by
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
|
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
|
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list):
s=^y]
p=x and y
for i in range(1,len(x)):
s. append((x^y)^p)
p=(x and y)or(p and (x or y))
return s
x=list()
y=list()
|
Это мы не проходили, это нам не задавали...(асихронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
|
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
|
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения
PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
|
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
|
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
|
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9
Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
|