Благодаря архитектуре Silverlight можно разрабатывать Silverlight приложения, используя всю мощь Microsoft .NET Framework. В Silverlight используется расширяемый язык разметки приложений (Extensible Application Markup Language, XAML) для описания представления элементов пользовательского интерфейса, взаимодействий и анимаций.
Цель Silverlight - обеспечить в Веб-приложениях точность отображения и качество пользовательского интерфейса доступное в настольных приложениях, чтобы Веб-разработчики и дизайнеры могли реализовывать в создаваемых решениях особые требования заказчиков. Silverlight заполняет технологический вакуум между дизайнерам и разработчикам, предоставляя им общий формат для работы.
Silverlight - это подключаемый модуль, который может использоваться в разных браузерах и на разных платформах, разработанный для обеспечения возможности создания сложных сценариев воспроизведения мультимедиа и создания насыщенных интерактивных Интернет-приложений с использованием современных технологий. Он предлагает завершенную модель программирования, которая поддерживает AJAX, .NET Framework и такие динамические языки программирования, как Python и Ruby. Возможность программирования в Silverlight 1.0 обеспечивалась поддержкой существующих Веб-технологий, включая AJAX, JavaScript и
Пакет Microsoft Tools for Visual Studio (Visual Studio Tools для Silverlight) включают программу установки, которая обеспечивает установку среды выполнения (для операционной среды Windows), средств разработки ПО (SDK) Silverlight 3 и инструментов самой Visual Studio в правильной последовательности. Его можно загрузить по адресу http://silverlight.net/getstarted/ .
Для установки этих инструментальных средств необходимо выполнить следующие предварительные условия:
Если все эти требования выполнены, при запуске программы установки на экране появится Silverlight Tools
(рис 7.1) Запуск программы установки инструментов Silverlight 3После установки Visual Studio, а также всех необходимых инструментов и шаблонов для Silverlight, можно приступить к созданию приложения Silverlight. Для этого необходимо выберать пункт New Project в меню File. Откроется диалоговое окно New Project. В верхнем правом углу диалога должен быть выбран пункт .NET Framework 3.5 и в списке Project Types (Типы проекта) должен быть выбран Silverlight. Будут доступны шаблоны:
Если установлен компонент Silverlight .NET RIA Services, то появятся еще шаблоны:
(рис 7.2) Диалоговое окно New Project Visual Studio 2008Выберите шаблон Silverlight Application и задайте имя и местоположение своего проекта. Щелкните OK, и Visual Studio запустит New Silverlight Application Wizard (Мастер нового приложения Silverlight рис. 7.3). Этот мастер предлагает несколько вариантов создания и управления Silverlight-приложением. Все приложения Silverlight создаются как пользовательские элементы управления, экземпляры которых затем могут быть созданы и размещены на странице. Таким образом, данное обсуждение сводится к тому, как это сделать.
(рис 7.3) Мастер New Silverlight ApplicationПри выборе кнопки-флажка сверху мастер добавляет новый Веб-проект в решение. Этот Веб-проект может быть либо Веб-приложением ASP.NET, либо Веб-сайтом ASP.NET. Первый содержит все необходимое для развертывания приложения на Веб-сервере ASP.NET. Второй является более простой облегченной структурой, в которой страницы могут выполняться с любого сервера или даже файловой системы. Если сделать выбор как показано на рис. 7.3, будет создано решение, состоящее из двух проектов: базовый элемент управления Silverlight ( SilverlightApplication1 ) и Веб-приложение ( SilverlightApplication1.Web ). Тут же можно включить или выключить поддержку .NET RIA Services. Потом всегда можно ее добавить (подробнее в разделе 0 "Создание бизнес-приложений Silverlight с использованием .NET RIA сервисов").
Созданный шаблоном базовый проект содержит ряд файлов, включая манифест приложения, XAML-файл приложения с файлом выделенного кода, страницу-пример с файлом выделенного кода, информационный файл сборки и некоторые ссылки. В данном разделе представлены некоторые сложные моменты проекта Silverlight. Лучше всего начать с рассмотрения свойств проекта. Для этого необходимо щелкнуть правой кнопкой мыши проект SilverlightApplication1 в обозревателе решения и выбрать Properties. Появится диалоговое окно Project Properties (рис. 7.4).
(рис 7.4) Свойства проекта SilverlightОпции Assembly Name (Имя сборки) по умолчанию присваивается имя проекта. Это имя будет использоваться при компиляции приложения в DLL.
Опции Default Namespace (Пространство имен по умолчанию) по умолчанию также присваивается имя проекта. Если вы ссылаетесь на классы из этого проекта, их имена начинаются с имени этого пространства имен.
Опции Startup Object (Объект, с которого начинается запуск проекта) по умолчанию присваивается имя проекта с .App в конце (т.е. SilverlightApplication1.App ). Это класс в приложении, который будет выполняться первым. Шаблон определяет этот класс в App.xaml и связанный с ним файл выделенного кода App.xaml.cs.
По щелчку кнопки Assembly Information (сведения о сборке) будет вызван диалог Assembly Information (рис. 7.5). В нем можно определить метаданные своей сборки, включая Title (название), Description (описание), Copyright (авторское право), Trademark (торговая марка), Assembly Version (
(рис 7.5) Задание сведений о сборкеТакже доступны опции кэширования некоторых дополнительных сборок среды, позволяющие сократить размер приложения за счет того, что они не встраиваются в него, и опция формирования файла манифеста приложения. XAP файл - это обыкновенный ZIP архив, в котором содержатся файлы сборки, манифеста, шрифты, и т.д.
Есть опция для настройки работы приложения Silverlight вне браузера. Об этом подробнее в лекции 3 "Работа вне браузера".
Наконец, предлагается опция для создания самого файла манифеста Silverlight. Этот файл содержит данные по всем элементам пакета, которые будут использоваться приложением Silverlight, таким как дополнительные компоненты или элементы управления, которые необходимы для выполнения приложения.
Первой папкой проекта является папка Properties, содержащая файлы свойств: AppManifest.xml и AssemblyInfo.cs. AppManifest.xml создается при компиляции проекта. Если проект имеет какие-либо зависимости во время выполнения, такие как внешние элементы управления, ссылки на них размещаются в этом файле. Файл Assemblyinfo.cs содержит метаданные, которые должны быть скомпилированы в вашу DLL, заданную в диалоговом окне Assembly Information (рис. 7.5). Код в этом файле можно редактировать вручную, но рекомендуется использовать для этого диалоговое окно.
Папка References содержит ссылки на ряд сборок. Это основные сборки Silverlight, которые необходимы для запуска приложения.
mscorlib. В сборку mscorlib входят основные типы, используемые приложениями Silverlight.system. В сборку system входят многие высокоуровневые типы, используемые для разработки и отладки приложений Silverlight, такие как компилятор и классы для отладки и диагностики.System.Core. Сборка System.Core включает основные элементы управления и классы Silverlight.System.Net. Сборка System.Net включает библиотеки .NET, необходимые для сетевого взаимодействия.System.Windows. В сборку System.Windows входят основные функциональные возможности Windows и Silverlight, включая элементы управления Silverlight.System.Windows.Browser. В сборку System.Windows.Browser входят библиотеки, используемые для взаимодействия с браузером.System.Xml. В сборку System.Xml входят библиотеки Silverlight для обработки XML.В Silverlight также имеется ряд сборок, не входящих в стандартную поставку, которые можно добавлять для обеспечения необходимой функциональности, например, работу с базами данных.
Файл App.xaml создается интегрированной средой разработки (IDE) при создании проекта Silverlight по шаблону. Обычно он используется для хранения общей информации всего приложения. App.xaml содержит объявления, определяющие поведение приложения. Вот пример App.xaml, создаваемого шаблоном по умолчанию:
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication1.App">
<Application.Resources>
</Application.Resources>
</Application>
Первое, на что следует обратить внимание, - атрибут x:Class, который определяет имя класса, в который будет скомпилирован этот XAML и связанный с ним файл выделенного кода. Как видно, в данном случае это SilverlightApplication1.App, которое было задано на странице Project Properties (из рис. 7.4) как объект запуска для этого приложения. Таким образом, функциональность запуска проекта Silverlight находится в этом классе.
С помощью события Startup (Запуск) можно задать метод-обработчик, который будет выполняться при запуске приложения. Для этого просто указывается имя необходимой функции, описанной в файле выделенного кода. Также в событии Exit (Выход) можно задать имя метода-обработчика из файла выделенного кода, который будет выполняться при завершении приложения. Далее приведен код стандартного файла выделенного кода, созданного шаблоном:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightApplication1
{
public partial class App : Application
{
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
// Загружается основной элемент управления. По умолчанию - это MainPage.xaml
this.RootVisual = new MainPage();
}
private void Application_Exit(object sender, EventArgs e)
{
}
private void Application_UnhandledException(object sender,
ApplicationUnhandledExceptionEventArgs e)
{
if (!System.Diagnostics.Debugger.IsAttached)
{
e.Handled = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
}
}
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
{
try
{
string errorMsg = e.ExceptionObject.Message +
e.ExceptionObject.StackTrace;
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
System.Windows.Browser.HtmlPage.Window.Eval
("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
}
catch (Exception)
{
}
}
}
}
Сначала рассмотрим конструктор (это функция с именем, аналогичным имени модуля кода, в данном случае это App() ). Он используется для подключения методов Application_Startup и Application_Exit. Это уже было сделано в файле XAML, поэтому нет необходимости делать это в коде. Однако это демонстрирует замечательную гибкость модели XAML/выделенный код, которая позволяет подключать события во время разработки (задавая их в XAML) или во время выполнения (объявляя их в коде).
Далее можно проверить методы Application_Startup и Application_Exit. Обратите внимание, что они принимают два параметра: объект, формирующий событие, и объект аргументов. Такая сигнатура методов очень распространена в приложениях Silverlight.
В методе Application_Startup происходит присвоение свойству this.RootVisual (корневой визуальный элемент) приложения нового объекта MainPage (Главная страница). Тем самым объявляется, что элемент объекта Page является первым экраном приложения Silverlight. Если предполагается использовать другие экраны, объявленные в XAML, они будут запускаться уже из объекта MainPage. Объект MainPage является XAML-объектом по умолчанию, создаваемым шаблоном для размещения пользовательского интерфейса приложения Silverlight.
Файл MainPage.xaml является для приложения Silverlight интерфейсом по умолчанию. При компиляции вместе с ассоциированным с ним файлом выделенного кода он формирует класс MainPage, экземпляр которого будет объектом MainPage. В качестве значения свойства RootVisual приложения был задан новый объект MainPage, что позволило данному классу быть интерфейсом по умолчанию. Вот XAML, формируемый по умолчанию для MainPage.xaml:
<UserControl x:Class="SilverlightApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
<Grid x:Name="LayoutRoot">
</Grid>
</UserControl>
Прежде всего, стоит обратить внимание, что контейнером XAML является UserControl. При построении .NET-приложений Silverlight в Visual Studio, фактически, создаются элементы управления, которые компилируются в DLL и помещаются в XAP, который затем открывает и исполняет Silverlight. В данном случае, экземпляр этого UserControl называется SilverlightApplication1.MainPage - это пространство имен и MainPage - имя класса из этого пространства имен.
Объявления xmlns и xmlns:x задают пространство имен по умолчанию и дополнительное пространство имен, соответственно, которые должны использоваться для проверки корректности XAML. Ранее был рассмотрен атрибут x:Class, используемый для описания класса этого элемента управления, который также является примером применения дополнительного пространства имен, запись которого начинается с префикса x:.
Наконец, ширине и высоте присвоены значения по умолчанию: 640 x 480.
Далее идет корневой Grid. В Silverlight 3 корневым элементом должен быть Container (Контейнер), которым в данном случае является Grid под именем LayoutRoot. Соответственно, все элементы дизайна элемента управления будут дочерними элементами этого узла.
И его код code-behind:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightApplication1
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
}
}
Это стандартный класс MainPage, унаследованный от типа UserControl. В конструкторе класса выполняется общая настройка с помощью вызова метода InitializeComponent().
Кроме проекта элемента управления, шаблон создает веб-проект, в котором размещается приложение Silverlight. Этот веб-проект включает два ASPX-файла: Default.aspx, являющийся пустой Веб-формой, на базе которой можно построить свое приложение; и тестовую страницу <ИмяПриложения>TestPage.aspx (например, SilverlightApplication1TestPage.aspx ), которая содержит все необходимое для запуска Silverlight из ASP.NET.
Хотя Silverlight не имеет никаких зависимостей на стороне сервера, ASP.NET предлагает элементы управления, обеспечивающие возможность создания JavaScript и HTML на стороне клиента, необходимых для размещения Silverlight в браузере.
Файл TestPage включает ссылки на эти элементы управления. Далее приведена участок разметки для ASPX-файла в части включения объекта Silverlight на страницу:
<script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript">
function onSilverlightError(sender, args)
{
var appSource = "";
if (sender != null sender != 0)
{
appSource = sender.getHost().Source;
}
…
</script>
<body>
<form id="form1" runat="server" style="height:100%">
<div id="silverlightControlHost">
<object
data="data:application/x-silverlight-2,"
type="application/x-silverlight-2"
width="100%" height="100%">
<param
name="source"
value="ClientBin/SilverlightApplication1.xap"/>
<param
name="onError"
value="onSilverlightError" />
<param
name="background"
value="white" />
<param
name="minRuntimeVersion"
value="3.0.40624.0" />
<param
name="autoUpgrade"
value="true" />
<a href=
"http://go.microsoft.com/fwlink/?LinkID=149156v=3.0.40624.0"
style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181"
alt="Get Microsoft Silverlight"
style="border-style:none"/>
</a>
</object>
<iframe id="_sl_historyFrame"
style="visibility:hidden;height:0px;width:0px;border:0px">
</iframe>
</div>
</form>
</body>
На этой странице используются два элемента управления ASP.NET. Первый - (диспетчер сценариев), который является превосходным средством управления загрузкой и использованием всех необходимых библиотек JavaScript в соответствующее время и в соответствующем месте.
Второй - элемент управления Silverlight. Обратите внимание, что в качестве параметра он принимает рассмотренный выше XAP. Этот элемент управления будет формировать правильный HTML-код для создания <object>, представляющего Silverlight в браузере.
В данном разделе было рассмотрено проектирование приложений Silverlight в среде Visual Studio 2008 и предлагаемые студией различные инструменты и шаблоны для разработки приложений Silverlight с использованием языков программирования .NET. Был детально разобран проект, созданный на базе стандартных шаблонов Silverlight, рассмотрены все его файлы и то, как он используется для разработки и развертывания приложения Silverlight.
Далее будут более глубоко рассмотрены функциональные возможности, доступные в .NET Framework, включая создание собственных элементов управления, работу с сетью и обмен информацией, данные и XML, динамические языки программирования и серверные элементы управления ASP.NET.
Пространство имен System.Windows включает ряд основных элементов управления, составляющих сердце каждого приложения Microsoft Silverlight, а именно:
ButtonCheckBoxComboBoxHyperlinkButtonImageListBoxRadioButtonTextBlockTextBox и PasswordBoxDataGridCalendar и DatePickerВ Silverlight кнопка реализуется с помощью элемента управления Button. Кнопка реагирует на ввод пользователя с таких устройств ввода, как мышь, клавиатура или стилус, формируя событие Click (Щелчок). Условия формирования кнопкой события Click могут быть настроены несколькими способами. Они задаются свойством ClickMode (Режим щелчка), которое может принимать значения Hover (Наведение), Press (Нажатие) и Release (Отпустить). Эти значения определяют момент формирования события Click. В первом случае, Hover, событие Click формируется при наведении курсора мыши на кнопку. Во втором случае, Press, оно формируется при нажатии кнопки мыши в момент, когда курсор находится на Button. В третьем случае, Release, это событие возникает, когда пользователь нажимает и отпускает кнопку мыши при наведенном на кнопку курсоре.
<Canvas x:Name="LayoutRoot" Background="White">
<Button
x:Name="b1"
ClickMode="Hover"
Content="Button1"
Click="Button_Click">
</Button>
<Button
x:Name="b2"
Canvas.Top="40"
ClickMode="Press"
Content="Button2"
Click="Button_Click">
</Button>
<Button
x:Name="b3"
Canvas.Top="80"
ClickMode="Release"
Content="Button3"
Click="Button_Click">
</Button>
</Canvas>
И в code-behind задается обработчик события:
private void Button_Click(object sender, RoutedEventArgs e){ }
Как видно, для всех этих кнопок определен обработчик события Click и одна и та же функция, Button_Click, для каждой из них.
Элемент управления Button также является контейнером, поэтому его содержимое можно настроить с помощью XAML. Ниже показаны пример кнопки и код примера.
<Button
x:Name="b4"
Canvas.Top="120"
Click="Button_Click"
Width="100"
Height="100">
<Canvas>
<Ellipse
Fill="Green"
Width="100"
Height="100"
Canvas.Left="-50"
Canvas.Top="-50"/>
<Image
Source="1.jpg"
Height="100"
Width="100"
Canvas.Left="-50"
Canvas.Top="-50"
Stretch="Fill"
Opacity="0.4"/>
<TextBlock Text="Hello" Canvas.Left="-15"
Canvas.Top="-7"/>
</Canvas>
</Button>
(рис 7.6) Пример оформления элемента управления ButtonЭлемент управления Button обеспечивает чрезвычайную гибкость в представлении кнопок, что позволяет создавать разнообразные кнопки в Веб-приложениях.
Элемент управления CheckBox предоставляет пользователю опцию для выбора. Обычно он представляется в виде прямоугольника, в котором пользователь может установить или убрать флажок. Он используется, когда имеется ряд опций на выбор и можно выбрать несколько из них.
При установлении флажка CheckBox формирует событие Checked (Установлен), при снятии флажка формируется событие Unchecked (Снят), и событие Click формируется при каждом щелчке по CheckBox. Аналогично элементу управления Button, CheckBox имеет свойство ClickMode, которому может быть задано значение Hover, Press или Release, определяющее условия формирования события.
CheckBox может быть флажком с тремя состояниями (поддерживается неопределенное состояние). Это определяется свойством IsThreeState (Три состояния). Если это состояние включено, и пользователь переводит CheckBox в неопределенное состояние, свойству IsChecked присваивается значение null.
Значение CheckBox можно получить с помощью свойства IsChecked. Необходимо быть осторожным с IsChecked, когда CheckBox находится в режиме с тремя состояниями, поскольку, если CheckBox в неопределенном состоянии, свойство IsChecked возвращает значение null.
Аналогично элементу управления Button, CheckBox является контейнером. Он имеет свойство Content, с помощью которого можно задавать простую строку текста, которая будет отображаться как надпись рядом с флажком, или можно разместить XAML-код в дочернем теге <Content>, для получения более насыщенного эффекта, например текст с небольшой прозрачностью.
Вот пример каждого из вариантов текста:
<CheckBox
Checked="CheckBox_Checked"
Unchecked="CheckBox_Unchecked"
IsThreeState="True"
Content="Test1">
</CheckBox>
<CheckBox
Checked="CheckBox_Checked"
Unchecked="CheckBox_Unchecked"
IsThreeState="True">
<CheckBox.Content>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Test2"
Opacity="0.3">
</TextBlock>
</StackPanel>
</CheckBox.Content>
</CheckBox>
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
CheckBox c = (CheckBox)sender;
bool b = (bool)c.IsChecked;
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
CheckBox c = (CheckBox)sender;
bool b = (bool)c.IsChecked;
}
При обработке событий Clicked, Checked и Unchecked, в качестве sender будет выступать объект, который необходимо привести к типу CheckBox, чтобы получить доступ к свойствам флажка.
Элемент управления ComboBox (поле со списком) используется для представления списка доступных для выбора элементов. При этом отображается только выбранный элемент, но имеется выпадающее меню с полным списком доступных для выбора элементов.
Список образуют объекты ComboBoxItem (элемент поля со списком), как в данном примере:
<ComboBox
SelectionChanged="ComboBox_SelectionChanged"
Height="20"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Width="65">
<ComboBoxItem>
<TextBlock Text="Item1"></TextBlock>
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="Item2"></TextBlock>
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="Item3"></TextBlock>
</ComboBoxItem>
</ComboBox>
Обработка выбора элемента ComboBox пользователем осуществляется посредством события SelectionChanged (Выбранный элемент изменен) и свойства SelectedItem (Выбранный элемент). Продемонстрируем вариант, когда ComboBox содержит элементы разного типа. Ниже представлен пример, в котором ComboBox включает составные элементы, образованные компонентами StackPanel, в каждом из которых имеется Image и TextBlock.
<ComboBox
SelectionChanged="theList_SelectionChanged"
Margin="0,43,0,0"
Height="22"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Width="65">
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Image
Height="100"
Width="100"
Source="1.jpg"/>
<TextBlock
Text="Item 1"
HorizontalAlignment="Right"
VerticalAlignment="Center">
</TextBlock>
</StackPanel>
</ComboBoxItem>
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Image
Height="100"
Width="100"
Source="2.jpg"/>
<TextBlock
Text="Item 2"
HorizontalAlignment="Right"
VerticalAlignment="Center">
</TextBlock>
</StackPanel>
</ComboBoxItem>
</ComboBox>
(рис 7.7 ) Пример оформления элемента управления ComboBoxДанный фрагмент кода обеспечивает формирование более насыщенного визуального представления элементов ComboBox, включающего изображение и текстовый блок.
HyperlinkButton (Гиперссылка) обеспечивает на странице элемент с возможностью щелчка по нему для перехода по URI, заданному свойством NavigateUri ( Uri перехода).
Например:
<HyperlinkButton
Content="The Official Microsoft Silverlight Site"
NavigateUri="http://silverlight.net/" />
HyperlinkButton - это элемент управления с содержимым, т.е. он может иметь простое свойство Content, содержащее текст, который будет отображаться для гиперссылки, или его содержимое может быть намного более насыщенным и более привлекательным.
Например, если вы хотите, чтобы гиперссылка выглядела как рисунок, это очень просто реализовать, используя дочерний элемент <Hyperlink.Content>, в котором может располагаться изображение. Например:
<HyperlinkButton
NavigateUri="http://www.silverlight.net"
TargetName="_blank">
<StackPanel Width="230">
<Image
Source="SL.png"
HorizontalAlignment="Left"
Stretch="Fill"/>
<dataInput:Label
Height="16"
Content="The Official Microsoft Silverlight Site"/>
</StackPanel>
</HyperlinkButton>
Теперь, когда приложение будет запущено, получится изображение, щелчок по которому обеспечит переход по заданному URL.
(рис 7.8) Пример оформления элемента управления HyperlinkButtonСвойство TargetName определяет, где будет открываться содержимое, располагающееся по заданному URL. Для вывода на экран содержимого URL доступны следующие опции:
blank Открывает новое окно браузера без имени._self Замещает текущую HTML-станицу новым содержимым. Если HTML-станица отображается во фрейме, замещается только содержимое рамки._top Замещает текущую HTML-станицу новым содержимым. Даже если HTML-станица отображается во фрейме, меняется содержимое всего окна браузера._parent Замещает всю HTML-станицу.Если используется фреймовая структура, можно задавать имя используемого фрейма.
Стоит обратить внимание на то, что событие Click для HyperlinkButton формируется перед переходом по заданному URI. Это может быть очень полезным, потому что обеспечивает завершение любой предварительной обработки перед загрузкой нового содержимого.
Элемент управления Image используется для отображения изображений. Он может принимать форматы файлов .bmp, .jpg и .png. Путь к изображению задается свойством Source. Например:
<Image Source="sl.png" Stretch="Fill"/>
Если фактические размеры изображения отличаются от заданных для элемента управления Image (т.е. если имеется элемент Image размером 100 x 100 и в него загружается .jpg -изображение 2000 x 2000 пикселов), управлять поведением отображения можно с помощью свойства Stretch. Оно может принимать следующие значения:
Fill Изменяет размеры изображения соответственно размерам области вывода, используя независимое масштабирование по осям х и у.Uniform Изменяет размеры изображения так, чтобы оно поместилось в элемент управления Image, но при этом сохраняет пропорции изображения.UniformToFill Изменяет размеры изображения так, чтобы оно полностью заполнило область вывода, обрезая его в случае необходимости.None Отображает изображение как есть, что приводит к его обрезке, если оно не помещается в элемент Image.Часто изображение необходимо задать не во время разработки, указывая URI в XAML-коде, а определить его во время выполнения, возможно, как результат обращения к базе данных или чего-либо подобного. В таких случаях в качестве источника для элемента управления Image может использоваться класс BitmapImage (пространства имен System.Windows.Media.Imaging ). Далее приведен пример того, как это делается.
<Image x:Name="_image"/>
public Page1()
{
InitializeComponent();
Uri uri = new Uri("sl.jpg", UriKind.Relative);
_image.Source = new BitmapImage(uri);
}
В данном случае создается новый объект Uri с использованием пути к изображению. Второй параметр в конструкторе - опция, определяющая, как должен вычисляться Uri. Используемый URI может быть относительным (в этом случае поиск заданного ресурса будет вестись в том же каталоге, в котором располагается компонент), абсолютным (в этом случае поиск заданного ресурса будет вестись напрямую, поэтому местоположение должно указываться с применением синтаксиса http://сервер/ресурс) или комбинацией первых двух.
Когда Uri создан, он может использоваться для создания нового BitmapImage, который определяется как источник для элемента управления Image.
Элемент управления ListBox используется для представления содержимого в виде упорядоченного списка. Это достаточно гибкий элемент управления, так что элементы списка могут создаваться из содержимого любого типа, но обычно список образуется элементами ListBoxItem (элемент списка), как показано в следующем примере:
<ListBox
SelectionChanged="ListBox_SelectionChanged"
Height="94"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="75">
<ListBoxItem Content="1"/>
<ListBoxItem Content="2"/>
<ListBoxItem Content="3"/>
<ListBoxItem Content="4"/>
<ListBoxItem Content="5"/>
</ListBox>
Возможность выбора элементов, образующих ListBox, пользователем реализуется посредством события SelectionChanged (Выбранный элемент изменен) и свойства SelectedItem (Выбранный элемент). В предыдущем фрагменте XAML-кода обработкой события SelectionChanged занимался обработчик метода ListBox_SelectionChanged. Свойство SelectedItem возвращает object, а не ListBoxItem, потому что в ListBox могут размещаться разные типы содержимого. Поэтому SelectedItem необходимо приводить к ListBoxItem.
В ListBox может располагаться разное содержимое. Далее приведен пример, когда ListBox включает составные элементы, образованные компонентами StackPanel, каждый из которых содержит Image и TextBlock.
(рис 7.9) Пример оформления элемента управления ListBoxКод примера:
<ListBox
x:Name="_listbox"
SelectionChanged="ListBox_SelectionChanged"
Margin="59,21,0,0"
Width="194"
Height="216">
<StackPanel Orientation="Horizontal">
<Image Height="100" Width="100" Source="1.jpg"/>
<TextBlock
Text="Item 1"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Image Height="100" Width="100" Source="2.jpg"/>
<TextBlock
Text="Item 2"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
</StackPanel>
</ListBox>
Содержимое таких сложных элементов, как представленные здесь, можно получить следующим образом: с помощью SelectedItem получить контейнер (в данном случае, StackPanel ) и затем извлечь из него необходимое содержимое. Например:
StackPanel s = _listbox.SelectedItem as StackPanel; TextBlock t = s.Children[2] as TextBlock; string strTest = t.Text;
Элемент управления RadioButton, подобно CheckBox используется для фиксирования выбора пользователя. Однако отличается от CheckBox тем, что обычно применяется в ситуациях, когда пользователь должен выбрать единственный вариант из ряда предлагаемых опций.
Один из способов управления набором опций с возможностью единственного выбора - задать элементы управления RadioButton, соответствующие опциям, как элементы одного уровня в контейнере. Рассмотрим пример:
<StackPanel
Orientation="Vertical"
Background="Yellow"
Height="163"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="179">
<RadioButton Content="Option 1" IsChecked="true"/>
<RadioButton Content="Option 2"></RadioButton>
<RadioButton Content="Option 3"></RadioButton>
<RadioButton Content="Option 4"></RadioButton>
<StackPanel Orientation="Vertical" Background="White">
<RadioButton Content="Option 5" IsChecked="true"/>
<RadioButton Content="Option 6"></RadioButton>
<RadioButton Content="Option 7"></RadioButton>
<RadioButton Content="Option 8"></RadioButton>
</StackPanel>
</StackPanel>
В данном XAML-коде имеется два контейнера StackPanel, один из которых расположен в другом. Первый контейнер содержит опции 1, 2, 3, и 4 ; второй - опции 5, 6, 7 и 8. В результате, пользователь может выбрать только одну из опций от 1 до 4 и только одну из опций от 5 до 8. Как это работает представлено на рис. 7.10
(рис 7.10) Пример оформления элемента управления RadioButtonКроме того, опции можно сгруппировать, задавая для каждого RadioButton свойство GroupName (Имя группы). В предыдущем примере в StackPanel располагались опции 1 -4, и Silverlight разрешал пользователю приложения выбирать только одну из них. Если потребовалось бы разделить этот набор опций на две группы, чтобы пользователь мог выбирать одну из опций 1 и 2, и одну из опций 3 и 4, вместо контейнера можно было бы использовать группы RadioButton.
<StackPanel Orientation="Vertical" Background="Yellow"> <RadioButton Content="Option 1" IsChecked="true" GroupName="G1"/> <RadioButton Content="Option 2" GroupName="G1" /> <RadioButton Content="Option 3" GroupName="G2" /> <RadioButton Content="Option 4" GroupName="G2" /> <RadioButton Content="Option 5" GroupName="G3" IsChecked="true"/> <RadioButton Content="Option 6" GroupName="G3" /> <RadioButton Content="Option 7" GroupName="G3" /> <RadioButton Content="Option 8" GroupName="G3" /> </StackPanel>
Аналогично элементам управления Button и CheckBox, RadioButton имеет свойство ClickMode, определяющее, какое действие пользователя приводит к формированию события Click. Его возможными значениями являются: Hover, при котором событие формируется уже от того, что пользователь проводит курсором по элементу управления; Press, при котором событие формируется по щелчку кнопки мыши по элементу управления; и Release, при котором кнопка мыши должна быть нажата, а потом отпущена, при нахождении курсора мыши на кнопке выбора. Также аналогично элементу управления CheckBox, состояние выбора отдельного RadioButton может быть проверено с помощью свойства IsChecked.
Элемент управления TextBlock используется в приложениях Silverlight для отображения текста. В самом простом случае, для отображения текст достаточно применить TextBlock с заданным свойством Text. Например:
<TextBlock Text="1234" />
Размер текста можно менять, задавая свойство FontSize (в пикселах). Используемый шрифт определяется свойством FontFamily ; например, XAML-код для вывода текста шрифтом Arial Black размером 20 выглядел бы так:
<TextBlock Text="1234" FontFamily="Arial Black" FontSize="20"/>
Свойство FontStyle определяет, как будет выведен текст, курсивом или обычным шрифтом. Чтобы текст отображался курсивом, свойству FontStyle задается значение Italic:
<TextBlock Text="1234" FontFamily="Arial Black" FontSize="20" FontStyle="Italic"/>
Чтобы использовать обычный шрифт, можно задать свойству FontStyle значение Normal или просто оставить его незаданным.
Разрывы строк и использование разных шрифтов для отображения текста реализуется с помощью подэлементов TextBlock: <LineBreak> и <Run>. Как следует из его имени, <LineBreak> создает разрывы в тексте с переносом остального текста на новую строку. Однако TextBlock не является элементом управления для представления содержимого, как некоторые из элементов управления, которые были представлены в данной главе ранее. Поэтому если необходимо представить текст иначе, чем все остальное содержимое свойства Text, используется элемент управления Run:
<TextBlock Width="400" Text="My first text"> <LineBreak/> <Run>My Second Text</Run> <LineBreak/> <Run>My Third Text</Run> <LineBreak/> <Run>My Fourth Text</Run> </TextBlock>
Элемент управления Run поддерживает те же свойства шрифта, размера, цвета и т.д., что и TextBlock. Таким образом, он предоставляет тот же уровень управления его содержимым, что и TextBlock. Это означает, что текст TextBlock и текст, отображаемый с помощью Run, полностью согласованы.
Silverlight руководствуется правилами замещения системных шрифтов, поэтому если шрифт представлен в
Элемент управления TextBox обеспечивает пользователям область для ввода текста. В самой простой форме TextBox предоставляет область, в которую пользователь может ввести одну строку текста. Чтобы элемент управления TextBox могли принимать многостроковый ввод, надо задать высоту или поместить их в контейнер, обеспечивающий ему нестандартную высоту. Затем свойству AcceptsReturn (Допускаются символы возврата каретки) потребуется задать значение True, благодаря чему элементы управления TextBox сможет принимать символы возврата каретки. Свойство Text такого TextBox возвращает объект типа String, в котором каждая строка будет отделена символом "\r".
Элементы управления TextBox позволяют выбирать подстроки Text и также обеспечивают возможность настроить то, как выглядит выбранный текст. Для задания или возвращения выбранного в настоящий момент текста используется свойство SelectedText (Выбранный текст). Начало выбранной подстроки можно получить с помощью свойства SelectionStart (Начало выбранной подстроки), ее длину - с помощью свойства SelectionEnd (Конец выбранной подстроки). При любом изменении выбора подстроки формируется событие SelectionChanged (Выбранный элемент изменен). Рассмотрим следующий пример:
Во-первых, XAML-код:
<TextBox
Height="100"
AcceptsReturn="True"
Text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
SelectionChanged="TextBox_SelectionChanged"/>
Здесь определяется событие SelectionChanged, для которого определен обработчик события TextBox_SelectionChanged. Рассмотрим:
private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
TextBox t = sender as TextBox;
int st = t.SelectionStart;
int ln = t.SelectionLength;
string strT = t.SelectedText;
}
В данном случае, переменная st типа int содержит индекс начального символа выбранной подстроки (отсчитываемой от нуля), ln - длина выбранной подстроки, и strT - строка, содержащая выбранную подстроку. Итак, например, если выбрана подстрока, как показано на рис. 7.11, st будет равна 9, ln равна 8, и strT будет равна JKLMNOPQ.
(рис 7.11) Пример оформления элемента управления TextBoxТакже в TextBox можно использовать разные шрифты, точно так же как это делается в TextBlock.
Очень похож на TextBox элемент управления PasswordBox (Поле пароля). PasswordBox во многих отношениях практически идентичен TextBox. С помощью свойства PasswordChar (Символ пароля) этого элемента управления можно задать символ, который будет использоваться вместо любого введенного символа для отображения нажатия клавиши. Например, PasswordBox, в котором вводимые символы заменяются символом #, описывается следующим XAML-кодом:
<PasswordBox PasswordChar="#" x:Name="pw"/>
Кроме того, следует отметить, что вводимое пользователем содержимое сохраняется в свойстве Password (Пароль), а не в свойстве Text, поэтому для получения ввода пользователя должно использоваться свойство Password.
Элемент управления DataGrid разработан для облегчения задачи по отображению данных в формате таблицы. Это сетка данных, а не просто сетка, потому что она может быть связана с источником данных.
При добавлении элемента управления TheDataGrid в окно редактирования XAML, получаем такой XAML-код:
<UserControl
xmlns:data=
"clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
x:Class="BusinessApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}">
<data:DataGrid
Name="TheDataGrid"
SelectionChanged="DataGrid_SelectionChanged"
SelectionMode="Extended">
</data:DataGrid>
</Grid>
</UserControl>
private ProductContext _productContext = new ProductContext();
public MainPage()
{
InitializeComponent();
LoadOperation<Product> loadOp =
this._productContext.Load(this._productContext.GetProductQuery());
this.TheDataGrid.ItemsSource = loadOp.Entities;
}
Метод _productContext.GetProductQuery() выбирает из базы данных AdventureWorks все содержимое таблицы Product.
В DataGrid возможны два режима выбора: одиночный, при котором можно выбирать по одной строке, и множественный, при котором при удержании клавиш Ctrl и/или Shift может быть выбрано несколько строк.
Эти режимы задаются с помощью свойства SelectionMode (Режим выбора), которое принимает значения DataGridSelectionMode.Single для одиночного выбора и DataGridSelectionMode.Extended для множественного.
Итак, для единичного выбора выбранные данные могут быть получены this.TheDataGrid.SelectedItem. Когда установлен режим множественного выбора, можно использовать свойство SelectedItems, возвращающее коллекцию списков:
System.Collections.IList listOfItems = this.TheDataGrid.SelectedItems;
В данном случае, свойство SelectedItems возвращает System.Collections.. После этого можно перебрать элементы этого списка.
(рис 7.12) Пример оформления элемента управления DataGrid
Возможность использования дат в приложениях Silverlight обеспечивается элементами управления Calendar (Календарь) и DatePicker (Элемент выбора дат). Элемент управления Calendar выводит на экран дни заданного месяца или месяцы заданного года и предоставляет кнопки со стрелками для перемещения по месяцам или годам. DatePicker сочетает это представление с текстовым полем, в которое пользователь может вводить дату в соответствующем формате, или выпадающим списком, в котором можно выбрать определенную дату (см. рис. 7.13).
(рис 7.13) Пример оформления элементов управления Calendar и DatePickerКод XAML:
<controls:Calendar Name="d1"/> <controls:DatePicker Name="d2"/>
Коллекция BlackoutDates (Недоступные даты) позволяет задавать диапазон дат, которые не могут быть выбраны. Эта коллекция содержит тип CalendarBlackoutDatesCollection (Коллекция диапазона дат календаря), в который могут добавляться диапазоны дат. Все даты, попадающие в этот диапазон, будут отображаться неактивными и, таким образом, не могут быть выбраны.
CalendarBlackoutDatesCollection _blackoutDates = d2.BlackoutDates;
Элемент управления DatePicker сочетает функциональность календаря с текстовым полем. Свойство Text этого поля содержит все, что пользователь вводит в качестве даты. Если невозможно выполнить синтаксический разбор введенных пользователем данных, формируется ошибка TextParseError (Ошибка синтаксического разбора текста). Визуальное представление элемента управления DatePicker включает текстовое поле с датой, и справа от него располагается значок, выбор которого обеспечивает отображение элемента управления Calendar для выбора даты. Когда пользователь щелкает этот значок, формируется событие CalendarOpened (Календарь открыт). Когда пользователь закрывает его, формируется событие CalendarClosed (Календарь закрыт). Элементы управления Calendar и DatePicker обеспечивают базовые средства для создания приложений, в которых ввод основывается на датах и которые могут отображать информацию календаря.
Существует ряд функциональных возможностей, общих для всех или большинства этих элементов управления, таких как обработка фокуса, обработка событий мыши, обработка событий клавиатуры.
Элементы, которые могут принимать ввод, формируют события GotFocus и LostFocus. События GotFocus и LostFocus формируются каждый раз, когда пользователь переходит на или покидает элемент управления, либо наводя курсором мыши, либо используя клавишу Tab. Оба этих события являются событиями, передающимися вверх по иерархии (bubbling events). Это означает, что элемент управления принимает событие, но не обрабатывает его. Событие передается его родителю и так далее вверх по иерархии до тех пор, пока не будет перехвачено обработчиком события.
Элементы управления Silverlight формируют несколько событий мыши:
MouseEnter Событие MouseEnter формируется при входе курсора мыши в область отображения элемента управления.MouseLeave Событие MouseLeave формируется, когда курсор мыши покидает область отображения элемента управления.MouseLeftButtonDown Событие MouseLeftButtonDown формируется при нажатии пользователем левой кнопки мыши, когда курсор находится над элементом управления.MouseLeftButtonUp Событие MouseLeftButtonUp формируется при отпускании удерживаемой левой кнопки мыши, когда курсор находится над элементом управления.MouseMove Событие MouseMove формируется при перемещении курсора по элементу управления.Кроме перечисленных событий для обеспечения максимального контроля могут использоваться методы CaptureMouse и ReleaseMouseCapture. Когда для элемента управления вызывается метод CaptureMouse, все события мыши направляются в этот элемент управления независимо от того, находится ли курсор мыши в его границах или нет. Метод ReleaseMouseCapture, как следует из его имени, возвращает механизм перехвата событий в нормальное состояние. Эти методы очень полезны для реализации перемещения объектов методом "drag-and-drop". Далее представлен пример использования этих событий и методов.
Ниже представлен XAML-документ, обеспечивающий прорисовку эллипсов на странице. Обратите внимание, что для всех эллипсов определены одни и те же обработчики событий мыши:
<Canvas Width="640" Height="480" Background="Wheat">
<Ellipse
Canvas.Top="0"
Fill="Black"
Width="20"
Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
<Ellipse
Canvas.Top="40"
Fill="Black"
Width="20" Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
<Ellipse
Canvas.Top="80"
Fill="Black"
Width="20" Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
<Ellipse
Canvas.Top="120"
Fill="Black" Width="20"
Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
</Canvas>
Теперь рассмотрим выделенный код. Во-первых, нам необходимы переменные для сохранения х и у координат курсора мыши в момент начала перемещения методом "drag-and-drop" и еще одна переменная для обозначения того, удерживается ли кнопка мыши в настоящий момент. Если курсор находится над любой из кнопок, и нажимается кнопка мыши, выполняется функция Ellipse_MouseLeftButtonDown.
double beginX = 0;
double beginY = 0;
bool isMouseDown = false;
private void Ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Ellipse b = sender as Ellipse;
beginX = e.GetPosition(this).X;
beginY = e.GetPosition(this).Y;
isMouseDown = true; b.CaptureMouse();
}
Отправителем является универсальный объект, поэтому, прежде всего, необходимо привести его к типу эллипс. После этого используем аргумент MouseButtonEventArgs (Аргументы событий кнопки мыши) для получения текущих координат х и у и задания их как начальных значений. Затем, поскольку кнопка мыши удерживается нажатой, ее перемещения должны отслеживаться, поэтому переменной isMouseDown задается значение True. Наконец, мы хотим отслеживать события мыши для этого эллипса (любого из заданных) таким образом, чтобы даже если пользователь уводит курсор мыши с этого эллипса, он продолжал получать события.
Итак, поскольку пользователь двигает мышью, должно формироваться событие MouseMove. Оно обрабатывается функцией-обработчиком события Ellipse_MouseMove:
private void Ellipse_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
Ellipse b = sender as Ellipse;
double currX = e.GetPosition(this).X;
double currY = e.GetPosition(this).Y;
b.SetValue(Canvas.LeftProperty, currX);
b.SetValue(Canvas.TopProperty, currY);
}
}
Это событие формируется при прохождении курсора мыши по эллипсу, независимо от того, выполняется ли перемещение этого эллипса или нет. Но нас интересуют только варианты, когда пользователи перетягивает эллипс, а это, по определению, означает, что переменная isMouseDown имеет значение True. В этом случае мы получаем текущие координаты курсора мыши и используем их для задания присоединенных свойств Top и Left эллипса. В результате будет создан эффект перетягивания эллипса соответственно координатам курсора мыши.
Наконец, при отпускании удерживаемой кнопки мыши формируется событие MouseLeftButtonUp, перехватываемое функцией Ellipse_MouseLeftButtonUp:
private void Ellipse_MouseLeftButtonUp(object sender,
MouseButtonEventArgs e)
{
Ellipse b = sender as Ellipse;
isMouseDown = false;
b.ReleaseMouseCapture();
}
Это обеспечивает возвращение переменной isMouseDown к исходному значению, и элемент управления, отслеживающий события мыши, прекращает делать это. В результате восстанавливается обычное поведение мыши, а эллипс остается передвинутым в другое место. Все это в действии можно увидеть на рис. 7.14.
(рис 7.14) Пример использования событий мыши для реализации перемещения объектов методом "Drag-and-drop"На рисунке показано, как приложение выглядит в исходном состоянии. Если пользователь наведет курсор мыши на любой из эллипсов и затем нажмет кнопку мыши и продолжит перемещение, эллипс начнет двигаться за курсором. Таким образом, пользователь может менять расположение эллипсов на экране методом "drag-and-drop".
Кроме элемента управления TextBox, который предлагает пользователю возможность ввода текста с клавиатуры, многие элементы управления формируют события KeyDown и KeyUp, которые могут использоваться для перехвата ввода с клавиатуры. Событие KeyDown формируется при каждом нажатии клавиши, когда фокус находится на элементе. Функция-обработчик этого события принимает универсальный объект-отправитель и объект KeyEventArgs, который может использоваться для извлечения информации о нажатой клавише. Он имеет свойство key, возвращающее объект Key с информацией о клавише. Это платформонезависимое свойство, поэтому оно лучше всего подходит для использования в приложениях Silverlight. KeyEventArgs предлагает также еще одно свойство, PlatformKeyCode (Код клавиши на данной платформе), которое может использоваться со свойством key для получения кодов клавиш, используемых в конкретной
операционной системе.
Кроме того, статическое свойство Keyboard.Modifers возвращает значение ModifierKeys (Модифицирующие клавиши), которое может использоваться для определения того, какая из модифицирующих клавиш (Alt, Ctrl, Shift, Windows) была нажата. Просто используйте побитовое И на возвращенное значение свойства для проверки искомой модифицирующей клавиши (например, Shift).
Стиль создается в разделе <Resources> (Ресурсы) контейнера. Здесь может быть создан один или более стилей, для которых задается имя стиля и тип объекта, к которому будет применяться стиль. Например, чтобы создать стиль TextBlockStyle (Стиль текстового блока) для элемента управления TextBlock, используется такой XAML:
<UserControl.Resources>
<Style TargetType="TextBlock" x:Key="TextBlockStyle">
<Setter Property="FontFamily" Value="Comic Sans Ms"></Setter>
<Setter Property="Foreground" Value="MediumBlue"></Setter>
<Setter Property="FontSize" Value="30"></Setter>
</Style>
</UserControl.Resources>
Для стиля задается тип элемента управления, к которому он может применяться. Однако то, что этот стиль предполагается для TextBlock, не означает, что все экземпляры TextBlock будут использовать его. Вы не ограничены одним стилем для одного типа. В стиле должен быть задан тип элемента управления, для которого предназначен стиль, а также может быть задан Key (Ключ) стиля. Таким образом, можно иметь множество разных описаний стилей для элемента управления TextBlock с разными Key. Тогда, задавая свойство Style (Стиль) для разных TextBlock, вы просто выбираете тот стиль, который желаете применить к тому или иному TextBlock, по имени. Это будет продемонстрировано через мгновение, но сначала рассмотрим настройку стиля свойств TextBlock. Для этого используется Setter (Установщик). Setter - это тег XAML, определяющий свойство и значение, которое необходимо задать этому
свойству.
Этот стиль должен быть определен на странице как ресурс. Как видите, корневым элементом XAML на странице является UserControl. У него есть дочерний элемент <UserControl.Resources>. Тег <Style> помещается в него.
Применяется этот стиль к TextBlock посредством свойства Style. Поскольку стиль определен как ресурс, для задания имени стиля используется синтаксис с ключевым словом StaticResource (Статический ресурс):
<TextBlock
Text="Click!"
Style="{StaticResource TextBlockStyle}"/>
Теперь все свойства, применяемые к элементам управления TextBlock кнопки, задаются в одном месте, что значительно упрощает обслуживание и делает XAML удобным для восприятия и понимания.
В данном случае действие стиля ограничено рамками одного пользовательского элемента управления UserControl. Чтобы расширить стиль на все страницы приложения, необходимо поместить стиль в контейнер <Application.Resources> файла App.xaml.
<Application.Resources>
<Style TargetType="TextBlock" x:Key="TextBlockStyle">
<Setter Property="FontFamily" Value="Arial"></Setter>
<Setter Property="Foreground" Value="MediumBlue"></Setter>
<Setter Property="FontSize" Value="30"></Setter>
</Style>
</Application.Resources>
В Silverlight можно определить стиль сразу всего элемента управления, включающего несколько других элементов, например, Button и образующих его элементов управления, т.е. StackPanel, Image и TextBlock.
Шаблоны действуют абсолютно аналогично стилям: размещаются в разделе <Resources> и описываются с помощью тега Setter. Чтобы создать Template (Шаблон), задается свойство Template и затем с помощью <Setter.Value> определяется ControlTemplate для заданного элемента управления:
<UserControl.Resources>
<Style TargetType="TextBlock" x:Key="TextBlockStyle">
<Setter Property="FontFamily" Value="Comic Sans Ms"></Setter>
<Setter Property="Text" Value="Click!"></Setter>
<Setter Property="Foreground" Value="MediumBlue"></Setter>
<Setter Property="FontSize" Value="15"></Setter>
</Style>
<Style x:Key="ImageButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Button>
<Button.Content>
<StackPanel Orientation="Vertical">
<Image
Source="1.jpg"
Height="48" Width="48">
</Image>
<TextBlock
Style="{StaticResource TextBlockStyle}">
</TextBlock>
</StackPanel>
</Button.Content>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Button Style="{StaticResource ImageButton}"/>
<Button Content="Button2"/>
В результате получится кнопка, как показано на рис. 7.15
(рис 7.15) Применение шаблона и стиля к элементу управления Button
В данном разделе изучен некоторый базовый набор элементов управления Silverlight. Всего элементов управления после установки Silverlight SDK и Toolkit - 79. Так же показан способ применения шаблонов и стилей к элементам управления. Они позволяют унифицировать и настраивать внешний вид и поведение всех создаваемых вами элементов управления во всем приложении Silverlight.
В следующей таблице отражена совместимость Silverlight различных версий с браузерами и операционными системами.
| Начало формы ПлатформаКонец формы | Требования |
|---|---|
| ПК Windows | Процессор X86 или x64 500 МГц, 128 Мб ОЗУ |
| Mac OS 10.4.8+ (PowerPC) | Процессор PowerPC G4 800 МГц, 128 Мб ОЗУ |
| Mac OS 10.4.8+ (Intel-based) | Процессор Intel Core Duo 1.83 ГГц , 128 Мб ОЗУ Конец формы |
http://vogue.ru/photoviewer - сайт журнала Vogue, просмотр платьев, костюмов и другой модной одежды
http://www.silverlightshow.net/items/Virtual-earth-deep-zooming.aspx - работа приложения Silverlight с веб-сервисом Microsoft Virtual Earth. Демонстрация технологии DeepZoom. География.
http://demo.mapdotnet.com/MDNUXHurricaneDemo - работа приложения Silverlight с географическим веб-сервисом Microsoft Bing. Демонстрация технологии DeepZoom. Ветры.
http://demo.mapdotnet.com/mdnuxpropertygeomsample - работа приложения Silverlight с географическим веб-сервисом Microsoft Bing. Цены на участки земли в США.
http://demos.telerik.com/silverlight - примеры бизнес приложений. Акции
http://demos.telerik.com/wpf - реализовано с помощью Windows Presentation Foundation
http://demos.telerik.com/silverlight - реализовано с помощью Silverlight
http://www.silverlightbuzz.com/2009/08/03/obama-to-jfk-deep-zoom - Демонстрация технологии DeepZoom. Президенты США от Обамы до Кеннеди (Obama to JFK Deep Zoom)
http://news.sportbox.ru - новостной спортивный сайт sportbox.ru. Внедрена технология Smooth Streaming для повышения качества передачи видео с сайта и его автоматической настройки для пользователей в любом регионе.
http://www.prlib.ru - сайт президентской Библиотеки им. Б.Н. Ельцина - зарегистрированные посетители могут изучать оцифрованные материалы в режиме 2D и 3D, а также масштабировать графические объекты до нужных деталей
http://media.mariinsky.ru - сайт Мариинского театра - медиа-центр, который позволяет просматривать через Интернет видеозаписи, трансляции концертных выступлений в высоком разрешении, фотографий и т.д.
http://www.microsoft.com/silverlight, http://silverlight.net - официальные сайты технологии Silverlight
http://msdn.microsoft.com/ru-ru/silverlight - центр разработки Silverlight
http://silverlighter.ru - Сообщество пользователей Silverlight
http://www.iis.net/extensions/SmoothStreaming - описание и загрузка Smooth Streaming
http://www.microsoft.com/rus/expression - описание пакета Microsoft Expression Studio
Благодаря архитектуре Silverlight можно разрабатывать Silverlight приложения, используя всю мощь Microsoft .NET Framework. В Silverlight используется расширяемый язык разметки приложений (Extensible Application Markup Language, XAML) для описания представления элементов пользовательского интерфейса, взаимодействий и анимаций.
Цель Silverlight - обеспечить в Веб-приложениях точность отображения и качество пользовательского интерфейса доступное в настольных приложениях, чтобы Веб-разработчики и дизайнеры могли реализовывать в создаваемых решениях особые требования заказчиков. Silverlight заполняет технологический вакуум между дизайнерам и разработчикам, предоставляя им общий формат для работы.
Silverlight - это подключаемый модуль, который может использоваться в разных браузерах и на разных платформах, разработанный для обеспечения возможности создания сложных сценариев воспроизведения мультимедиа и создания насыщенных интерактивных Интернет-приложений с использованием современных технологий. Он предлагает завершенную модель программирования, которая поддерживает AJAX, .NET Framework и такие динамические языки программирования, как Python и Ruby. Возможность программирования в Silverlight 1.0 обеспечивалась поддержкой существующих Веб-технологий, включая AJAX, JavaScript и
Пакет Microsoft Tools for Visual Studio (Visual Studio Tools для Silverlight) включают программу установки, которая обеспечивает установку среды выполнения (для операционной среды Windows), средств разработки ПО (SDK) Silverlight 3 и инструментов самой Visual Studio в правильной последовательности. Его можно загрузить по адресу http://silverlight.net/getstarted/ .
Для установки этих инструментальных средств необходимо выполнить следующие предварительные условия:
Если все эти требования выполнены, при запуске программы установки на экране появится Silverlight Tools
(рис 7.1) Запуск программы установки инструментов Silverlight 3После установки Visual Studio, а также всех необходимых инструментов и шаблонов для Silverlight, можно приступить к созданию приложения Silverlight. Для этого необходимо выберать пункт New Project в меню File. Откроется диалоговое окно New Project. В верхнем правом углу диалога должен быть выбран пункт .NET Framework 3.5 и в списке Project Types (Типы проекта) должен быть выбран Silverlight. Будут доступны шаблоны:
Если установлен компонент Silverlight .NET RIA Services, то появятся еще шаблоны:
(рис 7.2) Диалоговое окно New Project Visual Studio 2008Выберите шаблон Silverlight Application и задайте имя и местоположение своего проекта. Щелкните OK, и Visual Studio запустит New Silverlight Application Wizard (Мастер нового приложения Silverlight рис. 7.3). Этот мастер предлагает несколько вариантов создания и управления Silverlight-приложением. Все приложения Silverlight создаются как пользовательские элементы управления, экземпляры которых затем могут быть созданы и размещены на странице. Таким образом, данное обсуждение сводится к тому, как это сделать.
(рис 7.3) Мастер New Silverlight ApplicationПри выборе кнопки-флажка сверху мастер добавляет новый Веб-проект в решение. Этот Веб-проект может быть либо Веб-приложением ASP.NET, либо Веб-сайтом ASP.NET. Первый содержит все необходимое для развертывания приложения на Веб-сервере ASP.NET. Второй является более простой облегченной структурой, в которой страницы могут выполняться с любого сервера или даже файловой системы. Если сделать выбор как показано на рис. 7.3, будет создано решение, состоящее из двух проектов: базовый элемент управления Silverlight ( SilverlightApplication1 ) и Веб-приложение ( SilverlightApplication1.Web ). Тут же можно включить или выключить поддержку .NET RIA Services. Потом всегда можно ее добавить (подробнее в разделе 0 "Создание бизнес-приложений Silverlight с использованием .NET RIA сервисов").
Созданный шаблоном базовый проект содержит ряд файлов, включая манифест приложения, XAML-файл приложения с файлом выделенного кода, страницу-пример с файлом выделенного кода, информационный файл сборки и некоторые ссылки. В данном разделе представлены некоторые сложные моменты проекта Silverlight. Лучше всего начать с рассмотрения свойств проекта. Для этого необходимо щелкнуть правой кнопкой мыши проект SilverlightApplication1 в обозревателе решения и выбрать Properties. Появится диалоговое окно Project Properties (рис. 7.4).
(рис 7.4) Свойства проекта SilverlightОпции Assembly Name (Имя сборки) по умолчанию присваивается имя проекта. Это имя будет использоваться при компиляции приложения в DLL.
Опции Default Namespace (Пространство имен по умолчанию) по умолчанию также присваивается имя проекта. Если вы ссылаетесь на классы из этого проекта, их имена начинаются с имени этого пространства имен.
Опции Startup Object (Объект, с которого начинается запуск проекта) по умолчанию присваивается имя проекта с .App в конце (т.е. SilverlightApplication1.App ). Это класс в приложении, который будет выполняться первым. Шаблон определяет этот класс в App.xaml и связанный с ним файл выделенного кода App.xaml.cs.
По щелчку кнопки Assembly Information (сведения о сборке) будет вызван диалог Assembly Information (рис. 7.5). В нем можно определить метаданные своей сборки, включая Title (название), Description (описание), Copyright (авторское право), Trademark (торговая марка), Assembly Version (
(рис 7.5) Задание сведений о сборкеТакже доступны опции кэширования некоторых дополнительных сборок среды, позволяющие сократить размер приложения за счет того, что они не встраиваются в него, и опция формирования файла манифеста приложения. XAP файл - это обыкновенный ZIP архив, в котором содержатся файлы сборки, манифеста, шрифты, и т.д.
Есть опция для настройки работы приложения Silverlight вне браузера. Об этом подробнее в лекции 3 "Работа вне браузера".
Наконец, предлагается опция для создания самого файла манифеста Silverlight. Этот файл содержит данные по всем элементам пакета, которые будут использоваться приложением Silverlight, таким как дополнительные компоненты или элементы управления, которые необходимы для выполнения приложения.
Первой папкой проекта является папка Properties, содержащая файлы свойств: AppManifest.xml и AssemblyInfo.cs. AppManifest.xml создается при компиляции проекта. Если проект имеет какие-либо зависимости во время выполнения, такие как внешние элементы управления, ссылки на них размещаются в этом файле. Файл Assemblyinfo.cs содержит метаданные, которые должны быть скомпилированы в вашу DLL, заданную в диалоговом окне Assembly Information (рис. 7.5). Код в этом файле можно редактировать вручную, но рекомендуется использовать для этого диалоговое окно.
Папка References содержит ссылки на ряд сборок. Это основные сборки Silverlight, которые необходимы для запуска приложения.
mscorlib. В сборку mscorlib входят основные типы, используемые приложениями Silverlight.system. В сборку system входят многие высокоуровневые типы, используемые для разработки и отладки приложений Silverlight, такие как компилятор и классы для отладки и диагностики.System.Core. Сборка System.Core включает основные элементы управления и классы Silverlight.System.Net. Сборка System.Net включает библиотеки .NET, необходимые для сетевого взаимодействия.System.Windows. В сборку System.Windows входят основные функциональные возможности Windows и Silverlight, включая элементы управления Silverlight.System.Windows.Browser. В сборку System.Windows.Browser входят библиотеки, используемые для взаимодействия с браузером.System.Xml. В сборку System.Xml входят библиотеки Silverlight для обработки XML.В Silverlight также имеется ряд сборок, не входящих в стандартную поставку, которые можно добавлять для обеспечения необходимой функциональности, например, работу с базами данных.
Файл App.xaml создается интегрированной средой разработки (IDE) при создании проекта Silverlight по шаблону. Обычно он используется для хранения общей информации всего приложения. App.xaml содержит объявления, определяющие поведение приложения. Вот пример App.xaml, создаваемого шаблоном по умолчанию:
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication1.App">
<Application.Resources>
</Application.Resources>
</Application>
Первое, на что следует обратить внимание, - атрибут x:Class, который определяет имя класса, в который будет скомпилирован этот XAML и связанный с ним файл выделенного кода. Как видно, в данном случае это SilverlightApplication1.App, которое было задано на странице Project Properties (из рис. 7.4) как объект запуска для этого приложения. Таким образом, функциональность запуска проекта Silverlight находится в этом классе.
С помощью события Startup (Запуск) можно задать метод-обработчик, который будет выполняться при запуске приложения. Для этого просто указывается имя необходимой функции, описанной в файле выделенного кода. Также в событии Exit (Выход) можно задать имя метода-обработчика из файла выделенного кода, который будет выполняться при завершении приложения. Далее приведен код стандартного файла выделенного кода, созданного шаблоном:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightApplication1
{
public partial class App : Application
{
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
// Загружается основной элемент управления. По умолчанию - это MainPage.xaml
this.RootVisual = new MainPage();
}
private void Application_Exit(object sender, EventArgs e)
{
}
private void Application_UnhandledException(object sender,
ApplicationUnhandledExceptionEventArgs e)
{
if (!System.Diagnostics.Debugger.IsAttached)
{
e.Handled = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
}
}
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
{
try
{
string errorMsg = e.ExceptionObject.Message +
e.ExceptionObject.StackTrace;
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
System.Windows.Browser.HtmlPage.Window.Eval
("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
}
catch (Exception)
{
}
}
}
}
Сначала рассмотрим конструктор (это функция с именем, аналогичным имени модуля кода, в данном случае это App() ). Он используется для подключения методов Application_Startup и Application_Exit. Это уже было сделано в файле XAML, поэтому нет необходимости делать это в коде. Однако это демонстрирует замечательную гибкость модели XAML/выделенный код, которая позволяет подключать события во время разработки (задавая их в XAML) или во время выполнения (объявляя их в коде).
Далее можно проверить методы Application_Startup и Application_Exit. Обратите внимание, что они принимают два параметра: объект, формирующий событие, и объект аргументов. Такая сигнатура методов очень распространена в приложениях Silverlight.
В методе Application_Startup происходит присвоение свойству this.RootVisual (корневой визуальный элемент) приложения нового объекта MainPage (Главная страница). Тем самым объявляется, что элемент объекта Page является первым экраном приложения Silverlight. Если предполагается использовать другие экраны, объявленные в XAML, они будут запускаться уже из объекта MainPage. Объект MainPage является XAML-объектом по умолчанию, создаваемым шаблоном для размещения пользовательского интерфейса приложения Silverlight.
Файл MainPage.xaml является для приложения Silverlight интерфейсом по умолчанию. При компиляции вместе с ассоциированным с ним файлом выделенного кода он формирует класс MainPage, экземпляр которого будет объектом MainPage. В качестве значения свойства RootVisual приложения был задан новый объект MainPage, что позволило данному классу быть интерфейсом по умолчанию. Вот XAML, формируемый по умолчанию для MainPage.xaml:
<UserControl x:Class="SilverlightApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
<Grid x:Name="LayoutRoot">
</Grid>
</UserControl>
Прежде всего, стоит обратить внимание, что контейнером XAML является UserControl. При построении .NET-приложений Silverlight в Visual Studio, фактически, создаются элементы управления, которые компилируются в DLL и помещаются в XAP, который затем открывает и исполняет Silverlight. В данном случае, экземпляр этого UserControl называется SilverlightApplication1.MainPage - это пространство имен и MainPage - имя класса из этого пространства имен.
Объявления xmlns и xmlns:x задают пространство имен по умолчанию и дополнительное пространство имен, соответственно, которые должны использоваться для проверки корректности XAML. Ранее был рассмотрен атрибут x:Class, используемый для описания класса этого элемента управления, который также является примером применения дополнительного пространства имен, запись которого начинается с префикса x:.
Наконец, ширине и высоте присвоены значения по умолчанию: 640 x 480.
Далее идет корневой Grid. В Silverlight 3 корневым элементом должен быть Container (Контейнер), которым в данном случае является Grid под именем LayoutRoot. Соответственно, все элементы дизайна элемента управления будут дочерними элементами этого узла.
И его код code-behind:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightApplication1
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
}
}
Это стандартный класс MainPage, унаследованный от типа UserControl. В конструкторе класса выполняется общая настройка с помощью вызова метода InitializeComponent().
Кроме проекта элемента управления, шаблон создает веб-проект, в котором размещается приложение Silverlight. Этот веб-проект включает два ASPX-файла: Default.aspx, являющийся пустой Веб-формой, на базе которой можно построить свое приложение; и тестовую страницу <ИмяПриложения>TestPage.aspx (например, SilverlightApplication1TestPage.aspx ), которая содержит все необходимое для запуска Silverlight из ASP.NET.
Хотя Silverlight не имеет никаких зависимостей на стороне сервера, ASP.NET предлагает элементы управления, обеспечивающие возможность создания JavaScript и HTML на стороне клиента, необходимых для размещения Silverlight в браузере.
Файл TestPage включает ссылки на эти элементы управления. Далее приведена участок разметки для ASPX-файла в части включения объекта Silverlight на страницу:
<script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript">
function onSilverlightError(sender, args)
{
var appSource = "";
if (sender != null sender != 0)
{
appSource = sender.getHost().Source;
}
…
</script>
<body>
<form id="form1" runat="server" style="height:100%">
<div id="silverlightControlHost">
<object
data="data:application/x-silverlight-2,"
type="application/x-silverlight-2"
width="100%" height="100%">
<param
name="source"
value="ClientBin/SilverlightApplication1.xap"/>
<param
name="onError"
value="onSilverlightError" />
<param
name="background"
value="white" />
<param
name="minRuntimeVersion"
value="3.0.40624.0" />
<param
name="autoUpgrade"
value="true" />
<a href=
"http://go.microsoft.com/fwlink/?LinkID=149156v=3.0.40624.0"
style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181"
alt="Get Microsoft Silverlight"
style="border-style:none"/>
</a>
</object>
<iframe id="_sl_historyFrame"
style="visibility:hidden;height:0px;width:0px;border:0px">
</iframe>
</div>
</form>
</body>
На этой странице используются два элемента управления ASP.NET. Первый - (диспетчер сценариев), который является превосходным средством управления загрузкой и использованием всех необходимых библиотек JavaScript в соответствующее время и в соответствующем месте.
Второй - элемент управления Silverlight. Обратите внимание, что в качестве параметра он принимает рассмотренный выше XAP. Этот элемент управления будет формировать правильный HTML-код для создания <object>, представляющего Silverlight в браузере.
В данном разделе было рассмотрено проектирование приложений Silverlight в среде Visual Studio 2008 и предлагаемые студией различные инструменты и шаблоны для разработки приложений Silverlight с использованием языков программирования .NET. Был детально разобран проект, созданный на базе стандартных шаблонов Silverlight, рассмотрены все его файлы и то, как он используется для разработки и развертывания приложения Silverlight.
Далее будут более глубоко рассмотрены функциональные возможности, доступные в .NET Framework, включая создание собственных элементов управления, работу с сетью и обмен информацией, данные и XML, динамические языки программирования и серверные элементы управления ASP.NET.
Пространство имен System.Windows включает ряд основных элементов управления, составляющих сердце каждого приложения Microsoft Silverlight, а именно:
ButtonCheckBoxComboBoxHyperlinkButtonImageListBoxRadioButtonTextBlockTextBox и PasswordBoxDataGridCalendar и DatePickerВ Silverlight кнопка реализуется с помощью элемента управления Button. Кнопка реагирует на ввод пользователя с таких устройств ввода, как мышь, клавиатура или стилус, формируя событие Click (Щелчок). Условия формирования кнопкой события Click могут быть настроены несколькими способами. Они задаются свойством ClickMode (Режим щелчка), которое может принимать значения Hover (Наведение), Press (Нажатие) и Release (Отпустить). Эти значения определяют момент формирования события Click. В первом случае, Hover, событие Click формируется при наведении курсора мыши на кнопку. Во втором случае, Press, оно формируется при нажатии кнопки мыши в момент, когда курсор находится на Button. В третьем случае, Release, это событие возникает, когда пользователь нажимает и отпускает кнопку мыши при наведенном на кнопку курсоре.
<Canvas x:Name="LayoutRoot" Background="White">
<Button
x:Name="b1"
ClickMode="Hover"
Content="Button1"
Click="Button_Click">
</Button>
<Button
x:Name="b2"
Canvas.Top="40"
ClickMode="Press"
Content="Button2"
Click="Button_Click">
</Button>
<Button
x:Name="b3"
Canvas.Top="80"
ClickMode="Release"
Content="Button3"
Click="Button_Click">
</Button>
</Canvas>
И в code-behind задается обработчик события:
private void Button_Click(object sender, RoutedEventArgs e){ }
Как видно, для всех этих кнопок определен обработчик события Click и одна и та же функция, Button_Click, для каждой из них.
Элемент управления Button также является контейнером, поэтому его содержимое можно настроить с помощью XAML. Ниже показаны пример кнопки и код примера.
<Button
x:Name="b4"
Canvas.Top="120"
Click="Button_Click"
Width="100"
Height="100">
<Canvas>
<Ellipse
Fill="Green"
Width="100"
Height="100"
Canvas.Left="-50"
Canvas.Top="-50"/>
<Image
Source="1.jpg"
Height="100"
Width="100"
Canvas.Left="-50"
Canvas.Top="-50"
Stretch="Fill"
Opacity="0.4"/>
<TextBlock Text="Hello" Canvas.Left="-15"
Canvas.Top="-7"/>
</Canvas>
</Button>
(рис 7.6) Пример оформления элемента управления ButtonЭлемент управления Button обеспечивает чрезвычайную гибкость в представлении кнопок, что позволяет создавать разнообразные кнопки в Веб-приложениях.
Элемент управления CheckBox предоставляет пользователю опцию для выбора. Обычно он представляется в виде прямоугольника, в котором пользователь может установить или убрать флажок. Он используется, когда имеется ряд опций на выбор и можно выбрать несколько из них.
При установлении флажка CheckBox формирует событие Checked (Установлен), при снятии флажка формируется событие Unchecked (Снят), и событие Click формируется при каждом щелчке по CheckBox. Аналогично элементу управления Button, CheckBox имеет свойство ClickMode, которому может быть задано значение Hover, Press или Release, определяющее условия формирования события.
CheckBox может быть флажком с тремя состояниями (поддерживается неопределенное состояние). Это определяется свойством IsThreeState (Три состояния). Если это состояние включено, и пользователь переводит CheckBox в неопределенное состояние, свойству IsChecked присваивается значение null.
Значение CheckBox можно получить с помощью свойства IsChecked. Необходимо быть осторожным с IsChecked, когда CheckBox находится в режиме с тремя состояниями, поскольку, если CheckBox в неопределенном состоянии, свойство IsChecked возвращает значение null.
Аналогично элементу управления Button, CheckBox является контейнером. Он имеет свойство Content, с помощью которого можно задавать простую строку текста, которая будет отображаться как надпись рядом с флажком, или можно разместить XAML-код в дочернем теге <Content>, для получения более насыщенного эффекта, например текст с небольшой прозрачностью.
Вот пример каждого из вариантов текста:
<CheckBox
Checked="CheckBox_Checked"
Unchecked="CheckBox_Unchecked"
IsThreeState="True"
Content="Test1">
</CheckBox>
<CheckBox
Checked="CheckBox_Checked"
Unchecked="CheckBox_Unchecked"
IsThreeState="True">
<CheckBox.Content>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Test2"
Opacity="0.3">
</TextBlock>
</StackPanel>
</CheckBox.Content>
</CheckBox>
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
CheckBox c = (CheckBox)sender;
bool b = (bool)c.IsChecked;
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
CheckBox c = (CheckBox)sender;
bool b = (bool)c.IsChecked;
}
При обработке событий Clicked, Checked и Unchecked, в качестве sender будет выступать объект, который необходимо привести к типу CheckBox, чтобы получить доступ к свойствам флажка.
Элемент управления ComboBox (поле со списком) используется для представления списка доступных для выбора элементов. При этом отображается только выбранный элемент, но имеется выпадающее меню с полным списком доступных для выбора элементов.
Список образуют объекты ComboBoxItem (элемент поля со списком), как в данном примере:
<ComboBox
SelectionChanged="ComboBox_SelectionChanged"
Height="20"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Width="65">
<ComboBoxItem>
<TextBlock Text="Item1"></TextBlock>
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="Item2"></TextBlock>
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="Item3"></TextBlock>
</ComboBoxItem>
</ComboBox>
Обработка выбора элемента ComboBox пользователем осуществляется посредством события SelectionChanged (Выбранный элемент изменен) и свойства SelectedItem (Выбранный элемент). Продемонстрируем вариант, когда ComboBox содержит элементы разного типа. Ниже представлен пример, в котором ComboBox включает составные элементы, образованные компонентами StackPanel, в каждом из которых имеется Image и TextBlock.
<ComboBox
SelectionChanged="theList_SelectionChanged"
Margin="0,43,0,0"
Height="22"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Width="65">
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Image
Height="100"
Width="100"
Source="1.jpg"/>
<TextBlock
Text="Item 1"
HorizontalAlignment="Right"
VerticalAlignment="Center">
</TextBlock>
</StackPanel>
</ComboBoxItem>
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Image
Height="100"
Width="100"
Source="2.jpg"/>
<TextBlock
Text="Item 2"
HorizontalAlignment="Right"
VerticalAlignment="Center">
</TextBlock>
</StackPanel>
</ComboBoxItem>
</ComboBox>
(рис 7.7 ) Пример оформления элемента управления ComboBoxДанный фрагмент кода обеспечивает формирование более насыщенного визуального представления элементов ComboBox, включающего изображение и текстовый блок.
HyperlinkButton (Гиперссылка) обеспечивает на странице элемент с возможностью щелчка по нему для перехода по URI, заданному свойством NavigateUri ( Uri перехода).
Например:
<HyperlinkButton
Content="The Official Microsoft Silverlight Site"
NavigateUri="http://silverlight.net/" />
HyperlinkButton - это элемент управления с содержимым, т.е. он может иметь простое свойство Content, содержащее текст, который будет отображаться для гиперссылки, или его содержимое может быть намного более насыщенным и более привлекательным.
Например, если вы хотите, чтобы гиперссылка выглядела как рисунок, это очень просто реализовать, используя дочерний элемент <Hyperlink.Content>, в котором может располагаться изображение. Например:
<HyperlinkButton
NavigateUri="http://www.silverlight.net"
TargetName="_blank">
<StackPanel Width="230">
<Image
Source="SL.png"
HorizontalAlignment="Left"
Stretch="Fill"/>
<dataInput:Label
Height="16"
Content="The Official Microsoft Silverlight Site"/>
</StackPanel>
</HyperlinkButton>
Теперь, когда приложение будет запущено, получится изображение, щелчок по которому обеспечит переход по заданному URL.
(рис 7.8) Пример оформления элемента управления HyperlinkButtonСвойство TargetName определяет, где будет открываться содержимое, располагающееся по заданному URL. Для вывода на экран содержимого URL доступны следующие опции:
blank Открывает новое окно браузера без имени._self Замещает текущую HTML-станицу новым содержимым. Если HTML-станица отображается во фрейме, замещается только содержимое рамки._top Замещает текущую HTML-станицу новым содержимым. Даже если HTML-станица отображается во фрейме, меняется содержимое всего окна браузера._parent Замещает всю HTML-станицу.Если используется фреймовая структура, можно задавать имя используемого фрейма.
Стоит обратить внимание на то, что событие Click для HyperlinkButton формируется перед переходом по заданному URI. Это может быть очень полезным, потому что обеспечивает завершение любой предварительной обработки перед загрузкой нового содержимого.
Элемент управления Image используется для отображения изображений. Он может принимать форматы файлов .bmp, .jpg и .png. Путь к изображению задается свойством Source. Например:
<Image Source="sl.png" Stretch="Fill"/>
Если фактические размеры изображения отличаются от заданных для элемента управления Image (т.е. если имеется элемент Image размером 100 x 100 и в него загружается .jpg -изображение 2000 x 2000 пикселов), управлять поведением отображения можно с помощью свойства Stretch. Оно может принимать следующие значения:
Fill Изменяет размеры изображения соответственно размерам области вывода, используя независимое масштабирование по осям х и у.Uniform Изменяет размеры изображения так, чтобы оно поместилось в элемент управления Image, но при этом сохраняет пропорции изображения.UniformToFill Изменяет размеры изображения так, чтобы оно полностью заполнило область вывода, обрезая его в случае необходимости.None Отображает изображение как есть, что приводит к его обрезке, если оно не помещается в элемент Image.Часто изображение необходимо задать не во время разработки, указывая URI в XAML-коде, а определить его во время выполнения, возможно, как результат обращения к базе данных или чего-либо подобного. В таких случаях в качестве источника для элемента управления Image может использоваться класс BitmapImage (пространства имен System.Windows.Media.Imaging ). Далее приведен пример того, как это делается.
<Image x:Name="_image"/>
public Page1()
{
InitializeComponent();
Uri uri = new Uri("sl.jpg", UriKind.Relative);
_image.Source = new BitmapImage(uri);
}
В данном случае создается новый объект Uri с использованием пути к изображению. Второй параметр в конструкторе - опция, определяющая, как должен вычисляться Uri. Используемый URI может быть относительным (в этом случае поиск заданного ресурса будет вестись в том же каталоге, в котором располагается компонент), абсолютным (в этом случае поиск заданного ресурса будет вестись напрямую, поэтому местоположение должно указываться с применением синтаксиса http://сервер/ресурс) или комбинацией первых двух.
Когда Uri создан, он может использоваться для создания нового BitmapImage, который определяется как источник для элемента управления Image.
Элемент управления ListBox используется для представления содержимого в виде упорядоченного списка. Это достаточно гибкий элемент управления, так что элементы списка могут создаваться из содержимого любого типа, но обычно список образуется элементами ListBoxItem (элемент списка), как показано в следующем примере:
<ListBox
SelectionChanged="ListBox_SelectionChanged"
Height="94"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="75">
<ListBoxItem Content="1"/>
<ListBoxItem Content="2"/>
<ListBoxItem Content="3"/>
<ListBoxItem Content="4"/>
<ListBoxItem Content="5"/>
</ListBox>
Возможность выбора элементов, образующих ListBox, пользователем реализуется посредством события SelectionChanged (Выбранный элемент изменен) и свойства SelectedItem (Выбранный элемент). В предыдущем фрагменте XAML-кода обработкой события SelectionChanged занимался обработчик метода ListBox_SelectionChanged. Свойство SelectedItem возвращает object, а не ListBoxItem, потому что в ListBox могут размещаться разные типы содержимого. Поэтому SelectedItem необходимо приводить к ListBoxItem.
В ListBox может располагаться разное содержимое. Далее приведен пример, когда ListBox включает составные элементы, образованные компонентами StackPanel, каждый из которых содержит Image и TextBlock.
(рис 7.9) Пример оформления элемента управления ListBoxКод примера:
<ListBox
x:Name="_listbox"
SelectionChanged="ListBox_SelectionChanged"
Margin="59,21,0,0"
Width="194"
Height="216">
<StackPanel Orientation="Horizontal">
<Image Height="100" Width="100" Source="1.jpg"/>
<TextBlock
Text="Item 1"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Image Height="100" Width="100" Source="2.jpg"/>
<TextBlock
Text="Item 2"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
</StackPanel>
</ListBox>
Содержимое таких сложных элементов, как представленные здесь, можно получить следующим образом: с помощью SelectedItem получить контейнер (в данном случае, StackPanel ) и затем извлечь из него необходимое содержимое. Например:
StackPanel s = _listbox.SelectedItem as StackPanel; TextBlock t = s.Children[2] as TextBlock; string strTest = t.Text;
Элемент управления RadioButton, подобно CheckBox используется для фиксирования выбора пользователя. Однако отличается от CheckBox тем, что обычно применяется в ситуациях, когда пользователь должен выбрать единственный вариант из ряда предлагаемых опций.
Один из способов управления набором опций с возможностью единственного выбора - задать элементы управления RadioButton, соответствующие опциям, как элементы одного уровня в контейнере. Рассмотрим пример:
<StackPanel
Orientation="Vertical"
Background="Yellow"
Height="163"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="179">
<RadioButton Content="Option 1" IsChecked="true"/>
<RadioButton Content="Option 2"></RadioButton>
<RadioButton Content="Option 3"></RadioButton>
<RadioButton Content="Option 4"></RadioButton>
<StackPanel Orientation="Vertical" Background="White">
<RadioButton Content="Option 5" IsChecked="true"/>
<RadioButton Content="Option 6"></RadioButton>
<RadioButton Content="Option 7"></RadioButton>
<RadioButton Content="Option 8"></RadioButton>
</StackPanel>
</StackPanel>
В данном XAML-коде имеется два контейнера StackPanel, один из которых расположен в другом. Первый контейнер содержит опции 1, 2, 3, и 4 ; второй - опции 5, 6, 7 и 8. В результате, пользователь может выбрать только одну из опций от 1 до 4 и только одну из опций от 5 до 8. Как это работает представлено на рис. 7.10
(рис 7.10) Пример оформления элемента управления RadioButtonКроме того, опции можно сгруппировать, задавая для каждого RadioButton свойство GroupName (Имя группы). В предыдущем примере в StackPanel располагались опции 1 -4, и Silverlight разрешал пользователю приложения выбирать только одну из них. Если потребовалось бы разделить этот набор опций на две группы, чтобы пользователь мог выбирать одну из опций 1 и 2, и одну из опций 3 и 4, вместо контейнера можно было бы использовать группы RadioButton.
<StackPanel Orientation="Vertical" Background="Yellow"> <RadioButton Content="Option 1" IsChecked="true" GroupName="G1"/> <RadioButton Content="Option 2" GroupName="G1" /> <RadioButton Content="Option 3" GroupName="G2" /> <RadioButton Content="Option 4" GroupName="G2" /> <RadioButton Content="Option 5" GroupName="G3" IsChecked="true"/> <RadioButton Content="Option 6" GroupName="G3" /> <RadioButton Content="Option 7" GroupName="G3" /> <RadioButton Content="Option 8" GroupName="G3" /> </StackPanel>
Аналогично элементам управления Button и CheckBox, RadioButton имеет свойство ClickMode, определяющее, какое действие пользователя приводит к формированию события Click. Его возможными значениями являются: Hover, при котором событие формируется уже от того, что пользователь проводит курсором по элементу управления; Press, при котором событие формируется по щелчку кнопки мыши по элементу управления; и Release, при котором кнопка мыши должна быть нажата, а потом отпущена, при нахождении курсора мыши на кнопке выбора. Также аналогично элементу управления CheckBox, состояние выбора отдельного RadioButton может быть проверено с помощью свойства IsChecked.
Элемент управления TextBlock используется в приложениях Silverlight для отображения текста. В самом простом случае, для отображения текст достаточно применить TextBlock с заданным свойством Text. Например:
<TextBlock Text="1234" />
Размер текста можно менять, задавая свойство FontSize (в пикселах). Используемый шрифт определяется свойством FontFamily ; например, XAML-код для вывода текста шрифтом Arial Black размером 20 выглядел бы так:
<TextBlock Text="1234" FontFamily="Arial Black" FontSize="20"/>
Свойство FontStyle определяет, как будет выведен текст, курсивом или обычным шрифтом. Чтобы текст отображался курсивом, свойству FontStyle задается значение Italic:
<TextBlock Text="1234" FontFamily="Arial Black" FontSize="20" FontStyle="Italic"/>
Чтобы использовать обычный шрифт, можно задать свойству FontStyle значение Normal или просто оставить его незаданным.
Разрывы строк и использование разных шрифтов для отображения текста реализуется с помощью подэлементов TextBlock: <LineBreak> и <Run>. Как следует из его имени, <LineBreak> создает разрывы в тексте с переносом остального текста на новую строку. Однако TextBlock не является элементом управления для представления содержимого, как некоторые из элементов управления, которые были представлены в данной главе ранее. Поэтому если необходимо представить текст иначе, чем все остальное содержимое свойства Text, используется элемент управления Run:
<TextBlock Width="400" Text="My first text"> <LineBreak/> <Run>My Second Text</Run> <LineBreak/> <Run>My Third Text</Run> <LineBreak/> <Run>My Fourth Text</Run> </TextBlock>
Элемент управления Run поддерживает те же свойства шрифта, размера, цвета и т.д., что и TextBlock. Таким образом, он предоставляет тот же уровень управления его содержимым, что и TextBlock. Это означает, что текст TextBlock и текст, отображаемый с помощью Run, полностью согласованы.
Silverlight руководствуется правилами замещения системных шрифтов, поэтому если шрифт представлен в
Элемент управления TextBox обеспечивает пользователям область для ввода текста. В самой простой форме TextBox предоставляет область, в которую пользователь может ввести одну строку текста. Чтобы элемент управления TextBox могли принимать многостроковый ввод, надо задать высоту или поместить их в контейнер, обеспечивающий ему нестандартную высоту. Затем свойству AcceptsReturn (Допускаются символы возврата каретки) потребуется задать значение True, благодаря чему элементы управления TextBox сможет принимать символы возврата каретки. Свойство Text такого TextBox возвращает объект типа String, в котором каждая строка будет отделена символом "\r".
Элементы управления TextBox позволяют выбирать подстроки Text и также обеспечивают возможность настроить то, как выглядит выбранный текст. Для задания или возвращения выбранного в настоящий момент текста используется свойство SelectedText (Выбранный текст). Начало выбранной подстроки можно получить с помощью свойства SelectionStart (Начало выбранной подстроки), ее длину - с помощью свойства SelectionEnd (Конец выбранной подстроки). При любом изменении выбора подстроки формируется событие SelectionChanged (Выбранный элемент изменен). Рассмотрим следующий пример:
Во-первых, XAML-код:
<TextBox
Height="100"
AcceptsReturn="True"
Text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
SelectionChanged="TextBox_SelectionChanged"/>
Здесь определяется событие SelectionChanged, для которого определен обработчик события TextBox_SelectionChanged. Рассмотрим:
private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
TextBox t = sender as TextBox;
int st = t.SelectionStart;
int ln = t.SelectionLength;
string strT = t.SelectedText;
}
В данном случае, переменная st типа int содержит индекс начального символа выбранной подстроки (отсчитываемой от нуля), ln - длина выбранной подстроки, и strT - строка, содержащая выбранную подстроку. Итак, например, если выбрана подстрока, как показано на рис. 7.11, st будет равна 9, ln равна 8, и strT будет равна JKLMNOPQ.
(рис 7.11) Пример оформления элемента управления TextBoxТакже в TextBox можно использовать разные шрифты, точно так же как это делается в TextBlock.
Очень похож на TextBox элемент управления PasswordBox (Поле пароля). PasswordBox во многих отношениях практически идентичен TextBox. С помощью свойства PasswordChar (Символ пароля) этого элемента управления можно задать символ, который будет использоваться вместо любого введенного символа для отображения нажатия клавиши. Например, PasswordBox, в котором вводимые символы заменяются символом #, описывается следующим XAML-кодом:
<PasswordBox PasswordChar="#" x:Name="pw"/>
Кроме того, следует отметить, что вводимое пользователем содержимое сохраняется в свойстве Password (Пароль), а не в свойстве Text, поэтому для получения ввода пользователя должно использоваться свойство Password.
Элемент управления DataGrid разработан для облегчения задачи по отображению данных в формате таблицы. Это сетка данных, а не просто сетка, потому что она может быть связана с источником данных.
При добавлении элемента управления TheDataGrid в окно редактирования XAML, получаем такой XAML-код:
<UserControl
xmlns:data=
"clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
x:Class="BusinessApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}">
<data:DataGrid
Name="TheDataGrid"
SelectionChanged="DataGrid_SelectionChanged"
SelectionMode="Extended">
</data:DataGrid>
</Grid>
</UserControl>
private ProductContext _productContext = new ProductContext();
public MainPage()
{
InitializeComponent();
LoadOperation<Product> loadOp =
this._productContext.Load(this._productContext.GetProductQuery());
this.TheDataGrid.ItemsSource = loadOp.Entities;
}
Метод _productContext.GetProductQuery() выбирает из базы данных AdventureWorks все содержимое таблицы Product.
В DataGrid возможны два режима выбора: одиночный, при котором можно выбирать по одной строке, и множественный, при котором при удержании клавиш Ctrl и/или Shift может быть выбрано несколько строк.
Эти режимы задаются с помощью свойства SelectionMode (Режим выбора), которое принимает значения DataGridSelectionMode.Single для одиночного выбора и DataGridSelectionMode.Extended для множественного.
Итак, для единичного выбора выбранные данные могут быть получены this.TheDataGrid.SelectedItem. Когда установлен режим множественного выбора, можно использовать свойство SelectedItems, возвращающее коллекцию списков:
System.Collections.IList listOfItems = this.TheDataGrid.SelectedItems;
В данном случае, свойство SelectedItems возвращает System.Collections.. После этого можно перебрать элементы этого списка.
(рис 7.12) Пример оформления элемента управления DataGrid
Возможность использования дат в приложениях Silverlight обеспечивается элементами управления Calendar (Календарь) и DatePicker (Элемент выбора дат). Элемент управления Calendar выводит на экран дни заданного месяца или месяцы заданного года и предоставляет кнопки со стрелками для перемещения по месяцам или годам. DatePicker сочетает это представление с текстовым полем, в которое пользователь может вводить дату в соответствующем формате, или выпадающим списком, в котором можно выбрать определенную дату (см. рис. 7.13).
(рис 7.13) Пример оформления элементов управления Calendar и DatePickerКод XAML:
<controls:Calendar Name="d1"/> <controls:DatePicker Name="d2"/>
Коллекция BlackoutDates (Недоступные даты) позволяет задавать диапазон дат, которые не могут быть выбраны. Эта коллекция содержит тип CalendarBlackoutDatesCollection (Коллекция диапазона дат календаря), в который могут добавляться диапазоны дат. Все даты, попадающие в этот диапазон, будут отображаться неактивными и, таким образом, не могут быть выбраны.
CalendarBlackoutDatesCollection _blackoutDates = d2.BlackoutDates;
Элемент управления DatePicker сочетает функциональность календаря с текстовым полем. Свойство Text этого поля содержит все, что пользователь вводит в качестве даты. Если невозможно выполнить синтаксический разбор введенных пользователем данных, формируется ошибка TextParseError (Ошибка синтаксического разбора текста). Визуальное представление элемента управления DatePicker включает текстовое поле с датой, и справа от него располагается значок, выбор которого обеспечивает отображение элемента управления Calendar для выбора даты. Когда пользователь щелкает этот значок, формируется событие CalendarOpened (Календарь открыт). Когда пользователь закрывает его, формируется событие CalendarClosed (Календарь закрыт). Элементы управления Calendar и DatePicker обеспечивают базовые средства для создания приложений, в которых ввод основывается на датах и которые могут отображать информацию календаря.
Существует ряд функциональных возможностей, общих для всех или большинства этих элементов управления, таких как обработка фокуса, обработка событий мыши, обработка событий клавиатуры.
Элементы, которые могут принимать ввод, формируют события GotFocus и LostFocus. События GotFocus и LostFocus формируются каждый раз, когда пользователь переходит на или покидает элемент управления, либо наводя курсором мыши, либо используя клавишу Tab. Оба этих события являются событиями, передающимися вверх по иерархии (bubbling events). Это означает, что элемент управления принимает событие, но не обрабатывает его. Событие передается его родителю и так далее вверх по иерархии до тех пор, пока не будет перехвачено обработчиком события.
Элементы управления Silverlight формируют несколько событий мыши:
MouseEnter Событие MouseEnter формируется при входе курсора мыши в область отображения элемента управления.MouseLeave Событие MouseLeave формируется, когда курсор мыши покидает область отображения элемента управления.MouseLeftButtonDown Событие MouseLeftButtonDown формируется при нажатии пользователем левой кнопки мыши, когда курсор находится над элементом управления.MouseLeftButtonUp Событие MouseLeftButtonUp формируется при отпускании удерживаемой левой кнопки мыши, когда курсор находится над элементом управления.MouseMove Событие MouseMove формируется при перемещении курсора по элементу управления.Кроме перечисленных событий для обеспечения максимального контроля могут использоваться методы CaptureMouse и ReleaseMouseCapture. Когда для элемента управления вызывается метод CaptureMouse, все события мыши направляются в этот элемент управления независимо от того, находится ли курсор мыши в его границах или нет. Метод ReleaseMouseCapture, как следует из его имени, возвращает механизм перехвата событий в нормальное состояние. Эти методы очень полезны для реализации перемещения объектов методом "drag-and-drop". Далее представлен пример использования этих событий и методов.
Ниже представлен XAML-документ, обеспечивающий прорисовку эллипсов на странице. Обратите внимание, что для всех эллипсов определены одни и те же обработчики событий мыши:
<Canvas Width="640" Height="480" Background="Wheat">
<Ellipse
Canvas.Top="0"
Fill="Black"
Width="20"
Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
<Ellipse
Canvas.Top="40"
Fill="Black"
Width="20" Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
<Ellipse
Canvas.Top="80"
Fill="Black"
Width="20" Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
<Ellipse
Canvas.Top="120"
Fill="Black" Width="20"
Height="20"
MouseLeftButtonDown="Ellipse_MouseLeftButtonDown"
MouseLeftButtonUp="Ellipse_MouseLeftButtonUp"
MouseMove="Ellipse_MouseMove" />
</Canvas>
Теперь рассмотрим выделенный код. Во-первых, нам необходимы переменные для сохранения х и у координат курсора мыши в момент начала перемещения методом "drag-and-drop" и еще одна переменная для обозначения того, удерживается ли кнопка мыши в настоящий момент. Если курсор находится над любой из кнопок, и нажимается кнопка мыши, выполняется функция Ellipse_MouseLeftButtonDown.
double beginX = 0;
double beginY = 0;
bool isMouseDown = false;
private void Ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Ellipse b = sender as Ellipse;
beginX = e.GetPosition(this).X;
beginY = e.GetPosition(this).Y;
isMouseDown = true; b.CaptureMouse();
}
Отправителем является универсальный объект, поэтому, прежде всего, необходимо привести его к типу эллипс. После этого используем аргумент MouseButtonEventArgs (Аргументы событий кнопки мыши) для получения текущих координат х и у и задания их как начальных значений. Затем, поскольку кнопка мыши удерживается нажатой, ее перемещения должны отслеживаться, поэтому переменной isMouseDown задается значение True. Наконец, мы хотим отслеживать события мыши для этого эллипса (любого из заданных) таким образом, чтобы даже если пользователь уводит курсор мыши с этого эллипса, он продолжал получать события.
Итак, поскольку пользователь двигает мышью, должно формироваться событие MouseMove. Оно обрабатывается функцией-обработчиком события Ellipse_MouseMove:
private void Ellipse_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
Ellipse b = sender as Ellipse;
double currX = e.GetPosition(this).X;
double currY = e.GetPosition(this).Y;
b.SetValue(Canvas.LeftProperty, currX);
b.SetValue(Canvas.TopProperty, currY);
}
}
Это событие формируется при прохождении курсора мыши по эллипсу, независимо от того, выполняется ли перемещение этого эллипса или нет. Но нас интересуют только варианты, когда пользователи перетягивает эллипс, а это, по определению, означает, что переменная isMouseDown имеет значение True. В этом случае мы получаем текущие координаты курсора мыши и используем их для задания присоединенных свойств Top и Left эллипса. В результате будет создан эффект перетягивания эллипса соответственно координатам курсора мыши.
Наконец, при отпускании удерживаемой кнопки мыши формируется событие MouseLeftButtonUp, перехватываемое функцией Ellipse_MouseLeftButtonUp:
private void Ellipse_MouseLeftButtonUp(object sender,
MouseButtonEventArgs e)
{
Ellipse b = sender as Ellipse;
isMouseDown = false;
b.ReleaseMouseCapture();
}
Это обеспечивает возвращение переменной isMouseDown к исходному значению, и элемент управления, отслеживающий события мыши, прекращает делать это. В результате восстанавливается обычное поведение мыши, а эллипс остается передвинутым в другое место. Все это в действии можно увидеть на рис. 7.14.
(рис 7.14) Пример использования событий мыши для реализации перемещения объектов методом "Drag-and-drop"На рисунке показано, как приложение выглядит в исходном состоянии. Если пользователь наведет курсор мыши на любой из эллипсов и затем нажмет кнопку мыши и продолжит перемещение, эллипс начнет двигаться за курсором. Таким образом, пользователь может менять расположение эллипсов на экране методом "drag-and-drop".
Кроме элемента управления TextBox, который предлагает пользователю возможность ввода текста с клавиатуры, многие элементы управления формируют события KeyDown и KeyUp, которые могут использоваться для перехвата ввода с клавиатуры. Событие KeyDown формируется при каждом нажатии клавиши, когда фокус находится на элементе. Функция-обработчик этого события принимает универсальный объект-отправитель и объект KeyEventArgs, который может использоваться для извлечения информации о нажатой клавише. Он имеет свойство key, возвращающее объект Key с информацией о клавише. Это платформонезависимое свойство, поэтому оно лучше всего подходит для использования в приложениях Silverlight. KeyEventArgs предлагает также еще одно свойство, PlatformKeyCode (Код клавиши на данной платформе), которое может использоваться со свойством key для получения кодов клавиш, используемых в конкретной
операционной системе.
Кроме того, статическое свойство Keyboard.Modifers возвращает значение ModifierKeys (Модифицирующие клавиши), которое может использоваться для определения того, какая из модифицирующих клавиш (Alt, Ctrl, Shift, Windows) была нажата. Просто используйте побитовое И на возвращенное значение свойства для проверки искомой модифицирующей клавиши (например, Shift).
Стиль создается в разделе <Resources> (Ресурсы) контейнера. Здесь может быть создан один или более стилей, для которых задается имя стиля и тип объекта, к которому будет применяться стиль. Например, чтобы создать стиль TextBlockStyle (Стиль текстового блока) для элемента управления TextBlock, используется такой XAML:
<UserControl.Resources>
<Style TargetType="TextBlock" x:Key="TextBlockStyle">
<Setter Property="FontFamily" Value="Comic Sans Ms"></Setter>
<Setter Property="Foreground" Value="MediumBlue"></Setter>
<Setter Property="FontSize" Value="30"></Setter>
</Style>
</UserControl.Resources>
Для стиля задается тип элемента управления, к которому он может применяться. Однако то, что этот стиль предполагается для TextBlock, не означает, что все экземпляры TextBlock будут использовать его. Вы не ограничены одним стилем для одного типа. В стиле должен быть задан тип элемента управления, для которого предназначен стиль, а также может быть задан Key (Ключ) стиля. Таким образом, можно иметь множество разных описаний стилей для элемента управления TextBlock с разными Key. Тогда, задавая свойство Style (Стиль) для разных TextBlock, вы просто выбираете тот стиль, который желаете применить к тому или иному TextBlock, по имени. Это будет продемонстрировано через мгновение, но сначала рассмотрим настройку стиля свойств TextBlock. Для этого используется Setter (Установщик). Setter - это тег XAML, определяющий свойство и значение, которое необходимо задать этому
свойству.
Этот стиль должен быть определен на странице как ресурс. Как видите, корневым элементом XAML на странице является UserControl. У него есть дочерний элемент <UserControl.Resources>. Тег <Style> помещается в него.
Применяется этот стиль к TextBlock посредством свойства Style. Поскольку стиль определен как ресурс, для задания имени стиля используется синтаксис с ключевым словом StaticResource (Статический ресурс):
<TextBlock
Text="Click!"
Style="{StaticResource TextBlockStyle}"/>
Теперь все свойства, применяемые к элементам управления TextBlock кнопки, задаются в одном месте, что значительно упрощает обслуживание и делает XAML удобным для восприятия и понимания.
В данном случае действие стиля ограничено рамками одного пользовательского элемента управления UserControl. Чтобы расширить стиль на все страницы приложения, необходимо поместить стиль в контейнер <Application.Resources> файла App.xaml.
<Application.Resources>
<Style TargetType="TextBlock" x:Key="TextBlockStyle">
<Setter Property="FontFamily" Value="Arial"></Setter>
<Setter Property="Foreground" Value="MediumBlue"></Setter>
<Setter Property="FontSize" Value="30"></Setter>
</Style>
</Application.Resources>
В Silverlight можно определить стиль сразу всего элемента управления, включающего несколько других элементов, например, Button и образующих его элементов управления, т.е. StackPanel, Image и TextBlock.
Шаблоны действуют абсолютно аналогично стилям: размещаются в разделе <Resources> и описываются с помощью тега Setter. Чтобы создать Template (Шаблон), задается свойство Template и затем с помощью <Setter.Value> определяется ControlTemplate для заданного элемента управления:
<UserControl.Resources>
<Style TargetType="TextBlock" x:Key="TextBlockStyle">
<Setter Property="FontFamily" Value="Comic Sans Ms"></Setter>
<Setter Property="Text" Value="Click!"></Setter>
<Setter Property="Foreground" Value="MediumBlue"></Setter>
<Setter Property="FontSize" Value="15"></Setter>
</Style>
<Style x:Key="ImageButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Button>
<Button.Content>
<StackPanel Orientation="Vertical">
<Image
Source="1.jpg"
Height="48" Width="48">
</Image>
<TextBlock
Style="{StaticResource TextBlockStyle}">
</TextBlock>
</StackPanel>
</Button.Content>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Button Style="{StaticResource ImageButton}"/>
<Button Content="Button2"/>
В результате получится кнопка, как показано на рис. 7.15
(рис 7.15) Применение шаблона и стиля к элементу управления Button
В данном разделе изучен некоторый базовый набор элементов управления Silverlight. Всего элементов управления после установки Silverlight SDK и Toolkit - 79. Так же показан способ применения шаблонов и стилей к элементам управления. Они позволяют унифицировать и настраивать внешний вид и поведение всех создаваемых вами элементов управления во всем приложении Silverlight.
В следующей таблице отражена совместимость Silverlight различных версий с браузерами и операционными системами.
| Начало формы ПлатформаКонец формы | Требования |
|---|---|
| ПК Windows | Процессор X86 или x64 500 МГц, 128 Мб ОЗУ |
| Mac OS 10.4.8+ (PowerPC) | Процессор PowerPC G4 800 МГц, 128 Мб ОЗУ |
| Mac OS 10.4.8+ (Intel-based) | Процессор Intel Core Duo 1.83 ГГц , 128 Мб ОЗУ Конец формы |
http://vogue.ru/photoviewer - сайт журнала Vogue, просмотр платьев, костюмов и другой модной одежды
http://www.silverlightshow.net/items/Virtual-earth-deep-zooming.aspx - работа приложения Silverlight с веб-сервисом Microsoft Virtual Earth. Демонстрация технологии DeepZoom. География.
http://demo.mapdotnet.com/MDNUXHurricaneDemo - работа приложения Silverlight с географическим веб-сервисом Microsoft Bing. Демонстрация технологии DeepZoom. Ветры.
http://demo.mapdotnet.com/mdnuxpropertygeomsample - работа приложения Silverlight с географическим веб-сервисом Microsoft Bing. Цены на участки земли в США.
http://demos.telerik.com/silverlight - примеры бизнес приложений. Акции
http://demos.telerik.com/wpf - реализовано с помощью Windows Presentation Foundation
http://demos.telerik.com/silverlight - реализовано с помощью Silverlight
http://www.silverlightbuzz.com/2009/08/03/obama-to-jfk-deep-zoom - Демонстрация технологии DeepZoom. Президенты США от Обамы до Кеннеди (Obama to JFK Deep Zoom)
http://news.sportbox.ru - новостной спортивный сайт sportbox.ru. Внедрена технология Smooth Streaming для повышения качества передачи видео с сайта и его автоматической настройки для пользователей в любом регионе.
http://www.prlib.ru - сайт президентской Библиотеки им. Б.Н. Ельцина - зарегистрированные посетители могут изучать оцифрованные материалы в режиме 2D и 3D, а также масштабировать графические объекты до нужных деталей
http://media.mariinsky.ru - сайт Мариинского театра - медиа-центр, который позволяет просматривать через Интернет видеозаписи, трансляции концертных выступлений в высоком разрешении, фотографий и т.д.
http://www.microsoft.com/silverlight, http://silverlight.net - официальные сайты технологии Silverlight
http://msdn.microsoft.com/ru-ru/silverlight - центр разработки Silverlight
http://silverlighter.ru - Сообщество пользователей Silverlight
http://www.iis.net/extensions/SmoothStreaming - описание и загрузка Smooth Streaming
http://www.microsoft.com/rus/expression - описание пакета Microsoft Expression Studio
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.