Модификация приложения Windows Foundation Presentation : оформление элемента ListBox



 

Теперь осталось нарисовать новый элемент для главного окна MainWindow. xaml. Отредактируем код следующим образом:

 

<Window x:Class="NewListBox.MainWindow"

 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 xmlns:local="clr-namespace:NewListBox"

 Title="WPF :: Солнечная система в ListBox (C#)" Height="700" Width="700">

<!-- Ресурсы окна -->

<Window.Resources>

 

</Window.Resources>

 

<Grid HorizontalAlignment="Center" VerticalAlignment="Center" ClipToBounds="True">

 

</Grid>

</Window>

 

Для начала мы объявили привязку окна в класс NewListBox при помощи строчки в свойства кона:

 

 xmlns:local="clr-namespace:NewListBox"

 

Поменяли свойство Title, высоту (700) и ширину (700) окна. Для сетки (Grid) установили положение внутренних элементов по вертикали и по горизонтали (по центру), а также задали свойство отсечения лишнего у элемента, чтобы сетка помещалась в окне. И в конце объявили пространство объектов для ресурсов окна.

 

Перетащим с панели инструментов элемент ListBox и очистим его содержимое. Изменим для этого элемента свойство Focusable на False, и для свойство ItemsSource пропишем Binding:

 

<Grid HorizontalAlignment="Center" VerticalAlignment="Center" ClipToBounds="True">

   <!-- Устанавливаем сам элемент ListBox по сетке Grid -->

   <ListBox ItemsSource="{Binding Source={StaticResource solarSystem}, Path=SolarSystemObjects}" Focusable="False" />

</Grid>

 

Для ресурсов окна сделаем следующее:

 

<!-- Ресурсы окна -->

<Window.Resources>

   <!-- Переопределяем класс и подключаем объекты класса -->

   <local:SolarSystem x:Key="solarSystem" />

   <local:ConvertOrbit x:Key="convertOrbit" />

   <!-- Устанавливаем шаблон для данных -->

   <DataTemplate DataType="{x:Type local:SolarSystemObject}">

       <Canvas Height="20">

               

       </Canvas>

   </DataTemplate>

</Window.Resources>

 

Внутри поставлен элемент Canvas с размерами высоты и ширины в 20. Заполним элемент Canvas, элементом окружности и элементом изображения, тем самым создаём шаблон данных для элемента внутри ListBox (элемента списка):

 

       <Canvas Height="20">

           <!-- Окружность орбиты (элемент Ellipse) -->

           <!-- Через Binging конвертируем число типа Double Orbit из класса SolarSystemObject? Left для отступа по левому края элемента Ellipse; Top для отступа сверху -->

           <Ellipse

               Canvas.Left="{Binding Path=Orbit, Converter={StaticResource convertOrbit}, ConverterParameter=-1.707}"

                 Canvas.Top="{Binding Path=Orbit, Converter={StaticResource convertOrbit}, ConverterParameter=-0.3}"

               Path=Orbit, Converter={StaticResource convertOrbit}, ConverterParameter=2}"

               Height="{Binding Path=Orbit, Converter={StaticResource convertOrbit}, ConverterParameter=2}"

               Stroke="AliceBlue"

               StrokeThickness="1" />

           <!-- Через Binding получаем путь до изображения для элемента Image -->

           <Image Source="{Binding Path=Image}" Height="20">

               <!-- Вставка элемента изображения для планет и размер изображения для вывода -->

               <Image.ToolTip>

                   <!-- Подсказка при наведении мыши на элемент в ListBox -->

                   <StackPanel TextBlock.FontSize="12">

                       <!-- Устанавливаем размер подсказки по ширине и размер шрифта -->

                       <!-- Используем элемент типа StackPanel для организации одной строки и вставки TextBlock -->

                       <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" />

                       <StackPanel Orientation="Horizontal">

                           <TextBlock Text="Орбита: " />

                           <TextBlock Text="{Binding Path=Orbit}" />

                           <TextBlock Text=" а. е." />

                       </StackPanel>

                       <TextBlock Text="{Binding Path=Details}" TextWrapping="Wrap"/>

                   </StackPanel>

               </Image.ToolTip>

           </Image>

       </Canvas>

 

Каждый элемент внутри списка будет представлен изображением, всплывающей подсказкой при наведении на изображении (название планеты, орбита, описание планеты), а также пустой окружностью проходящей позади изображения (параметры окружности определим как зависимость положение для левой верхней точки окружности внутри Canvas: слева и сверху).

Класс ConvertOrbit организовывает связь положения со значением орбиты.

 

Теперь установим связь шаблона данных и стиля одного элемента, а также добавим событие выделения элемента в списке через Trigger, для этого добавим новый стиль одного элемента (после закрывающего тэга </ DataTemplate> и до закрывающего тэга </ Window. Resources>):

 

   </DataTemplate>

   <!-- Стиль одного элемента в ListBox -->

   <Style TargetType="ListBoxItem">

       <Setter Property="Canvas.Left" Value="{Binding Path=Orbit, Converter={StaticResource convertOrbit}, ConverterParameter=0.707}"/>

       <!-- Отступ для элемента слева -->

       <Setter Property="Canvas.Bottom" Value="{Binding Path=Orbit, Converter={StaticResource convertOrbit}, ConverterParameter=0.707}"/>

       <!-- Отступ для элемента снизу -->

       <Setter Property="Template">

           <!-- Меняем шаблон -->

           <Setter.Value>

               <ControlTemplate TargetType="{x:Type ListBoxItem}">

                   <Grid>

                       <!-- Вставляем в элемент ListBoxItem сетку -->

                       <!-- Вставляем окружность выделения -->

                       <Ellipse x:Name="selectedPlanet" Margin="-10" StrokeThickness="4"/>

                          <!-- Устанавливаем радиус окружности (-10, -10, -10, -10) и толщину пера (4) -->

                       <!-- ContentPresenter сообщает что окружность должна отрисовывать не поточечное, с горизонтальным положением и вертикальным положением в зависимости от шаблона первоначального элемента -->

                       <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

                   </Grid>

                   <ControlTemplate.Triggers>

                       <!-- Событие "если выделен элемент" для ListBoxItem -->

                       <Trigger Property="IsSelected" Value="true">

                           <!-- Устанавливаем цвет и тип пера "штрих" -->

                           <Setter Property="Stroke" TargetName="selectedPlanet" Value="Green"/>

                       </Trigger>

                      </ControlTemplate.Triggers>

               </ControlTemplate>

           </Setter.Value>

       </Setter>

   </Style>

</Window.Resources>

 

В окне конструктора для MainWindow.xaml отобразится следующее:

 

Рис. 5. 1. Незаконченное изменения стиля элемента управления ListBox

 

Попробуем откомпилировать и запустить. Увидим что элементы (планеты) выделяются, появляется зелёное выделение и подсказка с полным описанием.

 

Наконец, изменим главный стиль ListBox (добавим XAML-код после закрывающего тэга </ Style>:

 

   </Style>

   <!-- Стиль элемента управления ListBox -->

   <Style TargetType="ListBox">

       <Setter Property="ItemsPanel">

           <Setter.Value>

               <ItemsPanelTemplate>

                   <!-- Конечный размер ListBox, фон -->

                   <Canvas Height="590" Background="Black" />

               </ItemsPanelTemplate>

           </Setter.Value>

       </Setter>

   </Style>

</Window.Resources>

 

Готово. В конструкторе изменится вид представления окна…

 

Завершающая часть

 

Компилируем приложение (Release) и запускаем. Результат работы показан ниже (Рис. 6. 1):

 

Рис. 6. 1. Модифицированное приложение Windows Foundation Presentation (Выделена планета и высвечена подсказка)

 

О приложении к данной работе

 

Получившуюся программу (NewListBox . exe), собранную из кусков кода приведённых в данной работе, можно загрузить по ссылке в конце этого материала (сслыка доступна в программном продукте).

 

Приложение: Исходный код программы и всех сопровождающих файлов с кодом приведён по ссылке в конце этого материала (сслыка доступна в программном продукте).


Дата добавления: 2019-09-13; просмотров: 441; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!