Практикум
Создание элементов управления
Целью данного практического занятия является создание пользовательских "богатых" элементов управления на основе стандартных. Здесь мы воспользуемся возможностью Silverlight по созданю шаблонов и стилей для стандартных элементов управления. Для выполнения задания необходима Visual Studio.
Задание
Создать пользовательские элементы управления Button, ComboBox и ListBox. Разместить элементы каждый на отдельной странице. Создать меню для навигации по страницам с пользовательскими элементами управления. В проекте SilverlightControls добавим папку \Controls, куда поместим пользовательские элементы управления. В папке Views разместим страницы с этими элементами.
Меню
Создаем проект Silverlight, как в разделе "Создание простого приложения Silverlight", согласно рис. P.1, рис. P.2 и рис. P.3. Называем его SilverlightControls. Разница лишь в том, что используем шаблон Silverlight Navigation Application.
Шаблон создаст 2 пункта меню в MainPage.xaml, таких как About и Home, мы его расширяем пунктами Button, ComboBox, ListBox:
<Border x:Name="LinksBorder" Style="{StaticResource LinksBorderStyle}"> <StackPanel x:Name="LinksStackPanel" Style="{StaticResource LinksStackPanelStyle}"> <HyperlinkButton x:Name="Link1" Style="{StaticResource LinkStyle}" NavigateUri="/Home" TargetName="ContentFrame" Content="home"/> <Rectangle Style="{StaticResource DividerStyle}"/> <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}" NavigateUri="/About" TargetName="ContentFrame" Content="about"/> <Rectangle Style="{StaticResource DividerStyle}"/> <HyperlinkButton x:Name="Link3" Style="{StaticResource LinkStyle}" NavigateUri="/ButtonPage" TargetName="ContentFrame" Content="Button"/> <Rectangle Style="{StaticResource DividerStyle}"/> <HyperlinkButton x:Name="Link4" Style="{StaticResource LinkStyle}" NavigateUri="/ComboBoxPage" TargetName="ContentFrame" Content="ComboBox"/> <Rectangle Style="{StaticResource DividerStyle}"/> <HyperlinkButton x:Name="Link5" Style="{StaticResource LinkStyle}" NavigateUri="/ListBoxPage" TargetName="ContentFrame" Content="ListBox"/> </StackPanel> </Border>
Далее необходимо создать страницы и сами элементы управления.
Элемент Button
Добавляем новый пользовательский элемент управления ButtonControl.xaml (Add/New Item). Размещаем его в каталоге \Controls. Туда же добавим рисунки 4.jpg и SL.png.
Добавим стандартный элемент Button
<Button x:Name="button1" Content="Button1" Click="Button_Click" Style="{StaticResource ImageButton}" HorizontalAlignment="Left" Width="77"/>
и улучшим его внешний вид с помощью стиля:
<UserControl.Resources> <Style x:Key="TextBlockStyle" TargetType="TextBlock"> <Setter Property="FontFamily" Value="Comic Sans Ms"/> <Setter Property="Text" Value="Click!"/> <Setter Property="Foreground" Value="MediumBlue"/> <Setter Property="FontSize" Value="15"/> </Style> <Style x:Key="ImageButton" TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Button> <StackPanel Orientation="Vertical"> <Image Source="SL.png" Height="65" Width="65" Stretch="Fill"/> <TextBlock Style="{StaticResource TextBlockStyle}" HorizontalAlignment="Center"/> </StackPanel> </Button> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources>
- Т.е. кнопка будет состоять из кнопки <Button/>. Эта кнопка является контейнером для <StackPanel/>, которая в свою очередь содержит <Image/> и <TextBlock/>. К текстовому блоку привязан стиль TextBlockStyle. К самой кнопке привязан стиль ImageButton.
Добавляем страницу ButtonPage.xaml для размещения этого элемента, страницу поместим в каталог \Views проекта.
На странице ButtonPage.xaml добавляем пространство имен класса SilverlightControls:
xmlns:local="clr-namespace:SilverlightControls"
и в сетку страницы сам элемент управления Button:
<local:ButtonControl VerticalAlignment="Top" HorizontalAlignment="Center"/>
После запуска мы получим:
Элемент ComboBox
Добавляем новый пользовательский элемент управления ComboBoxControl.xaml (Add/New Item). Размещаем его в каталоге \Controls. Туда же добавим рисунки 1.jpg, 2.jpg и 3.jpg.
Добавим стандартный элемент ComboBox:
<ComboBox Margin="37,0,0,119" Height="22" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="65"/>
Добавим три элемента, улучшим вид каждого элемента, с помощью шаблона:
<ComboBox Margin="37,0,0,119" Height="22" VerticalAlignment="Top" HorizontalAlignment="Left" Width="65"> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image Height="100" Width="100" Source="1.jpg"/> <TextBlock Text="Ferrari F430" HorizontalAlignment="Right" VerticalAlignment="Center"/> </StackPanel> </ComboBoxItem> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image Height="100" Width="100" Source="2.jpg"/> <TextBlock Text="Fisker Karma" HorizontalAlignment="Right" VerticalAlignment="Center"/> </StackPanel> </ComboBoxItem> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image Height="100" Width="100" Source="3.jpg"/> <TextBlock Text="Lamborghini Murcielago LP 640" HorizontalAlignment="Right" VerticalAlignment="Center"/> </StackPanel> </ComboBoxItem> </ComboBox>
Каждый пункт списка содержит вложенную панель <StackPanel/>, в которую вложены элементы <Image/> и <TextBlock/>.
Добавляем страницу ComboBoxPage.xaml для размещения этого элемента, страницу поместим в каталог \Views проекта.
На странице ComboBoxPage.xaml добавляем пространство имен класса SilverlightControls:
xmlns:local="clr-namespace:SilverlightControls"
и в сетку страницы сам элемент управления ComboBox:
<local:ComboBoxControl VerticalAlignment="Top" HorizontalAlignment="Center"/>
После компиляции проекта мы увидим ниспадающий список автомобилей с их изображениями: