Опубликован: 24.03.2009 | Уровень: для всех | Доступ: платный
Лекция 6:

Элемент управления браузера Silverlight

< Лекция 5 || Лекция 6: 12345 || Лекция 7 >

Пользовательский контекст

В элемент управления Silverlight может передаваться дополнительный параметр - параметр контекста. Он включается непосредственно в событие onLoad как второй параметр. Обычно для него используется имя userContext (Пользовательский контекст). Его поведение абсолютно аналогично представленным ранее параметрам: он имеет значение, которое может быть запрошено после формирования визуального представления элемента управления. Однако, как правило, пользовательский контекст используется не как параметр элемента управления, а как переменная ссылочного типа для различия элементов управления, хотя ничто не мешает задавать его для параметризации вашего элемента управления.

Далее представлен пример страницы, на которой размещаются три элемента управления Silverlight. Обратите внимание, что переменные имени и контекста заданы в этой странице-хосте и передаются как параметры в JavaScript, создающий элемент управления Silverlight:

<html>
  <head>
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript">
      function handleLoad(control, userContext, rootElement)
      {
      alert(userContext);
      }
      function createSilverlight(parentElement, cid, context) {
      Silverlight.createObject( "Page.xaml",
      document.getElementById(parentElement), cid, {
      width:'300', height:'300',
      inplaceInstallPrompt:false, background:'#D6D6D6', 
      isWindowless:'false', framerate:'24', version:'2.0' }, 
      {onError:null, onLoad :handleLoad
      },
      "p1,p2,p3", context, null); }
    </script>
  </head>
  <body>
    <div id="SilverlightControlHost1">
      <script type="text/javascript"> 
        createSilverlight("SilverlightControlHost1", "ctrl1","the first control"); 
      </script>
    </div>
    <div id="SilverlightControlHost2">
      <script type="text/javascript"> 
        createSilverlight("SilverlightControlHost2", "ctrl2","the second control"); 
      </script>
    </div>
    <div id="SilverlightControlHost3">
      <script type="text/javascript"> 
        createSilverlight("SilverlightControlHost3", "ctrl3","the third control"); 
      </script>
    </div>
  </body>
</html>

HTML-страница имеет обработчик события onLoad, который представлен здесь:

<script type="text/javascript">
  function handleLoad(control, userContext, rootElement)
  {
  alert(userContext);
  }
</script>

Он принимает параметр userContext и отображает значение контекста в окне предупреждения. Как это выглядит на экране, показано на рис. 6.1, на котором HTML-страница представляет контекст первого элемента управления

 Вывод на экран пользовательского контекста

Рис. 6.1. Вывод на экран пользовательского контекста

Реакция на события, возникающие в случае ошибки на странице

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

При инициализации элемента управления с помощью обработчика событий onError задается функция JavaScript, которая будет вызываться при возникновении ошибки. Однако если такая функция не будет задана (или если она задана как null ), то никакого уведомления об ошибке не будет происходить, и будет отображаться пустая серая область на месте элемента управления Silverlight. Но в проектах, созданных из Expression Blend, описывается стандартный обработчик ошибок.

Стандартный обработчик событий

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

Далее представлен пример неправильно сформированного XAML-документа, в котором сделана ошибка в имени закрывающего тега элемента TextBlock, он ошибочно назван </TextBlok>:

<Canvas xmlns="http://schemas.microsoft.com/client/2007" 
        xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml">
  <TextBlock>
    Hello, World!
  </TextBlok>
</Canvas>

Если используется обработчик, созданный Expression Blend no умолчанию, он обеспечит вывод на экран сообщения об ошибке Silverlight, как показан на рис. 6.2.

 Сообщение об ошибке

Рис. 6.2. Сообщение об ошибке

Использование собственного обработчика ошибок

Можно использовать собственный обработчик ошибок. Для этого свойству onError элемента управления Silverlight необходимо задать специальную функцию обработчика ошибок. Она должна будет принимать два параметра: объект отправителя события и аргументы события, описывающие детали возникшей ошибки.

Существует три типа аргументов события. Первый тип - базовый объект ErrorEventArgs (Аргументы ошибки), содержащий тип сообщения об ошибке и код. Свойство errorType (Тип ошибки) определяет тип ошибки в виде строки, содержащей значения RuntimeError (Ошибка времени выполнения) или ParserError (Ошибка синтаксического анализатора). На основании этой информации используется один из двух производных типов ошибок.

При обработке в XAML ошибки синтаксического разбора используется объект ParserErrorEventArgs (Аргументы ошибки синтаксического анализатора). Оно содержит ряд свойств:

  • Свойство charposition (позиция символа) содержит позицию символа, в котором возникла ошибка.
  • Свойство linenumber (номер строки) содержит номер строки, в которой возникла ошибка.
  • Свойство xamlFile (xaml-файл) определяет файл, в котором возникла ошибка.
  • Свойство xmlAttribute (xaml-атрибут) определяет xml-атрибут, в котором возникла ошибка.
  • Свойство xmlElement (xaml-элемент) определяет xml-элемент, в котором возникла ошибка.

Ошибки времени выполнения определяются в объекте RuntimeErrorEventArgs (Аргументы ошибки времени выполнения). Этот объект также включает ряд свойств:

  • Свойство charPosition определяет позицию символа, в котором возникла ошибка.
  • Свойство lineNumber определяет строку, в которой возникла ошибка.
  • Свойство methodName (имя метода) определяет метод, связанный с этой ошибкой.

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

function createSilverlight() {
Silverlight.createObject( "Scene.xaml",
document.getElementById("firstControl"), "agc1", {
width:'300',
height:'300',
inplaceInsta llPrompt: false,
background :'#D6D6D6',
isWindowless:'false',
framerate:'24',
version:'2.0' }, {
on Error: handleError,
onLoad:null },
null); }

Далее представлен HTML-файл, который вызывает этот измененный метод создания элемента управления Silverlight и содержит функцию handleError, заданную как обработчик ошибок в атрибуте onError:

<html>
  <head>
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript" src="createSilverlight.js"></script>
    <script type="text/javascript">
      function handleError(sender, errorArguments) {
       var strError = "Error Details: \n";
       strError+= "Type: " + errorArguments.errorType + "\n"; 
       strError+= "Message: " + errorArguments.errorMessage + "\n"; 
       strError+= "Code: " + errorArguments.errorCode + "\n";
       // Мы знаем (в данном случае), что это ошибка синтаксического анализатора. 
       // Чтобы обработчик ошибок был более универсальным, 
       // тип ошибки должен определяться до вызова 
       // свойств аргументов определенного типа. 
       strError+= "Xaml File: " + errorArguments.xamlFile + "\n"; 
       strError+= "Xaml Element: " + errorArguments.xmlElement + "\n"; 
       strError+= "Xaml Attribute: " + errorArguments.xmlAttribute + "\n"; 
       strError+= "Line: " + errorArguments.lineNumber + "\n"; 
       strError+= "Position: " + errorArguments.charPosition + "\n"; 
       alert(strError); 
      }
    </script>
  </head>
  <body>
    <div id="firstControl">
      <script type="text/javascript">
        createSilverlight();
      </script>
    </div>
  </body>
</html>

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

 Использование собственного обработчика ошибок

Рис. 6.3. Использование собственного обработчика ошибок
< Лекция 5 || Лекция 6: 12345 || Лекция 7 >
pankaj kowale
pankaj kowale
Индия, bandra
Ahmed mogaeng
Ahmed mogaeng
Россия, Moscow