Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
73
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

3. Модификация приложения Windows Foundation Presentation: добавление ресурсов

Для начала добавим все необходимые ресурсы, ими станут картинки планет.

Выделим в обозревателе решений название проекта ( ), нажнём на нём правую кнопку мыши и далее во всплывающем меню выберем Добавить -> Создать папку:

Рис. 3. 1. Создание новой директории для файлов внутри проекта

Теперь введём Planets в названии и получим новую директорию в обозревателе решений:

Теперь добавим в эту директорию изображения планет. Выполним для иконки проекта в обозревателе решений Добавить -> Существующий элемент… или в верхнем меню Проект -> Существующий элемент… (Shift+Alt+A) для всех следующих изображений:

Солнце (Sun.jpg):

Меркурий (Mercury.gif):

Венера (Venus.gif):

Земля (Earth.gif):

Марс (Mars.gif):

Юпитер (Jupiter.gif):

Сатурн (Saturn.gif):

Уран (Uranus.gif):

Нептун (Neptune.gif):

Плутон (Pluto.gif):

Получим список изображений в обозревателе решений:

4. Модификация приложения Windows Foundation Presentation: добавление исходного кода

Добавим новый класс для работы с будущим элементом управления. Для начала поработаем с ресурсами изображений. Добавим новый файл класса C# с коллекцией элементов с именем SolarSystem.cs:

Исходный код добавленного файла изначально такой:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace NewListBox.Planets

{

class SolarSystem

{

}

}

Модифицируем файл следующим образом:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections.ObjectModel;

namespace NewListBox

{

public class SolarSystem

{

// объявление коллекции динамических данных ObservableCollection<SolarSystemObject> и заполнение коллекции элементами

private ObservableCollection<SolarSystemObject> solarSystemObjects;

public ObservableCollection<SolarSystemObject> SolarSystemObjects // Свойство для работы с коллекцией элементов

{

get { return solarSystemObjects; }

}

public SolarSystem()

{

this.solarSystemObjects = new ObservableCollection<SolarSystemObject>();

/* Добавляем новые объекты типа SolarSystemObject(Название, число: удаление от солнца [а. е.], число: средний диаметр [км], ссылка на изображение внутри проекта, описание) */

this.solarSystemObjects.Add(new SolarSystemObject("Солнце", 0, 1380000, new Uri(@"Planets\Sun.jpg", UriKind.Relative), "Со́лнце — единственная звезда Солнечной системы, вокруг которой обращаются другие объекты этой системы: планеты и их спутники, карликовые планеты и их спутники, астероиды, метеороиды, кометы и космическая пыль."));

this.solarSystemObjects.Add(new SolarSystemObject("Меркурий", 0.38, 4880, new Uri(@"Planets\Mercury.gif", UriKind.Relative), "Мерку́рий — самая близкая к Солнцу планета Солнечной системы, обращающаяся вокруг Солнца за 88 земных суток."));

this.solarSystemObjects.Add(new SolarSystemObject("Венера", 0.72, 12103.6, new Uri(@"Planets\Venus.gif", UriKind.Relative), "Вене́ра — вторая внутренняя планета Солнечной системы с периодом обращения в 224,7 земных суток. Планета получила своё название в честь Венеры, богини любви из римского пантеона. Венера — третий по яркости объект на небе Земли после Солнца и Луны и достигает видимой звёздной величины в −4,6."));

this.solarSystemObjects.Add(new SolarSystemObject("Земля", 1, 12756.3, new Uri(@"Planets\Earth.gif", UriKind.Relative), "Земля́ — третья от Солнца планета Солнечной системы, крупнейшая по диаметру, массе и плотности среди планет земной группы. Наша родная планета."));

this.solarSystemObjects.Add(new SolarSystemObject("Марс", 1.52, 6794, new Uri(@"Planets\Mars.gif", UriKind.Relative), "Марс — четвёртая по удалённости от Солнца и седьмая по размерам планета Солнечной системы; масса планеты составляет 10,7 % массы Земли."));

this.solarSystemObjects.Add(new SolarSystemObject("Юпитер", 5.20, 142984, new Uri(@"Planets\Jupiter.gif", UriKind.Relative), "Юпи́тер — пятая планета от Солнца, крупнейшая в Солнечной системе. Наряду с Сатурном, Ураном и Нептуном Юпитер классифицируется как газовый гигант. Планета была известна людям с глубокой древности, что нашло своё отражение в мифологии и религиозных верованиях различных культур: месопотамской, вавилонской, греческой и других. Современное название Юпитера происходит от имени древнеримского верховного бога-громовержца."));

this.solarSystemObjects.Add(new SolarSystemObject("Сатурн", 9.54, 120536, new Uri(@"Planets\Saturn.gif", UriKind.Relative), "Сату́рн — шестая планета от Солнца и вторая по размерам планета в Солнечной системе после Юпитера. Сатурн, а также Юпитер, Уран и Нептун, классифицируются как газовые гиганты. Сатурн назван в честь римского бога земледелия."));

this.solarSystemObjects.Add(new SolarSystemObject("Уран", 19.218, 51118, new Uri(@"Planets\Uranus.gif", UriKind.Relative), "Ура́н — седьмая по удалённости от Солнца, третья по диаметру и четвёртая по массе планета Солнечной системы. Была открыта в 1781 году английским астрономом Уильямом Гершелем и названа в честь греческого бога неба Урана, отца Кроноса (в римской мифологии Сатурна) и, соответственно, деда Зевса."));

this.solarSystemObjects.Add(new SolarSystemObject("Нептун", 30.06, 49532, new Uri(@"Planets\Neptune.gif", UriKind.Relative), "Непту́н — восьмая и самая дальняя планета Солнечной системы. Нептун также является четвёртой по диаметру и третьей по массе планетой. Масса Нептуна в 17,2 раза, а диаметр экватора в 3,9 раза больше таковых у Земли. Планета была названа в честь римского бога морей."));

this.solarSystemObjects.Add(new SolarSystemObject("Плутон", 39.5, 2274, new Uri(@"Planets\Pluto.gif", UriKind.Relative), "Плуто́н (134340 Pluto) — крупнейшая по размерам, наряду с Эридой, карликовая планета Солнечной системы, транснептуновый объект (ТНО) и девятое/десятое по величине небесное тело, обращающееся вокруг Солнца. Первоначально Плутон классифицировался как планета, однако сейчас он считается одним из крупнейших объектов (возможно, самым крупным) в поясе Койпера."));

}

}

}

Теперь, добавим сам класс, обеспечивающий обработку и получение данных из коллекции элементов. Создаём новый класс с именем SolarSystemObject.cs:

Исходный код сделаем таким:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace NewListBox

{

public class SolarSystemObject

{

// Название планеты

private string name;

public string Name

{

get { return name; }

set { name = value; }

}

// Орбита, в астрономических единицах (а. е)

private double orbit;

public double Orbit

{

get { return orbit; }

set { orbit = value; }

}

// Средний диаметр, в км

private double diameter;

public double Diameter

{

get { return diameter; }

set { diameter = value; }

}

// Относительная ссылка на изображение

private Uri image;

public Uri Image

{

get { return image; }

set { image = value; }

}

// Описание

private string details;

public string Details

{

get { return details; }

set { details = value; }

}

// Метод для работы с коллекцией элементов

public SolarSystemObject(string name, double orbit, double diameter, Uri image, string details)

{

this.name = name;

this.orbit = orbit;

this.diameter = diameter;

this.image = image;

this.details = details;

}

// Вместо new использован virtual-override

public override string ToString()

{

return this.name;

}

}

}

Немного о ключевом слове override в самом конце кода:

Рис. 4. 1. Разница между new и override (наследование и переопределение методов)

При использовании new метод класса Foo не перекрывает реализацию базового класса, а подменяет её своей (прячет её). Поэтому когда мы сохраняем переменную типа в переменной базового типа от класса Bar, мы не получим вызова override метода из класса Foo , так как не переопределяется, а подменяется метод используя new. При использовании virtual-override происходит виртуальный вызов и будет вызван переопределённый (overriden) метод из класса Bar.

Добавим последний необходимый класс для обработки положения окружностей орбит в элементе управления. Назовём его ConvertOrbit.cs:

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Data;

using System.Globalization;

namespace NewListBox

{

public class ConvertOrbit : IValueConverter

{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

{

double orbit = (double)value;

double factor = System.Convert.ToDouble(parameter, culture.NumberFormat); // Получаем форматирование для единиц измерения (зависит от настроек операционной системы по умолчанию, а именно от региона и региональных стандартов), parameter - получаем извне

return Math.Pow(orbit / 40, 0.4) * 700 * factor; // Возводим выражение за запятой в степень 0.4, необходимо для определения положения в элементе управления в пикселях? определяет значения для положения по X и Y, 700 - размер окна, factor - получаем извне (parameter)

}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

{

throw new NotSupportedException("Этот метод не должен быть вызван");

}

}

}