SSブログ

F# + Silverlight で Hello World [OCaml]

とりあえず文字を表示するだけのものを作った。Silverlight は 1.1 Alpha Refresh が必要。

index.html を以下のように書く。Silverlight.js は SDK に含まれるものを置く。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head>
    <script type="text/javascript" src="Silverlight.js"></script>
    <title>Hello Silverlight!</title>
  </head>

  <body>
    <!-- ここに Silverlight コントロールが表示されます -->
    <div id="SilverlightControlHost"></div>

    <script type="text/javascript">
      // Silverlight コントロールをロードします
      function createSilverlight()
      {
        Silverlight.createObjectEx({
          source: 'Page.xaml',
          parentElement:document.getElementById("SilverlightControlHost"),
          id:'SilverlightControl',
          properties:{
            width:'200',
            height:'200',
            background:'silver',
            isWindowless:'false',
            framerate:'24',
            enableFramerateCounter:'false',
            version:'1.0'
          },
          events:{
            onError:null,
            onLoad:null,
            onResize:null
          },
          context:null
        });
      }
      createSilverlight();
    </script>
  </body>
</html>

Page.xaml は事実上の空。マネージドコードを使うので x:Class 属性にクラス名と DLL の場所を指定する。Loaded 属性で指定したメソッドがロード時に呼ばれる。

<Canvas
   xmlns="http://schemas.microsoft.com/client/2007"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Loaded="Page_Loaded"
   x:Class="SilverTest.Page;assembly=SilverTest.dll"
>
</Canvas>

SilverTest.fs が F# のコード。Page_Loaded で TextBlock オブジェクトを作ってキャンバスに追加する。[1] などを参照した。

namespace SilverTest

open System;
open System.Windows;
open System.Windows.Controls;
open System.Windows.Documents;
open System.Windows.Ink;
open System.Windows.Input;
open System.Windows.Media;
open System.Windows.Media.Animation;
open System.Windows.Shapes;

type Page = class inherit Canvas
  new() = {}

  member x.Page_Loaded(o : obj,  e : EventArgs) = 
    let canvas = o :?> Canvas in
    let text = new TextBlock() in
    text.Text <- "Hello Silverlight!!";
    text.SetValue(Canvas.TopProperty, 0);
    text.SetValue(Canvas.LeftProperty, 0);
    canvas.Children.Add(text);

end

コンパイルオプション。[2] に書いてあったのをほぼそのまま使った。

fsc -r System.SilverLight.dll -r agclr.dll -r Microsoft.Scripting.Vestigial.dll -r System.dll -r Microsoft.Scripting.Silverlight.dll -r Microsoft.Scripting.dll --clr-root "C:\Program Files\Microsoft Silverlight" --no-framework --no-mllib --static-link fslib -a SilverTest.fs

XAML で定義したキャンバス上のオブジェクトを F# 側から触る方法がまだ分からなくて、何も出来ていないようなものだ。C# のサンプルなんかでは何もしなくても名前で指定できてるっぽいんだけど。あと F# のクラス構文もまだ全然わかってない。

[1] http://www.strangelights.com/blog/archive/2007/05/25/1584.aspx
[2] http://www.strangelights.com/blog/archive/2007/05/28/1585.aspx


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。