WEB开发网
开发学院WEB开发ASP.NET 用IronRuby创建WPF应用程序 阅读

用IronRuby创建WPF应用程序

 2010-10-09 08:15:31 来源:WEB开发网   
核心提示:我曾在早期的博文中介绍过IronRuby,在文章中,用IronRuby创建WPF应用程序,我扩展了IronRuby的基础知识,来解释需要在Rail应用程序所做的额外工作,我创建了基于WPF的类似于时钟的应用程序——我喜欢参考WPF的“Hello,Wold”应用程序&mda

我曾在早期的博文中介绍过IronRuby。在文章中,我扩展了IronRuby的基础知识,来解释需要在Rail应用程序所做的额外工作,好让大家继续深入.NET所实现Ruby语言,但这方面的内容并不够。所以现在我想深入地谈谈IronRuby与项目的兼容性,以便开发全新的应用程序来说明IronRuby和.NET之间的互操作性。实际上,我们会使用WPF(Windows Presentation Foundation),它是.NET Framework的组件,我们可以用它创建富媒体和图形界面。

WPF基础

再次申明,WPF是.NET Framework组件之一,负责呈现富用户界面和其他媒体。它不是.NET Framework中唯一可完成该功能的函数库集,Window Form也可以完成类似工作,在我们需要创建炫目效果的时候,WPF会显得十分有用。无论是演示文档、视频、数据录入表格、某些类型的数据可视化(这是我最希望做的,尤其用IronRuby完成,后面的故事更精彩)抑或用动画把以上的都串联起来,你很可能会发现在给Windows开发这些应用程序的时候 WPF可以满足你的需求。

举例说明。某一天午饭时间,我创建了基于WPF的类似于时钟的应用程序——我喜欢参考WPF的“Hello,Wold”应用程序——于是决定使用IronRuby。

注:学习本示例的过程中,需要参考WPF文档。

示例程序

require 'WindowsBase' 
require 'PresentationFramework' 
require 'PresentationCore' 
require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 
 
class Clock 
 
  CLOCK_WIDTH   = 150 
  CLOCK_HEIGHT  = 150 
  LABEL_HEIGHT  = CLOCK_HEIGHT / 7 
  LABEL_WIDTH   = CLOCK_WIDTH / 7 
  RADIUS     = CLOCK_WIDTH / 2 
  RADS      = Math::PI / 180 
  MIN_LOCATIONS  = {} 
  HOUR_LOCATIONS = {} 
 
  def run! 
    plot_locations 
 
    # build our window 
    @window = System::Windows::Window.new 
    @window.background = System::Windows::Media::Brushes.LightGray 
    @window.width = CLOCK_WIDTH * 2 
    @window.height = CLOCK_HEIGHT * 2 
    @window.resize_mode = System::Windows::ResizeMode.NoResize 
     
    @canvas = System::Windows::Controls::Canvas.new 
    @canvas.width = CLOCK_WIDTH 
    @canvas.height = CLOCK_HEIGHT 
 
    # create shapes to represent clock hands 
    @minute_hand = System::Windows::Shapes::Line.new 
    @minute_hand.stroke = System::Windows::Media::Brushes.Black 
    @minute_hand.stroke_thickness = 1 
    @minute_hand.x1 = CLOCK_WIDTH / 2 
    @minute_hand.y1 = CLOCK_HEIGHT / 2 
 
    @hour_hand = System::Windows::Shapes::Line.new 
    @hour_hand.stroke = System::Windows::Media::Brushes.Black 
    @hour_hand.stroke_thickness = 3 
    @hour_hand.x1 = CLOCK_WIDTH / 2 
    @hour_hand.y1 = CLOCK_HEIGHT / 2 
     
    # .. and stick them to our canvas 
    @canvas.children.add(@minute_hand) 
    @canvas.children.add(@hour_hand) 
     
    plot_face # draw a clock face 
    plot_labels # draw clock numbers 
    plot_hands # draw minute / hour hands 
 
    @window.content = @canvas 
    app = System::Windows::Application.new 
    app.run(@window) 
    # the Application object handles the lifecycle of our app 
    # including the execution loop 
  end 
   
  # determine 2 sets of equidistant points around the circumference of a circle 
  # of CLOCK_WIDTH and CLOCK_HEIGHT dimensions. 
  def plot_locations 
    for i in (0..60) # 60 minutes, and 12 hours 
      a = i * 6 
      x = (RADIUS * Math.sin(a * RADS)).to_i + (CLOCK_WIDTH / 2) 
      y = (CLOCK_HEIGHT / 2) - (RADIUS * Math.cos(a * RADS)).to_i 
      coords = [x, y] 
      HOUR_LOCATIONS[i / 5] = coords if i % 5 == 0 # is this also an 'hour' location (ie. every 5 minutes)? 
      MIN_LOCATIONS[i] = coords 
    end 
  end 
   
  # draws a circle to represent the clock's face 
  def plot_face 
    extra_x = (CLOCK_WIDTH * 0.15) # pad our circle a little 
    extra_y = (CLOCK_HEIGHT * 0.15) 
    face = System::Windows::Shapes::Ellipse.new 
    face.fill = System::Windows::Media::Brushes.White 
    face.width = CLOCK_WIDTH + extra_x 
    face.height = CLOCK_HEIGHT + extra_y 
    face.margin = System::Windows::Thickness.new(0 - (extra_x/2), 0 - (extra_y/2), 0, 0) 
    face.stroke = System::Windows::Media::Brushes.Gray # give it a slight border 
    face.stroke_thickness = 1 
    System::Windows::Controls::Canvas.set_z_index(face, -1) # send our circle to the back 
    @canvas.children.add(face) # add the clock face to our canvas 
  end 
   
  # at each point along the hour locations, put a number 
  def plot_labels 
    HOUR_LOCATIONS.each_pair do |p, coords| 
      unless p == 0 
        lbl = System::Windows::Controls::Label.new 
        lbl.horizontal_content_alignment = System::Windows::HorizontalAlignment.Center 
        lbl.width = LABEL_WIDTH 
        lbl.height = LABEL_HEIGHT 
        lbl.content = p.to_s 
        lbl.margin = System::Windows::Thickness.new(coords[0] - (LABEL_WIDTH / 2), coords[1] - (LABEL_HEIGHT / 2), 0, 0) 
        lbl.padding = System::Windows::Thickness.new(0, 0, 0, 0) 
        @canvas.children.add(lbl) 
      end 
    end 
  end 
   
  def plot_hands 
    time = Time.now 
    hours = time.hour 
    minutes = time.min 
     
    if !@minutes || minutes != @minutes 
      @hours = hours >= 12 ? hours - 12 : hours 
      @minutes = minutes == 0 ? 60 : minutes 
      # Dispatcher.BeginInvoke() is asynchronous, though it probably doesn't matter too much here 
      @minute_hand.dispatcher.begin_invoke(System::Windows::Threading::DispatcherPriority.Render, System::Action.new { 
        @minute_hand.x2 = MIN_LOCATIONS[@minutes][0] 
        @minute_hand.y2 = MIN_LOCATIONS[@minutes][1] 
        @hour_hand.x2 = HOUR_LOCATIONS[@hours][0] 
        @hour_hand.y2 = HOUR_LOCATIONS[@hours][1] 
      }) 
    end 
  end 
   
end 
 
clock = Clock.new 
 
timer = System::Timers::Timer.new 
timer.interval = 1000 
timer.elapsed { clock.plot_hands } 
timer.enabled = true 
 
clock.run!

1 2 3 4 5  下一页

Tags:IronRuby 创建 WPF

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接