Опубликован: 24.03.2009 | Доступ: свободный | Студентов: 2286 / 115 | Оценка: 4.24 / 3.93 | Длительность: 17:47:00
Лекция 14:

Использование динамических языков в Silverlight 2

< Лекция 13 || Лекция 14: 1234

Реализация часов выполняется в двух модулях кода на Ruby. Первый - вспомогательный класс, созданный группой Silverlight Dynamic Languages (Динамические языки Silverlight) для использования в Ruby-приложениях. Рассмотрим его код:

include System: :Windows
include System: :Windows: :Controls
include System: :Windows::Media

class SilverlightApplication 
 def application
  Application.current 
 end
 
 def self.use xaml(options = {}) 
  options = {:type => UserControl, :name => "app"}.merge(options) 
  Application.current.load  root visual(options[:type].new, "#{options[:name]}.xaml") 
 end
 
 def root
  application.root visual 
 end
 
 def method missing(m)
  root.send(m) 
 end 
end

class FrameworkElement
 def method  missing(m) 
  find  name(m.to s.to  clr string)
 end 
end

Здесь определяется ряд вспомогательных функций и объектов, включая:

  • application ( приложение ) Указывает на текущее приложение (просто обозначается Application.current )
  • root ( корень ) Указывает на корневой визуальный элемент, а именно, элемент верхнего уровня в XAML
  • method missing ( поиск метода по им ени ) Обрабатывает трансляцию имени метода в строковый формат clr, что помогает при написании кода
  • use xaml (использовать xaml ) Управляет загрузкой XAML в визуальное дерево

В коде приложения, реализующего часы, используется вспомогательные функции root и use xaml. Рассмотрим их:

require 'Silverlight'
class Clock < SilverlightApplication
 use xaml :type => Canvas

 def start
  d = Time.now()
  root.hour animation.from = from angle d.hour, 1, d.minute/2
  root.hour animation.to = to angle d.hour
  root.minute animation.from = from angle d.minute
  root.minute animation.to = to angle d.minute
  root.second animation.from = from angle d.second
  root.second animation.to = to angle d.second
 end

 def from angle(time, divisor = 5, offset = 0)
  ((time / (12.0 * divisor)) * 360) + offset + 180
 end

 def to angle(time)
  from angle(time) + 360
 end
end
Clock.new.start

Обратите внимание на первую строку кода

require 'Silverlight'

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

Затем объявляется класс Clock (Часы), производный от SilverlightApplication (определенный в Silverlight.rb ):

class Clock < SilverlightApplication

Вызываем функцию use xaml из SilverlightApplication и задаем, что используем XAML с базовым элементом <Canvas>. Это наследие Silverlight 1, в котором <Canvas> был единственным корневым элементом.

Далее переходим к функции start, которая вызывается по завершении инициализации. Она принимает текущее время с помощью функции Time.now и использует его для определения значений from (от) и to (до) для трех анимаций. Помните анимации hour animation, minute animation и second animation? Теперь можно увидеть, как они используются. В Ruby вызов функции осуществляется путем указания ее имени, за которым следует пробел и список параметров через запятую. Таким образом, угол, представляющий текущее расположение часовой стрелки, получаем, вызывая from angle и передавая в нее соответствующие параметры, которыми в данном случае являются текущее количество часов, 1, и количество минут, деленное на 2. Причина деления количества минут на два в том, что для трансформаций отсчет углов ведется от нижней точки окружности, т.е. здесь необходимо выполнить смещение на 180 градусов, следовательно, текущее показание делится на 2, чтобы "перевернуть" угол, предоставляемый значением minute.

Рассмотрим эту функцию:

def from angle(time, divisor = 5, offset = 0)
((time / (12.0 * divisor)) * 360) + offset + 180 End

Возвращаясь к коду, можно увидеть, что начальное условие просто использует эту функцию для вычисления соответствующего угла трансформации, с которого будет начинаться анимация, и задает его в качестве значения свойства from анимации. Аналогично, значение окончания анимации ( to ) равно 360 градусам плюс текущее значение from. Таким образом, трансформация обеспечит прохождение стрелкой 360 градусов, начиная от исходного значения, за заданный промежуток времени (12 часов для часовой стрелки, 1 час для минутной и 1 минута для секундной стрелки).

Наконец, приложение начинается с создания нового экземпляра класса Clock и его запуска:

Clock.new.start

Таким образом, с помощью Ruby мы создали функциональное Silverlight-приложение-анимированные часы, которые отображают текущее время.

Заключение

В данной лекции представлены динамические языки программирования и создано простое приложение Hello World с использованием IronPython, IronRuby и управляемого JavaScript. Вы увидели, как настраивать Visual Studio для работы с инструментом Chiron, применяемым для построения и управления выполнением динамических приложений.

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

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

Надеюсь, вы получили такое же удовольствие от работы с этим курсом, какое испытывал я при ее написании!

< Лекция 13 || Лекция 14: 1234