Использование динамических языков в Silverlight 2
Реализация часов выполняется в двух модулях кода на 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 в как можно более доступной форме, чтобы вы могли взять курс, открыть любую лекцию, проработать ее и понять, что представляет собой эта технология, и захотели пойти дальше.
Надеюсь, вы получили такое же удовольствие от работы с этим курсом, какое испытывал я при ее написании!