Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Вопросы к защите лабораторной работы №4




1. Особенности платформы WPF.

2. Ключевые компоненты архитектуры WPF и их назначение.

3. Преимущества DirectХ по сравнению к GDI.

4. Назначение контейнеров в WPF.

5. Виды панелей в WPF.

6. Отображение графических примитивов.

7. Управление прозрачностью элементов.

8. Назначение элемента Viewbox.

9. Применение маски непрозрачности.



Лабораторная работа №5

Тема: Разработка приложения на языке программирования C# с помощью платформы WPF для работы с файловой системой.

Цель: Освоить основные методы разработки приложений на основе платформы WPF, научиться обрабатывать сообщения от элементов управления (кнопки, окна редактирования, переключатели…) и работать с элементами файловой системы.

Теоретические сведения

Элементы управления списками

ListBox

Представляет собой обычный список. Содержит коллекцию элементов ListBoxItem, которые являются типичными элементами управления содержимым. Также ListBox может содержать любые другие элементы, например:

<ListBox Name="phonesList"> <TextBlock FontWeight="Bold" TextDecorations="Underline" Text="Новинки 2015 года" /> <ListBoxItem Background="LightGray">LG Nexus 5X</ListBoxItem> <ListBoxItem>Huawei Nexus 6P</ListBoxItem> <ListBoxItem Background="LightGray">iPhone 6S</ListBoxItem> <ListBoxItem>iPhone 6S Plus</ListBoxItem> <ListBoxItem Background="LightGray">Аsus Zenphone 2</ListBoxItem> <ListBoxItem>Microsoft Lumia 950</ListBoxItem> </ListBox>

Все эти элементы будут находиться в коллекции phonesList.Items и, таким образом, по счетчику можно к ним обращаться, например, phonesList.Items[0] - первый элемент ListBox, который в данном случае представляет TextBlock. Также мы можем установить элемент: phonesList.Items[2]="LG G 4";

Добавление в  ListВох выполняется с помощью phonesList.Items.Add().Обрабатывая событие SelectionChanged, мы можем динамически получать выделенный элемент.

TreeView

 Данный элемент управления предназначен для древовидного отображения данных в окне приложения. Может содержать как коллекцию элементов TreeViewItem, так и другое содержимое, например, текстовые блоки.

 

Однако все же лучше обертывать элементы в объекты TreeViewItem. С помощью его свойства Header мы можем установить текстовую метку или заголовок узла дерева.

 

 

Программное добавление узлов в TreeView:

TreeViewItem dirNode = new TreeViewItem();// создание узла

            dirNode.Tag = “доп. информация”;// поле для доп. информации (не обяз.)

            dirNode.Header =”название узла”;

            driveNode.Items.Add(dirNode);// добавление узла в дерево driveNode

В поле Tag при формировании дерева каталогов можно хранить информацию любого типа, например, чтобы иметь всю информацию о папке, можно писать туда тип DirectoryInfo.

Чтобы отследить выбор или раскрытие узла, мы можем обработать соответствующие события. Событие Expanded возникает при раскрытии узла, а событие Collapsed, наоборот, при его сворачивании.

Выбор узла дерева мы можем обработать с помощью обработки события Selected.

<TreeView>

<TreeViewItem Header="C-языки" Expanded="TreeViewItem_Expanded">

<TreeViewItem Header="C#" Selected="TreeViewItem_Selected" />

<TreeViewItem Header="C/C++" Selected="TreeViewItem_Selected" />

<TreeViewItem Header="Java" Selected="TreeViewItem_Selected" />

</TreeViewItem>

</TreeView>

Теперь добавим в файл связанного кода C# обработчики для этих событий:

private void TreeViewItem_Expanded(object sender, RoutedEventArgs e)

{

TreeViewItem tvItem = (TreeViewItem)sender;

// или TreeViewItem tvItem = (TreeViewItem)e.OriginalSource;

MessageBox.Show("Узел " + tvItem.Header.ToString() + " раскрыт");

}

 

private void TreeViewItem_Selected(object sender, RoutedEventArgs e)

{

TreeViewItem tvItem = (TreeViewItem)sender;

MessageBox.Show("Выбран узел: " + tvItem.Header.ToString());

}

ListView

Этот элемент управления отображает информацию на множестве строк и столбцов. Он унаследован от класса ListBox, поэтому может вести себя как простой список:

<ListView>

<TextBlock>LG Nexus 5X</TextBlock>

<TextBlock>Huawei Nexus 6P</TextBlock>

<TextBlock>iPhone 6S</TextBlock>

<TextBlock>iPhone 6S Plus</TextBlock>

<TextBlock>Аsus Zenphone 2</TextBlock>

<TextBlock>Microsoft Lumia 950</TextBlock>

</ListView>

Добавление в такой простой ListView выполняется  с помощью ListView.Items.Add().

Но чтобы создать более сложные по структуре данные (несколько столбцов) один из вариантов сделать следующим образом:

1) описать класс, содержащий свойства, соответствующие столбцам таблицы;

2) Сгенерировать список, элементами которого являются объекты описанного выше класса;

3) Задать этот список в свойство ItemsSource элемента ListView;

4) определить свойство Viewэлемента ListView.  Это свойство принимает в качестве значения объект DataView, который управляет отображением данных. DataView определяет коллекцию определений столбцов - GridViewColumn, которое с помощью свойства Header определяет название столбца, а с помощью свойства DisplayMemberBinding можно определить привязку столбца к определенному свойству добавляемого в ListView объекта.

Добавлять новый элемент надо не напрямую в ListView, а в коллекцию, к которой идет привязка, а затем уже обновить ListView. Можно сделать по-другому: использовать коллекцию ObservableCollection. Она по функциональности похожа на список List за тем исключением, что позволяет известить внешние объекты о том, что коллекция была изменена. Таким образом формирование ListView будет иметь вид:

код разметки:

<ListView Name="listview1">

 <ListView.View>

<GridView>

<GridViewColumn Header="name" DisplayMemberBinding="{Binding Path=name}"/>

<GridViewColumn Header="time" DisplayMemberBinding="{Binding Path=time}"/>

</GridView>

 </ListView.View>

</ListView>

код:

public class info

{

public string name { get; set; }

public string time { get; set; }

   public info(string n, string t)

{

     name = n; time = t;

}

}

public partial class MainWindow : Window

{

 

   public List<info> listview;

   public ObservableCollection<info> _someInfos;

   public MainWindow()

   {

       InitializeComponent();

        _someInfos = new ObservableCollection<info>();

       listview1.ItemsSource = _someInfos;

   }

    …

// когда выбрали узел в дереве (каталог), в listview отображаем имя и дату создания //файлов этого каталога

private void treeview1_Selected(object sender, RoutedEventArgs e)

   {

       TreeViewItem t = (TreeViewItem)e.OriginalSource;

        DirectoryInfo d = (DirectoryInfo)(t.Tag);

        var f = d.GetFileSystemInfos();// получаем список файлов

         _someInfos.Clear();

         foreach (FileSystemInfo current in f)

         {// добавляем в коллекцию. Одновременно будет обновляться listview

          _someInfos.Add(new info(current.Name, current.CreationTime.ToShortDateString())); 

         }

      }

Обрабатывая событие SelectionChanged, мы можем динамически получать выделенный элемент.

ComboBox

ComboBox содержит коллекцию элементов и образует выпадающий список:

 

 <ComboBox Name="phonesList" Height="30" VerticalAlignment="Top">

<TextBlock>LG Nexus 5X</TextBlock>

<TextBlock>Huawai Nexus 6P</TextBlock>

<TextBlock>iPhone 6S</TextBlock>

<TextBlock>iPhone 6S Plus</TextBlock>

<TextBlock>Microsoft Lumia 950</TextBlock>

</ComboBox>

Программное заполнение выполняется методом

                       combobox1.Items.Add(“Name”);

Свойство SelectedIndex позволяет считывать или устанавливать выделенный элемент списка:

      combobox1.SelectedIndex = 0;

Обрабатывая событие SelectionChanged, мы можем динамически получать выделенный элемент:

<ComboBox Height="25" SelectionChanged="ComboBox_Selected"> <!-- остальное содержимое списка--> </ComboBox>

Обработка события в коде C#:

private void ComboBox_Selected(object sender, RoutedEventArgs e) { ComboBox comboBox = (ComboBox)sender; ComboBoxItem selectedItem = (ComboBoxItem)comboBox.SelectedItem; MessageBox.Show(selectedItem.Content.ToString()); }

 

Управление каталогами

В пространстве имен System.IO есть четыре класса, предназначенные для работы с физическими файлами и структурой каталогов на диске: Directory, File, DirectoryInfo и FileInfo. С их помощью можно выполнять создание, удаление, перемещение файлов и каталогов, а также получение их свойств. Основные элементы этих классов представлены в таблицах 5.1 и 5.2.

Таблица 5.1 - Свойства класса FileSystemInfo

Свойства      Описание

Attributes  Получить или установить атрибуты для данного объекта файловой

                      системы. Для этого свойства используется значение FileAttributes

CreationTime Получить или установить время создания объекта файловой системы

Exists         Определить, существует ли данный объект файловой системы

Extension   Получить расширение файла

FullName   Возвратить имя файла или каталога с указанием полного пути

LastAccessTime Получить или установить время последнего обращения к объекту

LastWriteTime Получить или установить время последнего внесения изменений в объект

Name            Возвратить имя файла. Это свойство доступно только для чтения.

            Для каталогов возвращает имя последнего каталога в иерархии, если

            это возможно. Если нет, возвращает полностью определенное имя

Таблица 5.2 - Элементы класса DirectoryInfo

Элемент        Описание

Create,                      Создать каталог или подкаталог по указанному пути в файловой системе

CreateSubDirectory  

Delete                    Удалить каталог со всем его содержимым

GetDirectories                   Возвратить массив строк, представляющих все подкаталоги

GetFiles                 Получить файлы в текущем каталоге в виде массива объектов

класса FileInfo

MoveTo                 Переместить каталог и все его содержимое на новый адрес в ФС

Parent                    Возвратить родительский каталог

 

Пример работы с файлами и каталогами с использованием класса Directory

В данном примере создаются два каталога, выводится информация о них и предпринимается попытка удаления каталога.

using System;

using System.IO;

namespace ConsoleApplication1

{

class Class1

{

   static void DirInfo(DirectoryInfo di)

   {

       //вывод информации о каталоге

       Console.WriteLine("=====Directory Info=====");

       Console.WriteLine("FullName:" + di.FullName);

       Console.WriteLine("Name:" + di.Name);

       Console.WriteLine("Parent:" + di.Parent);

       Console.WriteLine("Creation:" + di.CreationTime);

       Console.WriteLine("Attributes:" + di.Attributes);

       Console.WriteLine("Root:" + di.Root);

       Console.WriteLine("==========================");

   }

   static void Main()

   {

       DirectoryInfo di1 = new DirectoryInfo(@"с:\MyDir");

       DirectoryInfo di2 = new DirectoryInfo(@"c:\MyDir\temp");

       try

       {

           //Создать каталоги

           di1.Create();

           di2.Create();

           //Вывести информацию о каталогах

           DirInfo(di1);

           DirInfo(di2);

           //Попытаться удалить каталог

           Console.WriteLine("Попытка удалить {0}.", di1.Name);

           di1.Delete();

          }

       catch (Exception)

       {

           Console.WriteLine("Попытка не удалась");

       }   } }  

* Результат работы программы

* =====Directory Info=====

* FullName: c:\MyDir

* Name: MyDir

* Parent:

* Creation: 30.04.2006 17:14:44

* Attributes: Directory

* Root: c:\

* ========================

* =====Directory Info=====

* FullName: c:\MyDir\temp

* Name: temp

* Parent:

* Creation: 30.04.2006 17:14:44

* Attributes: Directory

* Root: c:\

* ========================

* Попытка удалить MyDir

* Попытка не удалась

Каталог не пуст, поэтому попытка его удаления не удалась. Однако, если использовать метод Delete с одним параметром, задающим режим удаления, можно удалить и непустой каталог:

di1.Delete( true );                //удаляет непустой каталог

Пример работы с файлами и каталогами с использованием класса FileInfo

В данном примере копируются все файлы с расширением jpg из каталога d:\foto в каталог d:\temp. Метод Exists позволяет проверить, существует ли исходный каталог.

using System;

using System.IO;

namespace ConsoleApplication1

{

class Class1

{

   static void Main()

   {

       try

       {           string DestName = @"d:\temp\";

           DirectoryInfo dest = new DirectoryInfo(DestName);

           dest.Create(); //создание целевого каталога

           DirectoryInfo dir = new DirectoryInfo(@"d:\foto");

           if (!dir.Exists) //проверка существования каталога

           {

               Console.WriteLine("Каталог " +

                                  dir.Name + " не существует");

               Console.ReadKey();

               return;

           }

           FileInfo[] files = dir.GetFiles("*.jpg"); //список файлов

           foreach (FileInfo f in files)

               f.CopyTo(dest + f.Name); //копирование файла

           Console.WriteLine("Скопировано" + files.Length + "jpg-файлов");

       }

       catch (Exception e)       {           Console.WriteLine("Error:" + e.Message);      }              } } }

 

В библиотеке классов Microsoft .NET Framework предусмотрено мощное средство работы с каталогами — класс Directory. С помощью статических методов этого класса программа может выполнять такие действия, как получение списка логических дисков, определение текущего каталога, просмотр содержимого каталогов, создание и удаление каталогов, проверка их существования и пр.

Получить список всех логических дисков, имеющихся в системе, можно статическим методом Directory. GetLogicalDrives:

String[ ] drives = Directory.GetLogicalDrives();

foreach(string s in drives) Console.Write{"{0} ", s);

Этот метод не имеет параметров. После выполнения он возвращает ссылку на массив текстовых строк вида «С: \» с обозначениями всех доступных логических дисковых устройств.

Определение полного пути к текущему каталогу

string currentDir = Directory.GetCurrentDirectory();

Метод возвращает этот путь в виде текстовой строки класса string.

Определение диска, на котором находится любой каталог. В качестве параметра передается путь к нужному каталогу:

string directoryRoot = Directory.GetDirectoryRoot(currentDir);










Последнее изменение этой страницы: 2018-04-12; просмотров: 328.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...