В этой лекции будут свалены материалы, не вошедшие в другие лекции, но всплавшие при решении лабораторных работ
Всплывающие подсказки, это блок с дополнительной информацией, появляющийся при наведении курсора на объект.
Можно реализовать двумя вариантами:
Подсказка простой текст: просто добавляем атрибут ToolTip.Tip к нашему визуальному элементу
<Image
...
ToolTip.Tip="Текст подсказки"/>
В подсказке хотите показать сложную комбинацию (картинка + описание, многострочный текст): добавляем к элементу вложенный тег
<Image ...>
<ToolTip.Tip>
<StackPanel>
<TextBlock Classes="h1">
ToolTip
</TextBlock>
<TextBlock Classes="h2">
A control which pops up a hint when a control is hovered
</TextBlock>
</StackPanel>
</ToolTip.Tip>
</Image>
Естественно вместо фиксированного текста можете сделать привязку (binding) к вычисляемому свойству класса.
Задача состоит из двух подзадач:
// создание диалога и инициализация
var saveFileBox = new SaveFileDialog();
saveFileBox.Title = "Сохранить список мероприятий";
saveFileBox.InitialFileName = "events.csv";
var settingsFileName = await saveFileBox.ShowAsync(this);
// если выбор успешный, то в переменной имя целевого файла
if (settingsFileName != null) {
// тут логика по сохранению данных
}
В принципе мы это проходили на 2-м курсе
// тут копипаста из лекции
using (var writer = new StreamWriter(settingsFileName)){
var enCulture = System.Globalization.CultureInfo.GetCultureInfo("en-US");
//TODO тут вставить выбор всех мероприятий из БД и перебор в цикле
// строковое поле выводим в кавычках
// вместо фиксированных значений вставляем данные из модели
writer.WriteLine("{0},{1},\"{2}\"",
1,
// дробные числа выводим с точкой
2.0.ToString("0.00", enCulture),
"qq");
}
Компонент AutoCompleteBox выглядит как текстовое поле, но при вводе данных показывает (и позволяет выбрать) варианты из списка:
<AutoCompleteBox
Name="autoCompleteBox"
Text="{Binding #root.currentCity}"
ItemsSource="{Binding #root.cityList}" />
При сохранении смотрим что введено в autoCompleteBox.Text, если название есть в списке городов, то сразу берем его id, если нет, то сначала добавляем город в базу, потом смотрим на его id
Для ввода даты можно использовать компонент DatePicker (есть еще CalendarDatePicker, но его я не копал):
<DatePicker
Name="datePicker"
SelectedDate="{Binding #root.currentDate}"/>
Тип данных для атрибута SelectedDate: DateTimeOffset, поэтому напрямую поле БД ему скармливать нельзя.
Ниже пример для свойства класса окна
public DateTimeOffset currentDate { get; set; } = new DateTimeOffset( DateTime.Now);
вы можете при создании окна присвоить текущее значение даты этому свойству, или в вёрстке поменять на геттер currentUser.bithDayDTO. Где суффикс DTO означает, что это не оригинальное значение даты из базы, а преобразованное в DateTimeOffset. И не забыть при сохранении преобразовать обратно в дату.
Для ввода времени можно использовать компонент TimePicker (как пользоваться раскопайте сами).