ASP.NET AJAX Control Toolkit

62

К этому моменту может показаться, что допустимо создать специальный элемент управления ASP.NET, который визуализирует клиентский код JavaScript, использующий клиентские библиотеки ASP.NET AJAX. Фактически, именно это в основном и делают рассмотренные до сих пор элементы управления ASP.NET AJAX (UpdatePanel, UpdateProgress и Timer). Реализация данного подхода достаточно проста. Понадобится просто добавить код, который регистрирует специальный код JavaScript в ScriptManager внутри страницы, и визуализировать необходимую базовую HTML-разметку и JavaScript-код, который создает элемент управления.

Хотя такой подход работает, он утомителен и излишне ограничен. Проблема в том, что ASP.NET AJAX не просто позволяет разрабатывать новые типы элементов управления, но также создавать эффекты, которые применимы к многочисленным элементам управления. Фактически эти универсальные эффекты - такие как автоматическое завершение, перетаскивание, анимация, изменение размеров, сворачивание, редактирование с применением масок, и т.д. - представляют наиболее распространенный способ работы с ASP.NET AJAX.

По этой причине ASP.NET AJAX поощряет применение другой модели - модели, которая для добавления функциональности ASP.NET AJAX к существующим элементам управления использует расширители элементов управления. С помощью расширителей элементов управления эффекты Ajax можно добавлять к существующей странице, не изменяя используемый ею набор элементов управления.

Собственно платформа ASP.NET не содержит какие-либо расширители элементов управления. Их включает в себя инструментарий ASP.NET AJAX Control Toolkit - замечательная коллекция элементов управления и расширителей элементов управления, которые используют функции ASP.NET AJAX, но могут быть помещены на веб-страницу, подобно любому обычному серверному элементу управления.

Наиболее примечательная особенность инструментария ASP.NET AJAX в том, что он разрабатывается с применением совместной модели с открытым исходным кодом, которая позволяет принимать участие в разработке всему сообществу. Инструментарий ASP.NET Control Toolkit AJAX является бесплатным и включает полный исходный код, что делает его прекрасным выбором для разработчиков, стремящихся украсить свои веб-страницы эффектами Ajax, и разработчиков, которые хотят научиться создавать собственные расширители элементов управления.

В последующих разделах мы испытаем в действии AutoCompleteExtender из ASP.NET Control Toolkit и бегло рассмотрим другие возможности, предлагаемые этим средством.

Установка инструментария ASP.NET AJAX Control Toolkit

Чтобы получить инструментарий ASP.NET AJAX Control Toolkit, перейдите к странице Ajax Control Toolkit. Следуя ссылкам, можно перейти к странице загрузки CodePlex, которая предлагает несколько вариантов загрузки в зависимости от версии .NET и от того, нужен ли исходный код. На момент написания этих строк самой простой опцией загрузки был ZIP-файл размером в 11 Мбайт по имени AjaxControlToolkit.Binary.NET4.zip, который разработан для ASP.NET 4 и не включает исходный код. После загрузки этого ZIP-файла содержащиеся в нем файлы можно извлечь в постоянное место хранения на жестком диске.

ZIP-файл содержит центральную сборку AjaxControlToolkit.dll и ряд более мелких сопровождающих сборок, которые поддерживают локализацию для различных культур. Вы увидите также архивированную папку AjaxControlToolkitSampleSite, которая содержит огромный образец веб-сайта, демонстрирующий все компоненты инструментария ASP.NET AJAX Control Toolkit, и файл ReadMe.html с инструкциями по установке.

Чтобы приступить к разработке с применением ASP.NET AJAX Control Toolkit, можно было бы просто скопировать сборку AjaxControlToolkit.dll (и специфичные для данной культуры подпапки) в каталог Bin своего веб-приложения. Однако задача значительно упрощается, если позволить Visual Studio добавить компоненты в панель инструментов Toolbox. Для этого выполните перечисленные ниже действия:

  1. Удостоверьтесь, что папка SampleWebSite находится в подходящем месте на жестком диске. В случае перемещения папки SampleWebSite после завершения этого процесса Visual Studio будет не в состоянии обнаружить сборку AjaxControlToolkit.dll. В результате не получится добавить необходимую ссылку на сборку при перетаскивании элементов управления на веб-страницу. (Единственный способ решения этой проблемы - удаление элементов управления из Toolbox и затем их повторное добавление из нового расположения.)

  2. Создайте в Visual Studio новую вкладку панели инструментов для размещения элементов управления. Щелкните в панели инструментов правой кнопкой мыши и выберите пункт Add Tab (Добавить вкладку) в контекстном меню. Введите имя вкладки (например, AJAX Toolkit) и нажмите <Enter>.

  3. Теперь в новую вкладку нужно добавить элементы управления. Щелкните правой кнопкой мыши на созданной пустой вкладке и выберите пункт Choose Items (Выбрать элементы) в контекстном меню.

  4. В диалоговом окне Choose Toolbox Items (Выбор элементов панели инструментов) щелкните на кнопке Browse (Обзор). Найдите сборку AjaxControlToolkit.dll и щелкните на кнопке OK.

  5. Теперь все компоненты из сборки AjaxControlToolkit.dll отобразятся в списке, будут выделены, а флажки рядом с каждым из них будут установлены. Чтобы добавить на вкладку AJAX Toolkit все элементы управления одним действием, щелкните на кнопке OK.

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

Добавление ASP.NET AJAX Control Toolkit в панель инструментов Toolbox

Теперь компоненты из ASP.NET AJAX Control Toolkit можно использовать в любой веб-странице любого веб-сайта. Начните с добавления к веб-странице элемента управления ScriptManager. Затем перейдите к созданной ранее вкладке AJAX Toolkit и перетащите нужный элемент управления ASP.NET AJAX на свою страницу. При первом добавлении компонента из ASP.NET Control Toolkit AJAX среда Visual Studio скопирует сборку AjaxControlToolkit.dll в папку Bin веб-приложения, наряду со сборками локализации.

Инструментарий ASP.NET Control Toolkit AJAX содержит множество полезных компонентов. В последующих разделах более подробно рассматривается компонент AutoCompleteExtender.

Компонент AutoCompleteExtender

Команда ASP.NET делала все возможное, чтобы избежать дублирования существующих элементов управления разновидностями ASP.NET AJAX. Например, может показаться заманчивым создание серверного элемента управления AutoCompleteTextBox. Однако это сопряжено с рядом проблем:

Более рациональным решением было бы добавление динамических средств к веб-сайту без замены уже используемых элементов управления. Делает это возможным еще одна новая концепция ASP.NET AJAX, которая называется расширителями элементов управления. Расширители элементов управления - это фрагменты функциональности в стиле Ajax, которые подключаются к обыкновенным серверным элементам управления, Чтобы использовать определенное средство, понадобится просто добавить требуемый расширитель элемента управления и присоединить его к соответствующему элементу управления.

Одним из примеров может служить AutoCompleteExtender, который позволяет отображать список предположений, когда пользователь осуществляет ввод в другом элементе управления (таком как текстовое поле).

Хотя имя AutoCompleteExtender, как и имена многих расширителей элементов управления, завершается словом Extender, это характерно не для всех расширителей. В следующем разделе приведен краткий обзор с перечнем всех расширителей и всех обычных элементов управления в ASP.NET AJAX Control Toolkit.

Влияние AutoCompleteExtender на работу обычного серверного элемента управления TextBox продемонстрировано на рисунке ниже. Во время ввода текстом пользователем раскрывающийся список предлагает возможные варианты. Если пользователь щелкает на одном из этих элементов списка, соответствующий текст копируется в текстовое поле:

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

Создание этого примера достаточно просто. Сначала на страницу нужно добавить элемент управления ScriptManager. Затем необходимо добавить обычное текстовое поле. Затем должен быть добавлен элемент управления AutoCompleteExtender, который расширяет текстовое поле средством автозавершения. Трюк в том, что список предположений должен быть получен из веб-метода, который понадобится создать. Ниже приведен пример веб-службы AutoCompleteService, содержащей метод GetNames(), который предоставляет список предположений:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Web.Configuration;
using System.Data.SqlClient;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class AutoCompleteService : System.Web.Services.WebService 
{
    [WebMethod]
    public string HelloWorld() {
        return "Hello World";
    }

    [System.Web.Services.WebMethod]
    [System.Web.Script.Services.ScriptMethod]
    public List<string> GetNames(string prefixText, int count)
    {
    	// ...
    }
    
    // Вспомогательный метод
    private static List<string> GetNameListFromDB()
    {
        // ...
    }
    
}

Ниже показана разметка исходной страницы:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="AutoCompleteTextBox" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

<!DOCTYPE html>
<html>
<head id="Head1" runat="server">
    <title>Основы ASP.NET</title>
    <style>
        .textbox {
            position: absolute;
            width: 400px;
            height: 32px;
            top: 10%;
            left: 50%;
            margin-left: -200px;
            font-family: Georgia, serif;
            font-size: 24px;
            font-style: italic;
            font-weight: normal;
            letter-spacing: normal;
            padding: 4px 4px 6px 4px;
            border: 1px solid #ddd;
            font-weight: bold;
            color: #59a6d6;
            border-radius: 5px;
            box-shadow: 1px 1px 3px #000;
        }

        .textbox:focus {
            box-shadow:0px 0px 8px #59a6d6;
        }

        .listitem, .listitemhighlight {
            padding:10px;
        }
        .listitem:hover {
            cursor:pointer;
            background:#15a4ee;
            color:white;
        }
        
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server" CssClass="textbox" autocomplete="off" />
            <ajaxToolkit:AutoCompleteExtender ID="autoComplete1" runat="server"
                TargetControlID="TextBox1" ServicePath="AutoCompleteService.asmx"
                ServiceMethod="GetNames" MinimumPrefixLength="2" 
                CompletionListItemCssClass="listitem">
            </ajaxToolkit:AutoCompleteExtender>
            <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" CombineScripts="false" />
        </div>
    </form>
</body>
</html>

Обратите внимание, что AutoCompleteExtender привязывается к соответствующему серверному элементу управления через свойство AutoCompleteExtender.TargetControlID. Он использует также свойство MinimumPrefixLength, которое позволяет дождаться, пока пользователь не ввел определенное количество букв, прежде чем предлагать список предположений. Эта функция полезна, если список настолько длинный, что единственный символ не позволяет вывести полезный список предположений.

Наиболее трудоемкая часть этого примера - создание веб-метода GetNames(). Он принимает два параметра, которые указывают текст, уже введенный пользователем, и требуемое количество соответствий (которое по умолчанию равно 10). Ниже показано определение этого метода для веб-службы AutoCompleteService:

public class AutoCompleteService : System.Web.Services.WebService 
{
    [System.Web.Services.WebMethod]
    public List<string> GetNames(string prefixText, int count)
    {
        List<string> names = null;

        // Загрузить список имен из кэша
        if (HttpContext.Current.Cache["NameList"] == null)
        {
            // Если список еще не сохранен в кэше, то создать его.
            // GetNameListFromDB() - вспомогательный метод с кодом ADO.NET 
            // для извлечения данных из базы Northwind
            names = GetNameListFromDB();

            // Сохранить список в кэше на 60 минут
            HttpContext.Current.Cache.Insert("NameList", names, null,
              DateTime.Now.AddMinutes(60), TimeSpan.Zero);
        }
        else
        {
            // Загрузить из кэша список имен
            names = (List<string>)HttpContext.Current.Cache["NameList"];
        }

        int index = -1;
        for (int i = 0; i < names.Count; i++)
        {
            // Остановить, если поиск переходит к следующей букве.
            // (Это повышает производительность.)
            if (names[i].StartsWith(prefixText, StringComparison.InvariantCultureIgnoreCase))
            {
                index = i;
                break;
            }
        }

        // Остановить поиск при отсутствии соответствия
        if (index == -1) return new List<string>();

        List<string> wordList = new List<string>();
        for (int i = index; i < (index + count); i++)
        {
            // Остановить, если достигнут конец списка
            if (i >= names.Count) break;

            // Остановиться, если имена перестают соответствовать вводу
            if (!names[i].StartsWith(prefixText, StringComparison.InvariantCultureIgnoreCase)) break;

            wordList.Add(names[i]);
        }

        return wordList;
    }
    
    // ...
}

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

public class AutoCompleteService : System.Web.Services.WebService 
{
    // ...
    
    private static List<string> GetNameListFromDB()
    {
        string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand("SELECT ContactName FROM Customers ORDER BY ContactName", con);

        List<string> names = new List<string>();

        try
        {
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                names.Add((string)reader["ContactName"]);
            }
            reader.Close();

            return names;
        }
        finally
        {
            con.Close();
        }
    }
}

Этот список кэшируется на протяжении часа, чтобы обеспечить быстрое извлечение. После того как список получен, его нужно сократить так, чтобы он включал только 10 предположений, наиболее близко соответствующих введенным символам. В этом примере список уже упорядочен. Это означает, что нужно просто найти начальную позицию - первое соответствие, которое начинается с тех же букв, что и префиксный текст.

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

Комплект инструментов ASP.NET AJAX Control Toolkit

AutoCompleteExtender - только один из множества компонентов, которые входят в состав ASP.NET Control Toolkit. Доступные в настоящее время расширители элементов управления перечислены в таблице ниже, а элементы управления - во второй таблице:

Расширители элементов управления, доступные в ASP.NET AJAX Control Toolkit
Имя Описание
AlwaysVisibleControlExtender

Этот расширитель фиксирует элемент управления в определенной позиции (например, в верхнем левым углу веб-страницы) даже при прокрутке содержимого страницы

AnimationExtender

Этот мощный и удивительно гибкий расширитель позволяет добавлять анимационные эффекты, такие как изменение размеров, перемещение, затухание, изменение цвета и многие другие, по отдельности или в комбинации друг с другом

AutoCompleteExtender

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

CalendarExtender

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

CascadingDropDown

Этот расширитель позволяет присоединять раскрывающиеся списки, не прибегая к кодированию решения вручную

CollapsiblePanelExtender

Этот расширитель позволяет сворачивать и разворачивать панели на странице. Остальная часть содержимого страницы обтекает их автоматически

ColorPickerExtender

Этот расширитель отображает всплывающий инструмент для выбора цвета, который может быть присоединен к текстовому полю для облегчения выбора цвета

ConfirmButtonExtender

Этот расширитель перехватывает щелчки на элементах управления Button, LinkButton или ImageButton и выводит на экран подтверждающее сообщение. Событие щелчка подавляется, если пользователь решает отменить действие в диалоговом окне подтверждения

DragPanelExtender

Этот расширитель позволяет перетаскивать панель по странице

DropDownExtender

Этот расширитель превращает практически любой элемент управления в раскрывающийся, когда курсор мыши помещается поверх него. Например, DropDownExtender можно использовать в сочетании с обычным элементом управления Label. Тогда пользователь сможет переместить курсор мыши над ним, выбрать другой элемент из списка (тем самым изменяя текст в метке) и затем сместить курсор мыши с элемента управления (позволяя метке вернуться к своему обычному виду)

DropShadowExtender

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

DynamicPopulateExtender

Этот простой расширитель заменяет содержимое элемента управления результатом вызова метода веб-службы

FilteredTextBoxExtender

Этот расширитель позволяет запретить ввод определенных символов в текстовом поле (например, букв в текстовом поле, которое содержит числовые данные). Он предназначен для дополнения проверки достоверности, а не ее замены, поскольку злоумышленники могут обойти фильтрацию, изменяя визуализированную страницу или отключая JavaScript в браузере

HoverMenuExtender

Этот расширитель позволяет отображать содержимое во всплывающем окне рядом с элементом управления, когда пользователь задерживает курсор мыши над ним

ListSearchExtender

Этот расширитель позволяет пользователю искать элементы в ListBox или DropDownList, вводя первые несколько букв текста элемента. Элемент управления ищет элементы и переходит к первому соответствию, по мере того как пользовательские вводит текст

MaskedEditExtender

Этот расширитель ограничивает вид допустимого ввода в текстовом поле с использованием маски. (Маска - это строка, которая определяет модель текста фиксированной длины и предоставляет готовые символы для облегчения пользователю ввода. Например, маска телефонного номера может отображать в текстовом поле набор символов "(___)___-____". По мере того как пользователь выполняет ввод, заполнители заменяются допустимыми цифрами, а нечисловые символы отклоняются.) MaskedEditExtender можно применять в сочетании с MaskedEditValidator, гарантируя, что пользователь не сможет обойти код JavaScript и ввести недопустимое значение

ModalPopupExtender

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

MultiHandleSliderExtender

Этот расширитель преобразует обычный элемент управления TextBox в ползунок. Однако этот ползунок обладает функциями, которые выходят за рамки его стандартного серверного эквивалента ASP.NET. Наиболее примечательно то, что поддерживается несколько ползунков, которые могут перетаскиваться вдоль дорожки независимо друг от друга. Это полезно, когда ползунок предназначен для указания диапазона значений

MutuallyExclusiveCheckBoxExtender

Этот расширитель позволяет связывать "ключ" с несколькими элементами управления CheckBox. Когда пользователь щелкает на флажке, который расширен подобным образом, отметка с любого другого флажка с тем же самым ключом снимается автоматически

NumericUpDownExtender

Этот расширитель присоединяется к текстовому полю, чтобы обеспечить конфигурируемые кнопки стрелок вверх и вниз (справа от него). Эти кнопки увеличивают числовое значение или значение даты в текстовом поле

PagingBulletedListExtender

Этот расширитель присоединяется к элементу управления BulletedList и придает ему возможности разбиения на страницы на стороне клиента, что позволяет разделить длинный список на меньшие разделы

PasswordStrength

Этот расширитель присоединяется к текстовому полю. По мере ввода он ранжирует криптографическую надежность значения текстового поля (чем выше показатель, тем большую трудность пароль представляет для взлома). Этот расширитель предназначен для использования в качестве ориентира для поля создания пароля

PopupControlExtender

Этот расширитель предоставляет всплывающее содержимое, которое может отображаться рядом с любым элементом управления

ResizableControlExtender

Этот расширитель позволяет пользователю изменять размеры элемента управления с помощью конфигурируемого маркера, который отображается в нижнем правом углу

RoundedCornersExtender

Этот расширитель скругляет углы любого элемента управления, придавая ему аккуратный, профессиональный внешний вид

SliderExtender

Этот расширитель преобразует текстовое поле в графический ползунок, который позволяет пользователю выбирать числовое значение, перетаскивая ползунок в позицию на дорожке

SlideShowExtender

Этот расширитель присоединяется к изображению, заставляя его выводить на экран последовательность изображений. Изображения предоставляются посредством метода веб-службы, и показ слайдов может выполняться в бесконечном цикле или с применением созданных кнопок воспроизведения, паузы и перехода к предыдущему или следующему изображению

TextBoxWatermarkExtender

Этот расширитель позволяет автоматически изменять цвет фона и предоставлять определенный текст, когда элемент управления TextBox пуст. Например, текстовое поле могло бы включать светло-серый текст "Введите значение на бледно-синем фоне". Этот текст исчезает, когда курсор помещается в текстовое поле или немедленно после ввода значения

ToggleButtonExtender

Этот расширитель превращает обычный элемент управления CheckBox из ASP.NET во флажок с изображением

UpdatePanelAnimationExtender

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

ValidatorCalloutExtender

Расширяет логику клиентской стороны элементов управления проверкой достоверности ASP.NET, чтобы они использовали всплывающие выноски проверки достоверности, которые указывают на элемент управления с недопустимым вводом

Элементы управления, доступные в ASP.NET AJAX Control Toolkit
Имя Описание
Accordion

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

AsyncFileUpload

Этот элемент управления подобен веб-элементу управления FileUpload, за исключением того, что он выполняет его работу асинхронно, разрешая пользователю продолжить взаимодействовать со страницей. (Очевидно, что обратная отправка страницы или переход к новой странице прервут асинхронную передачу файлов.) Элемент управления AsyncFileUpload может быть также сконфигурирован для отображения другого элемента управления во время загрузки. Обычно этот второй элемент управления (на который ссылается свойство ThrobberID) отображает простую анимацию, что ставит пользователя в известность о продолжении выполнения загрузки

ComboBox

Этот элемент управления был создан по примеру поля со списком Windows, которое предоставляет раскрывающийся список (подобный элементу управления DropDownList ASP.NET) и позволяет пользователю вводить произвольный текст (как элемент управления TextBox в ASP.NET). Он воспринимает многие элементы интерфейса программирования и большинство соглашений своего Windows-аналога

Editor

Этот удивительно мощный элемент управления предоставляет средства редактирования HTML-разметки, а также панель инструментов команд. Пользователь может переключиться между тремя представлениями: Html (которое отображает код разметки), Design (отображающее корректно визуализированное представление, подобно текстовому процессору) и Preview (которое аналогично Design, но без возможности редактирования)

NoBot

Этот элемент управления выполняет несколько проверок, пытаясь выяснить, не осуществляет ли доступ к странице автоматизированная программа (робот), а не человек. Если NoBot решит, что доступ к странице производится роботом, запрос будет отклонен. Это позволяет предотвратить выполнение программ, которые крадут содержимое или отправляют в блог спам-комментарии, хотя, понятно, его можно обойти.

Например, NoBot вынуждает браузер выполнить вычисление с помощью JavaScript, которое использует HTML DOM, и передает результат, предназначенный для выявления обращений к странице, инициированных не браузером. NoBot может также отклонять запросы, которые выполняют обратную отправку формы слишком быстро или повторяют ее слишком часто в течение определенного интервала. Оба эти вида поведения наводят на мысль, что действует автоматизированная программа, а не человек

Rating

Этот элемент управления позволяет пользователям устанавливать рейтинг, перемещая курсор мыши над последовательностью значков звездочек, пока не будет выделено требуемое их количество

ReorderList

Этот элемент управления создает шаблонный список с возможностью прокрутки, который позволяет пользователю изменять порядок следования пунктов, перетаскивая их

Seadragon

Этот усовершенствованный элемент управления позволяет пользователю в широких пределах масштабировать изображение, поддерживающее очень большое увеличение, В действительности эти изображения составлены из серии намного меньших мозаичных фрагментов, управление которыми производится на веб-сервере. Для создания изображения Seadragon нужен бесплатный инструмент Deep Zoom Compose. Следует также отметить, что эти увеличиваемые изображения являются значительно более громоздким средством, чем встроенное в Silverlight

TabContainer

Этот элемент управления напоминает вкладки, отображаемые в Windows. Каждая вкладка имеет заголовок, и пользователь переходит от одной вкладки к другой, щелкая на заголовках

Чтобы использовать любой из этих элементов управления или расширителей элементов управления, нужно просто перетащить их на форму, установить соответствующие свойства и запустить страницу. По адресу www.asp.net/ajax/ajaxcontroltoolkit все компоненты ASP.NET AJAX Control Toolkit можно опробовать в онлайновом режиме.

Пройди тесты
Лучший чат для C# программистов