Поделиться через


Пошаговое руководство. Построение простого приложения WPF с помощью конструктора WPF

Обновлен: Ноябрь 2007

В данном пошаговом руководстве показано, как построить простое приложение Windows Presentation Foundation (WPF) с помощью WPF (конструктор). 

В данном пошаговом руководстве выполняются следующие задачи.

  • Создание проекта.

  • Создание макета.

  • Добавление в макет элементов управления.

  • Задание значений свойств, относящихся к макету.

  • Создание источника данных.

  • Подключение к источнику данных.

  • Привязка свойств элемента управления.

В итоге будет создано простое приложение, позволяющее просматривать файловую систему. Пользовательский интерфейс приложения будет реализован на языке XAML. Дополнительные сведения см. в разделе Язык XAML. На следующем рисунке показано, как будет выглядеть приложение.

Просмотр дерева FolderExplorer и списка

Bb546972.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или версии среды. Чтобы изменить параметры, выберите пункт Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio.

Обязательные компоненты

Ниже перечислены компоненты, необходимые для выполнения этого пошагового руководства.

  • Visual Studio 2008.

Создание проекта

Первым этапом является создание проекта для приложения.

Создание проекта

  1. Создайте новый проект приложения WPF на языке Visual Basic или Visual C# с именем FolderExplorer. Дополнительные сведения см. в разделе Практическое руководство. Создание нового проекта приложения WPF.

    В конструкторе WPF (конструктор) откроется файл Window1.xaml.

  2. В представлении конструктора выберите окно. Дополнительные сведения см. в разделе Практическое руководство. Выбор и перемещение элементов в область конструктора.

  3. В окне Свойства установите для свойства Title значение Folder Explorer.

Создание макета

Макет определяет расположение элементов управления в главном окне приложения. Ниже показано, как создать элементы макета, которые будут содержать элементы управления приложения.

Создание макета

  1. Выберите в окне корневой элемент управления Grid.

  2. Добавьте вторую строку к сетке. Дополнительные сведения см. в разделе Практическое руководство. Добавление строк и столбцов в таблицу.

  3. Добавьте второй столбец к сетке.

Добавление элементов управления в макет

Если макет определен, его можно заполнить элементами управления. Для этого достаточно щелкнуть требуемый элемент управления вПанели элементов и перетащить его в область конструктора.

Добавление в макет элементов управления

  1. Перетащите элемент управления TreeView с Панели элементов в первую ячейку сетки. При необходимости измените размер элемента управления.

  2. Перетащите элемент управления ListView с Панели элементов в ячейку, находящуюся в первой строке и втором столбце сетки. При необходимости измените размер элемента управления.

  3. Перетащите элемент управления ListView с Панели элементов в ячейку, находящуюся во второй строке и втором столбце таблицы. При необходимости измените размер элемента управления.

Задание свойств, связанных с макетом

Ниже показано, как задать значения свойств, связанных с макетом, для элементов управления. После задания свойств для каждого элемента управления макет будет больше напоминать готовое приложение.

Задание свойств, связанных с макетом

  1. Выберите элемент управления TreeView.

  2. В окне Свойства задайте значения свойств, как показано ниже.

    Свойство

    Значение

    Grid.ColumnSpan

    1

    Grid.RowSpan

    2

    Height

    Auto

    HorizontalAlignment

    Stretch

    Margin

    0,0,0,0

    VerticalAlignment

    Stretch

    Width

    Auto

    Размер элемента управления TreeView изменится таким образом, чтобы элемент поместился в первом столбце таблицы и занимал две строки таблицы.

  3. Выберите оба элемента управления ListView.

  4. В окне Свойства задайте значения свойств, как показано ниже.

    Свойство

    Значение

    Grid.ColumnSpan

    1

    Grid.RowSpan

    1

    Height

    Auto

    HorizontalAlignment

    Stretch

    Margin

    0,0,0,0

    VerticalAlignment

    Stretch

    Width

    Auto

    Размер элементов управления ListView изменится таким образом, чтобы эти элементы заполнили соответствующие ячейки сетки.

  5. В окне Структура документа разверните узел ColumnDefinitions для сетки. Дополнительные сведения см. в разделе Навигация по иерархии элементов документа WPF.

  6. Выберите первый элемент узла ColumnDefinition.

  7. В окне Свойства присвойте свойству «Width» значение *.

  8. В окне Структура документа выберите второй элемент узла ColumnDefinition.

  9. В окне Свойства присвойте свойству «Width» значение 2*.

    Размер столбцов изменится: первый столбец займет одну треть ширины окна, а второй — две трети.

  10. В окне Структура документа разверните узел RowDefinitions для сетки.

  11. Выберите первый элемент узла RowDefinition.

  12. В окне Свойства присвойте свойству «Height» значение *.

  13. В окне Структура документа выберите второй элемент узла RowDefinition.

  14. В окне Свойства присвойте свойству «Height» значение *.

    Размер строк изменится: они будут занимать половину высоты окна.

  15. Выполните построение и запуск проекта.

  16. Измените размер окна, чтобы увидеть динамическое изменение размера элементов управления TreeView и ListView.

Создание источника данных

Источник данных для приложения FolderExplorer является классом с именем Folder. Этот класс представляет простую модель файловой системы. Каждый экземпляр класса Folder содержит коллекции SubFolders и Files.

Создание источника данных

  1. Добавьте новый класс с именем Folder к проекту FolderExplorer. Дополнительные сведения см. в разделе Практическое руководство. Добавление в проект новых элементов.

  2. Замените содержимое файла Folder с исходным кодом следующим кодом.

    Imports System
    Imports System.IO
    Imports System.Linq
    Imports System.Collections.Generic
    Imports System.Collections.ObjectModel
    Imports System.Text
    
    Public Class Folder
        Private _folder As DirectoryInfo
        Private _subFolders As ObservableCollection(Of Folder)
        Private _files As ObservableCollection(Of FileInfo)
    
        Public Sub New() 
            Me.FullPath = "c:\"
    
        End Sub 'New
    
    
        Public ReadOnly Property Name() As String 
            Get
                Return Me._folder.Name
            End Get
        End Property
    
    
        Public Property FullPath() As String 
            Get
                Return Me._folder.FullName
            End Get
    
            Set
                If Directory.Exists(value) Then
                    Me._folder = New DirectoryInfo(value)
                Else
                    Throw New ArgumentException("must exist", "fullPath")
                End If
            End Set
        End Property
    
        ReadOnly Property Files() As ObservableCollection(Of FileInfo)
            Get
                If Me._files Is Nothing Then
                    Me._files = New ObservableCollection(Of FileInfo)
    
                    Dim fi As FileInfo() = Me._folder.GetFiles()
    
                    Dim i As Integer
                    For i = 0 To fi.Length - 1
                        Me._files.Add(fi(i))
                    Next i
                End If
    
                Return Me._files
            End Get
        End Property
    
        ReadOnly Property SubFolders() As ObservableCollection(Of Folder)
    
            Get
                If Me._subFolders Is Nothing Then
                    Try
    
                    Me._subFolders = New ObservableCollection(Of Folder)
    
                        Dim di As DirectoryInfo() = Me._folder.GetDirectories()
    
                        Dim i As Integer
                        For i = 0 To di.Length - 1
                            Dim newFolder As New Folder()
                            newFolder.FullPath = di(i).FullName
                            Me._subFolders.Add(newFolder)
                        Next i
                    Catch ex As Exception
    
                        System.Diagnostics.Trace.WriteLine(ex.Message)
    
                    End Try
                End If
    
                Return Me._subFolders
            End Get
        End Property
    End Class
    
    using System;
    using System.IO;
    using System.Linq;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Text;
    
    namespace FolderExplorer
    {
        public class Folder
        {
            private DirectoryInfo _folder;
            private ObservableCollection<Folder> _subFolders;
            private ObservableCollection<FileInfo> _files;
    
            public Folder()
            {
                this.FullPath = @"c:\";
            }
    
            public string Name
            {
                get
                {
                    return this._folder.Name;
                }
            }
    
            public string FullPath
            {
                get
                {
                    return this._folder.FullName;
                }
    
                set
                {
                    if (Directory.Exists(value))
                    {
                        this._folder = new DirectoryInfo(value);
                    }
                    else
                    {
                        throw new ArgumentException("must exist", "fullPath");
                    }
                }
            }
    
            public ObservableCollection<FileInfo> Files
            {
                get
                {
                    if (this._files == null)
                    {
                        this._files = new ObservableCollection<FileInfo>();
    
                        FileInfo[] fi = this._folder.GetFiles();
    
                        for (int i = 0; i < fi.Length; i++)
                        {
                            this._files.Add(fi[i]);
                        }
                    }
    
                    return this._files;
                }
            }
    
            public ObservableCollection<Folder> SubFolders
            {
                get
                {
                    if (this._subFolders == null)
                    {
                        this._subFolders = new ObservableCollection<Folder>();
    
                        DirectoryInfo[] di = this._folder.GetDirectories();
    
                        for (int i = 0; i < di.Length; i++)
                        {
                            Folder newFolder = new Folder();
                            newFolder.FullPath = di[i].FullName;
                            this._subFolders.Add(newFolder);
                        }
                    }
    
                    return this._subFolders;
                }
            }
        }
    }
    

Подключение к источнику данных

Элементы управления WPF подключаются к источникам данных путем привязки данных. Далее показано, как объявить источник ObjectDataProvider и выполнить привязку к нему.

Подключение к источнику данных

  1. Откройте файл Window1.xaml в конструкторе WPF (конструктор). 

  2. В представлении XAML вставьте следующий код XAML в тег <Window> рядом с другими сопоставлениями xmlns. Дополнительные сведения см. в разделе Практическое руководство. Импорт пространства имен в XAML.

    xmlns:my="clr-namespace:FolderExplorer"
    
  3. Вставьте следующий код XAML после открывающего тега <Window> и перед открывающим тегом <Grid>.

      <Window.Resources>
    
            <ObjectDataProvider x:Key="RootFolderDataProvider" >
                <ObjectDataProvider.ObjectInstance>
                    <my:Folder FullPath="c:\"/>
                </ObjectDataProvider.ObjectInstance>
            </ObjectDataProvider>
    
            <HierarchicalDataTemplate 
                DataType    = "{x:Type my:Folder}"
                ItemsSource = "{Binding Path=SubFolders}">
                <TextBlock Text="{Binding Path=Name}" />
            </HierarchicalDataTemplate>
    
        </Window.Resources>
    
    
     <Window.Resources>
    
            <ObjectDataProvider x:Key="RootFolderDataProvider" >
                <ObjectDataProvider.ObjectInstance>
                    <my:Folder FullPath="c:\"/>
                </ObjectDataProvider.ObjectInstance>
            </ObjectDataProvider>
    
            <HierarchicalDataTemplate 
                DataType    = "{x:Type my:Folder}"
                ItemsSource = "{Binding Path=SubFolders}">
                <TextBlock Text="{Binding Path=Name}" />
            </HierarchicalDataTemplate>
    
        </Window.Resources>
    
    
  4. Замените тег <TreeView> следующим кодом XAML.

            <TreeView Grid.ColumnSpan="1" Grid.RowSpan="2" Margin="0,0,0,0" Name="treeView1" >
                <TreeViewItem ItemsSource="{Binding Path=SubFolders, Source={StaticResource RootFolderDataProvider}}" Header="Folders"  />
            </TreeView>
    
         <TreeView Grid.ColumnSpan="1" Grid.RowSpan="2" Margin="0,0,0,0" Name="treeView1" >
                <TreeViewItem ItemsSource="{Binding Path=SubFolders, Source={StaticResource RootFolderDataProvider}}" Header="Folders"  />
            </TreeView>
    

Привязка свойств элемента управления

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

Выполнение привязки свойств элемента управления

  1. В представлении XAML замените оба тега <ListView> следующим кодом XAML.

            <ListView Name="listView1" 
            ItemsSource="{Binding Path=SelectedItem.SubFolders, ElementName=treeView1, Mode=OneWay}" 
            Grid.Column="1" 
            Grid.RowSpan="1" />
    
            <ListView Name="listView2" 
            ItemsSource="{Binding Path=SelectedItem.Files, ElementName=treeView1, Mode=OneWay}" 
            Grid.Column="1" 
            Grid.Row="1" />
    
         <ListView Name="listView1" 
            ItemsSource="{Binding Path=SelectedItem.SubFolders, ElementName=treeView1, Mode=OneWay}" 
            Grid.Column="1" 
            Grid.RowSpan="1" />
    
            <ListView Name="listView2" 
            ItemsSource="{Binding Path=SelectedItem.Files, ElementName=treeView1, Mode=OneWay}" 
            Grid.Column="1" 
            Grid.Row="1" />
    
  2. Выполните построение и запуск проекта.

  3. Разверните элемент Folders, чтобы открыть корневую папку. Поэкспериментируйте, щелкая вложенные папки и посматривая содержимое двух элементов управления ListView. Вложенные папки отображаются в верхнем элементе управления ListView, а файлы — в нижнем элементе управления ListView.

Последующие шаги

См. также

Задачи

Практическое руководство. Использование вложенных событий

Пошаговое руководство. Отладка пользовательских элементов управления WPF во время разработки

Основные понятия

Комбинированный режим — одновременный просмотр области конструктора WPF и XAML

Навигация по иерархии элементов документа WPF

Другие ресурсы

Работа с элементами управления в конструкторе WPF