HTMLファイルにXAMLを記述
HTMLファイルに、スクリプトとして「XAMLマークアップ」を記述することができます。
利点は、
1.HTMLファイルと同時にブラウザに送られるので高速
2.同じ理由で、サーバのMIME設定の影響を受けない
3.ファイルが1つで管理し易い
欠点は、
1.WYSIWIGエディタで編集できない
2.SilverlightのXAMLの機能に制限される
全体が1つのHTMLファイルになっているので、必要なら、ブラウザのソースコードの表示機能を使って、XAMLのスクリプトを見てください。
このサンプルを作る過程を書きます。
1.XAMLの準備
1.1.数式部分
数式部分は、ワードで書きました。これを xps2xaml で、XAMLに変換しました。
1.2.図形部分
Visual Studio で WPFプロジェクトを作り、Pageファイルを追加して作りました。確認は、IEで直接 Page.xaml を開いて行いました。
1.3.XAMLスクリプト
上の2つを連結して、HTML上のスクリプト記述にします。
スクリプトに xamlScript1 と id が付けてあり、これを object タグで指定することになります。
スケーリングや原点が異なるので、StackPanel に2つの Canvas 置いた構造になっています。
- <SCRIPT id=xamlScript2 type=text/xaml>
- <?xml version="1.0"?>
- <StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Width="300" Height="360">
- <Canvas Width="220" Height="220">
- <Canvas.RenderTransform>
- <MatrixTransform Matrix="50 0 0 -50 110 110"/>
- </Canvas.RenderTransform>
- :
- : 図形の部分の記述
- :
- </Canvas>
- <Canvas>
- <Canvas.RenderTransform>
- <MatrixTransform Matrix="1 0 0 1 -70 -100"/>
- </Canvas.RenderTransform>
- :
- : 数式の部分の記述
- :
- </Canvas>
- </StackPanel>
- </SCRIPT>
2.XAMLスクリプトの表示
同じHTMLファイル中のXAMLスクリプトを表示するには、以下のようにします。
- <object height="40" type="application/x-silverlight">
- <param name="Background" value="transparent"/>
- <param name="Source" value="#xamlScript2"/>
- <param name="Windowless" value="-1"/>
- <param name="MinRuntimeVersion" value="1.0.0.0"/>
- </object>
Source パラメータに、スクリプトの id、 xamlScript1 を指定しています。
このページのソースを見ると、もっと沢山 param タグが書かれています。これは意図したものではなく、HTMLDo エディタで自動挿入されるものです。
必須なのは、この4つでした。
3.要点
3.1.デバック済みで
XAML記述で誤りや未サポートがある場合、一切描画が行われないような状態になります。何のエラー表示も無いので、別途確認の必要があります。Visual Studio のエディタの機能で、XAMLの構文誤りの無い状態にして、ブラウザで開いて確認して置きます。
3.2.XAMLの記述能力はSilverlight以下
object タグは、type属性から Silverlightアプリケーションを実行するコンポーネントを選択するものと考えます。したがって、Loose XAML で利用可能な Viewport3Dなどが未サポートなのは推測できます。
さらに、Silverlight アプリケーションで利用可能なものも使えないものがあります。
Button など入力を行うタグを記述すると一切表示されなくなるようです。
今のところ、DataTrigger が Silverlight で未サポートなので、入力関連のタグが記述できてもあまり使い道がないかもしれません。
今回の例は、「START」ボタンをトリガに起動するように考えていました。これができないのは意外です。
3.3.XAMLスクリプトの記述順
参照する object タグより前に記述する必要があります。
この条件はブラウザ依存のようで、FireFoxは逆順でも表示します。
また、使用している エディタ(HTMLDo)での問題があります。
- 先頭がスクリプトだと消されてしまう
- スクリプトには表示位置があるわけではないので、タグの順番が組みかえられてしまう。
3.4.編集上の問題
結局、エディタ(HTMLDo)では、IFRAMEを使う方法以外は、編集時に表示して置くことができないことが分かりました。
(いつの間にか表示されるようになっています。)
Silverlight.js や object タグは、編集時には評価されないようです。
編集時の表示は、諦めるとしても、その空間がリザーブされていることぐらいは分からないと編集できませんが、編集時の object タグは透明なもののようです。
マウスポインタでクリックして選択すると、破線で枠どられるので、存在が分かります。
この例では、テーブルで枠取りをして、編集時に占有領域が分かるようにしています。
- <table style="background-color: #f0f0f0; width: 300px; height: 360px; margin-right: 30px;"
- border="5" cellspacing="5" cellpadding="0" width="50%" align="left">
- <tbody>
- <tr>
- <td>
- <object width="300" height="360" type="application/x-silverlight">
- <param name="Background" value="#ffe4e1">
- <param name="Source" value="#xamlScript2">
- <param name="MinRuntimeVersion" value="1.0.0.0">
- </object>
- </td>
- </tr>
- </tbody>
- </table>
4.図形の描画部分の説明
図形を3つ用意します。
- 定円
- 転円
- 赤いマーク(転円の回転の軌跡を示す)
- <Path StrokeThickness="0.02" Stroke="Gray"><!--定円-->
- <Path.Data>
- <EllipseGeometry RadiusX="1" RadiusY="1" Center="0 0"/>
- </Path.Data>
- </Path>
- <Path StrokeThickness="0.02" Stroke="Blue"><!---転円-->
- <Path.Data>
- <EllipseGeometry x:Name="e_out" RadiusX="0.5" RadiusY="0.5" Center="1.5 0"/>
- </Path.Data>
- <Path.RenderTransform>
- <RotateTransform x:Name="mc_angle"/>
- </Path.RenderTransform>
- </Path>
- <Canvas>
- <Path Fill="Red"><!--マーク-->
- <Path.Data>
- <EllipseGeometry RadiusX="0.06" RadiusY="0.06" Center="2 0"/>
- </Path.Data>
- <Path.RenderTransform>
- <RotateTransform x:Name="mark1_angle" CenterX="1.5" CenterY="0" />
- </Path.RenderTransform>
- </Path>
- <Canvas.RenderTransform>
- <RotateTransform x:Name="mark1_canvas_angle"/>
- </Canvas.RenderTransform>
- </Canvas>
マークは、独立した Canvas に描きます。マーク自体は、転円の中心に対して回転します。 Canvas は、原点に対して回転します。
Canvas の loaded イベントを使ってアニメーションをスタートします。同じ時点から、同じ時間(20秒)動作します。
- マークを、「転円の中心」を中心に2回転(720°)
- マークの乗った Canvas を、原点を中心に360°回転
- 転円を、原点を中心に360°回転
- <Canvas.Triggers>
- <EventTrigger RoutedEvent="Canvas.Loaded">
- <BeginStoryboard>
- <Storyboard>
- <DoubleAnimationUsingKeyFrames Storyboard.TargetName="mark1_angle"
- Storyboard.TargetProperty="Angle"
- Duration="0:0:20" >
- <LinearDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
- <LinearDoubleKeyFrame KeyTime="0:0:20" Value="720"/>
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </BeginStoryboard>
- </EventTrigger>
- <EventTrigger RoutedEvent="Canvas.Loaded">
- <BeginStoryboard>
- <Storyboard>
- <DoubleAnimationUsingKeyFrames Storyboard.TargetName="mark1_canvas_angle"
- Storyboard.TargetProperty="Angle"
- Duration="0:0:20" >
- <LinearDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
- <LinearDoubleKeyFrame KeyTime="0:0:20" Value="360"/>
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </BeginStoryboard>
- </EventTrigger>
- <EventTrigger RoutedEvent="Canvas.Loaded">
- <BeginStoryboard>
- <Storyboard>
- <DoubleAnimationUsingKeyFrames Storyboard.TargetName="mc_angle"
- Storyboard.TargetProperty="Angle"
- Duration="0:0:20" >
- <LinearDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
- <LinearDoubleKeyFrame KeyTime="0:0:20" Value="360"/>
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </BeginStoryboard>
- </EventTrigger>
- </Canvas.Triggers>
|